OSDN Git Service

接続ボーンを持たない剛体に対処。
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / pmd / pmdloader / RigidBuilder.java
1 /*\r
2  * building rigid information\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.pmd.pmdloader;\r
9 \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
26 \r
27 /**\r
28  * 剛体関係の通知をパーサから受け取る。\r
29  */\r
30 class RigidBuilder implements PmdRigidHandler {\r
31 \r
32     private final List<BoneInfo> boneList;\r
33 \r
34     private final List<RigidInfo> rigidList;\r
35     private Iterator<RigidInfo> rigidIt;\r
36     private RigidInfo currentRigid = null;\r
37 \r
38     private final List<RigidGroup> rigidGroupList;\r
39 \r
40     /**\r
41      * コンストラクタ。\r
42      * @param model モデル\r
43      */\r
44     RigidBuilder(PmdModel model){\r
45         super();\r
46         this.boneList = model.getBoneList();\r
47         this.rigidList = model.getRigidList();\r
48         this.rigidGroupList = model.getRigidGroupList();\r
49         return;\r
50     }\r
51 \r
52     /**\r
53      * {@inheritDoc}\r
54      * @param stage {@inheritDoc}\r
55      * @param loops {@inheritDoc}\r
56      */\r
57     @Override\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
61 \r
62         this.rigidIt = this.rigidList.iterator();\r
63         if(this.rigidIt.hasNext()){\r
64             this.currentRigid = this.rigidIt.next();\r
65         }\r
66 \r
67         ListUtil.prepareDefConsList(this.rigidGroupList,\r
68                                     RigidGroup.class,\r
69                                     PmdLimits.RIGIDGROUP_FIXEDNUM );\r
70         ListUtil.assignIndexedSerial(this.rigidGroupList);\r
71 \r
72         return;\r
73     }\r
74 \r
75     /**\r
76      * {@inheritDoc}\r
77      * @param stage {@inheritDoc}\r
78      */\r
79     @Override\r
80     public void loopNext(ParseStage stage){\r
81         if(this.rigidIt.hasNext()){\r
82             this.currentRigid = this.rigidIt.next();\r
83         }\r
84         return;\r
85     }\r
86 \r
87     /**\r
88      * {@inheritDoc}\r
89      * @param stage {@inheritDoc}\r
90      */\r
91     @Override\r
92     public void loopEnd(ParseStage stage){\r
93         return;\r
94     }\r
95 \r
96     /**\r
97      * {@inheritDoc}\r
98      * @param rigidName {@inheritDoc}\r
99      */\r
100     @Override\r
101     public void pmdRigidName(String rigidName){\r
102         this.currentRigid.getRigidName().setPrimaryText(rigidName);\r
103         return;\r
104     }\r
105 \r
106     /**\r
107      * {@inheritDoc}\r
108      * @param rigidGroupId {@inheritDoc}\r
109      * @param linkedBoneId {@inheritDoc}\r
110      */\r
111     @Override\r
112     public void pmdRigidInfo(int rigidGroupId, int linkedBoneId){\r
113         BoneInfo bone;\r
114         if(linkedBoneId < 0 || 65535 <= linkedBoneId){\r
115             bone = null;\r
116         }else{\r
117             bone = this.boneList.get(linkedBoneId);\r
118         }\r
119         RigidGroup group = this.rigidGroupList.get(rigidGroupId);\r
120 \r
121         this.currentRigid.setLinkedBone(bone);\r
122         this.currentRigid.setRigidGroup(group);\r
123         group.getRigidList().add(this.currentRigid);\r
124 \r
125         return;\r
126     }\r
127 \r
128     /**\r
129      * {@inheritDoc}\r
130      * @param shapeType {@inheritDoc}\r
131      * @param width {@inheritDoc}\r
132      * @param height {@inheritDoc}\r
133      * @param depth {@inheritDoc}\r
134      */\r
135     @Override\r
136     public void pmdRigidShape(byte shapeType,\r
137                               float width, float height, float depth){\r
138         RigidShape shape = this.currentRigid.getRigidShape();\r
139 \r
140         shape.setWidth(width);\r
141         shape.setHeight(height);\r
142         shape.setDepth(depth);\r
143 \r
144         RigidShapeType type = RigidShapeType.decode(shapeType);\r
145         shape.setShapeType(type);\r
146 \r
147         return;\r
148     }\r
149 \r
150     /**\r
151      * {@inheritDoc}\r
152      * @param posX {@inheritDoc}\r
153      * @param posY {@inheritDoc}\r
154      * @param posZ {@inheritDoc}\r
155      */\r
156     @Override\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
162         return;\r
163     }\r
164 \r
165     /**\r
166      * {@inheritDoc}\r
167      * @param radX {@inheritDoc}\r
168      * @param radY {@inheritDoc}\r
169      * @param radZ {@inheritDoc}\r
170      */\r
171     @Override\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
177         return;\r
178     }\r
179 \r
180     /**\r
181      * {@inheritDoc}\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
187      */\r
188     @Override\r
189     public void pmdRigidPhysics(float mass,\r
190                                   float dampingPos,\r
191                                   float dampingRot,\r
192                                   float restitution,\r
193                                   float friction ){\r
194         DynamicsInfo info = this.currentRigid.getDynamicsInfo();\r
195 \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
201 \r
202         return;\r
203     }\r
204 \r
205     /**\r
206      * {@inheritDoc}\r
207      * @param behaveType {@inheritDoc}\r
208      * @param collisionMap {@inheritDoc}\r
209      */\r
210     @Override\r
211     public void pmdRigidBehavior(byte behaveType, short collisionMap){\r
212         RigidBehaviorType type = RigidBehaviorType.decode(behaveType);\r
213         this.currentRigid.setBehaviorType(type);\r
214 \r
215         for(int bitPos = 0; bitPos < PmdLimits.RIGIDGROUP_FIXEDNUM; bitPos++){\r
216             short mask = 0x0001;\r
217             mask <<= bitPos;\r
218             if((collisionMap & mask) == 0){\r
219                 RigidGroup group = this.rigidGroupList.get(bitPos);\r
220                 this.currentRigid.getThroughGroupColl().add(group);\r
221             }\r
222         }\r
223 \r
224         return;\r
225     }\r
226 \r
227 }\r