diff --git a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index fd12dcb89..1109a92c6 100644 --- a/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -46,11 +46,14 @@ import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import com.jme3.util.SafeArrayList; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Stack; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -91,8 +94,8 @@ public class PhysicsSpace { private Map physicsBodies = new ConcurrentHashMap(); private Map physicsJoints = new ConcurrentHashMap(); private Map physicsVehicles = new ConcurrentHashMap(); - private List collisionListeners = new LinkedList(); - private List collisionEvents = new LinkedList(); + private ArrayList collisionListeners = new ArrayList(); + private Stack collisionEvents = new Stack(); private Map collisionGroupListeners = new ConcurrentHashMap(); private ConcurrentLinkedQueue tickListeners = new ConcurrentLinkedQueue(); private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory(); @@ -331,7 +334,7 @@ public class PhysicsSpace { // } private void addCollisionEvent_native(PhysicsCollisionObject node, PhysicsCollisionObject node1, long manifoldPointObjectId) { // System.out.println("addCollisionEvent:"+node.getObjectId()+" "+ node1.getObjectId()); - collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId)); + collisionEvents.push(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, manifoldPointObjectId)); } /** @@ -361,17 +364,15 @@ public class PhysicsSpace { public void distributeEvents() { //add collision callbacks -// synchronized (collisionEvents) { - for (Iterator it = collisionEvents.iterator(); it.hasNext();) { - PhysicsCollisionEvent physicsCollisionEvent = it.next(); - for (PhysicsCollisionListener listener : collisionListeners) { - listener.collision(physicsCollisionEvent); + int clistsize = collisionListeners.size(); + while( collisionEvents.empty() == false ) { + PhysicsCollisionEvent physicsCollisionEvent = collisionEvents.pop(); + for(int i=0;i Future enqueueOnThisThread(Callable callable) { diff --git a/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java b/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java index 484f52133..6d4db3a09 100644 --- a/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java +++ b/jme3-jbullet/src/main/java/com/jme3/bullet/PhysicsSpace.java @@ -66,11 +66,13 @@ import com.jme3.math.Transform; import com.jme3.math.Vector3f; import com.jme3.scene.Node; import com.jme3.scene.Spatial; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Stack; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -111,8 +113,8 @@ public class PhysicsSpace { private Map physicsVehicles = new ConcurrentHashMap(); private Map collisionGroupListeners = new ConcurrentHashMap(); private ConcurrentLinkedQueue tickListeners = new ConcurrentLinkedQueue(); - private List collisionListeners = new LinkedList(); - private List collisionEvents = new LinkedList(); + private ArrayList collisionListeners = new ArrayList(); + private Stack collisionEvents = new Stack(); private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory(); private Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f); private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f); @@ -294,7 +296,7 @@ public class PhysicsSpace { CollisionObject rBody1 = (CollisionObject) body1; node = (PhysicsCollisionObject) rBody0.getUserPointer(); node1 = (PhysicsCollisionObject) rBody1.getUserPointer(); - collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, cp)); + collisionEvents.push(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, cp)); } return true; } @@ -332,19 +334,17 @@ public class PhysicsSpace { public void distributeEvents() { //add collision callbacks -// synchronized (collisionEvents) { - for (Iterator it = collisionEvents.iterator(); it.hasNext();) { - PhysicsCollisionEvent physicsCollisionEvent = it.next(); - for (PhysicsCollisionListener listener : collisionListeners) { - listener.collision(physicsCollisionEvent); - } - //recycle events - eventFactory.recycle(physicsCollisionEvent); - it.remove(); + int clistsize = collisionListeners.size(); + while( collisionEvents.empty() == false ) { + PhysicsCollisionEvent physicsCollisionEvent = collisionEvents.pop(); + for(int i=0;i Future enqueueOnThisThread(Callable callable) { AppTask task = new AppTask(callable); System.out.println("created apptask");