- add abstraction level for spatial data creation to AbstractPhysicsControl
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10371 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
887c13142f
commit
9514355b82
@ -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…
x
Reference in New Issue
Block a user