159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/*
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * To change this template, choose Tools | Templates
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * and open the template in the editor.
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.bullet.control;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.PhysicsSpace;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.shapes.BoxCollisionShape;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.shapes.CollisionShape;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.collision.shapes.SphereCollisionShape;
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.objects.PhysicsRigidBody;
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.util.CollisionShapeFactory;
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.InputCapsule;
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeExporter;
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeImporter;
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.OutputCapsule;
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Quaternion;
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f;
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.RenderManager;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.renderer.ViewPort;
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Geometry;
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Mesh;
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Spatial;
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.control.Control;
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.shape.Box;
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.shape.Sphere;
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException;
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author normenhansen
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl {
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected Spatial spatial;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected boolean enabled = true;
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected boolean added = false;
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected PhysicsSpace space = null;
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected boolean kinematicSpatial = true;
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public RigidBodyControl() {
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * When using this constructor, the CollisionShape for the RigidBody is generated
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * automatically when the Control is added to a Spatial.
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param mass When not 0, a HullCollisionShape is generated, otherwise a MeshCollisionShape is used. For geometries with box or sphere meshes the proper box or sphere collision shape is used.
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public RigidBodyControl(float mass) {
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.mass = mass;
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Creates a new PhysicsNode with the supplied collision shape and mass 1
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param shape
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public RigidBodyControl(CollisionShape shape) {
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super(shape);
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public RigidBodyControl(CollisionShape shape, float mass) {
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super(shape, mass);
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Control cloneForSpatial(Spatial spatial) {
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        RigidBodyControl control = new RigidBodyControl(collisionShape, mass);
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setAngularFactor(getAngularFactor());
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setAngularSleepingThreshold(getAngularSleepingThreshold());
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setCcdMotionThreshold(getCcdMotionThreshold());
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setCcdSweptSphereRadius(getCcdSweptSphereRadius());
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setCollideWithGroups(getCollideWithGroups());
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setCollisionGroup(getCollisionGroup());
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setDamping(getLinearDamping(), getAngularDamping());
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setFriction(getFriction());
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setGravity(getGravity());
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setKinematic(isKinematic());
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setKinematicSpatial(isKinematicSpatial());
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setLinearSleepingThreshold(getLinearSleepingThreshold());
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setPhysicsLocation(getPhysicsLocation(null));
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setPhysicsRotation(getPhysicsRotationMatrix(null));
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setRestitution(getRestitution());
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mass > 0) {
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            control.setAngularVelocity(getAngularVelocity());
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            control.setLinearVelocity(getLinearVelocity());
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setApplyPhysicsLocal(isApplyPhysicsLocal());
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        control.setSpatial(spatial);
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return control;
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setSpatial(Spatial spatial) {
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (getUserObject() == null || getUserObject() == this.spatial) {
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            setUserObject(spatial);
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.spatial = spatial;
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (spatial == null) {
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (getUserObject() == spatial) {
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                setUserObject(null);
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            spatial = null;
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            collisionShape = null;
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (collisionShape == null) {
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            createCollisionShape();
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            rebuildRigidBody();
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setPhysicsLocation(getSpatialTranslation());
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setPhysicsRotation(getSpatialRotation());
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    protected void createCollisionShape() {
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (spatial == null) {
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return;
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (spatial instanceof Geometry) {
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Geometry geom = (Geometry) spatial;
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Mesh mesh = geom.getMesh();
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (mesh instanceof Sphere) {
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                collisionShape = new SphereCollisionShape(((Sphere) mesh).getRadius());
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return;
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            } else if (mesh instanceof Box) {
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                collisionShape = new BoxCollisionShape(new Vector3f(((Box) mesh).getXExtent(), ((Box) mesh).getYExtent(), ((Box) mesh).getZExtent()));
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return;
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mass > 0) {
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            collisionShape = CollisionShapeFactory.createDynamicMeshShape(spatial);
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        } else {
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            collisionShape = CollisionShapeFactory.createMeshShape(spatial);
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setEnabled(boolean enabled) {
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.enabled = enabled;
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (space != null) {
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (enabled && !added) {
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (spatial != null) {
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    setPhysicsLocation(getSpatialTranslation());
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    setPhysicsRotation(getSpatialRotation());
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                space.addCollisionObject(this);
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                added = true;
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            } else if (!enabled && added) {
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                space.removeCollisionObject(this);
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                added = false;
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean isEnabled() {
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return enabled;
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Checks if this control is in kinematic spatial mode.
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @return true if the spatial location is applied to this kinematic rigidbody
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean isKinematicSpatial() {
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return kinematicSpatial;
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Sets this control to kinematic spatial mode so that the spatials transform will
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * be applied to the rigidbody in kinematic mode, defaults to true.
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param kinematicSpatial
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setKinematicSpatial(boolean kinematicSpatial) {
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.kinematicSpatial = kinematicSpatial;
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean isApplyPhysicsLocal() {
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return motionState.isApplyPhysicsLocal();
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * When set to true, the physics coordinates will be applied to the local
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * translation of the Spatial instead of the world traslation.
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param applyPhysicsLocal
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setApplyPhysicsLocal(boolean applyPhysicsLocal) {
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        motionState.setApplyPhysicsLocal(applyPhysicsLocal);
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private Vector3f getSpatialTranslation(){
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if(motionState.isApplyPhysicsLocal()){
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return spatial.getLocalTranslation();
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return spatial.getWorldTranslation();
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private Quaternion getSpatialRotation(){
19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if(motionState.isApplyPhysicsLocal()){
19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            return spatial.getLocalRotation();
19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return spatial.getWorldRotation();
19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void update(float tpf) {
20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (enabled && spatial != null) {
20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (isKinematic() && kinematicSpatial) {
20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                super.setPhysicsLocation(getSpatialTranslation());
20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                super.setPhysicsRotation(getSpatialRotation());
20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            } else {
20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                getMotionState().applyTransform(spatial);
20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void render(RenderManager rm, ViewPort vp) {
21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (enabled && space != null && space.getDebugManager() != null) {
21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (debugShape == null) {
21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                attachDebugShape(space.getDebugManager());
21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            //TODO: using spatial traslation/rotation..
21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            debugShape.setLocalTranslation(spatial.getWorldTranslation());
21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            debugShape.setLocalRotation(spatial.getWorldRotation());
22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            debugShape.updateLogicalState(0);
22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            debugShape.updateGeometricState();
22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            rm.renderScene(debugShape, vp);
22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setPhysicsSpace(PhysicsSpace space) {
22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (space == null) {
22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (this.space != null) {
22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                this.space.removeCollisionObject(this);
23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                added = false;
23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        } else {
23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if(this.space==space) return;
23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            space.addCollisionObject(this);
23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            added = true;
23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.space = space;
23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public PhysicsSpace getPhysicsSpace() {
24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return space;
24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void write(JmeExporter ex) throws IOException {
24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super.write(ex);
24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        OutputCapsule oc = ex.getCapsule(this);
24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        oc.write(enabled, "enabled", true);
24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        oc.write(motionState.isApplyPhysicsLocal(), "applyLocalPhysics", false);
25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        oc.write(kinematicSpatial, "kinematicSpatial", true);
25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        oc.write(spatial, "spatial", null);
25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void read(JmeImporter im) throws IOException {
25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super.read(im);
25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        InputCapsule ic = im.getCapsule(this);
25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        enabled = ic.readBoolean("enabled", true);
25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        kinematicSpatial = ic.readBoolean("kinematicSpatial", true);
26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        spatial = (Spatial) ic.readSavable("spatial", null);
26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        motionState.setApplyPhysicsLocal(ic.readBoolean("applyLocalPhysics", false));
26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setUserObject(spatial);
26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
265