2
0
Эх сурвалжийг харах

- add serialization for KinematicRagdollControl (TODO: presets)

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10372 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
nor..67 12 жил өмнө
parent
commit
f29b7fadab

+ 71 - 4
engine/src/bullet-common/com/jme3/bullet/control/KinematicRagdollControl.java

@@ -51,6 +51,7 @@ import com.jme3.export.InputCapsule;
 import com.jme3.export.JmeExporter;
 import com.jme3.export.JmeImporter;
 import com.jme3.export.OutputCapsule;
+import com.jme3.export.Savable;
 import com.jme3.math.Quaternion;
 import com.jme3.math.Vector3f;
 import com.jme3.renderer.RenderManager;
@@ -123,15 +124,18 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
         Ragdoll
     }
 
-    public class PhysicsBoneLink {
+    public class PhysicsBoneLink implements Savable {
 
-        protected Bone bone;
         protected PhysicsRigidBody rigidBody;
-        protected Quaternion initalWorldRotation;
+        protected Bone bone;
         protected SixDofJoint joint;
+        protected Quaternion initalWorldRotation;
         protected Quaternion startBlendingRot = new Quaternion();
         protected Vector3f startBlendingPos = new Vector3f();
 
+        public PhysicsBoneLink() {
+        }
+
         public Bone getBone() {
             return bone;
         }
@@ -139,6 +143,26 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
         public PhysicsRigidBody getRigidBody() {
             return rigidBody;
         }
+
+        public void write(JmeExporter ex) throws IOException {
+            OutputCapsule oc = ex.getCapsule(this);
+            oc.write(rigidBody, "rigidBody", null);
+            oc.write(bone, "bone", null);
+            oc.write(joint, "joint", null);
+            oc.write(initalWorldRotation, "initalWorldRotation", null);
+            oc.write(startBlendingRot, "startBlendingRot", new Quaternion());
+            oc.write(startBlendingPos, "startBlendingPos", new Vector3f());
+        }
+
+        public void read(JmeImporter im) throws IOException {
+            InputCapsule ic = im.getCapsule(this);
+            rigidBody = (PhysicsRigidBody) ic.readSavable("rigidBody", null);
+            bone = (Bone) ic.readSavable("bone", null);
+            joint = (SixDofJoint) ic.readSavable("joint", null);
+            initalWorldRotation = (Quaternion) ic.readSavable("initalWorldRotation", null);
+            startBlendingRot = (Quaternion) ic.readSavable("startBlendingRot", null);
+            startBlendingPos = (Vector3f) ic.readSavable("startBlendingPos", null);
+        }
     }
 
     /**
@@ -771,7 +795,12 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
     }
 
     public Control cloneForSpatial(Spatial spatial) {
-        throw new UnsupportedOperationException("Not supported yet.");
+        KinematicRagdollControl control = new KinematicRagdollControl(preset, weightThreshold);
+        control.setMode(mode);
+        control.setRootMass(rootMass);
+        control.setWeightThreshold(weightThreshold);
+        control.setApplyPhysicsLocal(applyLocal);
+        return control;
     }
 
     /**
@@ -783,6 +812,22 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
     public void write(JmeExporter ex) throws IOException {
         super.write(ex);
         OutputCapsule oc = ex.getCapsule(this);
+        oc.write(boneList.toArray(new String[boneList.size()]), "boneList", new String[0]);
+        oc.write(boneLinks.values().toArray(new PhysicsBoneLink[boneLinks.size()]), "boneLinks", new PhysicsBoneLink[0]);
+        oc.write(modelPosition, "modelPosition", new Vector3f());
+        oc.write(modelRotation, "modelRotation", new Quaternion());
+        oc.write(targetModel, "targetModel", null);
+        oc.write(skeleton, "skeleton", null);
+//        oc.write(preset, "preset", null);//TODO
+        oc.write(initScale, "initScale", null);
+        oc.write(mode, "mode", null);
+        oc.write(blendedControl, "blendedControl", false);
+        oc.write(weightThreshold, "weightThreshold", -1.0f);
+        oc.write(blendStart, "blendStart", 0.0f);
+        oc.write(blendTime, "blendTime", 1.0f);
+        oc.write(eventDispatchImpulseThreshold, "eventDispatchImpulseThreshold", 10);
+        oc.write(rootMass, "rootMass", 15);
+        oc.write(totalMass, "totalMass", 0);
     }
 
     /**
@@ -794,5 +839,27 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
     public void read(JmeImporter im) throws IOException {
         super.read(im);
         InputCapsule ic = im.getCapsule(this);
+        String[] loadedBoneList = ic.readStringArray("boneList", new String[0]);
+        for (String string : loadedBoneList) {
+            boneList.add(string);
+        }
+        PhysicsBoneLink[] loadedBoneLinks = (PhysicsBoneLink[])ic.readSavableArray("boneList", new PhysicsBoneLink[0]);
+        for (PhysicsBoneLink physicsBoneLink : loadedBoneLinks) {
+            boneLinks.put(physicsBoneLink.bone.getName(), physicsBoneLink);
+        }
+        modelPosition.set((Vector3f) ic.readSavable("modelPosition", new Vector3f()));
+        modelRotation.set((Quaternion) ic.readSavable("modelRotation", new Quaternion()));
+        targetModel = (Spatial) ic.readSavable("targetModel", null);
+        skeleton = (Skeleton) ic.readSavable("skeleton", null);
+//        preset //TODO
+        initScale = (Vector3f) ic.readSavable("initScale", null);
+        mode = ic.readEnum("mode", Mode.class, Mode.Kinematic);
+        blendedControl = ic.readBoolean("blendedControl", false);
+        weightThreshold = ic.readFloat("weightThreshold", -1.0f);
+        blendStart = ic.readFloat("blendStart", 0.0f);
+        blendTime = ic.readFloat("blendTime", 1.0f);
+        eventDispatchImpulseThreshold = ic.readFloat("eventDispatchImpulseThreshold", 10);
+        rootMass = ic.readFloat("rootMass", 15);
+        totalMass = ic.readFloat("totalMass", 0);
     }
 }