2 * dynamics xml exporter
4 * License : The MIT License
5 * Copyright(c) 2013 MikuToga Partners
8 package jp.sfjp.mikutoga.pmd.model.xml;
10 import java.io.IOException;
11 import java.util.Collection;
12 import java.util.List;
13 import jp.sfjp.mikutoga.corelib.I18nText;
14 import jp.sfjp.mikutoga.math.MkPos3D;
15 import jp.sfjp.mikutoga.pmd.Deg3d;
16 import jp.sfjp.mikutoga.pmd.Rad3d;
17 import jp.sfjp.mikutoga.pmd.RigidShapeType;
18 import jp.sfjp.mikutoga.pmd.TripletRange;
19 import jp.sfjp.mikutoga.pmd.model.BoneInfo;
20 import jp.sfjp.mikutoga.pmd.model.DynamicsInfo;
21 import jp.sfjp.mikutoga.pmd.model.JointInfo;
22 import jp.sfjp.mikutoga.pmd.model.PmdModel;
23 import jp.sfjp.mikutoga.pmd.model.RigidGroup;
24 import jp.sfjp.mikutoga.pmd.model.RigidInfo;
25 import jp.sfjp.mikutoga.pmd.model.RigidShape;
26 import jp.sfjp.mikutoga.xml.ProxyXmlExporter;
31 class ExporterDynamics extends ProxyXmlExporter {
33 private static final String LEAD_REF = "Ref:";
34 private static final String RIGIDBEHAVIOR_COMMENT =
35 "Rigid behavior types:\n"
36 + "[0 : FOLLOWBONE : ボーン追従 ]\n"
37 + "[1 : ONLYDYNAMICS : 物理演算 ]\n"
38 + "[2 : BONEDDYNAMICS : ボーン位置合わせ ]\n";
41 private final ExtraExporter exp;
48 ExporterDynamics(PmdXmlExporter delegate) {
50 this.exp = new ExtraExporter(delegate);
57 * @throws IOException 出力エラー
59 void putRigidList(PmdModel model)
61 ind().putSimpleSTag(PmdTag.RIGID_LIST.tag()).ln();
64 boolean dumped = false;
65 for(RigidInfo rigid : model.getRigidList()){
67 ln().putBlockComment(RIGIDBEHAVIOR_COMMENT).ln();
74 ind().putETag(PmdTag.RIGID_LIST.tag()).ln(2);
82 * @throws IOException 出力エラー
84 private void putRigid(RigidInfo rigid) throws IOException{
85 I18nText i18nName = rigid.getRigidName();
86 String primary = i18nName.getPrimaryText();
88 this.exp.putLocalNameComment(i18nName);
91 ind().putOpenSTag(PmdTag.RIGID.tag()).sp();
92 putAttr(PmdAttr.NAME.attr(), primary).sp();
93 this.exp.putNumberedIdAttr(PmdAttr.RIGID_ID,
94 ExtraExporter.PFX_RIGID, rigid);
96 putAttr(PmdAttr.BEHAVIOR.attr(),
97 rigid.getBehaviorType().name());
98 sp().putCloseSTag().ln();
101 this.exp.putI18nName(i18nName);
105 ind().putETag(PmdTag.RIGID.tag()).ln(2);
113 * @throws IOException 出力エラー
115 private void putRigidBody(RigidInfo rigid) throws IOException{
116 BoneInfo linkedBone = rigid.getLinkedBone();
117 putLinkedBone(linkedBone);
119 RigidShape shape = rigid.getRigidShape();
120 putRigidShape(shape);
122 MkPos3D position = rigid.getPosition();
124 this.exp.putPosition(position);
127 Rad3d rotation = rigid.getRotation();
129 this.exp.putRadRotation(rotation);
132 DynamicsInfo dynamics = rigid.getDynamicsInfo();
133 putDynamics(dynamics);
136 Collection<RigidGroup> throughGroup = rigid.getThroughGroupColl();
137 putThroughRigid(throughGroup);
144 * @param linkedBone 接続ボーン
145 * @throws IOException 出力エラー
147 private void putLinkedBone(BoneInfo linkedBone) throws IOException{
148 if(linkedBone == null) return;
150 ind().putOpenSTag(PmdTag.LINKED_BONE.tag()).sp();
151 this.exp.putNumberedIdAttr(PmdAttr.BONE_IDREF,
152 ExtraExporter.PFX_BONE,
156 sp().putLineComment(LEAD_REF + linkedBone.getBoneName().getText());
165 * @throws IOException 出力エラー
167 private void putRigidShape(RigidShape shape) throws IOException{
168 RigidShapeType type = shape.getShapeType();
172 ind().putOpenSTag(PmdTag.RIGID_SHAPE_BOX.tag()).sp();
173 putFloatAttr(PmdAttr.WIDTH.attr(),
174 shape.getWidth()).sp();
175 putFloatAttr(PmdAttr.HEIGHT.attr(),
176 shape.getHeight()).sp();
177 putFloatAttr(PmdAttr.DEPTH.attr(),
178 shape.getDepth()).sp();
181 ind().putOpenSTag(PmdTag.RIGID_SHAPE_SPHERE.tag()).sp();
182 putFloatAttr(PmdAttr.RADIUS.attr(),
183 shape.getRadius()).sp();
186 ind().putOpenSTag(PmdTag.RIGID_SHAPE_CAPSULE.tag()).sp();
187 putFloatAttr(PmdAttr.HEIGHT.attr(),
188 shape.getHeight()).sp();
189 putFloatAttr(PmdAttr.RADIUS.attr(),
190 shape.getRadius()).sp();
194 throw new AssertionError();
197 putCloseEmpty().ln();
204 * @param dynamics 力学設定
205 * @throws IOException 出力エラー
207 private void putDynamics(DynamicsInfo dynamics)
209 ind().putOpenSTag(PmdTag.DYNAMICS.tag()).ln();
211 ind().putFloatAttr(PmdAttr.MASS.attr(),
212 dynamics.getMass()).ln();
213 ind().putFloatAttr(PmdAttr.DAMPING_POSITION.attr(),
214 dynamics.getDampingPosition()).ln();
215 ind().putFloatAttr(PmdAttr.DAMPING_ROTATION.attr(),
216 dynamics.getDampingRotation()).ln();
217 ind().putFloatAttr(PmdAttr.RESTITUTION.attr(),
218 dynamics.getRestitution()).ln();
219 ind().putFloatAttr(PmdAttr.FRICTION.attr(),
220 dynamics.getFriction()).ln();
222 ind().putCloseEmpty().ln();
229 * @param groupColl 通過剛体グループ群
230 * @throws IOException 出力エラー
232 private void putThroughRigid(Collection<RigidGroup> groupColl)
234 for(RigidGroup group : groupColl){
235 ind().putOpenSTag(PmdTag.THROUGH_RIGID_GROUP.tag()).sp();
237 .putNumberedIdAttr(PmdAttr.RIGID_GROUP_IDREF,
238 ExtraExporter.PFX_RIGIDGROUP,
239 group.getSerialNumber() + 1);
241 putCloseEmpty().ln();
249 * @param model モデルデータ
250 * @throws IOException 出力エラー
252 void putRigidGroupList(PmdModel model)
254 ind().putSimpleSTag(PmdTag.RIGID_GROUP_LIST.tag()).ln(2);
257 boolean singleLast = false;
258 for(RigidGroup group : model.getRigidGroupList()){
259 List<RigidInfo> rigidList = group.getRigidList();
260 if(singleLast && ! rigidList.isEmpty()){
263 ind().putOpenSTag(PmdTag.RIGID_GROUP.tag()).sp();
264 this.exp.putNumberedIdAttr(PmdAttr.RIGID_GROUP_ID,
265 ExtraExporter.PFX_RIGIDGROUP,
266 group.getSerialNumber() + 1);
268 if(rigidList.isEmpty()){
269 putCloseEmpty().ln();
276 for(RigidInfo rigid : rigidList){
277 ind().putOpenSTag(PmdTag.RIGID_GROUP_MEMBER.tag()).sp();
278 this.exp.putNumberedIdAttr(PmdAttr.RIGID_IDREF,
279 ExtraExporter.PFX_RIGID, rigid);
283 putLineComment(LEAD_REF + rigid.getRigidName().getText());
288 ind().putETag(PmdTag.RIGID_GROUP.tag()).ln(2);
297 ind().putETag(PmdTag.RIGID_GROUP_LIST.tag()).ln(2);
304 * @param model モデルデータ
305 * @throws IOException 出力エラー
307 void putJointList(PmdModel model)
309 ind().putSimpleSTag(PmdTag.JOINT_LIST.tag()).ln();
312 boolean dumped = false;
313 List<JointInfo> jointList = model.getJointList();
314 for(JointInfo joint : jointList){
321 ind().putETag(PmdTag.JOINT_LIST.tag()).ln(2);
328 * @param joint ジョイント情報
329 * @throws IOException 出力エラー
331 private void putJoint(JointInfo joint)
333 I18nText i18nName = joint.getJointName();
335 this.exp.putLocalNameComment(i18nName);
337 ind().putOpenSTag(PmdTag.JOINT.tag()).sp();
338 this.exp.putPrimaryNameAttr(PmdAttr.NAME, i18nName);
339 sp().putCloseSTag().ln();
342 this.exp.putI18nName(i18nName);
344 RigidInfo rigidA = joint.getRigidA();
345 RigidInfo rigidB = joint.getRigidB();
350 + rigidA.getRigidName().getText()
351 + "]\u0020<=>\u0020["
352 + rigidB.getRigidName().getText()
356 ind().putOpenSTag(PmdTag.JOINTED_RIGID_PAIR.tag()).sp();
357 this.exp.putNumberedIdAttr(PmdAttr.RIGID_IDREF_1,
358 ExtraExporter.PFX_RIGID, rigidA);
360 this.exp.putNumberedIdAttr(PmdAttr.RIGID_IDREF_2,
361 ExtraExporter.PFX_RIGID, rigidB);
363 putCloseEmpty().ln(2);
365 putJointLimit(joint);
366 putJointElastic(joint);
369 ind().putETag(PmdTag.JOINT.tag()).ln(2);
376 * @param joint ジョイント情報
377 * @throws IOException 出力エラー
379 private void putJointLimit(JointInfo joint)
381 MkPos3D position = joint.getPosition();
383 this.exp.putPosition(position);
386 ind().putOpenSTag(PmdTag.LIMIT_POSITION.tag()).ln();
388 TripletRange posRange = joint.getPositionRange();
389 putTripletRangeAttr(posRange);
391 ind().putCloseEmpty().ln(2);
393 Rad3d rotation = joint.getRotation();
395 this.exp.putRadRotation(rotation);
398 ind().putOpenSTag(PmdTag.LIMIT_ROTATION.tag()).ln();
400 TripletRange rotRange = joint.getRotationRange();
401 putTripletRangeAttr(rotRange);
403 ind().putCloseEmpty().ln(2);
411 * @throws IOException 出力エラー
413 private void putTripletRangeAttr(TripletRange range)
416 putFloatAttr(PmdAttr.X_FROM.attr(), range.getXFrom()).sp();
417 putFloatAttr(PmdAttr.X_TO.attr(), range.getXTo() ).ln();
420 putFloatAttr(PmdAttr.Y_FROM.attr(), range.getYFrom()).sp();
421 putFloatAttr(PmdAttr.Y_TO.attr(), range.getYTo() ).ln();
424 putFloatAttr(PmdAttr.Z_FROM.attr(), range.getZFrom()).sp();
425 putFloatAttr(PmdAttr.Z_TO.attr(), range.getZTo() ).ln();
432 * @param joint ジョイント情報
433 * @throws IOException 出力エラー
435 private void putJointElastic(JointInfo joint)
437 ind().putOpenSTag(PmdTag.ELASTIC_POSITION.tag()).sp();
438 MkPos3D elaPosition = joint.getElasticPosition();
439 putFloatAttr(PmdAttr.X.attr(),
440 (float) elaPosition.getXpos()).sp();
441 putFloatAttr(PmdAttr.Y.attr(),
442 (float) elaPosition.getYpos()).sp();
443 putFloatAttr(PmdAttr.Z.attr(),
444 (float) elaPosition.getZpos()).sp();
445 putCloseEmpty().ln();
447 ind().putOpenSTag(PmdTag.ELASTIC_ROTATION.tag()).sp();
448 Deg3d elaRotation = joint.getElasticRotation();
449 putFloatAttr(PmdAttr.X_DEG.attr(),
450 elaRotation.getXDeg()).sp();
451 putFloatAttr(PmdAttr.Y_DEG.attr(),
452 elaRotation.getYDeg()).sp();
453 putFloatAttr(PmdAttr.Z_DEG.attr(),
454 elaRotation.getZDeg()).sp();
455 putCloseEmpty().ln(2);