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
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
113 BoneInfo bone = this.boneList.get(linkedBoneId);
\r
114 RigidGroup group = this.rigidGroupList.get(rigidGroupId);
\r
116 this.currentRigid.setLinkedBone(bone);
\r
117 this.currentRigid.setRigidGroup(group);
\r
118 group.getRigidList().add(this.currentRigid);
\r
125 * @param shapeType {@inheritDoc}
\r
126 * @param width {@inheritDoc}
\r
127 * @param height {@inheritDoc}
\r
128 * @param depth {@inheritDoc}
\r
131 public void pmdRigidShape(byte shapeType,
\r
132 float width, float height, float depth){
\r
133 RigidShape shape = this.currentRigid.getRigidShape();
\r
135 shape.setWidth(width);
\r
136 shape.setHeight(height);
\r
137 shape.setDepth(depth);
\r
139 RigidShapeType type = RigidShapeType.decode(shapeType);
\r
140 shape.setShapeType(type);
\r
147 * @param posX {@inheritDoc}
\r
148 * @param posY {@inheritDoc}
\r
149 * @param posZ {@inheritDoc}
\r
152 public void pmdRigidPosition(float posX, float posY, float posZ){
\r
153 Pos3d position = this.currentRigid.getPosition();
\r
154 position.setXPos(posX);
\r
155 position.setYPos(posY);
\r
156 position.setZPos(posZ);
\r
162 * @param radX {@inheritDoc}
\r
163 * @param radY {@inheritDoc}
\r
164 * @param radZ {@inheritDoc}
\r
167 public void pmdRigidRotation(float radX, float radY, float radZ){
\r
168 Rad3d rotation = this.currentRigid.getRotation();
\r
169 rotation.setXRad(radX);
\r
170 rotation.setYRad(radY);
\r
171 rotation.setZRad(radZ);
\r
177 * @param mass {@inheritDoc}
\r
178 * @param dampingPos {@inheritDoc}
\r
179 * @param dampingRot {@inheritDoc}
\r
180 * @param restitution {@inheritDoc}
\r
181 * @param friction {@inheritDoc}
\r
184 public void pmdRigidPhysics(float mass,
\r
189 DynamicsInfo info = this.currentRigid.getDynamicsInfo();
\r
191 info.setMass(mass);
\r
192 info.setDampingPosition(dampingPos);
\r
193 info.setDampingRotation(dampingRot);
\r
194 info.setRestitution(restitution);
\r
195 info.setFriction(friction);
\r
202 * @param behaveType {@inheritDoc}
\r
203 * @param collisionMap {@inheritDoc}
\r
206 public void pmdRigidBehavior(byte behaveType, short collisionMap){
\r
207 RigidBehaviorType type = RigidBehaviorType.decode(behaveType);
\r
208 this.currentRigid.setBehaviorType(type);
\r
210 for(int bitPos = 0; bitPos < PmdLimits.RIGIDGROUP_FIXEDNUM; bitPos++){
\r
211 short mask = 0x0001;
\r
213 if((collisionMap & mask) == 0){
\r
214 RigidGroup group = this.rigidGroupList.get(bitPos);
\r
215 this.currentRigid.getThroughGroupColl().add(group);
\r