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 jp.sourceforge.mikutoga.corelib.ListUtil;
\r
11 import java.util.Iterator;
\r
12 import java.util.List;
\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
57 public void loopStart(ParseStage stage, int loops){
\r
58 ListUtil.prepareDefConsList(this.rigidList, RigidInfo.class, loops);
\r
59 ListUtil.assignIndexedSerial(this.rigidList);
\r
61 this.rigidIt = this.rigidList.iterator();
\r
62 if(this.rigidIt.hasNext()){
\r
63 this.currentRigid = this.rigidIt.next();
\r
66 ListUtil.prepareDefConsList(this.rigidGroupList,
\r
68 PmdLimits.RIGIDGROUP_FIXEDNUM );
\r
69 ListUtil.assignIndexedSerial(this.rigidGroupList);
\r
76 * @param stage {@inheritDoc}
\r
78 public void loopNext(ParseStage stage){
\r
79 if(this.rigidIt.hasNext()){
\r
80 this.currentRigid = this.rigidIt.next();
\r
87 * @param stage {@inheritDoc}
\r
89 public void loopEnd(ParseStage stage){
\r
95 * @param rigidName {@inheritDoc}
\r
97 public void pmdRigidName(String rigidName){
\r
98 this.currentRigid.getRigidName().setPrimaryText(rigidName);
\r
104 * @param rigidGroupId {@inheritDoc}
\r
105 * @param linkedBoneId {@inheritDoc}
\r
107 public void pmdRigidInfo(int rigidGroupId, int linkedBoneId){
\r
108 BoneInfo bone = this.boneList.get(linkedBoneId);
\r
109 RigidGroup group = this.rigidGroupList.get(rigidGroupId);
\r
111 this.currentRigid.setLinkedBone(bone);
\r
112 this.currentRigid.setRigidGroup(group);
\r
113 group.getRigidList().add(this.currentRigid);
\r
120 * @param shapeType {@inheritDoc}
\r
121 * @param width {@inheritDoc}
\r
122 * @param height {@inheritDoc}
\r
123 * @param depth {@inheritDoc}
\r
125 public void pmdRigidShape(byte shapeType,
\r
126 float width, float height, float depth){
\r
127 RigidShape shape = this.currentRigid.getRigidShape();
\r
129 shape.setWidth(width);
\r
130 shape.setHeight(height);
\r
131 shape.setDepth(depth);
\r
133 RigidShapeType type = RigidShapeType.decode(shapeType);
\r
134 shape.setShapeType(type);
\r
141 * @param posX {@inheritDoc}
\r
142 * @param posY {@inheritDoc}
\r
143 * @param posZ {@inheritDoc}
\r
145 public void pmdRigidPosition(float posX, float posY, float posZ){
\r
146 Pos3d position = this.currentRigid.getPosition();
\r
147 position.setXPos(posX);
\r
148 position.setYPos(posY);
\r
149 position.setZPos(posZ);
\r
155 * @param radX {@inheritDoc}
\r
156 * @param radY {@inheritDoc}
\r
157 * @param radZ {@inheritDoc}
\r
159 public void pmdRigidRotation(float radX, float radY, float radZ){
\r
160 Rad3d rotation = this.currentRigid.getRotation();
\r
161 rotation.setXRad(radX);
\r
162 rotation.setYRad(radY);
\r
163 rotation.setZRad(radZ);
\r
169 * @param mass {@inheritDoc}
\r
170 * @param dampingPos {@inheritDoc}
\r
171 * @param dampingRot {@inheritDoc}
\r
172 * @param restitution {@inheritDoc}
\r
173 * @param friction {@inheritDoc}
\r
175 public void pmdRigidPhysics(float mass,
\r
180 DynamicsInfo info = this.currentRigid.getDynamicsInfo();
\r
182 info.setMass(mass);
\r
183 info.setDampingPosition(dampingPos);
\r
184 info.setDampingRotation(dampingRot);
\r
185 info.setRestitution(restitution);
\r
186 info.setFriction(friction);
\r
193 * @param behaveType {@inheritDoc}
\r
194 * @param collisionMap {@inheritDoc}
\r
196 public void pmdRigidBehavior(byte behaveType, short collisionMap){
\r
197 RigidBehaviorType type = RigidBehaviorType.decode(behaveType);
\r
198 this.currentRigid.setBehaviorType(type);
\r
200 for(int bitPos = 0; bitPos < PmdLimits.RIGIDGROUP_FIXEDNUM; bitPos++){
\r
201 short mask = 0x0001;
\r
203 if((collisionMap & mask) == 0){
\r
204 RigidGroup group = this.rigidGroupList.get(bitPos);
\r
205 this.currentRigid.getThroughGroupColl().add(group);
\r