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