2 * building rigid information
4 * License : The MIT License
5 * Copyright(c) 2010 MikuToga Partners
8 package jp.sourceforge.mikutoga.pmd.model.binio;
10 import java.util.Iterator;
11 import java.util.List;
12 import jp.sourceforge.mikutoga.corelib.ListUtil;
13 import jp.sourceforge.mikutoga.math.MkPos3D;
14 import jp.sourceforge.mikutoga.parser.ParseStage;
15 import jp.sourceforge.mikutoga.pmd.Rad3d;
16 import jp.sourceforge.mikutoga.pmd.RigidBehaviorType;
17 import jp.sourceforge.mikutoga.pmd.RigidShapeType;
18 import jp.sourceforge.mikutoga.pmd.model.BoneInfo;
19 import jp.sourceforge.mikutoga.pmd.model.DynamicsInfo;
20 import jp.sourceforge.mikutoga.pmd.model.PmdModel;
21 import jp.sourceforge.mikutoga.pmd.model.RigidGroup;
22 import jp.sourceforge.mikutoga.pmd.model.RigidInfo;
23 import jp.sourceforge.mikutoga.pmd.model.RigidShape;
24 import jp.sourceforge.mikutoga.pmd.parser.PmdLimits;
25 import jp.sourceforge.mikutoga.pmd.parser.PmdRigidHandler;
30 class RigidBuilder implements PmdRigidHandler {
32 private final List<BoneInfo> boneList;
34 private final List<RigidInfo> rigidList;
35 private Iterator<RigidInfo> rigidIt;
36 private RigidInfo currentRigid = null;
38 private final List<RigidGroup> rigidGroupList;
44 RigidBuilder(PmdModel model){
46 this.boneList = model.getBoneList();
47 this.rigidList = model.getRigidList();
48 this.rigidGroupList = model.getRigidGroupList();
54 * @param stage {@inheritDoc}
55 * @param loops {@inheritDoc}
58 public void loopStart(ParseStage stage, int loops){
59 ListUtil.prepareDefConsList(this.rigidList, RigidInfo.class, loops);
60 ListUtil.assignIndexedSerial(this.rigidList);
62 this.rigidIt = this.rigidList.iterator();
63 if(this.rigidIt.hasNext()){
64 this.currentRigid = this.rigidIt.next();
67 ListUtil.prepareDefConsList(this.rigidGroupList,
69 PmdLimits.RIGIDGROUP_FIXEDNUM );
70 ListUtil.assignIndexedSerial(this.rigidGroupList);
77 * @param stage {@inheritDoc}
80 public void loopNext(ParseStage stage){
81 if(this.rigidIt.hasNext()){
82 this.currentRigid = this.rigidIt.next();
89 * @param stage {@inheritDoc}
92 public void loopEnd(ParseStage stage){
98 * @param rigidName {@inheritDoc}
101 public void pmdRigidName(String rigidName){
102 this.currentRigid.getRigidName().setPrimaryText(rigidName);
108 * @param rigidGroupId {@inheritDoc}
109 * @param linkedBoneId {@inheritDoc}
112 public void pmdRigidInfo(int rigidGroupId, int linkedBoneId){
114 if(linkedBoneId < 0 || 65535 <= linkedBoneId){
117 bone = this.boneList.get(linkedBoneId);
119 RigidGroup group = this.rigidGroupList.get(rigidGroupId);
121 this.currentRigid.setLinkedBone(bone);
122 this.currentRigid.setRigidGroup(group);
123 group.getRigidList().add(this.currentRigid);
130 * @param shapeType {@inheritDoc}
131 * @param width {@inheritDoc}
132 * @param height {@inheritDoc}
133 * @param depth {@inheritDoc}
136 public void pmdRigidShape(byte shapeType,
137 float width, float height, float depth){
138 RigidShape shape = this.currentRigid.getRigidShape();
140 shape.setWidth(width);
141 shape.setHeight(height);
142 shape.setDepth(depth);
144 RigidShapeType type = RigidShapeType.decode(shapeType);
145 shape.setShapeType(type);
152 * @param posX {@inheritDoc}
153 * @param posY {@inheritDoc}
154 * @param posZ {@inheritDoc}
157 public void pmdRigidPosition(float posX, float posY, float posZ){
158 MkPos3D position = this.currentRigid.getPosition();
159 position.setXpos(posX);
160 position.setYpos(posY);
161 position.setZpos(posZ);
167 * @param radX {@inheritDoc}
168 * @param radY {@inheritDoc}
169 * @param radZ {@inheritDoc}
172 public void pmdRigidRotation(float radX, float radY, float radZ){
173 Rad3d rotation = this.currentRigid.getRotation();
174 rotation.setXRad(radX);
175 rotation.setYRad(radY);
176 rotation.setZRad(radZ);
182 * @param mass {@inheritDoc}
183 * @param dampingPos {@inheritDoc}
184 * @param dampingRot {@inheritDoc}
185 * @param restitution {@inheritDoc}
186 * @param friction {@inheritDoc}
189 public void pmdRigidPhysics(float mass,
194 DynamicsInfo info = this.currentRigid.getDynamicsInfo();
197 info.setDampingPosition(dampingPos);
198 info.setDampingRotation(dampingRot);
199 info.setRestitution(restitution);
200 info.setFriction(friction);
207 * @param behaveType {@inheritDoc}
208 * @param collisionMap {@inheritDoc}
211 public void pmdRigidBehavior(byte behaveType, short collisionMap){
212 RigidBehaviorType type = RigidBehaviorType.decode(behaveType);
213 this.currentRigid.setBehaviorType(type);
215 for(int bitPos = 0; bitPos < PmdLimits.RIGIDGROUP_FIXEDNUM; bitPos++){
218 if((collisionMap & mask) == 0){
219 RigidGroup group = this.rigidGroupList.get(bitPos);
220 this.currentRigid.getThroughGroupColl().add(group);