- add abstraction level for spatial data creation to AbstractPhysicsControl

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10371 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
nor..67 12 years ago
parent 887c13142f
commit 9514355b82
  1. 23
      engine/src/bullet-common/com/jme3/bullet/control/AbstractPhysicsControl.java
  2. 22
      engine/src/bullet-common/com/jme3/bullet/control/BetterCharacterControl.java
  3. 26
      engine/src/bullet-common/com/jme3/bullet/control/KinematicRagdollControl.java

@ -58,6 +58,22 @@ public abstract class AbstractPhysicsControl implements PhysicsControl {
protected PhysicsSpace space = null; protected PhysicsSpace space = null;
protected boolean applyLocal = false; protected boolean applyLocal = false;
/**
* Called when the control is added to a new spatial, create any
* spatial-dependent data here.
*
* @param spat The new spatial, guaranteed not to be null
*/
protected abstract void createSpatialData(Spatial spat);
/**
* Called when the control is removed from a spatial, remove any
* spatial-dependent data here.
*
* @param spat The old spatial, guaranteed not to be null
*/
protected abstract void removeSpatialData(Spatial spat);
/** /**
* Called when the physics object is supposed to move to the spatial * Called when the physics object is supposed to move to the spatial
* position. * position.
@ -146,10 +162,17 @@ public abstract class AbstractPhysicsControl implements PhysicsControl {
} }
public void setSpatial(Spatial spatial) { public void setSpatial(Spatial spatial) {
if (this.spatial != null && this.spatial != spatial) {
removeSpatialData(this.spatial);
}
else if (this.spatial == spatial) {
return;
}
this.spatial = spatial; this.spatial = spatial;
if (spatial == null) { if (spatial == null) {
return; return;
} }
createSpatialData(this.spatial);
setPhysicsLocation(getSpatialTranslation()); setPhysicsLocation(getSpatialTranslation());
setPhysicsRotation(getSpatialRotation()); setPhysicsRotation(getSpatialRotation());
} }

@ -602,18 +602,6 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph
location.set(vec); location.set(vec);
} }
/**
* We set the current spatial as UserObject so the user can find his
* spatial.
*
* @param spatial
*/
@Override
public void setSpatial(Spatial spatial) {
super.setSpatial(spatial);
rigidBody.setUserObject(spatial);
}
/** /**
* This is implemented from AbstractPhysicsControl and called when the * This is implemented from AbstractPhysicsControl and called when the
* spatial is attached for example. We don't set the actual physics rotation * spatial is attached for example. We don't set the actual physics rotation
@ -656,6 +644,16 @@ public class BetterCharacterControl extends AbstractPhysicsControl implements Ph
space.removeTickListener(this); space.removeTickListener(this);
} }
@Override
protected void createSpatialData(Spatial spat) {
rigidBody.setUserObject(spatial);
}
@Override
protected void removeSpatialData(Spatial spat) {
rigidBody.setUserObject(null);
}
public Control cloneForSpatial(Spatial spatial) { public Control cloneForSpatial(Spatial spatial) {
BetterCharacterControl control = new BetterCharacterControl(radius, height, mass); BetterCharacterControl control = new BetterCharacterControl(radius, height, mass);
control.setJumpForce(jumpForce); control.setJumpForce(jumpForce);

@ -102,7 +102,7 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
protected final Map<String, PhysicsBoneLink> boneLinks = new HashMap<String, PhysicsBoneLink>(); protected final Map<String, PhysicsBoneLink> boneLinks = new HashMap<String, PhysicsBoneLink>();
protected final Vector3f modelPosition = new Vector3f(); protected final Vector3f modelPosition = new Vector3f();
protected final Quaternion modelRotation = new Quaternion(); protected final Quaternion modelRotation = new Quaternion();
protected PhysicsRigidBody baseRigidBody; protected final PhysicsRigidBody baseRigidBody;
protected Spatial targetModel; protected Spatial targetModel;
protected Skeleton skeleton; protected Skeleton skeleton;
protected RagdollPreset preset = new HumanoidRagdollPreset(); protected RagdollPreset preset = new HumanoidRagdollPreset();
@ -145,18 +145,23 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
* contruct a KinematicRagdollControl * contruct a KinematicRagdollControl
*/ */
public KinematicRagdollControl() { public KinematicRagdollControl() {
baseRigidBody = new PhysicsRigidBody(new BoxCollisionShape(Vector3f.UNIT_XYZ.mult(0.1f)), 1);
baseRigidBody.setKinematic(mode == Mode.Kinematic);
} }
public KinematicRagdollControl(float weightThreshold) { public KinematicRagdollControl(float weightThreshold) {
this();
this.weightThreshold = weightThreshold; this.weightThreshold = weightThreshold;
} }
public KinematicRagdollControl(RagdollPreset preset, float weightThreshold) { public KinematicRagdollControl(RagdollPreset preset, float weightThreshold) {
this();
this.preset = preset; this.preset = preset;
this.weightThreshold = weightThreshold; this.weightThreshold = weightThreshold;
} }
public KinematicRagdollControl(RagdollPreset preset) { public KinematicRagdollControl(RagdollPreset preset) {
this();
this.preset = preset; this.preset = preset;
} }
@ -307,16 +312,10 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
} }
@Override @Override
public void setSpatial(Spatial model) { protected void createSpatialData(Spatial model) {
super.setSpatial(model);
if (added) { if (added) {
removePhysics(space); removePhysics(space);
} }
boneLinks.clear();
baseRigidBody = null;
if (model == null) {
return;
}
targetModel = model; targetModel = model;
Node parent = model.getParent(); Node parent = model.getParent();
@ -355,6 +354,15 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
logger.log(Level.FINE, "Created physics ragdoll for skeleton {0}", skeleton); logger.log(Level.FINE, "Created physics ragdoll for skeleton {0}", skeleton);
} }
@Override
protected void removeSpatialData(Spatial spat) {
if (added) {
removePhysics(space);
added = false;
}
boneLinks.clear();
}
/** /**
* Add a bone name to this control Using this method you can specify which * Add a bone name to this control Using this method you can specify which
* bones of the skeleton will be used to build the collision shapes. * bones of the skeleton will be used to build the collision shapes.
@ -378,8 +386,6 @@ public class KinematicRagdollControl extends AbstractPhysicsControl implements P
Bone childBone = skeleton.getRoots()[i]; Bone childBone = skeleton.getRoots()[i];
if (childBone.getParent() == null) { if (childBone.getParent() == null) {
logger.log(Level.FINE, "Found root bone in skeleton {0}", skeleton); logger.log(Level.FINE, "Found root bone in skeleton {0}", skeleton);
baseRigidBody = new PhysicsRigidBody(new BoxCollisionShape(Vector3f.UNIT_XYZ.mult(0.1f)), 1);
baseRigidBody.setKinematic(mode == Mode.Kinematic);
boneRecursion(model, childBone, baseRigidBody, 1, pointsMap); boneRecursion(model, childBone, baseRigidBody, 1, pointsMap);
} }
} }

Loading…
Cancel
Save