Merge pull request #165 from davidB/wip_jbullet_update

jbullet: refactor PhysiscSpace.addAll/removeAll
experimental
normen 11 years ago
commit 656886867d
  1. 57
      jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java
  2. 77
      jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java

@ -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 {
addRigidBody(physicsJoint.getBodyA());
} }
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
add(physicsJoint.getBodyB());
} else {
addRigidBody(physicsJoint.getBodyB());
}
addJoint(physicsJoint);
} }
} else if (spatial.getControl(PhysicsControl.class) != null) { } else {
spatial.getControl(PhysicsControl.class).setPhysicsSpace(this); add(spatial);
} }
//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 {
addRigidBody(physicsJoint.getBodyA());
}
if (physicsJoint.getBodyA() instanceof PhysicsControl) {
add(physicsJoint.getBodyB());
} else {
addRigidBody(physicsJoint.getBodyB());
} }
addJoint(physicsJoint);
} }
} else if (spatial.getControl(PhysicsControl.class) != null) { } else {
spatial.getControl(PhysicsControl.class).setPhysicsSpace(this); add(spatial);
} }
//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…
Cancel
Save