OSDN Git Service

45a5d7935b94d3f3ea03b2ec00da18fab868798f
[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 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
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     public void loopStart(ParseStage stage, int loops){\r
58         ListUtil.prepareDefConsList(this.rigidList, RigidInfo.class, loops);\r
59         ListUtil.assignIndexedSerial(this.rigidList);\r
60 \r
61         this.rigidIt = this.rigidList.iterator();\r
62         if(this.rigidIt.hasNext()){\r
63             this.currentRigid = this.rigidIt.next();\r
64         }\r
65 \r
66         ListUtil.prepareDefConsList(this.rigidGroupList,\r
67                                     RigidGroup.class,\r
68                                     PmdLimits.RIGIDGROUP_FIXEDNUM );\r
69         ListUtil.assignIndexedSerial(this.rigidGroupList);\r
70 \r
71         return;\r
72     }\r
73 \r
74     /**\r
75      * {@inheritDoc}\r
76      * @param stage {@inheritDoc}\r
77      */\r
78     public void loopNext(ParseStage stage){\r
79         if(this.rigidIt.hasNext()){\r
80             this.currentRigid = this.rigidIt.next();\r
81         }\r
82         return;\r
83     }\r
84 \r
85     /**\r
86      * {@inheritDoc}\r
87      * @param stage {@inheritDoc}\r
88      */\r
89     public void loopEnd(ParseStage stage){\r
90         return;\r
91     }\r
92 \r
93     /**\r
94      * {@inheritDoc}\r
95      * @param rigidName {@inheritDoc}\r
96      */\r
97     public void pmdRigidName(String rigidName){\r
98         this.currentRigid.getRigidName().setPrimaryText(rigidName);\r
99         return;\r
100     }\r
101 \r
102     /**\r
103      * {@inheritDoc}\r
104      * @param rigidGroupId {@inheritDoc}\r
105      * @param linkedBoneId {@inheritDoc}\r
106      */\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
110 \r
111         this.currentRigid.setLinkedBone(bone);\r
112         this.currentRigid.setRigidGroup(group);\r
113         group.getRigidList().add(this.currentRigid);\r
114 \r
115         return;\r
116     }\r
117 \r
118     /**\r
119      * {@inheritDoc}\r
120      * @param shapeType {@inheritDoc}\r
121      * @param width {@inheritDoc}\r
122      * @param height {@inheritDoc}\r
123      * @param depth {@inheritDoc}\r
124      */\r
125     public void pmdRigidShape(byte shapeType,\r
126                               float width, float height, float depth){\r
127         RigidShape shape = this.currentRigid.getRigidShape();\r
128 \r
129         shape.setWidth(width);\r
130         shape.setHeight(height);\r
131         shape.setDepth(depth);\r
132 \r
133         RigidShapeType type = RigidShapeType.decode(shapeType);\r
134         shape.setShapeType(type);\r
135 \r
136         return;\r
137     }\r
138 \r
139     /**\r
140      * {@inheritDoc}\r
141      * @param posX {@inheritDoc}\r
142      * @param posY {@inheritDoc}\r
143      * @param posZ {@inheritDoc}\r
144      */\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
150         return;\r
151     }\r
152 \r
153     /**\r
154      * {@inheritDoc}\r
155      * @param radX {@inheritDoc}\r
156      * @param radY {@inheritDoc}\r
157      * @param radZ {@inheritDoc}\r
158      */\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
164         return;\r
165     }\r
166 \r
167     /**\r
168      * {@inheritDoc}\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
174      */\r
175     public void pmdRigidPhysics(float mass,\r
176                                   float dampingPos,\r
177                                   float dampingRot,\r
178                                   float restitution,\r
179                                   float friction ){\r
180         DynamicsInfo info = this.currentRigid.getDynamicsInfo();\r
181 \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
187 \r
188         return;\r
189     }\r
190 \r
191     /**\r
192      * {@inheritDoc}\r
193      * @param behaveType {@inheritDoc}\r
194      * @param collisionMap {@inheritDoc}\r
195      */\r
196     public void pmdRigidBehavior(byte behaveType, short collisionMap){\r
197         RigidBehaviorType type = RigidBehaviorType.decode(behaveType);\r
198         this.currentRigid.setBehaviorType(type);\r
199 \r
200         for(int bitPos = 0; bitPos < PmdLimits.RIGIDGROUP_FIXEDNUM; bitPos++){\r
201             short mask = 0x0001;\r
202             mask <<= bitPos;\r
203             if((collisionMap & mask) == 0){\r
204                 RigidGroup group = this.rigidGroupList.get(bitPos);\r
205                 this.currentRigid.getThroughGroupColl().add(group);\r
206             }\r
207         }\r
208 \r
209         return;\r
210     }\r
211 \r
212 }\r