Merge pull request #165 from davidB/wip_jbullet_update
jbullet: refactor PhysiscSpace.addAll/removeAll
This commit is contained in:
commit
656886867d
@ -434,12 +434,11 @@ public class PhysicsSpace {
|
|||||||
* @param obj the PhysicsControl or Spatial with PhysicsControl to remove
|
* @param obj the PhysicsControl or Spatial with PhysicsControl to remove
|
||||||
*/
|
*/
|
||||||
public void remove(Object obj) {
|
public void remove(Object obj) {
|
||||||
|
if (obj == null) return;
|
||||||
if (obj instanceof PhysicsControl) {
|
if (obj instanceof PhysicsControl) {
|
||||||
((PhysicsControl) obj).setPhysicsSpace(null);
|
((PhysicsControl) obj).setPhysicsSpace(null);
|
||||||
} else if (obj instanceof Spatial) {
|
} else if (obj instanceof Spatial) {
|
||||||
Spatial node = (Spatial) obj;
|
remove(((Spatial) obj).getControl(PhysicsControl.class));
|
||||||
PhysicsControl control = node.getControl(PhysicsControl.class);
|
|
||||||
control.setPhysicsSpace(null);
|
|
||||||
} else if (obj instanceof PhysicsCollisionObject) {
|
} else if (obj instanceof PhysicsCollisionObject) {
|
||||||
removeCollisionObject((PhysicsCollisionObject) obj);
|
removeCollisionObject((PhysicsCollisionObject) obj);
|
||||||
} else if (obj instanceof PhysicsJoint) {
|
} else if (obj instanceof PhysicsJoint) {
|
||||||
@ -460,34 +459,25 @@ public class PhysicsSpace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* adds all physics controls and joints in the given spatial node to the
|
* adds all physics controls and joints in the given spatial node to the physics space
|
||||||
* physics space (e.g. after loading from disk) - recursive if node
|
* (e.g. after loading from disk) - recursive if node
|
||||||
*
|
|
||||||
* @param spatial the rootnode containing the physics objects
|
* @param spatial the rootnode containing the physics objects
|
||||||
*/
|
*/
|
||||||
public void addAll(Spatial spatial) {
|
public void addAll(Spatial spatial) {
|
||||||
if (spatial.getControl(RigidBodyControl.class) != null) {
|
if (spatial.getControl(RigidBodyControl.class) != null) {
|
||||||
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
||||||
physicsNode.setPhysicsSpace(this);
|
add(physicsNode);
|
||||||
//add joints
|
//add joints with physicsNode as BodyA
|
||||||
List<PhysicsJoint> joints = physicsNode.getJoints();
|
List<PhysicsJoint> joints = physicsNode.getJoints();
|
||||||
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
||||||
PhysicsJoint physicsJoint = it1.next();
|
PhysicsJoint physicsJoint = it1.next();
|
||||||
//add connected physicsnodes if they are not already added
|
if (physicsNode.equals(physicsJoint.getBodyA())) {
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
//add(physicsJoint.getBodyB());
|
||||||
add(physicsJoint.getBodyA());
|
add(physicsJoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
addRigidBody(physicsJoint.getBodyA());
|
add(spatial);
|
||||||
}
|
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
|
||||||
add(physicsJoint.getBodyB());
|
|
||||||
} else {
|
|
||||||
addRigidBody(physicsJoint.getBodyB());
|
|
||||||
}
|
|
||||||
addJoint(physicsJoint);
|
|
||||||
}
|
|
||||||
} else if (spatial.getControl(PhysicsControl.class) != null) {
|
|
||||||
spatial.getControl(PhysicsControl.class).setPhysicsSpace(this);
|
|
||||||
}
|
}
|
||||||
//recursion
|
//recursion
|
||||||
if (spatial instanceof Node) {
|
if (spatial instanceof Node) {
|
||||||
@ -500,34 +490,25 @@ public class PhysicsSpace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes all physics controls and joints in the given spatial from the
|
* Removes all physics controls and joints in the given spatial from the physics space
|
||||||
* physics space (e.g. before saving to disk) - recursive if node
|
* (e.g. before saving to disk) - recursive if node
|
||||||
*
|
|
||||||
* @param spatial the rootnode containing the physics objects
|
* @param spatial the rootnode containing the physics objects
|
||||||
*/
|
*/
|
||||||
public void removeAll(Spatial spatial) {
|
public void removeAll(Spatial spatial) {
|
||||||
if (spatial.getControl(RigidBodyControl.class) != null) {
|
if (spatial.getControl(RigidBodyControl.class) != null) {
|
||||||
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
||||||
physicsNode.setPhysicsSpace(null);
|
//remove joints with physicsNode as BodyA
|
||||||
//remove joints
|
|
||||||
List<PhysicsJoint> joints = physicsNode.getJoints();
|
List<PhysicsJoint> joints = physicsNode.getJoints();
|
||||||
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
||||||
PhysicsJoint physicsJoint = it1.next();
|
PhysicsJoint physicsJoint = it1.next();
|
||||||
//add connected physicsnodes if they are not already added
|
if (physicsNode.equals(physicsJoint.getBodyA())) {
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
|
||||||
remove(physicsJoint.getBodyA());
|
|
||||||
} else {
|
|
||||||
removeRigidBody(physicsJoint.getBodyA());
|
|
||||||
}
|
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
|
||||||
remove(physicsJoint.getBodyB());
|
|
||||||
} else {
|
|
||||||
removeRigidBody(physicsJoint.getBodyB());
|
|
||||||
}
|
|
||||||
removeJoint(physicsJoint);
|
removeJoint(physicsJoint);
|
||||||
|
//remove(physicsJoint.getBodyB());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
remove(physicsNode);
|
||||||
} else if (spatial.getControl(PhysicsControl.class) != null) {
|
} else if (spatial.getControl(PhysicsControl.class) != null) {
|
||||||
spatial.getControl(PhysicsControl.class).setPhysicsSpace(null);
|
remove(spatial);
|
||||||
}
|
}
|
||||||
//recursion
|
//recursion
|
||||||
if (spatial instanceof Node) {
|
if (spatial instanceof Node) {
|
||||||
|
@ -35,10 +35,22 @@ import com.bulletphysics.BulletGlobals;
|
|||||||
import com.bulletphysics.ContactAddedCallback;
|
import com.bulletphysics.ContactAddedCallback;
|
||||||
import com.bulletphysics.ContactDestroyedCallback;
|
import com.bulletphysics.ContactDestroyedCallback;
|
||||||
import com.bulletphysics.ContactProcessedCallback;
|
import com.bulletphysics.ContactProcessedCallback;
|
||||||
import com.bulletphysics.collision.broadphase.*;
|
import com.bulletphysics.collision.broadphase.AxisSweep3;
|
||||||
import com.bulletphysics.collision.dispatch.*;
|
import com.bulletphysics.collision.broadphase.AxisSweep3_32;
|
||||||
|
import com.bulletphysics.collision.broadphase.BroadphaseInterface;
|
||||||
|
import com.bulletphysics.collision.broadphase.BroadphaseProxy;
|
||||||
|
import com.bulletphysics.collision.broadphase.CollisionFilterGroups;
|
||||||
|
import com.bulletphysics.collision.broadphase.DbvtBroadphase;
|
||||||
|
import com.bulletphysics.collision.broadphase.OverlapFilterCallback;
|
||||||
|
import com.bulletphysics.collision.broadphase.SimpleBroadphase;
|
||||||
|
import com.bulletphysics.collision.dispatch.CollisionDispatcher;
|
||||||
|
import com.bulletphysics.collision.dispatch.CollisionObject;
|
||||||
|
import com.bulletphysics.collision.dispatch.CollisionWorld;
|
||||||
import com.bulletphysics.collision.dispatch.CollisionWorld.LocalConvexResult;
|
import com.bulletphysics.collision.dispatch.CollisionWorld.LocalConvexResult;
|
||||||
import com.bulletphysics.collision.dispatch.CollisionWorld.LocalRayResult;
|
import com.bulletphysics.collision.dispatch.CollisionWorld.LocalRayResult;
|
||||||
|
import com.bulletphysics.collision.dispatch.DefaultCollisionConfiguration;
|
||||||
|
import com.bulletphysics.collision.dispatch.GhostPairCallback;
|
||||||
|
import com.bulletphysics.collision.dispatch.PairCachingGhostObject;
|
||||||
import com.bulletphysics.collision.narrowphase.ManifoldPoint;
|
import com.bulletphysics.collision.narrowphase.ManifoldPoint;
|
||||||
import com.bulletphysics.collision.shapes.ConvexShape;
|
import com.bulletphysics.collision.shapes.ConvexShape;
|
||||||
import com.bulletphysics.dynamics.DiscreteDynamicsWorld;
|
import com.bulletphysics.dynamics.DiscreteDynamicsWorld;
|
||||||
@ -52,7 +64,13 @@ import com.bulletphysics.dynamics.vehicle.RaycastVehicle;
|
|||||||
import com.bulletphysics.extras.gimpact.GImpactCollisionAlgorithm;
|
import com.bulletphysics.extras.gimpact.GImpactCollisionAlgorithm;
|
||||||
import com.jme3.app.AppTask;
|
import com.jme3.app.AppTask;
|
||||||
import com.jme3.asset.AssetManager;
|
import com.jme3.asset.AssetManager;
|
||||||
import com.jme3.bullet.collision.*;
|
import com.jme3.bullet.collision.PhysicsCollisionEvent;
|
||||||
|
import com.jme3.bullet.collision.PhysicsCollisionEventFactory;
|
||||||
|
import com.jme3.bullet.collision.PhysicsCollisionGroupListener;
|
||||||
|
import com.jme3.bullet.collision.PhysicsCollisionListener;
|
||||||
|
import com.jme3.bullet.collision.PhysicsCollisionObject;
|
||||||
|
import com.jme3.bullet.collision.PhysicsRayTestResult;
|
||||||
|
import com.jme3.bullet.collision.PhysicsSweepTestResult;
|
||||||
import com.jme3.bullet.collision.shapes.CollisionShape;
|
import com.jme3.bullet.collision.shapes.CollisionShape;
|
||||||
import com.jme3.bullet.control.PhysicsControl;
|
import com.jme3.bullet.control.PhysicsControl;
|
||||||
import com.jme3.bullet.control.RigidBodyControl;
|
import com.jme3.bullet.control.RigidBodyControl;
|
||||||
@ -369,12 +387,11 @@ public class PhysicsSpace {
|
|||||||
* @param obj the PhysicsControl or Spatial with PhysicsControl to add
|
* @param obj the PhysicsControl or Spatial with PhysicsControl to add
|
||||||
*/
|
*/
|
||||||
public void add(Object obj) {
|
public void add(Object obj) {
|
||||||
|
if (obj == null) return;
|
||||||
if (obj instanceof PhysicsControl) {
|
if (obj instanceof PhysicsControl) {
|
||||||
((PhysicsControl) obj).setPhysicsSpace(this);
|
((PhysicsControl) obj).setPhysicsSpace(this);
|
||||||
} else if (obj instanceof Spatial) {
|
} else if (obj instanceof Spatial) {
|
||||||
Spatial node = (Spatial) obj;
|
add(((Spatial) obj).getControl(PhysicsControl.class));
|
||||||
PhysicsControl control = node.getControl(PhysicsControl.class);
|
|
||||||
control.setPhysicsSpace(this);
|
|
||||||
} else if (obj instanceof PhysicsCollisionObject) {
|
} else if (obj instanceof PhysicsCollisionObject) {
|
||||||
addCollisionObject((PhysicsCollisionObject) obj);
|
addCollisionObject((PhysicsCollisionObject) obj);
|
||||||
} else if (obj instanceof PhysicsJoint) {
|
} else if (obj instanceof PhysicsJoint) {
|
||||||
@ -398,15 +415,15 @@ public class PhysicsSpace {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* removes an object from the physics space
|
* removes an object from the physics space
|
||||||
|
*
|
||||||
* @param obj the PhysicsControl or Spatial with PhysicsControl to remove
|
* @param obj the PhysicsControl or Spatial with PhysicsControl to remove
|
||||||
*/
|
*/
|
||||||
public void remove(Object obj) {
|
public void remove(Object obj) {
|
||||||
|
if (obj == null) return;
|
||||||
if (obj instanceof PhysicsControl) {
|
if (obj instanceof PhysicsControl) {
|
||||||
((PhysicsControl) obj).setPhysicsSpace(null);
|
((PhysicsControl) obj).setPhysicsSpace(null);
|
||||||
} else if (obj instanceof Spatial) {
|
} else if (obj instanceof Spatial) {
|
||||||
Spatial node = (Spatial) obj;
|
remove(((Spatial) obj).getControl(PhysicsControl.class));
|
||||||
PhysicsControl control = node.getControl(PhysicsControl.class);
|
|
||||||
control.setPhysicsSpace(null);
|
|
||||||
} else if (obj instanceof PhysicsCollisionObject) {
|
} else if (obj instanceof PhysicsCollisionObject) {
|
||||||
removeCollisionObject((PhysicsCollisionObject) obj);
|
removeCollisionObject((PhysicsCollisionObject) obj);
|
||||||
} else if (obj instanceof PhysicsJoint) {
|
} else if (obj instanceof PhysicsJoint) {
|
||||||
@ -434,26 +451,18 @@ public class PhysicsSpace {
|
|||||||
public void addAll(Spatial spatial) {
|
public void addAll(Spatial spatial) {
|
||||||
if (spatial.getControl(RigidBodyControl.class) != null) {
|
if (spatial.getControl(RigidBodyControl.class) != null) {
|
||||||
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
||||||
physicsNode.setPhysicsSpace(this);
|
add(physicsNode);
|
||||||
//add joints
|
//add joints with physicsNode as BodyA
|
||||||
List<PhysicsJoint> joints = physicsNode.getJoints();
|
List<PhysicsJoint> joints = physicsNode.getJoints();
|
||||||
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
||||||
PhysicsJoint physicsJoint = it1.next();
|
PhysicsJoint physicsJoint = it1.next();
|
||||||
//add connected physicsnodes if they are not already added
|
if (physicsNode.equals(physicsJoint.getBodyA())) {
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
//add(physicsJoint.getBodyB());
|
||||||
add(physicsJoint.getBodyA());
|
add(physicsJoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
addRigidBody(physicsJoint.getBodyA());
|
add(spatial);
|
||||||
}
|
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
|
||||||
add(physicsJoint.getBodyB());
|
|
||||||
} else {
|
|
||||||
addRigidBody(physicsJoint.getBodyB());
|
|
||||||
}
|
|
||||||
addJoint(physicsJoint);
|
|
||||||
}
|
|
||||||
} else if (spatial.getControl(PhysicsControl.class) != null) {
|
|
||||||
spatial.getControl(PhysicsControl.class).setPhysicsSpace(this);
|
|
||||||
}
|
}
|
||||||
//recursion
|
//recursion
|
||||||
if (spatial instanceof Node) {
|
if (spatial instanceof Node) {
|
||||||
@ -473,26 +482,18 @@ public class PhysicsSpace {
|
|||||||
public void removeAll(Spatial spatial) {
|
public void removeAll(Spatial spatial) {
|
||||||
if (spatial.getControl(RigidBodyControl.class) != null) {
|
if (spatial.getControl(RigidBodyControl.class) != null) {
|
||||||
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
|
||||||
physicsNode.setPhysicsSpace(null);
|
//remove joints with physicsNode as BodyA
|
||||||
//remove joints
|
|
||||||
List<PhysicsJoint> joints = physicsNode.getJoints();
|
List<PhysicsJoint> joints = physicsNode.getJoints();
|
||||||
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
|
||||||
PhysicsJoint physicsJoint = it1.next();
|
PhysicsJoint physicsJoint = it1.next();
|
||||||
//add connected physicsnodes if they are not already added
|
if (physicsNode.equals(physicsJoint.getBodyA())) {
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
|
||||||
remove(physicsJoint.getBodyA());
|
|
||||||
} else {
|
|
||||||
removeRigidBody(physicsJoint.getBodyA());
|
|
||||||
}
|
|
||||||
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
|
|
||||||
remove(physicsJoint.getBodyB());
|
|
||||||
} else {
|
|
||||||
removeRigidBody(physicsJoint.getBodyB());
|
|
||||||
}
|
|
||||||
removeJoint(physicsJoint);
|
removeJoint(physicsJoint);
|
||||||
|
//remove(physicsJoint.getBodyB());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
remove(physicsNode);
|
||||||
} else if (spatial.getControl(PhysicsControl.class) != null) {
|
} else if (spatial.getControl(PhysicsControl.class) != null) {
|
||||||
spatial.getControl(PhysicsControl.class).setPhysicsSpace(null);
|
remove(spatial);
|
||||||
}
|
}
|
||||||
//recursion
|
//recursion
|
||||||
if (spatial instanceof Node) {
|
if (spatial instanceof Node) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user