Prechádzať zdrojové kódy

delete Java sourcecode associated with native Bullet

Stephen Gold 4 rokov pred
rodič
commit
a9332fdcde
39 zmenil súbory, kde vykonal 0 pridanie a 11996 odobranie
  1. 0 1377
      jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java
  2. 0 87
      jme3-bullet/src/main/java/com/jme3/bullet/collision/CollisionFlag.java
  3. 0 443
      jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEvent.java
  4. 0 68
      jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEventFactory.java
  5. 0 377
      jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java
  6. 0 102
      jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsRayTestResult.java
  7. 0 125
      jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsSweepTestResult.java
  8. 0 124
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/BoxCollisionShape.java
  9. 0 194
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CapsuleCollisionShape.java
  10. 0 238
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CollisionShape.java
  11. 0 186
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CompoundCollisionShape.java
  12. 0 167
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/ConeCollisionShape.java
  13. 0 179
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CylinderCollisionShape.java
  14. 0 219
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/GImpactCollisionShape.java
  15. 0 230
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HeightfieldCollisionShape.java
  16. 0 172
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HullCollisionShape.java
  17. 0 255
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java
  18. 0 123
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/PlaneCollisionShape.java
  19. 0 179
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SimplexCollisionShape.java
  20. 0 138
      jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SphereCollisionShape.java
  21. 0 192
      jme3-bullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java
  22. 0 306
      jme3-bullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java
  23. 0 233
      jme3-bullet/src/main/java/com/jme3/bullet/joints/PhysicsJoint.java
  24. 0 189
      jme3-bullet/src/main/java/com/jme3/bullet/joints/Point2PointJoint.java
  25. 0 350
      jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofJoint.java
  26. 0 151
      jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofSpringJoint.java
  27. 0 888
      jme3-bullet/src/main/java/com/jme3/bullet/joints/SliderJoint.java
  28. 0 287
      jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/RotationalLimitMotor.java
  29. 0 233
      jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/TranslationalLimitMotor.java
  30. 0 711
      jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java
  31. 0 402
      jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsGhostObject.java
  32. 0 1081
      jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java
  33. 0 695
      jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java
  34. 0 713
      jme3-bullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java
  35. 0 207
      jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/RigidBodyMotionState.java
  36. 0 66
      jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/VehicleTuning.java
  37. 0 72
      jme3-bullet/src/main/java/com/jme3/bullet/util/DebugMeshCallback.java
  38. 0 140
      jme3-bullet/src/main/java/com/jme3/bullet/util/DebugShapeFactory.java
  39. 0 97
      jme3-bullet/src/main/java/com/jme3/bullet/util/NativeMeshUtil.java

+ 0 - 1377
jme3-bullet/src/main/java/com/jme3/bullet/PhysicsSpace.java

@@ -1,1377 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet;
-
-import com.jme3.app.AppTask;
-import com.jme3.bullet.collision.*;
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.bullet.control.PhysicsControl;
-import com.jme3.bullet.control.RigidBodyControl;
-import com.jme3.bullet.joints.PhysicsJoint;
-import com.jme3.bullet.objects.PhysicsCharacter;
-import com.jme3.bullet.objects.PhysicsGhostObject;
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.bullet.objects.PhysicsVehicle;
-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.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Comparator;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Future;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A jbullet-jme physics space with its own btDynamicsWorld.
- *
- * @author normenhansen
- */
-public class PhysicsSpace {
-
-    /**
-     * message logger for this class
-     */
-    private static final Logger logger = Logger.getLogger(PhysicsSpace.class.getName());
-    /**
-     * index of the X axis
-     */
-    public static final int AXIS_X = 0;
-    /**
-     * index of the Y axis
-     */
-    public static final int AXIS_Y = 1;
-    /**
-     * index of the Z axis
-     */
-    public static final int AXIS_Z = 2;
-    /**
-     * Bullet identifier of the physics space. The constructor sets this to a
-     * non-zero value.
-     */
-    private long physicsSpaceId = 0;
-    /**
-     * first-in/first-out (FIFO) queue of physics tasks for each thread
-     */
-    private static ThreadLocal<ConcurrentLinkedQueue<AppTask<?>>> pQueueTL =
-            new ThreadLocal<ConcurrentLinkedQueue<AppTask<?>>>() {
-                @Override
-                protected ConcurrentLinkedQueue<AppTask<?>> initialValue() {
-                    return new ConcurrentLinkedQueue<AppTask<?>>();
-                }
-            };
-    /**
-     * first-in/first-out (FIFO) queue of physics tasks
-     */
-    private ConcurrentLinkedQueue<AppTask<?>> pQueue = new ConcurrentLinkedQueue<AppTask<?>>();
-    /**
-     * physics space for each thread
-     */
-    private static ThreadLocal<PhysicsSpace> physicsSpaceTL = new ThreadLocal<PhysicsSpace>();
-    /**
-     * copy of type of acceleration structure used
-     */
-    private BroadphaseType broadphaseType = BroadphaseType.DBVT;
-//    private DiscreteDynamicsWorld dynamicsWorld = null;
-//    private BroadphaseInterface broadphase;
-//    private CollisionDispatcher dispatcher;
-//    private ConstraintSolver solver;
-//    private DefaultCollisionConfiguration collisionConfiguration;
-//    private Map<GhostObject, PhysicsGhostObject> physicsGhostNodes = new ConcurrentHashMap<GhostObject, PhysicsGhostObject>();
-    private Map<Long, PhysicsGhostObject> physicsGhostObjects = new ConcurrentHashMap<Long, PhysicsGhostObject>();
-    private Map<Long, PhysicsCharacter> physicsCharacters = new ConcurrentHashMap<Long, PhysicsCharacter>();
-    private Map<Long, PhysicsRigidBody> physicsBodies = new ConcurrentHashMap<Long, PhysicsRigidBody>();
-    private Map<Long, PhysicsJoint> physicsJoints = new ConcurrentHashMap<Long, PhysicsJoint>();
-    private Map<Long, PhysicsVehicle> physicsVehicles = new ConcurrentHashMap<Long, PhysicsVehicle>();
-    /**
-     * list of registered collision listeners
-     */
-    final private List<PhysicsCollisionListener> collisionListeners
-            = new SafeArrayList<>(PhysicsCollisionListener.class);
-    /**
-     * queue of collision events not yet distributed to listeners
-     */
-    private ArrayDeque<PhysicsCollisionEvent> collisionEvents = new ArrayDeque<PhysicsCollisionEvent>();
-    /**
-     * map from collision groups to registered group listeners
-     */
-    private Map<Integer, PhysicsCollisionGroupListener> collisionGroupListeners = new ConcurrentHashMap<Integer, PhysicsCollisionGroupListener>();
-    /**
-     * queue of registered tick listeners
-     */
-    private ConcurrentLinkedQueue<PhysicsTickListener> tickListeners = new ConcurrentLinkedQueue<PhysicsTickListener>();
-    private PhysicsCollisionEventFactory eventFactory = new PhysicsCollisionEventFactory();
-    /**
-     * copy of minimum coordinate values when using AXIS_SWEEP broadphase
-     * algorithms
-     */
-    private Vector3f worldMin = new Vector3f(-10000f, -10000f, -10000f);
-    /**
-     * copy of maximum coordinate values when using AXIS_SWEEP broadphase
-     * algorithms
-     */
-    private Vector3f worldMax = new Vector3f(10000f, 10000f, 10000f);
-    /**
-     * physics time step (in seconds, &gt;0)
-     */
-    private float accuracy = 1f / 60f;
-    /**
-     * maximum number of physics steps per frame (&ge;0, default=4)
-     */
-    private int maxSubSteps = 4;
-    /**
-     * flags used in ray tests
-     */
-    private int rayTestFlags = 1 << 2;
-    /**
-     * copy of number of iterations used by the contact-and-constraint solver
-     * (default=10)
-     */
-    private int solverNumIterations = 10;
-
-    static {
-//        System.loadLibrary("bulletjme");
-//        initNativePhysics();
-    }
-
-    /**
-     * Access the PhysicsSpace <b>running on this thread</b>. For parallel
-     * physics, this can be invoked from the OpenGL thread.
-     *
-     * @return the PhysicsSpace running on this thread
-     */
-    public static PhysicsSpace getPhysicsSpace() {
-        return physicsSpaceTL.get();
-    }
-
-    /**
-     * Used internally
-     *
-     * @param space which physics space to simulate on this thread
-     */
-    public static void setLocalThreadPhysicsSpace(PhysicsSpace space) {
-        physicsSpaceTL.set(space);
-    }
-
-    /**
-     * Instantiate a PhysicsSpace. Must be invoked on the designated physics
-     * thread.
-     */
-    public PhysicsSpace() {
-        this(new Vector3f(-10000f, -10000f, -10000f), new Vector3f(10000f, 10000f, 10000f), BroadphaseType.DBVT);
-    }
-
-    /**
-     * Instantiate a PhysicsSpace. Must be invoked on the designated physics
-     * thread.
-     */
-    public PhysicsSpace(BroadphaseType broadphaseType) {
-        this(new Vector3f(-10000f, -10000f, -10000f), new Vector3f(10000f, 10000f, 10000f), broadphaseType);
-    }
-
-    /**
-     * Instantiate a PhysicsSpace. Must be invoked on the designated physics
-     * thread.
-     */
-    public PhysicsSpace(Vector3f worldMin, Vector3f worldMax) {
-        this(worldMin, worldMax, BroadphaseType.AXIS_SWEEP_3);
-    }
-
-    /**
-     * Instantiate a PhysicsSpace. Must be invoked on the designated physics
-     * thread.
-     *
-     * @param worldMin the desired minimum coordinates values (not null,
-     * unaffected, default=-10k,-10k,-10k)
-     * @param worldMax the desired minimum coordinates values (not null,
-     * unaffected, default=10k,10k,10k)
-     * @param broadphaseType which broadphase collision-detection algorithm to
-     * use (not null)
-     */
-    public PhysicsSpace(Vector3f worldMin, Vector3f worldMax, BroadphaseType broadphaseType) {
-        this.worldMin.set(worldMin);
-        this.worldMax.set(worldMax);
-        this.broadphaseType = broadphaseType;
-        create();
-    }
-
-    /**
-     * Must be invoked on the designated physics thread.
-     */
-    public void create() {
-        physicsSpaceId = createPhysicsSpace(worldMin.x, worldMin.y, worldMin.z, worldMax.x, worldMax.y, worldMax.z, broadphaseType.ordinal(), false);
-        pQueueTL.set(pQueue);
-        physicsSpaceTL.set(this);
-
-//        collisionConfiguration = new DefaultCollisionConfiguration();
-//        dispatcher = new CollisionDispatcher(collisionConfiguration);
-//        switch (broadphaseType) {
-//            case SIMPLE:
-//                broadphase = new SimpleBroadphase();
-//                break;
-//            case AXIS_SWEEP_3:
-//                broadphase = new AxisSweep3(Converter.convert(worldMin), Converter.convert(worldMax));
-//                break;
-//            case AXIS_SWEEP_3_32:
-//                broadphase = new AxisSweep3_32(Converter.convert(worldMin), Converter.convert(worldMax));
-//                break;
-//            case DBVT:
-//                broadphase = new DbvtBroadphase();
-//                break;
-//        }
-//
-//        solver = new SequentialImpulseConstraintSolver();
-//
-//        dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
-//        dynamicsWorld.setGravity(new javax.vecmath.Vector3f(0, -9.81f, 0));
-//
-//        broadphase.getOverlappingPairCache().setInternalGhostPairCallback(new GhostPairCallback());
-//        GImpactCollisionAlgorithm.registerAlgorithm(dispatcher);
-//
-//        //register filter callback for tick / collision
-//        setTickCallback();
-//        setContactCallbacks();
-//        //register filter callback for collision groups
-//        setOverlapFilterCallback();
-    }
-
-    private native long createPhysicsSpace(float minX, float minY, float minZ, float maxX, float maxY, float maxZ, int broadphaseType, boolean threading);
-
-    /**
-     * Callback invoked just before the physics is stepped.
-     * <p>
-     * This method is invoked from native code.
-     *
-     * @param timeStep the time per physics step (in seconds, &ge;0)
-     */
-    private void preTick_native(float f) {
-        AppTask task;
-        while((task=pQueue.poll())!=null){
-            if(task.isCancelled())continue;
-            try{
-                task.invoke();
-            } catch (Exception ex) {
-                logger.log(Level.SEVERE, null, ex);
-            }
-        }
-
-        for (Iterator<PhysicsTickListener> it = tickListeners.iterator(); it.hasNext();) {
-            PhysicsTickListener physicsTickCallback = it.next();
-            physicsTickCallback.prePhysicsTick(this, f);
-        }
-    }
-
-    /**
-     * Callback invoked just after the physics is stepped.
-     * <p>
-     * This method is invoked from native code.
-     *
-     * @param timeStep the time per physics step (in seconds, &ge;0)
-     */
-    private void postTick_native(float f) {
-        for (Iterator<PhysicsTickListener> it = tickListeners.iterator(); it.hasNext();) {
-            PhysicsTickListener physicsTickCallback = it.next();
-            physicsTickCallback.physicsTick(this, f);
-        }
-    }
-
-    /**
-     * This method is invoked from native code.
-     */
-    private void addCollision_native() {
-    }
-
-    private boolean needCollision_native(PhysicsCollisionObject objectA, PhysicsCollisionObject objectB) {
-        return false;
-    }
-
-//    private void setOverlapFilterCallback() {
-//        OverlapFilterCallback callback = new OverlapFilterCallback() {
-//
-//            public boolean needBroadphaseCollision(BroadphaseProxy bp, BroadphaseProxy bp1) {
-//                boolean collides = (bp.collisionFilterGroup & bp1.collisionFilterMask) != 0;
-//                if (collides) {
-//                    collides = (bp1.collisionFilterGroup & bp.collisionFilterMask) != 0;
-//                }
-//                if (collides) {
-//                    assert (bp.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject && bp1.clientObject instanceof com.bulletphysics.collision.dispatch.CollisionObject);
-//                    com.bulletphysics.collision.dispatch.CollisionObject colOb = (com.bulletphysics.collision.dispatch.CollisionObject) bp.clientObject;
-//                    com.bulletphysics.collision.dispatch.CollisionObject colOb1 = (com.bulletphysics.collision.dispatch.CollisionObject) bp1.clientObject;
-//                    assert (colOb.getUserPointer() != null && colOb1.getUserPointer() != null);
-//                    PhysicsCollisionObject collisionObject = (PhysicsCollisionObject) colOb.getUserPointer();
-//                    PhysicsCollisionObject collisionObject1 = (PhysicsCollisionObject) colOb1.getUserPointer();
-//                    if ((collisionObject.getCollideWithGroups() & collisionObject1.getCollisionGroup()) > 0
-//                            || (collisionObject1.getCollideWithGroups() & collisionObject.getCollisionGroup()) > 0) {
-//                        PhysicsCollisionGroupListener listener = collisionGroupListeners.get(collisionObject.getCollisionGroup());
-//                        PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(collisionObject1.getCollisionGroup());
-//                        if (listener != null) {
-//                            return listener.collide(collisionObject, collisionObject1);
-//                        } else if (listener1 != null) {
-//                            return listener1.collide(collisionObject, collisionObject1);
-//                        }
-//                        return true;
-//                    } else {
-//                        return false;
-//                    }
-//                }
-//                return collides;
-//            }
-//        };
-//        dynamicsWorld.getPairCache().setOverlapFilterCallback(callback);
-//    }
-//    private void setTickCallback() {
-//        final PhysicsSpace space = this;
-//        InternalTickCallback callback2 = new InternalTickCallback() {
-//
-//            @Override
-//            public void internalTick(DynamicsWorld dw, float f) {
-//                //execute task list
-//                AppTask task = pQueue.poll();
-//                task = pQueue.poll();
-//                while (task != null) {
-//                    while (task.isCancelled()) {
-//                        task = pQueue.poll();
-//                    }
-//                    try {
-//                        task.invoke();
-//                    } catch (Exception ex) {
-//                        logger.log(Level.SEVERE, null, ex);
-//                    }
-//                    task = pQueue.poll();
-//                }
-//                for (Iterator<PhysicsTickListener> it = tickListeners.iterator(); it.hasNext();) {
-//                    PhysicsTickListener physicsTickCallback = it.next();
-//                    physicsTickCallback.prePhysicsTick(space, f);
-//                }
-//            }
-//        };
-//        dynamicsWorld.setPreTickCallback(callback2);
-//        InternalTickCallback callback = new InternalTickCallback() {
-//
-//            @Override
-//            public void internalTick(DynamicsWorld dw, float f) {
-//                for (Iterator<PhysicsTickListener> it = tickListeners.iterator(); it.hasNext();) {
-//                    PhysicsTickListener physicsTickCallback = it.next();
-//                    physicsTickCallback.physicsTick(space, f);
-//                }
-//            }
-//        };
-//        dynamicsWorld.setInternalTickCallback(callback, this);
-//    }
-//    private void setContactCallbacks() {
-//        BulletGlobals.setContactAddedCallback(new ContactAddedCallback() {
-//
-//            public boolean contactAdded(ManifoldPoint cp, com.bulletphysics.collision.dispatch.CollisionObject colObj0,
-//                    int partId0, int index0, com.bulletphysics.collision.dispatch.CollisionObject colObj1, int partId1,
-//                    int index1) {
-//                System.out.println("contact added");
-//                return true;
-//            }
-//        });
-//
-//        BulletGlobals.setContactProcessedCallback(new ContactProcessedCallback() {
-//
-//            public boolean contactProcessed(ManifoldPoint cp, Object body0, Object body1) {
-//                if (body0 instanceof CollisionObject && body1 instanceof CollisionObject) {
-//                    PhysicsCollisionObject node = null, node1 = null;
-//                    CollisionObject rBody0 = (CollisionObject) body0;
-//                    CollisionObject rBody1 = (CollisionObject) body1;
-//                    node = (PhysicsCollisionObject) rBody0.getUserPointer();
-//                    node1 = (PhysicsCollisionObject) rBody1.getUserPointer();
-//                    collisionEvents.add(eventFactory.getEvent(PhysicsCollisionEvent.TYPE_PROCESSED, node, node1, cp));
-//                }
-//                return true;
-//            }
-//        });
-//
-//        BulletGlobals.setContactDestroyedCallback(new ContactDestroyedCallback() {
-//
-//            public boolean contactDestroyed(Object userPersistentData) {
-//                System.out.println("contact destroyed");
-//                return true;
-//            }
-//        });
-//    }
-    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));
-    }
-    
-    /**
-     * This method is invoked from native code.
-     */    
-    private boolean notifyCollisionGroupListeners_native(PhysicsCollisionObject node, PhysicsCollisionObject node1){
-        PhysicsCollisionGroupListener listener = collisionGroupListeners.get(node.getCollisionGroup());
-        PhysicsCollisionGroupListener listener1 = collisionGroupListeners.get(node1.getCollisionGroup());
-        boolean result = true;
-        
-        if(listener != null){
-            result = listener.collide(node, node1);
-        }
-        if(listener1 != null && node.getCollisionGroup() != node1.getCollisionGroup()){
-            result = listener1.collide(node, node1) && result;
-        }
-        
-        return result;
-    }
-
-    /**
-     * Update this space. Invoked (by the Bullet app state) once per frame while
-     * the app state is attached and enabled.
-     *
-     * @param time time-per-frame multiplied by speed (in seconds, &ge;0)
-     */
-    public void update(float time) {
-        update(time, maxSubSteps);
-    }
-
-    /**
-     * Simulate for the specified time interval, using no more than the
-     * specified number of steps.
-     *
-     * @param time the time interval (in seconds, &ge;0)
-     * @param maxSteps the maximum number of steps (&ge;1)
-     */
-    public void update(float time, int maxSteps) {
-//        if (getDynamicsWorld() == null) {
-//            return;
-//        }
-        //step simulation
-        stepSimulation(physicsSpaceId, time, maxSteps, accuracy);
-    }
-
-    private native void stepSimulation(long space, float time, int maxSteps, float accuracy);
-
-    /**
-     * Distribute each collision event to all listeners.
-     */
-    public void distributeEvents() {
-        //add collision callbacks
-        int clistsize = collisionListeners.size();
-        while( collisionEvents.isEmpty() == false ) {
-            PhysicsCollisionEvent physicsCollisionEvent = collisionEvents.pop();
-            for(int i=0;i<clistsize;i++) {
-                collisionListeners.get(i).collision(physicsCollisionEvent);
-            }
-            //recycle events
-            eventFactory.recycle(physicsCollisionEvent);
-        }
-    }
-
-    /**
-     * Enqueue a callable on the currently executing thread.
-     *
-     * @param <V> the task's result type
-     * @param callable the task to be executed
-     * @return a new task (not null)
-     */
-    public static <V> Future<V> enqueueOnThisThread(Callable<V> callable) {
-        AppTask<V> task = new AppTask<V>(callable);
-        System.out.println("created apptask");
-        pQueueTL.get().add(task);
-        return task;
-    }
-
-    /**
-     * Invoke the specified callable during the next physics tick. This is
-     * useful for applying forces.
-     *
-     * @param <V> the return type of the callable
-     * @param callable which callable to invoke
-     * @return Future object
-     */
-    public <V> Future<V> enqueue(Callable<V> callable) {
-        AppTask<V> task = new AppTask<V>(callable);
-        pQueue.add(task);
-        return task;
-    }
-
-    /**
-     * Add the specified object to this space.
-     *
-     * @param obj the PhysicsControl, Spatial-with-PhysicsControl,
-     * PhysicsCollisionObject, or PhysicsJoint to add (not null, modified)
-     */
-    public void add(Object obj) {
-        if (obj instanceof PhysicsControl) {
-            ((PhysicsControl) obj).setPhysicsSpace(this);
-        } else if (obj instanceof Spatial) {
-            Spatial node = (Spatial) obj;
-            for (int i = 0; i < node.getNumControls(); i++) {
-                if (node.getControl(i) instanceof PhysicsControl) {
-                    add(node.getControl(i));
-                }
-            }
-        } else if (obj instanceof PhysicsCollisionObject) {
-            addCollisionObject((PhysicsCollisionObject) obj);
-        } else if (obj instanceof PhysicsJoint) {
-            addJoint((PhysicsJoint) obj);
-        } else {
-            throw (new UnsupportedOperationException("Cannot add this kind of object to the physics space."));
-        }
-    }
-
-    /**
-     * Add the specified collision object to this space.
-     *
-     * @param obj the PhysicsCollisionObject to add (not null, modified)
-     */
-    public void addCollisionObject(PhysicsCollisionObject obj) {
-        if (obj instanceof PhysicsGhostObject) {
-            addGhostObject((PhysicsGhostObject) obj);
-        } else if (obj instanceof PhysicsRigidBody) {
-            addRigidBody((PhysicsRigidBody) obj);
-        } else if (obj instanceof PhysicsVehicle) {
-            addRigidBody((PhysicsVehicle) obj);
-        } else if (obj instanceof PhysicsCharacter) {
-            addCharacter((PhysicsCharacter) obj);
-        }
-    }
-
-    /**
-     * Remove the specified object from this space.
-     *
-     * @param obj the PhysicsCollisionObject to add, or null (modified)
-     */
-    public void remove(Object obj) {
-        if (obj == null) return;
-        if (obj instanceof PhysicsControl) {
-            ((PhysicsControl) obj).setPhysicsSpace(null);
-        } else if (obj instanceof Spatial) {
-            Spatial node = (Spatial) obj;
-            for (int i = 0; i < node.getNumControls(); i++) {
-                if (node.getControl(i) instanceof PhysicsControl) {
-                    remove(node.getControl(i));
-                }
-            }
-        } else if (obj instanceof PhysicsCollisionObject) {
-            removeCollisionObject((PhysicsCollisionObject) obj);
-        } else if (obj instanceof PhysicsJoint) {
-            removeJoint((PhysicsJoint) obj);
-        } else {
-            throw (new UnsupportedOperationException("Cannot remove this kind of object from the physics space."));
-        }
-    }
-
-    /**
-     * Remove the specified collision object from this space.
-     *
-     * @param obj the PhysicsControl or Spatial with PhysicsControl to remove
-     */
-    public void removeCollisionObject(PhysicsCollisionObject obj) {
-        if (obj instanceof PhysicsGhostObject) {
-            removeGhostObject((PhysicsGhostObject) obj);
-        } else if (obj instanceof PhysicsRigidBody) {
-            removeRigidBody((PhysicsRigidBody) obj);
-        } else if (obj instanceof PhysicsCharacter) {
-            removeCharacter((PhysicsCharacter) obj);
-        }
-    }
-
-    /**
-     * Add all collision objects and joints in the specified subtree of the
-     * scene graph to this space (e.g. after loading from disk). Note:
-     * recursive!
-     *
-     * @param spatial the root of the subtree (not null)
-     */
-    public void addAll(Spatial spatial) {
-        add(spatial);
-
-        if (spatial.getControl(RigidBodyControl.class) != null) {
-            RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
-            //add joints with physicsNode as BodyA
-            List<PhysicsJoint> joints = physicsNode.getJoints();
-            for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
-                PhysicsJoint physicsJoint = it1.next();
-                if (physicsNode.equals(physicsJoint.getBodyA())) {
-                    //add(physicsJoint.getBodyB());
-                    add(physicsJoint);
-                }
-            }
-        }
-        //recursion
-        if (spatial instanceof Node) {
-            List<Spatial> children = ((Node) spatial).getChildren();
-            for (Iterator<Spatial> it = children.iterator(); it.hasNext();) {
-                Spatial spat = it.next();
-                addAll(spat);
-            }
-        }
-    }
-
-    /**
-     * Remove all physics controls and joints in the specified subtree of the
-     * scene graph from the physics space (e.g. before saving to disk) Note:
-     * recursive!
-     *
-     * @param spatial the root of the subtree (not null)
-     */
-    public void removeAll(Spatial spatial) {
-        if (spatial.getControl(RigidBodyControl.class) != null) {
-            RigidBodyControl physicsNode = spatial.getControl(RigidBodyControl.class);
-            //remove joints with physicsNode as BodyA
-            List<PhysicsJoint> joints = physicsNode.getJoints();
-            for (Iterator<PhysicsJoint> it1 = joints.iterator(); it1.hasNext();) {
-                PhysicsJoint physicsJoint = it1.next();
-                if (physicsNode.equals(physicsJoint.getBodyA())) {
-                    removeJoint(physicsJoint);
-                    //remove(physicsJoint.getBodyB());
-                }
-            }
-        }
-            
-        remove(spatial);
-        //recursion
-        if (spatial instanceof Node) {
-            List<Spatial> children = ((Node) spatial).getChildren();
-            for (Iterator<Spatial> it = children.iterator(); it.hasNext();) {
-                Spatial spat = it.next();
-                removeAll(spat);
-            }
-        }
-    }
-
-    private native void addCollisionObject(long space, long id);
-
-    private native void removeCollisionObject(long space, long id);
-
-    private native void addRigidBody(long space, long id);
-
-    private native void removeRigidBody(long space, long id);
-
-    private native void addCharacterObject(long space, long id);
-
-    private native void removeCharacterObject(long space, long id);
-
-    private native void addAction(long space, long id);
-
-    private native void removeAction(long space, long id);
-
-    private native void addVehicle(long space, long id);
-
-    private native void removeVehicle(long space, long id);
-
-    private native void addConstraint(long space, long id);
-
-    private native void addConstraintC(long space, long id, boolean collision);
-
-    private native void removeConstraint(long space, long id);
-
-    private void addGhostObject(PhysicsGhostObject node) {
-        if (physicsGhostObjects.containsKey(node.getObjectId())) {
-            logger.log(Level.WARNING, "GhostObject {0} already exists in PhysicsSpace, cannot add.", node);
-            return;
-        }
-        physicsGhostObjects.put(node.getObjectId(), node);
-        logger.log(Level.FINE, "Adding ghost object {0} to physics space.", Long.toHexString(node.getObjectId()));
-        addCollisionObject(physicsSpaceId, node.getObjectId());
-    }
-
-    private void removeGhostObject(PhysicsGhostObject node) {
-        if (!physicsGhostObjects.containsKey(node.getObjectId())) {
-            logger.log(Level.WARNING, "GhostObject {0} does not exist in PhysicsSpace, cannot remove.", node);
-            return;
-        }
-        physicsGhostObjects.remove(node.getObjectId());
-        logger.log(Level.FINE, "Removing ghost object {0} from physics space.", Long.toHexString(node.getObjectId()));
-        removeCollisionObject(physicsSpaceId, node.getObjectId());
-    }
-
-    private void addCharacter(PhysicsCharacter node) {
-        if (physicsCharacters.containsKey(node.getObjectId())) {
-            logger.log(Level.WARNING, "Character {0} already exists in PhysicsSpace, cannot add.", node);
-            return;
-        }
-        physicsCharacters.put(node.getObjectId(), node);
-        logger.log(Level.FINE, "Adding character {0} to physics space.", Long.toHexString(node.getObjectId()));
-        addCharacterObject(physicsSpaceId, node.getObjectId());
-        addAction(physicsSpaceId, node.getControllerId());
-//        dynamicsWorld.addCollisionObject(node.getObjectId(), CollisionFilterGroups.CHARACTER_FILTER, (short) (CollisionFilterGroups.STATIC_FILTER | CollisionFilterGroups.DEFAULT_FILTER));
-//        dynamicsWorld.addAction(node.getControllerId());
-    }
-
-    private void removeCharacter(PhysicsCharacter node) {
-        if (!physicsCharacters.containsKey(node.getObjectId())) {
-            logger.log(Level.WARNING, "Character {0} does not exist in PhysicsSpace, cannot remove.", node);
-            return;
-        }
-        physicsCharacters.remove(node.getObjectId());
-        logger.log(Level.FINE, "Removing character {0} from physics space.", Long.toHexString(node.getObjectId()));
-        removeAction(physicsSpaceId, node.getControllerId());
-        removeCharacterObject(physicsSpaceId, node.getObjectId());
-//        dynamicsWorld.removeAction(node.getControllerId());
-//        dynamicsWorld.removeCollisionObject(node.getObjectId());
-    }
-
-    /**
-     * NOTE: When a rigid body is added, its gravity gets set to that of the
-     * physics space.
-     *
-     * @param node the body to add (not null, not already in the space)
-     */
-    private void addRigidBody(PhysicsRigidBody node) {
-        if (physicsBodies.containsKey(node.getObjectId())) {
-            logger.log(Level.WARNING, "RigidBody {0} already exists in PhysicsSpace, cannot add.", node);
-            return;
-        }
-        physicsBodies.put(node.getObjectId(), node);
-
-        //Workaround
-        //It seems that adding a Kinematic RigidBody to the dynamicWorld prevents it from being non-kinematic again afterward.
-        //so we add it non kinematic, then set it kinematic again.
-        boolean kinematic = false;
-        if (node.isKinematic()) {
-            kinematic = true;
-            node.setKinematic(false);
-        }
-        addRigidBody(physicsSpaceId, node.getObjectId());
-        if (kinematic) {
-            node.setKinematic(true);
-        }
-
-        logger.log(Level.FINE, "Adding RigidBody {0} to physics space.", node.getObjectId());
-        if (node instanceof PhysicsVehicle) {
-            PhysicsVehicle vehicle = (PhysicsVehicle) node;
-            vehicle.createVehicle(this);
-            long vehicleId = vehicle.getVehicleId();
-            assert vehicleId != 0L;
-            logger.log(Level.FINE,
-                    "Adding vehicle constraint {0} to physics space.",
-                    Long.toHexString(vehicleId));
-            physicsVehicles.put(vehicleId, vehicle);
-            addVehicle(physicsSpaceId, vehicleId);
-        }
-    }
-
-    private void removeRigidBody(PhysicsRigidBody node) {
-        if (!physicsBodies.containsKey(node.getObjectId())) {
-            logger.log(Level.WARNING, "RigidBody {0} does not exist in PhysicsSpace, cannot remove.", node);
-            return;
-        }
-        if (node instanceof PhysicsVehicle) {
-            logger.log(Level.FINE, "Removing vehicle constraint {0} from physics space.", Long.toHexString(((PhysicsVehicle) node).getVehicleId()));
-            physicsVehicles.remove(((PhysicsVehicle) node).getVehicleId());
-            removeVehicle(physicsSpaceId, ((PhysicsVehicle) node).getVehicleId());
-        }
-        logger.log(Level.FINE, "Removing RigidBody {0} from physics space.", Long.toHexString(node.getObjectId()));
-        physicsBodies.remove(node.getObjectId());
-        removeRigidBody(physicsSpaceId, node.getObjectId());
-    }
-
-    private void addJoint(PhysicsJoint joint) {
-        if (physicsJoints.containsKey(joint.getObjectId())) {
-            logger.log(Level.WARNING, "Joint {0} already exists in PhysicsSpace, cannot add.", joint);
-            return;
-        }
-        logger.log(Level.FINE, "Adding Joint {0} to physics space.", Long.toHexString(joint.getObjectId()));
-        physicsJoints.put(joint.getObjectId(), joint);
-        addConstraintC(physicsSpaceId, joint.getObjectId(), !joint.isCollisionBetweenLinkedBodys());
-//        dynamicsWorld.addConstraint(joint.getObjectId(), !joint.isCollisionBetweenLinkedBodys());
-    }
-
-    private void removeJoint(PhysicsJoint joint) {
-        if (!physicsJoints.containsKey(joint.getObjectId())) {
-            logger.log(Level.WARNING, "Joint {0} does not exist in PhysicsSpace, cannot remove.", joint);
-            return;
-        }
-        logger.log(Level.FINE, "Removing Joint {0} from physics space.", Long.toHexString(joint.getObjectId()));
-        physicsJoints.remove(joint.getObjectId());
-        removeConstraint(physicsSpaceId, joint.getObjectId());
-//        dynamicsWorld.removeConstraint(joint.getObjectId());
-    }
-
-    /**
-     * Copy the list of rigid bodies that have been added to this space and not
-     * yet removed.
-     *
-     * @return a new list (not null)
-     */
-    public Collection<PhysicsRigidBody> getRigidBodyList() {
-        return new LinkedList<PhysicsRigidBody>(physicsBodies.values());
-    }
-
-    /**
-     * Copy the list of ghost objects that have been added to this space and not
-     * yet removed.
-     *
-     * @return a new list (not null)
-     */
-    public Collection<PhysicsGhostObject> getGhostObjectList() {
-        return new LinkedList<PhysicsGhostObject>(physicsGhostObjects.values());
-    }
-
-    /**
-     * Copy the list of physics characters that have been added to this space
-     * and not yet removed.
-     *
-     * @return a new list (not null)
-     */
-    public Collection<PhysicsCharacter> getCharacterList() {
-        return new LinkedList<PhysicsCharacter>(physicsCharacters.values());
-    }
-
-    /**
-     * Copy the list of physics joints that have been added to this space and
-     * not yet removed.
-     *
-     * @return a new list (not null)
-     */
-    public Collection<PhysicsJoint> getJointList() {
-        return new LinkedList<PhysicsJoint>(physicsJoints.values());
-    }
-
-    /**
-     * Copy the list of physics vehicles that have been added to this space and
-     * not yet removed.
-     *
-     * @return a new list (not null)
-     */
-    public Collection<PhysicsVehicle> getVehicleList() {
-        return new LinkedList<PhysicsVehicle>(physicsVehicles.values());
-    }
-
-    /**
-     * Alter the gravitational acceleration acting on newly-added bodies.
-     * <p>
-     * Whenever a rigid body is added to a space, the body's gravity gets set to
-     * that of the space. Thus it makes sense to set the space's vector before
-     * adding any bodies to the space.
-     *
-     * @param gravity the desired acceleration vector (not null, unaffected)
-     */
-    public void setGravity(Vector3f gravity) {
-        this.gravity.set(gravity);
-        setGravity(physicsSpaceId, gravity);
-    }
-
-    private native void setGravity(long spaceId, Vector3f gravity);
-
-    /**
-     * copy of gravity-acceleration vector (default is 9.81 in the -Y direction,
-     * corresponding to Earth-normal in MKS units)
-     */
-    private final Vector3f gravity = new Vector3f(0,-9.81f,0);
-    /**
-     * Copy the gravitational acceleration acting on newly-added bodies.
-     *
-     * @param gravity storage for the result (not null, modified)
-     * @return acceleration (in the vector provided)
-     */
-    public Vector3f getGravity(Vector3f gravity) {
-        return gravity.set(this.gravity);
-    }
-
-//    /**
-//     * applies gravity value to all objects
-//     */
-//    public void applyGravity() {
-////        dynamicsWorld.applyGravity();
-//    }
-//
-//    /**
-//     * clears forces of all objects
-//     */
-//    public void clearForces() {
-////        dynamicsWorld.clearForces();
-//    }
-//
-    /**
-     * Register the specified tick listener with this space.
-     * <p>
-     * Tick listeners are notified before and after each physics step. A physics
-     * step is not necessarily the same as a frame; it is more influenced by the
-     * accuracy of the physics space.
-     *
-     * @see #setAccuracy(float)
-     *
-     * @param listener the listener to register (not null)
-     */
-    public void addTickListener(PhysicsTickListener listener) {
-        tickListeners.add(listener);
-    }
-
-    /**
-     * De-register the specified tick listener.
-     *
-     * @see #addTickListener(com.jme3.bullet.PhysicsTickListener)
-     * @param listener the listener to de-register (not null)
-     */
-    public void removeTickListener(PhysicsTickListener listener) {
-        tickListeners.remove(listener);
-    }
-
-    /**
-     * Register the specified collision listener with this space.
-     * <p>
-     * Collision listeners are notified when collisions occur in the space.
-     *
-     * @param listener the listener to register (not null, alias created)
-     */
-    public void addCollisionListener(PhysicsCollisionListener listener) {
-        collisionListeners.add(listener);
-    }
-
-    /**
-     * De-register the specified collision listener.
-     *
-     * @see
-     * #addCollisionListener(com.jme3.bullet.collision.PhysicsCollisionListener)
-     * @param listener the listener to de-register (not null)
-     */
-    public void removeCollisionListener(PhysicsCollisionListener listener) {
-        collisionListeners.remove(listener);
-    }
-
-    /**
-     * Register the specified collision-group listener with the specified
-     * collision group of this space.
-     * <p>
-     * Such a listener can disable collisions when they occur. There can be only
-     * one listener per collision group per space.
-     *
-     * @param listener the listener to register (not null)
-     * @param collisionGroup which group it should listen for (bit mask with
-     * exactly one bit set)
-     */
-    public void addCollisionGroupListener(PhysicsCollisionGroupListener listener, int collisionGroup) {
-        collisionGroupListeners.put(collisionGroup, listener);
-    }
-
-    /**
-     * De-register the specified collision-group listener.
-     *
-     * @see
-     * #addCollisionGroupListener(com.jme3.bullet.collision.PhysicsCollisionGroupListener,
-     * int)
-     * @param collisionGroup the group of the listener to de-register (bit mask
-     * with exactly one bit set)
-     */
-    public void removeCollisionGroupListener(int collisionGroup) {
-        collisionGroupListeners.remove(collisionGroup);
-    }
-    
-    /**
-     * Perform a ray-collision test and return the results as a list of
-     * PhysicsRayTestResults sorted by ascending hitFraction.
-     *
-     * @param from the starting location (physics-space coordinates, not null,
-     * unaffected)
-     * @param to the ending location (in physics-space coordinates, not null,
-     * unaffected)
-     * @return a new list of results (not null)
-     */
-    public List<PhysicsRayTestResult> rayTest(Vector3f from, Vector3f to) {
-        List<PhysicsRayTestResult> results = new ArrayList<PhysicsRayTestResult>();
-        rayTest(from, to, results);
-        
-        return results;
-    }
-    
-    /**
-     * Perform a ray-collision test and return the results as a list of
-     * PhysicsRayTestResults in arbitrary order.
-     *
-     * @param from the starting location (in physics-space coordinates, not
-     * null, unaffected)
-     * @param to the ending location (in physics-space coordinates, not null,
-     * unaffected)
-     * @return a new list of results (not null)
-     */
-    public List<PhysicsRayTestResult> rayTestRaw(Vector3f from, Vector3f to) {
-        List<PhysicsRayTestResult> results = new ArrayList<PhysicsRayTestResult>();
-        rayTestRaw(from, to, results);
-        
-        return results;
-    }
-
-    /**
-     * Alters the m_flags used in ray tests. see
-     * https://code.google.com/p/bullet/source/browse/trunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
-     * for possible options. Defaults to using the faster, approximate raytest.
-     *
-     * @param flags the desired flags, ORed together (default=0x4)
-     */
-    public void SetRayTestFlags(int flags) {
-        rayTestFlags = flags;
-    }
-
-    /**
-     * Reads m_flags used in ray tests. see
-     * https://code.google.com/p/bullet/source/browse/trunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
-     * for possible options.
-     *
-     * @return which flags are used
-     */
-    public int GetRayTestFlags() {
-        return rayTestFlags;
-    }
-
-    private static Comparator<PhysicsRayTestResult> hitFractionComparator = new Comparator<PhysicsRayTestResult>() {
-        @Override
-        public int compare(PhysicsRayTestResult r1, PhysicsRayTestResult r2) {
-            float comp = r1.getHitFraction() - r2.getHitFraction();
-            return comp > 0 ? 1 : -1;
-        }
-    };
-    
-    /**
-     * Perform a ray-collision test and return the results as a list of
-     * PhysicsRayTestResults sorted by ascending hitFraction.
-     *
-     * @param from coordinates of the starting location (in physics space, not
-     * null, unaffected)
-     * @param to coordinates of the ending location (in physics space, not null,
-     * unaffected)
-     * @param results the list to hold results (not null, modified)
-     * @return results
-     */
-    public List<PhysicsRayTestResult> rayTest(Vector3f from, Vector3f to, List<PhysicsRayTestResult> results) {
-        results.clear();
-        rayTest_native(from, to, physicsSpaceId, results, rayTestFlags);
-        
-        Collections.sort(results, hitFractionComparator);
-        return results;
-    }
-    
-    /**
-     * Perform a ray-collision test and return the results as a list of
-     * PhysicsRayTestResults in arbitrary order.
-     *
-     * @param from coordinates of the starting location (in physics space, not
-     * null, unaffected)
-     * @param to coordinates of the ending location (in physics space, not null,
-     * unaffected)
-     * @param results the list to hold results (not null, modified)
-     * @return results
-     */
-    public List<PhysicsRayTestResult> rayTestRaw(Vector3f from, Vector3f to, List<PhysicsRayTestResult> results) {
-        results.clear();
-        rayTest_native(from, to, physicsSpaceId, results, rayTestFlags);
-        return results;
-    }
-
-    public native void rayTest_native(Vector3f from, Vector3f to, long physicsSpaceId, List<PhysicsRayTestResult> results, int flags);
-
-//    private class InternalRayListener extends CollisionWorld.RayResultCallback {
-//
-//        private List<PhysicsRayTestResult> results;
-//
-//        public InternalRayListener(List<PhysicsRayTestResult> results) {
-//            this.results = results;
-//        }
-//
-//        @Override
-//        public float addSingleResult(LocalRayResult lrr, boolean bln) {
-//            PhysicsCollisionObject obj = (PhysicsCollisionObject) lrr.collisionObject.getUserPointer();
-//            results.add(new PhysicsRayTestResult(obj, Converter.convert(lrr.hitNormalLocal), lrr.hitFraction, bln));
-//            return lrr.hitFraction;
-//        }
-//    }
-//
-//
-
-
-    /**
-     * Perform a sweep-collision test and return the results as a new list.
-     * <p>
-     * The starting and ending locations must be at least 0.4f physics-space
-     * units apart.
-     * <p>
-     * A sweep test will miss a collision if it starts inside an object and
-     * sweeps away from the object's center.
-     *
-     * @param shape the shape to sweep (not null)
-     * @param start the starting physics-space transform (not null)
-     * @param end the ending physics-space transform (not null)
-     * @return a new list of results
-     */
-    public List<PhysicsSweepTestResult> sweepTest(CollisionShape shape, Transform start, Transform end) {
-        List<PhysicsSweepTestResult> results = new LinkedList<>();
-        sweepTest(shape, start, end , results);
-        return results;
-    }
-
-    /**
-     * Perform a sweep-collision test and store the results in an existing list.
-     * <p>
-     * The starting and ending locations must be at least 0.4f physics-space
-     * units apart.
-     * <p>
-     * A sweep test will miss a collision if it starts inside an object and
-     * sweeps away from the object's center.
-     *
-     * @param shape the shape to sweep (not null)
-     * @param start the starting physics-space transform (not null)
-     * @param end the ending physics-space transform (not null)
-     * @param results the list to hold results (not null, modified)
-     * @return results
-     */    
-    public List<PhysicsSweepTestResult> sweepTest(CollisionShape shape, Transform start, Transform end, List<PhysicsSweepTestResult> results) {
-        return sweepTest(shape, start, end, results, 0.0f);
-    }
-
-    public native void sweepTest_native(long shape, Transform from, Transform to, long physicsSpaceId, List<PhysicsSweepTestResult> results, float allowedCcdPenetration);
-    /**
-     * Perform a sweep-collision test and store the results in an existing list.
-     * <p>
-     * The starting and ending locations must be at least 0.4f physics-space
-     * units apart.
-     * <p>
-     * A sweep test will miss a collision if it starts inside an object and
-     * sweeps away from the object's center.
-     *
-     * @param shape the shape to sweep (not null)
-     * @param start the starting physics-space transform (not null)
-     * @param end the ending physics-space transform (not null)
-     * @param results the list to hold results (not null, modified)
-     * @param allowedCcdPenetration true&rarr;allow, false&rarr;disallow
-     * @return results
-     */
-    public List<PhysicsSweepTestResult> sweepTest(CollisionShape shape, Transform start, Transform end, List<PhysicsSweepTestResult> results, float allowedCcdPenetration ) {
-        results.clear();
-        sweepTest_native(shape.getObjectId(), start, end, physicsSpaceId, results, allowedCcdPenetration);
-        return results;
-    }
-
-/*    private class InternalSweepListener extends CollisionWorld.ConvexResultCallback {
-
-        private List<PhysicsSweepTestResult> results;
-
-        public InternalSweepListener(List<PhysicsSweepTestResult> results) {
-            this.results = results;
-        }
-
-        @Override
-        public float addSingleResult(LocalConvexResult lcr, boolean bln) {
-            PhysicsCollisionObject obj = (PhysicsCollisionObject) lcr.hitCollisionObject.getUserPointer();
-            results.add(new PhysicsSweepTestResult(obj, Converter.convert(lcr.hitNormalLocal), lcr.hitFraction, bln));
-            return lcr.hitFraction;
-        }
-    }
-
-    */
-    
-    /**
-     * Destroy this space so that a new one can be instantiated.
-     */
-    public void destroy() {
-        physicsBodies.clear();
-        physicsJoints.clear();
-
-//        dynamicsWorld.destroy();
-//        dynamicsWorld = null;
-    }
-
-    /**
-     * // * used internally //
-     *
-     * @return the dynamicsWorld //
-     */
-    public long getSpaceId() {
-        return physicsSpaceId;
-    }
-
-    /**
-     * Read the type of acceleration structure used.
-     *
-     * @return an enum value (not null)
-     */
-    public BroadphaseType getBroadphaseType() {
-        return broadphaseType;
-    }
-
-    /**
-     * Alter the type of acceleration structure used.
-     * 
-     * @param broadphaseType the desired algorithm (not null)
-     */
-    public void setBroadphaseType(BroadphaseType broadphaseType) {
-        this.broadphaseType = broadphaseType;
-    }
-
-    /**
-     * Alter the maximum number of physics steps per frame.
-     * <p>
-     * Extra physics steps help maintain determinism when the render fps drops
-     * below 1/accuracy. For example a value of 2 can compensate for frame rates
-     * as low as 30fps, assuming the physics has an accuracy of 1/60 sec.
-     * <p>
-     * Setting this value too high can depress the frame rate.
-     *
-     * @param steps the desired maximum number of steps per frame (&ge;1,
-     * default=4)
-     */
-    public void setMaxSubSteps(int steps) {
-        maxSubSteps = steps;
-    }
-
-    /**
-     * Read the accuracy (time step) of the physics simulation.
-     *
-     * @return the timestep (in seconds, &gt;0)
-     */
-    public float getAccuracy() {
-        return accuracy;
-    }
-
-    /**
-     * Alter the accuracy (time step) of the physics simulation.
-     * <p>
-     * In general, the smaller the time step, the more accurate (and
-     * compute-intensive) the simulation will be. Bullet works best with a
-     * time step of no more than 1/60 second.
-     *
-     * @param accuracy the desired time step (in seconds, &gt;0, default=1/60)
-     */
-    public void setAccuracy(float accuracy) {
-        this.accuracy = accuracy;
-    }
-
-    /**
-     * Access the minimum coordinate values for this space.
-     *
-     * @return the pre-existing vector
-     */
-    public Vector3f getWorldMin() {
-        return worldMin;
-    }
-
-    /**
-     * Alter the minimum coordinate values for this space. (only affects
-     * AXIS_SWEEP broadphase algorithms)
-     *
-     * @param worldMin the desired minimum coordinate values (not null,
-     * unaffected)
-     */
-    public void setWorldMin(Vector3f worldMin) {
-        this.worldMin.set(worldMin);
-    }
-
-    /**
-     * Access the maximum coordinate values for this space.
-     *
-     * @return the pre-existing vector (not null)
-     */
-    public Vector3f getWorldMax() {
-        return worldMax;
-    }
-
-    /**
-     * only applies for AXIS_SWEEP broadphase
-     *
-     * @param worldMax
-     */
-    public void setWorldMax(Vector3f worldMax) {
-        this.worldMax.set(worldMax);
-    }
-
-    /**
-     * Alter the number of iterations used by the contact-and-constraint solver.
-     * <p>
-     * Use 4 for low quality, 20 for high quality.
-     *
-     * @param numIterations the desired number of iterations (&ge;1, default=10)
-     */
-    public void setSolverNumIterations(int numIterations) {
-        this.solverNumIterations = numIterations;
-        setSolverNumIterations(physicsSpaceId, numIterations);
-    }
-    
-    /**
-     * Read the number of iterations used by the contact-and-constraint solver.
-     *
-     * @return the number of iterations used
-     */
-    public int getSolverNumIterations() {
-        return solverNumIterations;
-    }
-    
-    private native void setSolverNumIterations(long physicsSpaceId, int numIterations);
-    
-    public static native void initNativePhysics();
-
-    /**
-     * Enumerate the available acceleration structures for broadphase collision
-     * detection.
-     */
-    public enum BroadphaseType {
-
-        /**
-         * btSimpleBroadphase: a brute-force reference implementation for
-         * debugging purposes
-         */
-        SIMPLE,
-        /**
-         * btAxisSweep3: uses incremental 3-D sweep and prune, requires world
-         * bounds, limited to 16_384 objects
-         */
-        AXIS_SWEEP_3,
-        /**
-         * bt32BitAxisSweep3: uses incremental 3-D sweep and prune, requires
-         * world bounds, limited to 65_536 objects
-         */
-        AXIS_SWEEP_3_32,
-        /**
-         * btDbvtBroadphase: uses a fast, dynamic bounding-volume hierarchy
-         * based on AABB tree to allow quicker addition/removal of physics
-         * objects
-         */
-        DBVT;
-    }
-
-    /**
-     * Finalize this physics space just before it is destroyed. Should be
-     * invoked only by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing PhysicsSpace {0}", Long.toHexString(physicsSpaceId));
-        finalizeNative(physicsSpaceId);
-    }
-
-    private native void finalizeNative(long objectId);
-}

+ 0 - 87
jme3-bullet/src/main/java/com/jme3/bullet/collision/CollisionFlag.java

@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision;
-
-/**
- * Named collision flags for a {@link PhysicsCollisionObject}. Values must agree
- * with those in BulletCollision/CollisionDispatch/btCollisionObject.h
- *
- * @author Stephen Gold [email protected]
- * @see PhysicsCollisionObject#getCollisionFlags(long)
- */
-public class CollisionFlag {
-    /**
-     * flag for a static object
-     */
-    final public static int STATIC_OBJECT = 0x1;
-    /**
-     * flag for a kinematic object
-     */
-    final public static int KINEMATIC_OBJECT = 0x2;
-    /**
-     * flag for an object with no contact response, such as a PhysicsGhostObject
-     */
-    final public static int NO_CONTACT_RESPONSE = 0x4;
-    /**
-     * flag to enable a custom material callback for per-triangle
-     * friction/restitution (not used by JME)
-     */
-    final public static int CUSTOM_MATERIAL_CALLBACK = 0x8;
-    /**
-     * flag for a character object, such as a PhysicsCharacter
-     */
-    final public static int CHARACTER_OBJECT = 0x10;
-    /**
-     * flag to disable debug visualization (not used by JME)
-     */
-    final public static int DISABLE_VISUALIZE_OBJECT = 0x20;
-    /**
-     * flag to disable parallel/SPU processing (not used by JME)
-     */
-    final public static int DISABLE_SPU_COLLISION_PROCESSING = 0x40;
-    /**
-     * flag not used by JME
-     */
-    final public static int HAS_CONTACT_STIFFNESS_DAMPING = 0x80;
-    /**
-     * flag not used by JME
-     */
-    final public static int HAS_CUSTOM_DEBUG_RENDERING_COLOR = 0x100;
-    /**
-     * flag not used by JME
-     */
-    final public static int HAS_FRICTION_ANCHOR = 0x200;
-    /**
-     * flag not used by JME
-     */
-    final public static int HAS_COLLISION_SOUND_TRIGGER = 0x400;
-}

+ 0 - 443
jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEvent.java

@@ -1,443 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision;
-
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Spatial;
-import java.util.EventObject;
-
-/**
- * Describe a collision in the physics world.
- * <p>
- * Do not retain this object, as it will be reused after the collision() method
- * returns. Copy any data you need during the collide() method.
- *
- * @author normenhansen
- */
-public class PhysicsCollisionEvent extends EventObject {
-
-    /**
-     * type value to indicate a new event
-     */
-    public static final int TYPE_ADDED = 0;
-    /**
-     * type value to indicate an event that has been added to a PhysicsSpace
-     * queue
-     */
-    public static final int TYPE_PROCESSED = 1;
-    /**
-     * type value to indicate a cleaned/destroyed event
-     */
-    public static final int TYPE_DESTROYED = 2;
-    /**
-     * type value that indicates the event's status
-     */
-    private int type;
-    /**
-     * 1st involved object
-     */
-    private PhysicsCollisionObject nodeA;
-    /**
-     * 2nd involved object
-     */
-    private PhysicsCollisionObject nodeB;
-    /**
-     * Bullet identifier of the btManifoldPoint
-     */
-    private long manifoldPointObjectId = 0;
-
-    /**
-     * Instantiate a collision event.
-     *
-     * @param type event type (0=added/1=processed/2=destroyed)
-     * @param nodeA 1st involved object (alias created)
-     * @param nodeB 2nd involved object (alias created)
-     * @param manifoldPointObjectId Bullet identifier of the btManifoldPoint
-     */
-    public PhysicsCollisionEvent(int type, PhysicsCollisionObject nodeA, PhysicsCollisionObject nodeB, long manifoldPointObjectId) {
-        super(nodeA);
-        this.type = type;
-        this.nodeA = nodeA;
-        this.nodeB = nodeB;
-        this.manifoldPointObjectId = manifoldPointObjectId;
-    }
-
-    /**
-     * Destroy this event.
-     */
-    public void clean() {
-        source = null;
-        this.type = 0;
-        this.nodeA = null;
-        this.nodeB = null;
-        this.manifoldPointObjectId = 0;
-    }
-
-    /**
-     * Reuse this event.
-     *
-     * @param type event type (added/processed/destroyed)
-     * @param source 1st involved object (alias created)
-     * @param nodeB 2nd involved object (alias created)
-     * @param manifoldPointObjectId Bullet identifier
-     */
-    public void refactor(int type, PhysicsCollisionObject source, PhysicsCollisionObject nodeB, long manifoldPointObjectId) {
-        this.source = source;
-        this.type = type;
-        this.nodeA = source;
-        this.nodeB = nodeB;
-        this.manifoldPointObjectId = manifoldPointObjectId;
-    }
-
-    /**
-     * Read the type of event.
-     *
-     * @return added/processed/destroyed
-     */
-    public int getType() {
-        return type;
-    }
-
-    /**
-     * Access the user object of collision object A, provided it's a Spatial.
-     *
-     * @return the pre-existing Spatial, or null if none
-     */
-    public Spatial getNodeA() {
-        if (nodeA.getUserObject() instanceof Spatial) {
-            return (Spatial) nodeA.getUserObject();
-        }
-        return null;
-    }
-
-    /**
-     * Access the user object of collision object B, provided it's a Spatial.
-     *
-     * @return the pre-existing Spatial, or null if none
-     */
-    public Spatial getNodeB() {
-        if (nodeB.getUserObject() instanceof Spatial) {
-            return (Spatial) nodeB.getUserObject();
-        }
-        return null;
-    }
-
-    /**
-     * Access collision object A.
-     *
-     * @return the pre-existing object (not null)
-     */
-    public PhysicsCollisionObject getObjectA() {
-        return nodeA;
-    }
-
-    /**
-     * Access collision object B.
-     *
-     * @return the pre-existing object (not null)
-     */
-    public PhysicsCollisionObject getObjectB() {
-        return nodeB;
-    }
-
-    /**
-     * Read the collision's applied impulse.
-     *
-     * @return impulse
-     */
-    public float getAppliedImpulse() {
-        return getAppliedImpulse(manifoldPointObjectId);
-    }
-    private native float getAppliedImpulse(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's applied lateral impulse #1.
-     *
-     * @return impulse
-     */
-    public float getAppliedImpulseLateral1() {
-        return getAppliedImpulseLateral1(manifoldPointObjectId);
-    }
-    private native float getAppliedImpulseLateral1(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's applied lateral impulse #2.
-     *
-     * @return impulse
-     */
-    public float getAppliedImpulseLateral2() {
-        return getAppliedImpulseLateral2(manifoldPointObjectId);
-    }
-    private native float getAppliedImpulseLateral2(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's combined friction.
-     *
-     * @return friction
-     */
-    public float getCombinedFriction() {
-        return getCombinedFriction(manifoldPointObjectId);
-    }
-    private native float getCombinedFriction(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's combined restitution.
-     *
-     * @return restitution
-     */
-    public float getCombinedRestitution() {
-        return getCombinedRestitution(manifoldPointObjectId);
-    }
-    private native float getCombinedRestitution(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's distance #1.
-     *
-     * @return distance
-     */
-    public float getDistance1() {
-        return getDistance1(manifoldPointObjectId);
-    }
-    private native float getDistance1(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's index 0.
-     *
-     * @return index
-     */
-    public int getIndex0() {
-        return getIndex0(manifoldPointObjectId);
-    }
-    private native int getIndex0(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's index 1.
-     *
-     * @return index
-     */
-    public int getIndex1() {
-        return getIndex1(manifoldPointObjectId);
-    }
-    private native int getIndex1(long manifoldPointObjectId);
-
-    /**
-     * Copy the collision's lateral friction direction #1.
-     *
-     * @return a new vector (not null)
-     */
-    public Vector3f getLateralFrictionDir1() {
-        return getLateralFrictionDir1(new Vector3f());
-    }
-
-    /**
-     * Copy the collision's lateral friction direction #1.
-     *
-     * @param lateralFrictionDir1 storage for the result (not null, modified)
-     * @return direction vector (not null)
-     */
-    public Vector3f getLateralFrictionDir1(Vector3f lateralFrictionDir1) {
-        getLateralFrictionDir1(manifoldPointObjectId, lateralFrictionDir1);
-        return lateralFrictionDir1;
-    }
-    private native void getLateralFrictionDir1(long manifoldPointObjectId, Vector3f lateralFrictionDir1);
-
-    /**
-     * Copy the collision's lateral friction direction #2.
-     *
-     * @return a new vector
-     */
-    public Vector3f getLateralFrictionDir2() {
-        return getLateralFrictionDir2(new Vector3f());
-    }
-
-    /**
-     * Copy the collision's lateral friction direction #2.
-     *
-     * @param lateralFrictionDir2 storage for the result (not null, modified)
-     * @return direction vector (not null)
-     */
-    public Vector3f getLateralFrictionDir2(Vector3f lateralFrictionDir2) {
-        getLateralFrictionDir2(manifoldPointObjectId, lateralFrictionDir2);
-        return lateralFrictionDir2;
-    }
-    private native void getLateralFrictionDir2(long manifoldPointObjectId, Vector3f lateralFrictionDir2);
-
-    /**
-     * Test whether the collision's lateral friction is initialized.
-     *
-     * @return true if initialized, otherwise false
-     */
-    public boolean isLateralFrictionInitialized() {
-        return isLateralFrictionInitialized(manifoldPointObjectId);
-    }
-    private native boolean isLateralFrictionInitialized(long manifoldPointObjectId);
-
-    /**
-     * Read the collision's lifetime.
-     *
-     * @return lifetime
-     */
-    public int getLifeTime() {
-        return getLifeTime(manifoldPointObjectId);
-    }
-    private native int getLifeTime(long manifoldPointObjectId);
-
-    /**
-     * Copy the collision's location in the local coordinates of object A.
-     *
-     * @return a new location vector (in local coordinates, not null)
-     */
-    public Vector3f getLocalPointA() {
-        return getLocalPointA(new Vector3f());
-    }
-    
-    /**
-     * Copy the collision's location in the local coordinates of object A.
-     *
-     * @param localPointA storage for the result (not null, modified)
-     * @return a location vector (in local coordinates, not null)
-     */
-    public Vector3f getLocalPointA(Vector3f localPointA) {
-        getLocalPointA(manifoldPointObjectId, localPointA);
-        return localPointA;
-    }
-    private native void getLocalPointA(long manifoldPointObjectId, Vector3f localPointA);
-
-    /**
-     * Copy the collision's location in the local coordinates of object B.
-     *
-     * @return a new location vector (in local coordinates, not null)
-     */
-    public Vector3f getLocalPointB() {
-        return getLocalPointB(new Vector3f());
-    }
-    
-    /**
-     * Copy the collision's location in the local coordinates of object B.
-     *
-     * @param localPointB storage for the result (not null, modified)
-     * @return a location vector (in local coordinates, not null)
-     */
-    public Vector3f getLocalPointB(Vector3f localPointB) {
-        getLocalPointB(manifoldPointObjectId, localPointB);
-        return localPointB;
-    }
-    private native void getLocalPointB(long manifoldPointObjectId, Vector3f localPointB);
-
-    /**
-     * Copy the collision's normal on object B.
-     *
-     * @return a new normal vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getNormalWorldOnB() {
-        return getNormalWorldOnB(new Vector3f());
-    }
-
-    /**
-     * Copy the collision's normal on object B.
-     *
-     * @param normalWorldOnB storage for the result (not null, modified)
-     * @return a normal vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getNormalWorldOnB(Vector3f normalWorldOnB) {
-        getNormalWorldOnB(manifoldPointObjectId, normalWorldOnB);
-        return normalWorldOnB;
-    }
-    private native void getNormalWorldOnB(long manifoldPointObjectId, Vector3f normalWorldOnB);
-
-    /**
-     * Read part identifier 0.
-     *
-     * @return identifier
-     */
-    public int getPartId0() {
-        return getPartId0(manifoldPointObjectId);
-    }
-    private native int getPartId0(long manifoldPointObjectId);
-
-    /**
-     * Read part identifier 1.
-     *
-     * @return identifier
-     */
-    public int getPartId1() {
-        return getPartId1(manifoldPointObjectId);
-    }
-
-    private native int getPartId1(long manifoldPointObjectId);
-
-    /**
-     * Copy the collision's location.
-     *
-     * @return a new vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getPositionWorldOnA() {
-        return getPositionWorldOnA(new Vector3f());
-    }
-
-    /**
-     * Copy the collision's location.
-     *
-     * @param positionWorldOnA storage for the result (not null, modified)
-     * @return a location vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getPositionWorldOnA(Vector3f positionWorldOnA) {
-        getPositionWorldOnA(manifoldPointObjectId, positionWorldOnA);
-        return positionWorldOnA;
-    }
-    private native void getPositionWorldOnA(long manifoldPointObjectId, Vector3f positionWorldOnA);
-
-    /**
-     * Copy the collision's location.
-     *
-     * @return a new location vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getPositionWorldOnB() {
-        return getPositionWorldOnB(new Vector3f());
-    }
-
-    /**
-     * Copy the collision's location.
-     *
-     * @param positionWorldOnB storage for the result (not null, modified)
-     * @return a location vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getPositionWorldOnB(Vector3f positionWorldOnB) {
-        getPositionWorldOnB(manifoldPointObjectId, positionWorldOnB);
-        return positionWorldOnB;
-    }
-    private native void getPositionWorldOnB(long manifoldPointObjectId, Vector3f positionWorldOnB);
-
-//    public Object getUserPersistentData() {
-//        return userPersistentData;
-//    }
-}

+ 0 - 68
jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionEventFactory.java

@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2009-2012 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision;
-
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- *
- * @author normenhansen
- */
-public class PhysicsCollisionEventFactory {
-
-    private ConcurrentLinkedQueue<PhysicsCollisionEvent> eventBuffer = new ConcurrentLinkedQueue<PhysicsCollisionEvent>();
-
-    /**
-     * Obtain an unused event.
-     * 
-     * @return an event (not null)
-     */
-    public PhysicsCollisionEvent getEvent(int type, PhysicsCollisionObject source, PhysicsCollisionObject nodeB, long manifoldPointObjectId) {
-        PhysicsCollisionEvent event = eventBuffer.poll();
-        if (event == null) {
-            event = new PhysicsCollisionEvent(type, source, nodeB, manifoldPointObjectId);
-        }else{
-            event.refactor(type, source, nodeB, manifoldPointObjectId);
-        }
-        return event;
-    }
-
-    /**
-     * Recycle the specified event.
-     * 
-     * @param event 
-     */
-    public void recycle(PhysicsCollisionEvent event) {
-        event.clean();
-        eventBuffer.add(event);
-    }
-}

+ 0 - 377
jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsCollisionObject.java

@@ -1,377 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision;
-
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.export.*;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * The abstract base class for collision objects based on Bullet's
- * btCollisionObject.
- * <p>
- * Collision objects include PhysicsCharacter, PhysicsRigidBody, and
- * PhysicsGhostObject.
- *
- * @author normenhansen
- */
-public abstract class PhysicsCollisionObject implements Savable {
-
-    /**
-     * Unique identifier of the btCollisionObject. Constructors are responsible
-     * for setting this to a non-zero value. The id might change if the object
-     * gets rebuilt.
-     */
-    protected long objectId = 0;
-    /**
-     * shape associated with this object (not null)
-     */
-    protected CollisionShape collisionShape;
-    /**
-     * collideWithGroups bitmask that represents "no groups"
-     */
-    public static final int COLLISION_GROUP_NONE = 0x00000000;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #1
-     */
-    public static final int COLLISION_GROUP_01 = 0x00000001;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #2
-     */
-    public static final int COLLISION_GROUP_02 = 0x00000002;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #3
-     */
-    public static final int COLLISION_GROUP_03 = 0x00000004;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #4
-     */
-    public static final int COLLISION_GROUP_04 = 0x00000008;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #5
-     */
-    public static final int COLLISION_GROUP_05 = 0x00000010;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #6
-     */
-    public static final int COLLISION_GROUP_06 = 0x00000020;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #7
-     */
-    public static final int COLLISION_GROUP_07 = 0x00000040;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #8
-     */
-    public static final int COLLISION_GROUP_08 = 0x00000080;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #9
-     */
-    public static final int COLLISION_GROUP_09 = 0x00000100;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #10
-     */
-    public static final int COLLISION_GROUP_10 = 0x00000200;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #11
-     */
-    public static final int COLLISION_GROUP_11 = 0x00000400;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #12
-     */
-    public static final int COLLISION_GROUP_12 = 0x00000800;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #13
-     */
-    public static final int COLLISION_GROUP_13 = 0x00001000;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #14
-     */
-    public static final int COLLISION_GROUP_14 = 0x00002000;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #15
-     */
-    public static final int COLLISION_GROUP_15 = 0x00004000;
-    /**
-     * collisionGroup/collideWithGroups bitmask that represents group #16
-     */
-    public static final int COLLISION_GROUP_16 = 0x00008000;
-    /**
-     * collision group to which this physics object belongs (default=group #1)
-     */
-    protected int collisionGroup = 0x00000001;
-    /**
-     * collision groups with which this object can collide (default=only group
-     * #1)
-     */
-    protected int collisionGroupsMask = 0x00000001;
-    private Object userObject;
-
-    /**
-     * Apply the specified CollisionShape to this object. Note that the object
-     * should not be in any physics space while changing shape; the object gets
-     * rebuilt on the physics side.
-     *
-     * @param collisionShape the shape to apply (not null, alias created)
-     */
-    public void setCollisionShape(CollisionShape collisionShape) {
-        this.collisionShape = collisionShape;
-    }
-
-    /**
-     * Access the shape of this physics object.
-     *
-     * @return the pre-existing instance, which can then be applied to other
-     * physics objects (increases performance)
-     */
-    public CollisionShape getCollisionShape() {
-        return collisionShape;
-    }
-
-    /**
-     * Read the deactivation time.
-     *
-     * @return the time (in seconds)
-     */
-    public float getDeactivationTime() {
-        float time = getDeactivationTime(objectId);
-        return time;
-    }
-
-    native private float getDeactivationTime(long objectId);
-
-    /**
-     * Read the collision group for this physics object.
-     *
-     * @return the collision group (bit mask with exactly one bit set)
-     */
-    public int getCollisionGroup() {
-        return collisionGroup;
-    }
-
-    /**
-     * Alter the collision group for this physics object.
-     * <p>
-     * Groups are represented by integer bit masks with exactly 1 bit set.
-     * Pre-made variables are available in PhysicsCollisionObject. By default,
-     * physics objects are in COLLISION_GROUP_01.
-     * <p>
-     * Two objects can collide only if one of them has the collisionGroup of the
-     * other in its collideWithGroups set.
-     *
-     * @param collisionGroup the collisionGroup to apply (bit mask with exactly
-     * 1 bit set)
-     */
-    public void setCollisionGroup(int collisionGroup) {
-        this.collisionGroup = collisionGroup;
-        if (objectId != 0) {
-            setCollisionGroup(objectId, collisionGroup);
-        }
-    }
-
-    /**
-     * Add collision groups to the set with which this object can collide.
-     *
-     * Two objects can collide only if one of them has the collisionGroup of the
-     * other in its collideWithGroups set.
-     *
-     * @param collisionGroup groups to add (bit mask)
-     */
-    public void addCollideWithGroup(int collisionGroup) {
-        this.collisionGroupsMask = this.collisionGroupsMask | collisionGroup;
-        if (objectId != 0) {
-            setCollideWithGroups(objectId, this.collisionGroupsMask);
-        }
-    }
-
-    /**
-     * Remove collision groups from the set with which this object can collide.
-     *
-     * @param collisionGroup groups to remove, ORed together (bit mask)
-     */
-    public void removeCollideWithGroup(int collisionGroup) {
-        this.collisionGroupsMask = this.collisionGroupsMask & ~collisionGroup;
-        if (objectId != 0) {
-            setCollideWithGroups(this.collisionGroupsMask);
-        }
-    }
-
-    /**
-     * Directly alter the collision groups with which this object can collide.
-     *
-     * @param collisionGroups desired groups, ORed together (bit mask)
-     */
-    public void setCollideWithGroups(int collisionGroups) {
-        this.collisionGroupsMask = collisionGroups;
-        if (objectId != 0) {
-            setCollideWithGroups(objectId, this.collisionGroupsMask);
-        }
-    }
-
-    /**
-     * Read the set of collision groups with which this object can collide.
-     *
-     * @return bit mask
-     */
-    public int getCollideWithGroups() {
-        return collisionGroupsMask;
-    }
-
-    /**
-     * Initialize the user pointer and collision-group information of this
-     * object.
-     */
-    protected void initUserPointer() {
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "initUserPointer() objectId = {0}", Long.toHexString(objectId));
-        initUserPointer(objectId, collisionGroup, collisionGroupsMask);
-    }
-    native void initUserPointer(long objectId, int group, int groups);
-
-    /**
-     * Access the user object associated with this collision object.
-     *
-     * @return the pre-existing instance, or null if none
-     */
-    public Object getUserObject() {
-        return userObject;
-    }
-
-    /**
-     * Test whether this object responds to contact with other objects.
-     *
-     * @return true if responsive, otherwise false
-     */
-    public boolean isContactResponse() {
-        int flags = getCollisionFlags(objectId);
-        boolean result = (flags & CollisionFlag.NO_CONTACT_RESPONSE) == 0x0;
-        return result;
-    }
-
-    /**
-     * Associate a user object (such as a Spatial) with this collision object.
-     *
-     * @param userObject the object to associate with this collision object
-     * (alias created, may be null)
-     */
-    public void setUserObject(Object userObject) {
-        this.userObject = userObject;
-    }
-    
-    /**
-     * Read the id of the btCollisionObject.
-     *
-     * @return the unique identifier (not zero)
-     */
-     public long getObjectId(){
-        return objectId;
-    }
-    
-    /**
-     * Attach the identified btCollisionShape to the identified
-     * btCollisionObject. Native method.
-     *
-     * @param objectId the unique identifier of the btCollisionObject (not zero)
-     * @param collisionShapeId the unique identifier of the btCollisionShape
-     * (not zero)
-     */
-    protected native void attachCollisionShape(long objectId, long collisionShapeId);
-    native void setCollisionGroup(long objectId, int collisionGroup);
-    native void setCollideWithGroups(long objectId, int collisionGroups);
-
-    /**
-     * Serialize this object, for example when saving to a J3O file.
-     *
-     * @param e exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter e) throws IOException {
-        OutputCapsule capsule = e.getCapsule(this);
-        capsule.write(collisionGroup, "collisionGroup", 0x00000001);
-        capsule.write(collisionGroupsMask, "collisionGroupsMask", 0x00000001);
-        capsule.write(collisionShape, "collisionShape", null);
-    }
-
-    /**
-     * De-serialize this object, for example when loading from a J3O file.
-     *
-     * @param e importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter e) throws IOException {
-        InputCapsule capsule = e.getCapsule(this);
-        collisionGroup = capsule.readInt("collisionGroup", 0x00000001);
-        collisionGroupsMask = capsule.readInt("collisionGroupsMask", 0x00000001);
-        CollisionShape shape = (CollisionShape) capsule.readSavable("collisionShape", null);
-        collisionShape = shape;
-    }
-
-    /**
-     * Read the collision flags of this object. Subclasses are responsible for
-     * cloning/reading/writing these flags.
-     *
-     * @param objectId the ID of the btCollisionObject (not zero)
-     * @return the collision flags (bit mask)
-     */
-    native protected int getCollisionFlags(long objectId);
-
-    /**
-     * Alter the collision flags of this object. Subclasses are responsible for
-     * cloning/reading/writing these flags.
-     *
-     * @param objectId the ID of the btCollisionObject (not zero)
-     * @param desiredFlags the desired collision flags (bit mask)
-     */
-    native protected void setCollisionFlags(long objectId, int desiredFlags);
-
-    /**
-     * Finalize this collision object just before it is destroyed. Should be
-     * invoked only by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing CollisionObject {0}", Long.toHexString(objectId));
-        finalizeNative(objectId);
-    }
-
-    /**
-     * Finalize the identified btCollisionObject. Native method.
-     *
-     * @param objectId the unique identifier of the btCollisionObject (not zero)
-     */
-    protected native void finalizeNative(long objectId);
-}

+ 0 - 102
jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsRayTestResult.java

@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision;
-
-import com.jme3.math.Vector3f;
-
-/**
- * Represent the results of a Bullet ray test.
- *
- * @author Empire-Phoenix,normenhansen
- */
-public class PhysicsRayTestResult {
-
-    /**
-     * collision object that was hit
-     */
-    private PhysicsCollisionObject collisionObject;
-    /**
-     * normal vector at the point of contact
-     */
-    private Vector3f hitNormalLocal;
-    /**
-     * fraction of the ray's total length (from=0, to=1, &ge;0, &le;1)
-     */
-    private float hitFraction;
-    /**
-     * true&rarr;need to transform normal into world space
-     */
-    private boolean normalInWorldSpace = true;
-
-    /**
-     * A private constructor to inhibit instantiation of this class by Java.
-     * These results are instantiated exclusively by native code.
-     */
-    private PhysicsRayTestResult() {
-    }
-
-    /**
-     * Access the collision object that was hit.
-     *
-     * @return the pre-existing instance
-     */
-    public PhysicsCollisionObject getCollisionObject() {
-        return collisionObject;
-    }
-
-    /**
-     * Access the normal vector at the point of contact.
-     *
-     * @return a pre-existing unit vector (not null)
-     */
-    public Vector3f getHitNormalLocal() {
-        return hitNormalLocal;
-    }
-
-    /**
-     * Read the fraction of the ray's total length.
-     *
-     * @return fraction (from=0, to=1, &ge;0, &le;1)
-     */
-    public float getHitFraction() {
-        return hitFraction;
-    }
-
-    /**
-     * Test whether the normal is in world space.
-     *
-     * @return true if in world space, otherwise false
-     */
-    public boolean isNormalInWorldSpace() {
-        return normalInWorldSpace;
-    }
-}

+ 0 - 125
jme3-bullet/src/main/java/com/jme3/bullet/collision/PhysicsSweepTestResult.java

@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision;
-
-import com.jme3.math.Vector3f;
-
-/**
- * Represent the results of a Bullet sweep test.
- *
- * @author normenhansen
- */
-public class PhysicsSweepTestResult {
-
-    /**
-     * collision object that was hit
-     */
-    private PhysicsCollisionObject collisionObject;
-    /**
-     * normal vector at the point of contact
-     */
-    private Vector3f hitNormalLocal;
-    /**
-     * fraction of the way between the transforms (from=0, to=1, &ge;0, &le;1)
-     */
-    private float hitFraction;
-    /**
-     * true&rarr;need to transform normal into world space
-     */
-    private boolean normalInWorldSpace;
-
-    /**
-     * A private constructor to inhibit instantiation of this class by Java.
-     * These results are instantiated exclusively by native code.
-     */
-    public PhysicsSweepTestResult() {
-    }
-
-    public PhysicsSweepTestResult(PhysicsCollisionObject collisionObject, Vector3f hitNormalLocal, float hitFraction, boolean normalInWorldSpace) {
-        this.collisionObject = collisionObject;
-        this.hitNormalLocal = hitNormalLocal;
-        this.hitFraction = hitFraction;
-        this.normalInWorldSpace = normalInWorldSpace;
-    }
-
-    /**
-     * Access the collision object that was hit.
-     *
-     * @return the pre-existing instance
-     */
-    public PhysicsCollisionObject getCollisionObject() {
-        return collisionObject;
-    }
-
-    /**
-     * Access the normal vector at the point of contact.
-     *
-     * @return the pre-existing vector (not null)
-     */
-    public Vector3f getHitNormalLocal() {
-        return hitNormalLocal;
-    }
-
-    /**
-     * Read the fraction of fraction of the way between the transforms (from=0,
-     * to=1, &ge;0, &le;1)
-     *
-     * @return fraction (from=0, to=1, &ge;0, &le;1)
-     */
-    public float getHitFraction() {
-        return hitFraction;
-    }
-
-    /**
-     * Test whether the normal is in world space.
-     *
-     * @return true if in world space, otherwise false
-     */
-    public boolean isNormalInWorldSpace() {
-        return normalInWorldSpace;
-    }
-
-    /**
-     * Fill in the fields of this result.
-     * 
-     * @param collisionObject
-     * @param hitNormalLocal
-     * @param hitFraction
-     * @param normalInWorldSpace 
-     */
-    public void fill(PhysicsCollisionObject collisionObject, Vector3f hitNormalLocal, float hitFraction, boolean normalInWorldSpace) {
-        this.collisionObject = collisionObject;
-        this.hitNormalLocal = hitNormalLocal;
-        this.hitFraction = hitFraction;
-        this.normalInWorldSpace = normalInWorldSpace;
-    }
-}

+ 0 - 124
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/BoxCollisionShape.java

@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A rectangular-solid collision shape based on Bullet's btBoxShape.
- *
- * @author normenhansen
- */
-public class BoxCollisionShape extends CollisionShape {
-
-    /**
-     * copy of half-extents of the box on each local axis (not null, no negative
-     * component)
-     */
-    private Vector3f halfExtents;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected BoxCollisionShape() {
-    }
-
-    /**
-     * Instantiate a box shape with the specified half extents.
-     *
-     * @param halfExtents the desired unscaled half extents (not null, no
-     * negative component, alias created)
-     */
-    public BoxCollisionShape(Vector3f halfExtents) {
-        this.halfExtents = halfExtents;
-        createShape();
-    }
-
-    /**
-     * Access the half extents of the box.
-     *
-     * @return the pre-existing instance (not null, no negative component)
-     */
-    public final Vector3f getHalfExtents() {
-        return halfExtents;
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(halfExtents, "halfExtents", new Vector3f(1, 1, 1));
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        Vector3f halfExtents = (Vector3f) capsule.readSavable("halfExtents", new Vector3f(1, 1, 1));
-        this.halfExtents = halfExtents;
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        objectId = createShape(halfExtents);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-//        cShape = new BoxShape(Converter.convert(halfExtents));
-        setScale(scale);
-        setMargin(margin);
-    }
-    
-    private native long createShape(Vector3f halfExtents);
-
-}

+ 0 - 194
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CapsuleCollisionShape.java

@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A capsule collision shape based on Bullet's btCapsuleShapeX, btCapsuleShape,
- * or btCapsuleShapeZ. These shapes have no margin and cannot be scaled.
- *
- * @author normenhansen
- */
-public class CapsuleCollisionShape extends CollisionShape{
-    /**
-     * copy of height of the cylindrical portion (&ge;0)
-     */
-    private float height;
-    /**
-     * copy of radius (&ge;0)
-     */
-    private float radius;
-    /**
-     * copy of main (height) axis (0&rarr;X, 1&rarr;Y, 2&rarr;Z)
-     */
-    private int axis;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected CapsuleCollisionShape() {
-    }
-
-    /**
-     * Instantiate a Y-axis capsule shape with the specified radius and height.
-     *
-     * @param radius the desired radius (&ge;0)
-     * @param height the desired height (of the cylindrical portion) (&ge;0)
-     */
-    public CapsuleCollisionShape(float radius, float height) {
-        this.radius=radius;
-        this.height=height;
-        this.axis=1;
-        createShape();
-    }
-
-    /**
-     * Instantiate a capsule shape around the specified main (height) axis.
-     *
-     * @param radius the desired radius (&ge;0)
-     * @param height the desired height (of the cylindrical portion) (&ge;0)
-     * @param axis which local axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     */
-    public CapsuleCollisionShape(float radius, float height, int axis) {
-        this.radius=radius;
-        this.height=height;
-        this.axis=axis;
-        createShape();
-    }
-
-    /**
-     * Read the radius of the capsule.
-     *
-     * @return the radius (&ge;0)
-     */
-    public float getRadius() {
-        return radius;
-    }
-
-    /**
-     * Read the height (of the cylindrical portion) of the capsule.
-     *
-     * @return height (&ge;0)
-     */
-    public float getHeight() {
-        return height;
-    }
-
-    /**
-     * Determine the main (height) axis of the capsule.
-     *
-     * @return 0 for local X, 1 for local Y, or 2 for local Z
-     */
-    public int getAxis() {
-        return axis;
-    }
-
-    /**
-     * Alter the scaling factors of this shape. Scaling is disabled
-     * for capsule shapes.
-     *
-     * @param scale the desired scaling factor for each local axis (not null, no
-     * negative component, unaffected, default=1,1,1)
-     */
-    @Override
-    public void setScale(Vector3f scale) {
-        if (!scale.equals(Vector3f.UNIT_XYZ)) {
-            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "CapsuleCollisionShape cannot be scaled");
-        }
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(radius, "radius", 0.5f);
-        capsule.write(height, "height", 1);
-        capsule.write(axis, "axis", 1);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        radius = capsule.readFloat("radius", 0.5f);
-        height = capsule.readFloat("height", 0.5f);
-        axis = capsule.readInt("axis", 1);
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape(){
-        objectId = createShape(axis, radius, height);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-        setScale(scale);
-        setMargin(margin);
-//        switch(axis){
-//            case 0:
-//                objectId=new CapsuleShapeX(radius,height);
-//            break;
-//            case 1:
-//                objectId=new CapsuleShape(radius,height);
-//            break;
-//            case 2:
-//                objectId=new CapsuleShapeZ(radius,height);
-//            break;
-//        }
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-    }
-    
-    private native long createShape(int axis, float radius, float height);
-
-}

+ 0 - 238
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CollisionShape.java

@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.*;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * The abstract base class for collision shapes based on Bullet's
- * btCollisionShape.
- * <p>
- * Collision shapes include BoxCollisionShape and CapsuleCollisionShape. As
- * suggested in the Bullet manual, a single collision shape can be shared among
- * multiple collision objects.
- *
- * @author normenhansen
- */
-public abstract class CollisionShape implements Savable {
-
-    /**
-     * default margin for new non-sphere/non-capsule shapes (in physics-space
-     * units, &gt;0, default=0.04)
-     */
-    private static float defaultMargin = 0.04f;
-    /**
-     * unique identifier of the btCollisionShape
-     * <p>
-     * Constructors are responsible for setting this to a non-zero value. After
-     * that, the id never changes.
-     */
-    protected long objectId = 0;
-    /**
-     * copy of scaling factors: one for each local axis (default=1,1,1)
-     */
-    protected Vector3f scale = new Vector3f(1, 1, 1);
-    /**
-     * copy of collision margin (in physics-space units, &gt;0, default=0)
-     */
-    protected float margin = defaultMargin;
-
-    public CollisionShape() {
-    }
-
-//    /**
-//     * used internally, not safe
-//     */
-//    public void calculateLocalInertia(long objectId, float mass) {
-//        if (this.objectId == 0) {
-//            return;
-//        }
-////        if (this instanceof MeshCollisionShape) {
-////            vector.set(0, 0, 0);
-////        } else {
-//        calculateLocalInertia(objectId, this.objectId, mass);
-////            objectId.calculateLocalInertia(mass, vector);
-////        }
-//    }
-//
-//    private native void calculateLocalInertia(long objectId, long shapeId, float mass);
-
-    /**
-     * Read the id of the btCollisionShape.
-     *
-     * @return the unique identifier (not zero)
-     */
-    public long getObjectId() {
-        return objectId;
-    }
-
-    /**
-     * used internally
-     */
-    public void setObjectId(long id) {
-        this.objectId = id;
-    }
-
-    /**
-     * Alter the scaling factors of this shape. CAUTION: Not all shapes can be
-     * scaled.
-     * <p>
-     * Note that if the shape is shared (between collision objects and/or
-     * compound shapes) changes can have unintended consequences.
-     *
-     * @param scale the desired scaling factor for each local axis (not null, no
-     * negative component, unaffected, default=1,1,1)
-     */
-    public void setScale(Vector3f scale) {
-        this.scale.set(scale);
-        setLocalScaling(objectId, scale);
-    }
-    /**
-     * Access the scaling factors.
-     *
-     * @return the pre-existing vector (not null)
-     */
-    public Vector3f getScale() {
-        return scale;
-    }
-
-    /**
-     * Test whether this shape can be applied to a dynamic rigid body. The only
-     * non-moving shapes are the heightfield, mesh, and plane shapes.
-     *
-     * @return true if non-moving, false otherwise
-     */
-    public boolean isNonMoving() {
-        boolean result = isNonMoving(objectId);
-        return result;
-    }
-
-    native private boolean isNonMoving(long objectId);
-
-    /**
-     * Read the collision margin for this shape.
-     *
-     * @return the margin distance (in physics-space units, &ge;0)
-     */
-    public float getMargin() {
-        return getMargin(objectId);
-    }
-
-    private native float getMargin(long objectId);
-
-    /**
-     * Alter the default margin for new shapes that are neither capsules nor
-     * spheres.
-     *
-     * @param margin the desired margin distance (in physics-space units, &gt;0,
-     * default=0.04)
-     */
-    public static void setDefaultMargin(float margin) {
-        defaultMargin = margin;
-    }
-
-    /**
-     * Read the default margin for new shapes.
-     *
-     * @return margin the default margin distance (in physics-space units,
-     * &gt;0)
-     */
-    public static float getDefaultMargin() {
-        return defaultMargin;
-    }
-
-    /**
-     * Alter the collision margin of this shape. CAUTION: Margin is applied
-     * differently, depending on the type of shape. Generally the collision
-     * margin expands the object, creating a gap. Don't set the collision margin
-     * to zero.
-     * <p>
-     * Note that if the shape is shared (between collision objects and/or
-     * compound shapes) changes can have unintended consequences.
-     *
-     * @param margin the desired margin distance (in physics-space units, &gt;0,
-     * default=0.04)
-     */
-    public void setMargin(float margin) {
-        setMargin(objectId, margin);
-        this.margin = margin;
-    }
-
-    private native void setLocalScaling(long obectId, Vector3f scale);
-
-    private native void setMargin(long objectId, float margin);
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(scale, "scale", new Vector3f(1, 1, 1));
-        capsule.write(getMargin(), "margin", 0.0f);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        InputCapsule capsule = im.getCapsule(this);
-        this.scale = (Vector3f) capsule.readSavable("scale", new Vector3f(1, 1, 1));
-        this.margin = capsule.readFloat("margin", 0.0f);
-    }
-
-    /**
-     * Finalize this shape just before it is destroyed. Should be invoked only
-     * by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing CollisionShape {0}", Long.toHexString(objectId));
-        finalizeNative(objectId);
-    }
-
-    private native void finalizeNative(long objectId);
-}

+ 0 - 186
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CompoundCollisionShape.java

@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.bullet.collision.shapes.infos.ChildCollisionShape;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A collision shape formed by combining convex child shapes, based on Bullet's
- * btCompoundShape.
- *
- * @author normenhansen
- */
-public class CompoundCollisionShape extends CollisionShape {
-
-    /**
-     * children of this shape
-     */
-    protected ArrayList<ChildCollisionShape> children = new ArrayList<ChildCollisionShape>();
-
-    /**
-     * Instantiate an empty compound shape (with no children).
-     */
-    public CompoundCollisionShape() {
-        objectId = createShape();//new CompoundShape();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-    }
-
-    /**
-     * Add a child shape with the specified local translation.
-     *
-     * @param shape the child shape to add (not null, not a compound shape,
-     * alias created)
-     * @param location the local coordinates of the child shape's center (not
-     * null, unaffected)
-     */
-    public void addChildShape(CollisionShape shape, Vector3f location) {
-//        Transform transA = new Transform(Converter.convert(new Matrix3f()));
-//        Converter.convert(location, transA.origin);
-//        children.add(new ChildCollisionShape(location.clone(), new Matrix3f(), shape));
-//        ((CompoundShape) objectId).addChildShape(transA, shape.getObjectId());
-        addChildShape(shape, location, new Matrix3f());
-    }
-
-    /**
-     * Add a child shape with the specified local translation and orientation.
-     *
-     * @param shape the child shape to add (not null, not a compound shape,
-     * alias created)
-     * @param location the local coordinates of the child shape's center (not
-     * null, unaffected)
-     * @param rotation the local orientation of the child shape (not null,
-     * unaffected)
-     */
-    public void addChildShape(CollisionShape shape, Vector3f location, Matrix3f rotation) {
-        if(shape instanceof CompoundCollisionShape){
-            throw new IllegalStateException("CompoundCollisionShapes cannot have CompoundCollisionShapes as children!");
-        }
-//        Transform transA = new Transform(Converter.convert(rotation));
-//        Converter.convert(location, transA.origin);
-//        Converter.convert(rotation, transA.basis);
-        children.add(new ChildCollisionShape(location.clone(), rotation.clone(), shape));
-        addChildShape(objectId, shape.getObjectId(), location, rotation);
-//        ((CompoundShape) objectId).addChildShape(transA, shape.getObjectId());
-    }
-
-    private void addChildShapeDirect(CollisionShape shape, Vector3f location, Matrix3f rotation) {
-        if(shape instanceof CompoundCollisionShape){
-            throw new IllegalStateException("CompoundCollisionShapes cannot have CompoundCollisionShapes as children!");
-        }
-//        Transform transA = new Transform(Converter.convert(rotation));
-//        Converter.convert(location, transA.origin);
-//        Converter.convert(rotation, transA.basis);
-        addChildShape(objectId, shape.getObjectId(), location, rotation);
-//        ((CompoundShape) objectId).addChildShape(transA, shape.getObjectId());
-    }
-
-    /**
-     * Remove a child from this shape.
-     *
-     * @param shape the child shape to remove (not null)
-     */
-    public void removeChildShape(CollisionShape shape) {
-        removeChildShape(objectId, shape.getObjectId());
-//        ((CompoundShape) objectId).removeChildShape(shape.getObjectId());
-        for (Iterator<ChildCollisionShape> it = children.iterator(); it.hasNext();) {
-            ChildCollisionShape childCollisionShape = it.next();
-            if (childCollisionShape.shape == shape) {
-                it.remove();
-            }
-        }
-    }
-
-    /**
-     * Access the list of children.
-     *
-     * @return the pre-existing list (not null)
-     */
-    public List<ChildCollisionShape> getChildren() {
-        return children;
-    }
-
-    private native long createShape();
-    
-    private native long addChildShape(long objectId, long childId, Vector3f location, Matrix3f rotation);
-    
-    private native long removeChildShape(long objectId, long childId);
-    
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.writeSavableArrayList(children, "children", new ArrayList<ChildCollisionShape>());
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    @SuppressWarnings("unchecked")
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        children = capsule.readSavableArrayList("children", new ArrayList<ChildCollisionShape>());
-        setScale(scale);
-        setMargin(margin);
-        loadChildren();
-    }
-
-    private void loadChildren() {
-        for (Iterator<ChildCollisionShape> it = children.iterator(); it.hasNext();) {
-            ChildCollisionShape child = it.next();
-            addChildShapeDirect(child.shape, child.location, child.rotation);
-        }
-    }
-
-}

+ 0 - 167
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/ConeCollisionShape.java

@@ -1,167 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.bullet.PhysicsSpace;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A conical collision shape based on Bullet's btConeShapeX, btConeShape, or
- * btConeShapeZ.
- *
- * @author normenhansen
- */
-public class ConeCollisionShape extends CollisionShape {
-
-    /**
-     * copy of radius (&ge;0)
-     */
-    protected float radius;
-    /**
-     * copy of height (&ge;0)
-     */
-    protected float height;
-    /**
-     * copy of main (height) axis (0&rarr;X, 1&rarr;Y, 2&rarr;Z)
-     */
-    protected int axis;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected ConeCollisionShape() {
-    }
-
-    /**
-     * Instantiate a cone shape around the specified main (height) axis.
-     *
-     * @param radius the desired radius (&ge;0)
-     * @param height the desired height (&ge;0)
-     * @param axis which local axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     */
-    public ConeCollisionShape(float radius, float height, int axis) {
-        this.radius = radius;
-        this.height = height;
-        this.axis = axis;
-        createShape();
-    }
-
-    /**
-     * Instantiate a cone shape oriented along the Y axis.
-     *
-     * @param radius the desired radius (&ge;0)
-     * @param height the desired height (&ge;0)
-     */
-    public ConeCollisionShape(float radius, float height) {
-        this.radius = radius;
-        this.height = height;
-        this.axis = PhysicsSpace.AXIS_Y;
-        createShape();
-    }
-
-    /**
-     * Read the radius of the cone.
-     *
-     * @return radius (&ge;0)
-     */
-    public float getRadius() {
-        return radius;
-    }
-
-    /**
-     * Read the height of the cone.
-     *
-     * @return height (&ge;0)
-     */
-    public float getHeight() {
-        return height;
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(radius, "radius", 0.5f);
-        capsule.write(height, "height", 0.5f);
-        capsule.write(axis, "axis", PhysicsSpace.AXIS_Y);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        radius = capsule.readFloat("radius", 0.5f);
-        height = capsule.readFloat("height", 0.5f);
-        axis = capsule.readInt("axis", PhysicsSpace.AXIS_Y);
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        objectId = createShape(axis, radius, height);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-//        if (axis == PhysicsSpace.AXIS_X) {
-//            objectId = new ConeShapeX(radius, height);
-//        } else if (axis == PhysicsSpace.AXIS_Y) {
-//            objectId = new ConeShape(radius, height);
-//        } else if (axis == PhysicsSpace.AXIS_Z) {
-//            objectId = new ConeShapeZ(radius, height);
-//        }
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        setScale(scale);
-        setMargin(margin);
-    }
-
-    private native long createShape(int axis, float radius, float height);
-}

+ 0 - 179
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/CylinderCollisionShape.java

@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A cylindrical collision shape based on Bullet's btCylinderShapeX, new
- * btCylinderShape, or btCylinderShapeZ.
- *
- * @author normenhansen
- */
-public class CylinderCollisionShape extends CollisionShape {
-
-    /**
-     * copy of half-extents of the cylinder on each local axis (not null, no
-     * negative component)
-     */
-    protected Vector3f halfExtents;
-    /**
-     * copy of main (height) axis (0&rarr;X, 1&rarr;Y, 2&rarr;Z)
-     */
-    protected int axis;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected CylinderCollisionShape() {
-    }
-
-    /**
-     * Instantiate a Z-axis cylinder shape with the specified half extents.
-     *
-     * @param halfExtents the desired unscaled half extents (not null, no
-     * negative component, alias created)
-     */
-    public CylinderCollisionShape(Vector3f halfExtents) {
-        this.halfExtents = halfExtents;
-        this.axis = 2;
-        createShape();
-    }
-
-    /**
-     * Instantiate a cylinder shape around the specified axis.
-     *
-     * @param halfExtents the desired unscaled half extents (not null, no 
-     * negative component, alias created)
-     * @param axis which local axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     */
-    public CylinderCollisionShape(Vector3f halfExtents, int axis) {
-        this.halfExtents = halfExtents;
-        this.axis = axis;
-        createShape();
-    }
-
-    /**
-     * Access the half extents of the cylinder.
-     *
-     * @return the pre-existing vector (not null, no negative component)
-     */
-    public final Vector3f getHalfExtents() {
-        return halfExtents;
-    }
-
-    /**
-     * Determine the main axis of the cylinder.
-     *
-     * @return 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     */
-    public int getAxis() {
-        return axis;
-    }
-
-    /**
-     * Alter the scaling factors of this shape. Scaling is disabled
-     * for cylinder shapes.
-     *
-     * @param scale the desired scaling factor for each local axis (not null, no
-     * negative component, unaffected, default=1,1,1)
-     */
-    @Override
-    public void setScale(Vector3f scale) {
-    	 if (!scale.equals(Vector3f.UNIT_XYZ)) {
-    		 Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "CylinderCollisionShape cannot be scaled");
-    	 }
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(halfExtents, "halfExtents", new Vector3f(0.5f, 0.5f, 0.5f));
-        capsule.write(axis, "axis", 1);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        halfExtents = (Vector3f) capsule.readSavable("halfExtents", new Vector3f(0.5f, 0.5f, 0.5f));
-        axis = capsule.readInt("axis", 1);
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        objectId = createShape(axis, halfExtents);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-//        switch (axis) {
-//            case 0:
-//                objectId = new CylinderShapeX(Converter.convert(halfExtents));
-//                break;
-//            case 1:
-//                objectId = new CylinderShape(Converter.convert(halfExtents));
-//                break;
-//            case 2:
-//                objectId = new CylinderShapeZ(Converter.convert(halfExtents));
-//                break;
-//        }
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        setScale(scale);
-        setMargin(margin);
-    }
-    
-    private native long createShape(int axis, Vector3f halfExtents);
-
-}

+ 0 - 219
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/GImpactCollisionShape.java

@@ -1,219 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.bullet.util.NativeMeshUtil;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Mesh;
-import com.jme3.scene.VertexBuffer.Type;
-import com.jme3.scene.mesh.IndexBuffer;
-import com.jme3.util.BufferUtils;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A mesh collision shape based on Bullet's btGImpactMeshShape.
- *
- * @author normenhansen
- */
-public class GImpactCollisionShape extends CollisionShape {
-
-//    protected Vector3f worldScale;
-    protected int numVertices, numTriangles, vertexStride, triangleIndexStride;
-    protected ByteBuffer triangleIndexBase, vertexBase;
-    /**
-     * Unique identifier of the Bullet mesh. The constructor sets this to a
-     * non-zero value.
-     */
-    protected long meshId = 0;
-//    protected IndexedMesh bulletMesh;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected GImpactCollisionShape() {
-    }
-
-    /**
-     * Instantiate a shape based on the specified JME mesh.
-     *
-     * @param mesh the Mesh to use
-     */
-    public GImpactCollisionShape(Mesh mesh) {
-        createCollisionMesh(mesh);
-    }
-
-    private void createCollisionMesh(Mesh mesh) {
-        triangleIndexBase = BufferUtils.createByteBuffer(mesh.getTriangleCount() * 3 * 4);
-        vertexBase = BufferUtils.createByteBuffer(mesh.getVertexCount() * 3 * 4); 
-//        triangleIndexBase = ByteBuffer.allocate(mesh.getTriangleCount() * 3 * 4);
-//        vertexBase = ByteBuffer.allocate(mesh.getVertexCount() * 3 * 4);
-        numVertices = mesh.getVertexCount();
-        vertexStride = 12; //3 verts * 4 bytes per.
-        numTriangles = mesh.getTriangleCount();
-        triangleIndexStride = 12; //3 index entries * 4 bytes each.
-
-        IndexBuffer indices = mesh.getIndicesAsList();
-        FloatBuffer vertices = mesh.getFloatBuffer(Type.Position);
-        vertices.rewind();
-
-        int verticesLength = mesh.getVertexCount() * 3;
-        for (int i = 0; i < verticesLength; i++) {
-            float tempFloat = vertices.get();
-            vertexBase.putFloat(tempFloat);
-        }
-
-        int indicesLength = mesh.getTriangleCount() * 3;
-        for (int i = 0; i < indicesLength; i++) {
-            triangleIndexBase.putInt(indices.get(i));
-        }
-        vertices.rewind();
-        vertices.clear();
-
-        createShape();
-    }
-
-//    /**
-//     * creates a jme mesh from the collision shape, only needed for debugging
-//     */
-//    public Mesh createJmeMesh() {
-//        return Converter.convert(bulletMesh);
-//    }
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-//        capsule.write(worldScale, "worldScale", new Vector3f(1, 1, 1));
-        capsule.write(numVertices, "numVertices", 0);
-        capsule.write(numTriangles, "numTriangles", 0);
-        capsule.write(vertexStride, "vertexStride", 0);
-        capsule.write(triangleIndexStride, "triangleIndexStride", 0);
-
-        capsule.write(triangleIndexBase.array(), "triangleIndexBase", new byte[0]);
-        capsule.write(vertexBase.array(), "vertexBase", new byte[0]);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-//        worldScale = (Vector3f) capsule.readSavable("worldScale", new Vector3f(1, 1, 1));
-        numVertices = capsule.readInt("numVertices", 0);
-        numTriangles = capsule.readInt("numTriangles", 0);
-        vertexStride = capsule.readInt("vertexStride", 0);
-        triangleIndexStride = capsule.readInt("triangleIndexStride", 0);
-
-        triangleIndexBase = ByteBuffer.wrap(capsule.readByteArray("triangleIndexBase", new byte[0]));
-        vertexBase = ByteBuffer.wrap(capsule.readByteArray("vertexBase", new byte[0]));
-        createShape();
-    }
-    
-    /**
-     * Alter the scaling factors of this shape.
-     * <p>
-     * Note that if the shape is shared (between collision objects and/or
-     * compound shapes) changes can have unintended consequences.
-     *
-     * @param scale the desired scaling factor for each local axis (not null, no
-     * negative component, unaffected, default=(1,1,1))
-     */
-    @Override
-    public void setScale(Vector3f scale) {
-        super.setScale(scale);
-        recalcAabb(objectId);
-    }
-
-    native private void recalcAabb(long shapeId);
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-//        bulletMesh = new IndexedMesh();
-//        bulletMesh.numVertices = numVertices;
-//        bulletMesh.numTriangles = numTriangles;
-//        bulletMesh.vertexStride = vertexStride;
-//        bulletMesh.triangleIndexStride = triangleIndexStride;
-//        bulletMesh.triangleIndexBase = triangleIndexBase;
-//        bulletMesh.vertexBase = vertexBase;
-//        bulletMesh.triangleIndexBase = triangleIndexBase;
-//        TriangleIndexVertexArray tiv = new TriangleIndexVertexArray(numTriangles, triangleIndexBase, triangleIndexStride, numVertices, vertexBase, vertexStride);
-//        objectId = new GImpactMeshShape(tiv);
-//        objectId.setLocalScaling(Converter.convert(worldScale));
-//        ((GImpactMeshShape)objectId).updateBound();
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        meshId = NativeMeshUtil.createTriangleIndexVertexArray(triangleIndexBase, vertexBase, numTriangles, numVertices, vertexStride, triangleIndexStride);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Mesh {0}", Long.toHexString(meshId));
-        objectId = createShape(meshId);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-        setScale(scale);
-        setMargin(margin);
-    }
-
-    private native long createShape(long meshId);
-
-    /**
-     * Finalize this shape just before it is destroyed. Should be invoked only
-     * by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing Mesh {0}", Long.toHexString(meshId));
-        finalizeNative(meshId);
-    }
-
-    private native void finalizeNative(long objectId);
-}

+ 0 - 230
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HeightfieldCollisionShape.java

@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.FastMath;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Mesh;
-import com.jme3.util.BufferUtils;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A terrain collision shape based on Bullet's btHeightfieldTerrainShape.
- * <p>
- * This is much more efficient than a regular mesh, but it has a couple
- * limitations:
- * <ul>
- * <li>No rotation or translation.</li>
- * <li>The collision bounding box must be centered on (0,0,0) with the height
- * above and below the X-Z plane being equal on either side. If not, the whole
- * collision box is shifted vertically and objects won't collide properly.</li>
- * </ul>
- *
- * @author Brent Owens
- */
-public class HeightfieldCollisionShape extends CollisionShape {
-
-    /**
-     * number of rows in the heightfield (&gt;1)
-     */
-    protected int heightStickWidth;
-    /**
-     * number of columns in the heightfield (&gt;1)
-     */
-    protected int heightStickLength;
-    /**
-     * array of heightfield samples
-     */
-    protected float[] heightfieldData;
-    protected float heightScale;
-    protected float minHeight;
-    protected float maxHeight;
-    /**
-     * index of the height axis (0&rarr;X, 1&rarr;Y, 2&rarr;Z)
-     */
-    protected int upAxis;
-    protected boolean flipQuadEdges;
-    /**
-     * buffer for passing height data to Bullet
-     * <p>
-     * A Java reference must persist after createShape() completes, or else the
-     * buffer might get garbage collected.
-     */    
-    protected ByteBuffer bbuf;
-//    protected FloatBuffer fbuf;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected HeightfieldCollisionShape() {
-    }
-
-    /**
-     * Instantiate a new shape for the specified height map.
-     *
-     * @param heightmap (not null, length&ge;4, length a perfect square)
-     */
-    public HeightfieldCollisionShape(float[] heightmap) {
-        createCollisionHeightfield(heightmap, Vector3f.UNIT_XYZ);
-    }
-
-    /**
-     * Instantiate a new shape for the specified height map and scale vector.
-     *
-     * @param heightmap (not null, length&ge;4, length a perfect square)
-     * @param scale (not null, no negative component, unaffected, default=1,1,1)
-     */
-    public HeightfieldCollisionShape(float[] heightmap, Vector3f scale) {
-        createCollisionHeightfield(heightmap, scale);
-    }
-
-    protected void createCollisionHeightfield(float[] heightmap, Vector3f worldScale) {
-        this.scale = worldScale;
-        this.heightScale = 1;//don't change away from 1, we use worldScale instead to scale
-
-        this.heightfieldData = heightmap;
-
-        float min = heightfieldData[0];
-        float max = heightfieldData[0];
-        // calculate min and max height
-        for (int i = 0; i < heightfieldData.length; i++) {
-            if (heightfieldData[i] < min) {
-                min = heightfieldData[i];
-            }
-            if (heightfieldData[i] > max) {
-                max = heightfieldData[i];
-            }
-        }
-        // we need to center the terrain collision box at 0,0,0 for BulletPhysics. And to do that we need to set the
-        // min and max height to be equal on either side of the y axis, otherwise it gets shifted and collision is incorrect.
-        if (max < 0) {
-            max = -min;
-        } else {
-            if (Math.abs(max) > Math.abs(min)) {
-                min = -max;
-            } else {
-                max = -min;
-            }
-        }
-        this.minHeight = min;
-        this.maxHeight = max;
-
-        this.upAxis = 1;
-        flipQuadEdges = true;
-
-        heightStickWidth = (int) FastMath.sqrt(heightfieldData.length);
-        heightStickLength = heightStickWidth;
-
-
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        bbuf = BufferUtils.createByteBuffer(heightfieldData.length * 4); 
-//        fbuf = bbuf.asFloatBuffer();//FloatBuffer.wrap(heightfieldData);
-//        fbuf.rewind();
-//        fbuf.put(heightfieldData);
-        for (int i = 0; i < heightfieldData.length; i++) {
-            float f = heightfieldData[i];
-            bbuf.putFloat(f);
-        }
-//        fbuf.rewind();
-        objectId = createShape(heightStickWidth, heightStickLength, bbuf, heightScale, minHeight, maxHeight, upAxis, flipQuadEdges);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-        setScale(scale);
-        setMargin(margin);
-    }
-
-    private native long createShape(int heightStickWidth, int heightStickLength, ByteBuffer heightfieldData, float heightScale, float minHeight, float maxHeight, int upAxis, boolean flipQuadEdges);
-
-    /**
-     * Does nothing.
-     * 
-     * @return null
-     */
-    public Mesh createJmeMesh() {
-        //TODO return Converter.convert(bulletMesh);
-        return null;
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(heightStickWidth, "heightStickWidth", 0);
-        capsule.write(heightStickLength, "heightStickLength", 0);
-        capsule.write(heightScale, "heightScale", 0);
-        capsule.write(minHeight, "minHeight", 0);
-        capsule.write(maxHeight, "maxHeight", 0);
-        capsule.write(upAxis, "upAxis", 1);
-        capsule.write(heightfieldData, "heightfieldData", new float[0]);
-        capsule.write(flipQuadEdges, "flipQuadEdges", false);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        heightStickWidth = capsule.readInt("heightStickWidth", 0);
-        heightStickLength = capsule.readInt("heightStickLength", 0);
-        heightScale = capsule.readFloat("heightScale", 0);
-        minHeight = capsule.readFloat("minHeight", 0);
-        maxHeight = capsule.readFloat("maxHeight", 0);
-        upAxis = capsule.readInt("upAxis", 1);
-        heightfieldData = capsule.readFloatArray("heightfieldData", new float[0]);
-        flipQuadEdges = capsule.readBoolean("flipQuadEdges", false);
-        createShape();
-    }
-}

+ 0 - 172
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/HullCollisionShape.java

@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.scene.Mesh;
-import com.jme3.scene.VertexBuffer.Type;
-import com.jme3.util.BufferUtils;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A convex hull collision shape based on Bullet's btConvexHullShape.
- */
-public class HullCollisionShape extends CollisionShape {
-
-    private float[] points;
-//    protected FloatBuffer fbuf;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected HullCollisionShape() {
-    }
-
-    /**
-     * Instantiate a collision shape based on the specified JME mesh. For best
-     * performance and stability, use the mesh should have no more than 100
-     * vertices.
-     *
-     * @param mesh a mesh on which to base the shape (not null, at least one
-     * vertex)
-     */
-    public HullCollisionShape(Mesh mesh) {
-        this.points = getPoints(mesh);
-        createShape();
-    }
-
-    /**
-     * Instantiate a collision shape based on the specified array of
-     * coordinates.
-     *
-     * @param points an array of coordinates on which to base the shape (not
-     * null, not empty, length a multiple of 3)
-     */
-    public HullCollisionShape(float[] points) {
-        this.points = points;
-        createShape();
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(points, "points", null);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-
-        // for backwards compatability
-        Mesh mesh = (Mesh) capsule.readSavable("hullMesh", null);
-        if (mesh != null) {
-            this.points = getPoints(mesh);
-        } else {
-            this.points = capsule.readFloatArray("points", null);
-
-        }
-//        fbuf = ByteBuffer.allocateDirect(points.length * 4).asFloatBuffer();
-//        fbuf.put(points);
-//        fbuf = FloatBuffer.wrap(points).order(ByteOrder.nativeOrder()).asFloatBuffer();
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-//        ObjectArrayList<Vector3f> pointList = new ObjectArrayList<Vector3f>();
-//        for (int i = 0; i < points.length; i += 3) {
-//            pointList.add(new Vector3f(points[i], points[i + 1], points[i + 2]));
-//        }
-//        objectId = new ConvexHullShape(pointList);
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        ByteBuffer bbuf=BufferUtils.createByteBuffer(points.length * 4); 
-//        fbuf = bbuf.asFloatBuffer();
-//        fbuf.rewind();
-//        fbuf.put(points);
-        for (int i = 0; i < points.length; i++) {
-            float f = points[i];
-            bbuf.putFloat(f);
-        }
-        bbuf.rewind();
-        objectId = createShape(bbuf);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-        setScale(scale);
-        setMargin(margin);
-    }
-
-    private native long createShape(ByteBuffer points);
-
-    /**
-     * Copy the vertex positions from a JME mesh.
-     *
-     * @param mesh the mesh to read (not null)
-     * @return a new array (not null, length a multiple of 3)
-     */
-    protected float[] getPoints(Mesh mesh) {
-        FloatBuffer vertices = mesh.getFloatBuffer(Type.Position);
-        vertices.rewind();
-        int components = mesh.getVertexCount() * 3;
-        float[] pointsArray = new float[components];
-        for (int i = 0; i < components; i += 3) {
-            pointsArray[i] = vertices.get();
-            pointsArray[i + 1] = vertices.get();
-            pointsArray[i + 2] = vertices.get();
-        }
-        return pointsArray;
-    }
-}

+ 0 - 255
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/MeshCollisionShape.java

@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import com.jme3.bullet.util.NativeMeshUtil;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.scene.Mesh;
-import com.jme3.scene.VertexBuffer.Type;
-import com.jme3.scene.mesh.IndexBuffer;
-import com.jme3.util.BufferUtils;
-
-/**
- * A mesh collision shape based on Bullet's btBvhTriangleMeshShape.
- *
- * @author normenhansen
- */
-public class MeshCollisionShape extends CollisionShape {
-
-    private static final String VERTEX_BASE = "vertexBase";
-    private static final String TRIANGLE_INDEX_BASE = "triangleIndexBase";
-    private static final String TRIANGLE_INDEX_STRIDE = "triangleIndexStride";
-    private static final String VERTEX_STRIDE = "vertexStride";
-    private static final String NUM_TRIANGLES = "numTriangles";
-    private static final String NUM_VERTICES = "numVertices";
-    private static final String NATIVE_BVH = "nativeBvh";
-    protected int numVertices, numTriangles, vertexStride, triangleIndexStride;
-    protected ByteBuffer triangleIndexBase, vertexBase;
-    /**
-     * Unique identifier of the Bullet mesh. The constructor sets this to a
-     * non-zero value.
-     */
-    protected long meshId = 0;
-    protected long nativeBVHBuffer = 0;
-    private boolean memoryOptimized;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected MeshCollisionShape() {
-    }
-
-    /**
-     * Instantiate a collision shape based on the specified JME mesh, optimized
-     * for memory usage.
-     *
-     * @param mesh the mesh on which to base the shape (not null)
-     */
-    public MeshCollisionShape(Mesh mesh) {
-        this(mesh, true);
-    }
-
-    /**
-     * Instantiate a collision shape based on the specified JME mesh.
-     * <p>
-     * <code>memoryOptimized</code> determines if optimized instead of quantized
-     * BVH will be used. Internally, <code>memoryOptimized</code> BVH is slower
-     * to calculate (~4x) but also smaller (~0.5x). It is preferable to use the
-     * memory optimized version and then serialize the resulting
-     * MeshCollisionshape as this will also save the generated BVH. An exception
-     * can be procedurally / generated collision shapes, where the generation
-     * time is more of a concern
-     *
-     * @param mesh the mesh on which to base the shape (not null)
-     * @param memoryOptimized true to generate a memory-optimized BVH, false to
-     * generate quantized BVH
-     */
-    public MeshCollisionShape(final Mesh mesh, final boolean memoryOptimized) {
-        this.memoryOptimized = memoryOptimized;
-        this.createCollisionMesh(mesh);
-    }
-
-    /**
-     * An advanced constructor. Passing false values can lead to a crash.
-     * Usually you don’t want to use this. Use at own risk.
-     * <p>
-     * This constructor bypasses all copy logic normally used, this allows for
-     * faster Bullet shape generation when using procedurally generated Meshes.
-     *
-     * @param indices the raw index buffer
-     * @param vertices the raw vertex buffer
-     * @param memoryOptimized use quantized BVH, uses less memory, but slower
-     */
-    public MeshCollisionShape(ByteBuffer indices, ByteBuffer vertices, boolean memoryOptimized) {
-        this.triangleIndexBase = indices;
-        this.vertexBase = vertices;
-        this.numVertices = vertices.limit() / 4 / 3;
-        this.numTriangles = this.triangleIndexBase.limit() / 4 / 3;
-        this.vertexStride = 12;
-        this.triangleIndexStride = 12;
-        this.memoryOptimized = memoryOptimized;
-        this.createShape(null);
-    }
-    
-    private void createCollisionMesh(Mesh mesh) {
-        this.triangleIndexBase = BufferUtils.createByteBuffer(mesh.getTriangleCount() * 3 * 4);
-        this.vertexBase = BufferUtils.createByteBuffer(mesh.getVertexCount() * 3 * 4);
-        this.numVertices = mesh.getVertexCount();
-        this.vertexStride = 12; // 3 verts * 4 bytes per.
-        this.numTriangles = mesh.getTriangleCount();
-        this.triangleIndexStride = 12; // 3 index entries * 4 bytes each.
-
-        IndexBuffer indices = mesh.getIndicesAsList();
-        FloatBuffer vertices = mesh.getFloatBuffer(Type.Position);
-        vertices.rewind();
-
-        int verticesLength = mesh.getVertexCount() * 3;
-        for (int i = 0; i < verticesLength; i++) {
-            float tempFloat = vertices.get();
-            vertexBase.putFloat(tempFloat);
-        }
-
-        int indicesLength = mesh.getTriangleCount() * 3;
-        for (int i = 0; i < indicesLength; i++) {
-            triangleIndexBase.putInt(indices.get(i));
-        }
-        vertices.rewind();
-        vertices.clear();
-
-        this.createShape(null);
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(final JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(numVertices, MeshCollisionShape.NUM_VERTICES, 0);
-        capsule.write(numTriangles, MeshCollisionShape.NUM_TRIANGLES, 0);
-        capsule.write(vertexStride, MeshCollisionShape.VERTEX_STRIDE, 0);
-        capsule.write(triangleIndexStride, MeshCollisionShape.TRIANGLE_INDEX_STRIDE, 0);
-
-        triangleIndexBase.position(0);
-        byte[] triangleIndexBasearray = new byte[triangleIndexBase.limit()];
-        triangleIndexBase.get(triangleIndexBasearray);
-        capsule.write(triangleIndexBasearray, MeshCollisionShape.TRIANGLE_INDEX_BASE, null);
-
-        vertexBase.position(0);
-        byte[] vertexBaseArray = new byte[vertexBase.limit()];
-        vertexBase.get(vertexBaseArray);
-        capsule.write(vertexBaseArray, MeshCollisionShape.VERTEX_BASE, null);
-
-        if (memoryOptimized) {
-            byte[] data = saveBVH(objectId);
-            capsule.write(data, MeshCollisionShape.NATIVE_BVH, null);
-        }
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(final JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        this.numVertices = capsule.readInt(MeshCollisionShape.NUM_VERTICES, 0);
-        this.numTriangles = capsule.readInt(MeshCollisionShape.NUM_TRIANGLES, 0);
-        this.vertexStride = capsule.readInt(MeshCollisionShape.VERTEX_STRIDE, 0);
-        this.triangleIndexStride = capsule.readInt(MeshCollisionShape.TRIANGLE_INDEX_STRIDE, 0);
-
-        this.triangleIndexBase = BufferUtils.createByteBuffer(capsule.readByteArray(MeshCollisionShape.TRIANGLE_INDEX_BASE, null));
-        this.vertexBase = BufferUtils.createByteBuffer(capsule.readByteArray(MeshCollisionShape.VERTEX_BASE, null));
-
-        byte[] nativeBvh = capsule.readByteArray(MeshCollisionShape.NATIVE_BVH, null);
-        memoryOptimized=nativeBvh != null;
-        createShape(nativeBvh);
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    private void createShape(byte bvh[]) {
-        boolean buildBvh=bvh==null||bvh.length==0;
-        this.meshId = NativeMeshUtil.createTriangleIndexVertexArray(this.triangleIndexBase, this.vertexBase, this.numTriangles, this.numVertices, this.vertexStride, this.triangleIndexStride);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Mesh {0}", Long.toHexString(this.meshId));
-        this.objectId = createShape(memoryOptimized, buildBvh, this.meshId);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(this.objectId));
-        if(!buildBvh)   nativeBVHBuffer = setBVH(bvh, this.objectId);                
-        this.setScale(this.scale);
-        this.setMargin(this.margin);        
-    }
-
-    /**
-     * returns the pointer to the native buffer used by the in place
-     * de-serialized shape, must be freed when not used anymore!
-     */
-    private native long setBVH(byte[] buffer, long objectid);
-    
-    private native byte[] saveBVH(long objectId);
-    
-    private native long createShape(boolean memoryOptimized, boolean buildBvt, long meshId);
-
-    /**
-     * Finalize this shape just before it is destroyed. Should be invoked only
-     * by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    public void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing Mesh {0}", Long.toHexString(this.meshId));
-        if (this.meshId > 0) {
-            this.finalizeNative(this.meshId, this.nativeBVHBuffer);
-        }
-    }
-
-    private native void finalizeNative(long objectId, long nativeBVHBuffer);
-}

+ 0 - 123
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/PlaneCollisionShape.java

@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Plane;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A planar collision shape based on Bullet's btStaticPlaneShape.
- *
- * @author normenhansen
- */
-public class PlaneCollisionShape extends CollisionShape{
-    /**
-     * description of the plane
-     */
-    private Plane plane;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected PlaneCollisionShape() {
-    }
-
-    /**
-     * Instantiate a plane shape defined by the specified plane.
-     *
-     * @param plane the desired plane (not null, alias created)
-     */
-    public PlaneCollisionShape(Plane plane) {
-        this.plane = plane;
-        createShape();
-    }
-
-    /**
-     * Access the defining plane.
-     *
-     * @return the pre-existing instance (not null)
-     */
-    public final Plane getPlane() {
-        return plane;
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(plane, "collisionPlane", new Plane());
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        plane = (Plane) capsule.readSavable("collisionPlane", new Plane());
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        objectId = createShape(plane.getNormal(), plane.getConstant());
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-//        objectId = new StaticPlaneShape(Converter.convert(plane.getNormal()),plane.getConstant());
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        setScale(scale);
-        setMargin(margin);
-    }
-    
-    private native long createShape(Vector3f normal, float constant);
-
-}

+ 0 - 179
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SimplexCollisionShape.java

@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A simple point, line-segment, triangle, or tetrahedron collision shape based
- * on Bullet's btBU_Simplex1to4.
- *
- * @author normenhansen
- */
-public class SimplexCollisionShape extends CollisionShape {
-
-    /**
-     * vertex positions
-     */
-    private Vector3f vector1, vector2, vector3, vector4;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected SimplexCollisionShape() {
-    }
-
-    /**
-     * Instantiate a tetrahedral collision shape based on the specified points.
-     *
-     * @param point1 the coordinates of 1st point (not null, alias created)
-     * @param point2 the coordinates of 2nd point (not null, alias created)
-     * @param point3 the coordinates of 3rd point (not null, alias created)
-     * @param point4 the coordinates of 4th point (not null, alias created)
-     */
-    public SimplexCollisionShape(Vector3f point1, Vector3f point2, Vector3f point3, Vector3f point4) {
-        vector1 = point1;
-        vector2 = point2;
-        vector3 = point3;
-        vector4 = point4;
-        createShape();
-    }
-
-    /**
-     * Instantiate a triangular collision shape based on the specified points.
-     *
-     * @param point1 the coordinates of 1st point (not null, alias created)
-     * @param point2 the coordinates of 2nd point (not null, alias created)
-     * @param point3 the coordinates of 3rd point (not null, alias created)
-     */
-    public SimplexCollisionShape(Vector3f point1, Vector3f point2, Vector3f point3) {
-        vector1 = point1;
-        vector2 = point2;
-        vector3 = point3;
-        createShape();
-    }
-
-    /**
-     * Instantiate a line-segment collision shape based on the specified points.
-     *
-     * @param point1 the coordinates of 1st point (not null, alias created)
-     * @param point2 the coordinates of 2nd point (not null, alias created)
-     */
-    public SimplexCollisionShape(Vector3f point1, Vector3f point2) {
-        vector1 = point1;
-        vector2 = point2;
-        createShape();
-    }
-
-    /**
-     * Instantiate a point collision shape based on the specified points.
-     *
-     * @param point1 the coordinates of point (not null, alias created)
-     */
-    public SimplexCollisionShape(Vector3f point1) {
-        vector1 = point1;
-        createShape();
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(vector1, "simplexPoint1", null);
-        capsule.write(vector2, "simplexPoint2", null);
-        capsule.write(vector3, "simplexPoint3", null);
-        capsule.write(vector4, "simplexPoint4", null);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        vector1 = (Vector3f) capsule.readSavable("simplexPoint1", null);
-        vector2 = (Vector3f) capsule.readSavable("simplexPoint2", null);
-        vector3 = (Vector3f) capsule.readSavable("simplexPoint3", null);
-        vector4 = (Vector3f) capsule.readSavable("simplexPoint4", null);
-        createShape();
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        if (vector4 != null) {
-            objectId = createShape(vector1, vector2, vector3, vector4);
-//            objectId = new BU_Simplex1to4(Converter.convert(vector1), Converter.convert(vector2), Converter.convert(vector3), Converter.convert(vector4));
-        } else if (vector3 != null) {
-            objectId = createShape(vector1, vector2, vector3);
-//            objectId = new BU_Simplex1to4(Converter.convert(vector1), Converter.convert(vector2), Converter.convert(vector3));
-        } else if (vector2 != null) {
-            objectId = createShape(vector1, vector2);
-//            objectId = new BU_Simplex1to4(Converter.convert(vector1), Converter.convert(vector2));
-        } else {
-            objectId = createShape(vector1);
-//            objectId = new BU_Simplex1to4(Converter.convert(vector1));
-        }
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        setScale(scale);
-        setMargin(margin);
-    }
-    
-    private native long createShape(Vector3f vector1);
-    
-    private native long createShape(Vector3f vector1, Vector3f vector2);
-    
-    private native long createShape(Vector3f vector1, Vector3f vector2, Vector3f vector3);
-
-    private native long createShape(Vector3f vector1, Vector3f vector2, Vector3f vector3, Vector3f vector4);
-}

+ 0 - 138
jme3-bullet/src/main/java/com/jme3/bullet/collision/shapes/SphereCollisionShape.java

@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.collision.shapes;
-
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A spherical collision shape based on Bullet's btSphereShape. These shapes
- * have no margin and cannot be scaled.
- *
- * @author normenhansen
- */
-public class SphereCollisionShape extends CollisionShape {
-
-    /**
-     * copy of radius (&ge;0)
-     */
-    protected float radius;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected SphereCollisionShape() {
-    }
-
-    /**
-     * Instantiate a sphere shape with the specified radius.
-     *
-     * @param radius the desired radius (&ge;0)
-     */
-    public SphereCollisionShape(float radius) {
-        this.radius = radius;
-        createShape();
-    }
-
-    /**
-     * Read the radius of the sphere.
-     *
-     * @return the radius (&ge;0)
-     */
-    public float getRadius() {
-        return radius;
-    }
-
-    /**
-     * Serialize this shape, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(radius, "radius", 0.5f);
-    }
-
-    /**
-     * De-serialize this shape, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        radius = capsule.readFloat("radius", 0.5f);
-        createShape();
-    }
-
-    /**
-     * Alter the scaling factors of this shape. Scaling is disabled
-     * for sphere shapes.
-     *
-     * @param scale the desired scaling factor for each local axis (not null, no
-     * negative component, unaffected, default=1,1,1)
-     */
-    @Override
-    public void setScale(Vector3f scale) {
-        if (!scale.equals(Vector3f.UNIT_XYZ)) {
-            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "SphereCollisionShape cannot be scaled");
-        }
-    }
-
-    /**
-     * Instantiate the configured shape in Bullet.
-     */
-    protected void createShape() {
-        objectId = createShape(radius);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Shape {0}", Long.toHexString(objectId));
-//        new SphereShape(radius);
-//        objectId.setLocalScaling(Converter.convert(getScale()));
-//        objectId.setMargin(margin);
-        setScale(scale); // Set the scale to 1
-        setMargin(margin);
-    }
-    
-    private native long createShape(float radius);
-
-}

+ 0 - 192
jme3-bullet/src/main/java/com/jme3/bullet/joints/ConeJoint.java

@@ -1,192 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A joint based on Bullet's btConeTwistConstraint.
- * <p>
- * <i>From the Bullet manual:</i><br>
- * To create ragdolls, the cone twist constraint is very useful for limbs like
- * the upper arm. It is a special point to point constraint that adds cone and
- * twist axis limits. The x-axis serves as twist axis.
- *
- * @author normenhansen
- */
-public class ConeJoint extends PhysicsJoint {
-
-    protected Matrix3f rotA, rotB;
-    protected float swingSpan1 = 1e30f;
-    protected float swingSpan2 = 1e30f;
-    protected float twistSpan = 1e30f;
-    protected boolean angularOnly = false;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected ConeJoint() {
-    }
-
-    /**
-     * Instantiate a ConeJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     */
-    public ConeJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.rotA = new Matrix3f();
-        this.rotB = new Matrix3f();
-        createJoint();
-    }
-
-    /**
-     * Instantiate a ConeJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA local translation of the joint connection point in node A
-     * (not null, alias created)
-     * @param pivotB local translation of the joint connection point in node B
-     * (not null, alias created)
-     * @param rotA the local orientation of the connection to node A (not null,
-     * alias created)
-     * @param rotB the local orientation of the connection to node B (not null,
-     * alias created)
-     */
-    public ConeJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.rotA = rotA;
-        this.rotB = rotB;
-        createJoint();
-    }
-
-    /**
-     * Alter the angular limits for this joint.
-     *
-     * @param swingSpan1 angle (in radians)
-     * @param swingSpan2 angle (in radians)
-     * @param twistSpan angle (in radians)
-     */
-    public void setLimit(float swingSpan1, float swingSpan2, float twistSpan) {
-        this.swingSpan1 = swingSpan1;
-        this.swingSpan2 = swingSpan2;
-        this.twistSpan = twistSpan;
-        setLimit(objectId, swingSpan1, swingSpan2, twistSpan);
-    }
-
-    private native void setLimit(long objectId, float swingSpan1, float swingSpan2, float twistSpan);
-
-    /**
-     * Alter whether this joint is angular only.
-     *
-     * @param value the desired setting (default=false)
-     */
-    public void setAngularOnly(boolean value) {
-        angularOnly = value;
-        setAngularOnly(objectId, value);
-    }
-
-    private native void setAngularOnly(long objectId, boolean value);
-
-    /**
-     * Serialize this joint, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(rotA, "rotA", new Matrix3f());
-        capsule.write(rotB, "rotB", new Matrix3f());
-
-        capsule.write(angularOnly, "angularOnly", false);
-        capsule.write(swingSpan1, "swingSpan1", 1e30f);
-        capsule.write(swingSpan2, "swingSpan2", 1e30f);
-        capsule.write(twistSpan, "twistSpan", 1e30f);
-    }
-
-    /**
-     * De-serialize this joint, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        this.rotA = (Matrix3f) capsule.readSavable("rotA", new Matrix3f());
-        this.rotB = (Matrix3f) capsule.readSavable("rotB", new Matrix3f());
-
-        this.angularOnly = capsule.readBoolean("angularOnly", false);
-        this.swingSpan1 = capsule.readFloat("swingSpan1", 1e30f);
-        this.swingSpan2 = capsule.readFloat("swingSpan2", 1e30f);
-        this.twistSpan = capsule.readFloat("twistSpan", 1e30f);
-        createJoint();
-    }
-
-    /**
-     * Create the configured joint in Bullet.
-     */
-    protected void createJoint() {
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-        setLimit(objectId, swingSpan1, swingSpan2, twistSpan);
-        setAngularOnly(objectId, angularOnly);
-    }
-
-    private native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Matrix3f rotA, Vector3f pivotB, Matrix3f rotB);
-}

+ 0 - 306
jme3-bullet/src/main/java/com/jme3/bullet/joints/HingeJoint.java

@@ -1,306 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A joint based on Bullet's btHingeConstraint.
- * <p>
- * <i>From the Bullet manual:</i><br>
- * Hinge constraint, or revolute joint restricts two additional angular degrees
- * of freedom, so the body can only rotate around one axis, the hinge axis. This
- * can be useful to represent doors or wheels rotating around one axis. The user
- * can specify limits and motor for the hinge.
- *
- * @author normenhansen
- */
-public class HingeJoint extends PhysicsJoint {
-
-    protected Vector3f axisA;
-    protected Vector3f axisB;
-    /**
-     * copy of the angular-only flag (default=false)
-     */
-    protected boolean angularOnly = false;
-    /**
-     * copy of the limit's bias factor, how strictly position errors (drift) is
-     * corrected (default=0.3)
-     */
-    protected float biasFactor = 0.3f;
-    /**
-     * copy of the limit's relaxation factor, the rate at which velocity errors
-     * are corrected (default=1)
-     */
-    protected float relaxationFactor = 1.0f;
-    /**
-     * copy of the limit's softness, the range fraction at which velocity-error
-     * correction starts operating (default=0.9)
-     */
-    protected float limitSoftness = 0.9f;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected HingeJoint() {
-    }
-
-    /**
-     * Instantiate a HingeJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     * @param axisA the local axis of the connection to node A (not null, alias
-     * created)
-     * @param axisB the local axis of the connection to node B (not null, alias
-     * created)
-     */
-    public HingeJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Vector3f axisA, Vector3f axisB) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.axisA = axisA;
-        this.axisB = axisB;
-        createJoint();
-    }
-
-    /**
-     * Enable or disable this joint's motor.
-     *
-     * @param enable true to enable, false to disable
-     * @param targetVelocity the desired target velocity
-     * @param maxMotorImpulse the desired maximum rotational force
-     */
-    public void enableMotor(boolean enable, float targetVelocity, float maxMotorImpulse) {
-        enableMotor(objectId, enable, targetVelocity, maxMotorImpulse);
-    }
-
-    private native void enableMotor(long objectId, boolean enable, float targetVelocity, float maxMotorImpulse);
-
-    /**
-     * Test whether this joint's motor is enabled.
-     *
-     * @return true if enabled, otherwise false
-     */
-    public boolean getEnableMotor() {
-        return getEnableAngularMotor(objectId);
-    }
-
-    private native boolean getEnableAngularMotor(long objectId);
-
-    /**
-     * Read the motor's target velocity.
-     *
-     * @return velocity
-     */
-    public float getMotorTargetVelocity() {
-        return getMotorTargetVelocity(objectId);
-    }
-
-    private native float getMotorTargetVelocity(long objectId);
-
-    /**
-     * Read the motor's maximum impulse.
-     *
-     * @return impulse
-     */
-    public float getMaxMotorImpulse() {
-        return getMaxMotorImpulse(objectId);
-    }
-
-    private native float getMaxMotorImpulse(long objectId);
-
-    /**
-     * Alter this joint's limits.
-     *
-     * @param low the desired lower limit of the hinge angle (in radians)
-     * @param high the desired upper limit of the joint angle (in radians)
-     */
-    public void setLimit(float low, float high) {
-        setLimit(objectId, low, high);
-    }
-
-    private native void setLimit(long objectId, float low, float high);
-
-    /**
-     * Alter this joint's limits. If you're above the softness, velocities that
-     * would shoot through the actual limit are slowed down. The bias should be
-     * in the range of 0.2 - 0.5.
-     *
-     * @param low the desired lower limit of the hinge angle (in radians)
-     * @param high the desired upper limit of the joint angle (in radians)
-     * @param _softness the desired range fraction at which velocity-error
-     * correction starts operating. A softness of 0.9 means that the correction
-     * starts at 90% of the limit range. (default=0.9)
-     * @param _biasFactor the desired magnitude of the position correction, how
-     * strictly position errors (drift) is corrected. (default=0.3)
-     * @param _relaxationFactor the desired rate at which velocity errors are
-     * corrected. This can be seen as the strength of the limits. A low value
-     * will make the limits more spongy. (default=1)
-     */
-    public void setLimit(float low, float high, float _softness, float _biasFactor, float _relaxationFactor) {
-        biasFactor = _biasFactor;
-        relaxationFactor = _relaxationFactor;
-        limitSoftness = _softness;
-        setLimit(objectId, low, high, _softness, _biasFactor, _relaxationFactor);
-    }
-
-    private native void setLimit(long objectId, float low, float high, float _softness, float _biasFactor, float _relaxationFactor);
-
-    /**
-     * Read the upper limit of the hinge angle.
-     *
-     * @return angle (in radians)
-     */
-    public float getUpperLimit() {
-        return getUpperLimit(objectId);
-    }
-
-    private native float getUpperLimit(long objectId);
-
-    /**
-     * Read the lower limit of the hinge angle.
-     *
-     * @return the angle (in radians)
-     */
-    public float getLowerLimit() {
-        return getLowerLimit(objectId);
-    }
-
-    private native float getLowerLimit(long objectId);
-
-    /**
-     * Alter the hinge translation flag.
-     *
-     * @param angularOnly true&rarr;rotate only, false&rarr;rotate and translate
-     * (default=false)
-     */
-    public void setAngularOnly(boolean angularOnly) {
-        this.angularOnly = angularOnly;
-        setAngularOnly(objectId, angularOnly);
-    }
-
-    private native void setAngularOnly(long objectId, boolean angularOnly);
-
-    /**
-     * Read the hinge angle.
-     *
-     * @return the angle (in radians)
-     */
-    public float getHingeAngle() {
-        return getHingeAngle(objectId);
-    }
-
-    private native float getHingeAngle(long objectId);
-
-    /**
-     * Serialize this joint, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(axisA, "axisA", new Vector3f());
-        capsule.write(axisB, "axisB", new Vector3f());
-
-        capsule.write(angularOnly, "angularOnly", false);
-
-        capsule.write(getLowerLimit(), "lowerLimit", 1e30f);
-        capsule.write(getUpperLimit(), "upperLimit", -1e30f);
-
-        capsule.write(biasFactor, "biasFactor", 0.3f);
-        capsule.write(relaxationFactor, "relaxationFactor", 1f);
-        capsule.write(limitSoftness, "limitSoftness", 0.9f);
-
-        capsule.write(getEnableMotor(), "enableAngularMotor", false);
-        capsule.write(getMotorTargetVelocity(), "targetVelocity", 0.0f);
-        capsule.write(getMaxMotorImpulse(), "maxMotorImpulse", 0.0f);
-    }
-
-    /**
-     * De-serialize this joint, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        this.axisA = (Vector3f) capsule.readSavable("axisA", new Vector3f());
-        this.axisB = (Vector3f) capsule.readSavable("axisB", new Vector3f());
-
-        this.angularOnly = capsule.readBoolean("angularOnly", false);
-        float lowerLimit = capsule.readFloat("lowerLimit", 1e30f);
-        float upperLimit = capsule.readFloat("upperLimit", -1e30f);
-
-        this.biasFactor = capsule.readFloat("biasFactor", 0.3f);
-        this.relaxationFactor = capsule.readFloat("relaxationFactor", 1f);
-        this.limitSoftness = capsule.readFloat("limitSoftness", 0.9f);
-
-        boolean enableAngularMotor = capsule.readBoolean("enableAngularMotor", false);
-        float targetVelocity = capsule.readFloat("targetVelocity", 0.0f);
-        float maxMotorImpulse = capsule.readFloat("maxMotorImpulse", 0.0f);
-
-        createJoint();
-        enableMotor(enableAngularMotor, targetVelocity, maxMotorImpulse);
-        setLimit(lowerLimit, upperLimit, limitSoftness, biasFactor, relaxationFactor);
-    }
-
-    /**
-     * Create the configured joint in Bullet.
-     */
-    protected void createJoint() {
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, axisA, pivotB, axisB);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-        setAngularOnly(objectId, angularOnly);
-    }
-
-    private native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Vector3f axisA, Vector3f pivotB, Vector3f axisB);
-}

+ 0 - 233
jme3-bullet/src/main/java/com/jme3/bullet/joints/PhysicsJoint.java

@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.export.*;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * The abstract base class for physics joints based on Bullet's
- * btTypedConstraint, used to connect 2 dynamic rigid bodies in the same
- * physics space.
- * <p>
- * Joints include ConeJoint, HingeJoint, Point2PointJoint, and SixDofJoint.
- *
- * @author normenhansen
- */
-public abstract class PhysicsJoint implements Savable {
-
-    /**
-     * Unique identifier of the Bullet constraint. Constructors are responsible
-     * for setting this to a non-zero value. After that, the id never changes.
-     */
-    protected long objectId = 0;
-    /**
-     * one of the connected rigid bodies
-     */
-    protected PhysicsRigidBody nodeA;
-    /**
-     * the other connected rigid body
-     */
-    protected PhysicsRigidBody nodeB;
-    /**
-     * local offset of this joint's connection point in node A
-     */
-    protected Vector3f pivotA;
-    /**
-     * local offset of this joint's connection point in node B
-     */
-    protected Vector3f pivotB;
-    protected boolean collisionBetweenLinkedBodys = true;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected PhysicsJoint() {
-    }
-
-    /**
-     * Instantiate a PhysicsJoint. To be effective, the joint must be added to
-     * the physics space of the two bodies. Also, the bodies must be dynamic and
-     * distinct.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA local offset of the joint connection point in node A (not
-     * null, alias created)
-     * @param pivotB local offset of the joint connection point in node B (not
-     * null, alias created)
-     */
-    public PhysicsJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) {
-        this.nodeA = nodeA;
-        this.nodeB = nodeB;
-        this.pivotA = pivotA;
-        this.pivotB = pivotB;
-        nodeA.addJoint(this);
-        nodeB.addJoint(this);
-    }
-
-    /**
-     * Read the magnitude of the applied impulse.
-     *
-     * @return impulse
-     */
-    public float getAppliedImpulse() {
-        return getAppliedImpulse(objectId);
-    }
-
-    private native float getAppliedImpulse(long objectId);
-
-    /**
-     * Read the id of the Bullet constraint.
-     *
-     * @return the unique identifier (not zero)
-     */
-    public long getObjectId() {
-        return objectId;
-    }
-
-    /**
-     * Test whether collisions are allowed between the linked bodies.
-     *
-     * @return true if collision are allowed, otherwise false
-     */
-    public boolean isCollisionBetweenLinkedBodys() {
-        return collisionBetweenLinkedBodys;
-    }
-
-    /**
-     * Enable or disable collisions between the linked bodies. The joint must be
-     * removed from and added to PhysicsSpace for this change to be effective.
-     *
-     * @param collisionBetweenLinkedBodys true &rarr; allow collisions, false &rarr; prevent them
-     */
-    public void setCollisionBetweenLinkedBodys(boolean collisionBetweenLinkedBodys) {
-        this.collisionBetweenLinkedBodys = collisionBetweenLinkedBodys;
-    }
-
-    /**
-     * Access the 1st body specified in during construction.
-     *
-     * @return the pre-existing body
-     */
-    public PhysicsRigidBody getBodyA() {
-        return nodeA;
-    }
-
-    /**
-     * Access the 2nd body specified in during construction.
-     *
-     * @return the pre-existing body
-     */
-    public PhysicsRigidBody getBodyB() {
-        return nodeB;
-    }
-
-    /**
-     * Access the local offset of the joint connection point in node A.
-     *
-     * @return the pre-existing vector (not null)
-     */
-    public Vector3f getPivotA() {
-        return pivotA;
-    }
-
-    /**
-     * Access the local offset of the joint connection point in node A.
-     *
-     * @return the pre-existing vector (not null)
-     */
-    public Vector3f getPivotB() {
-        return pivotB;
-    }
-
-    /**
-     * Destroy this joint and remove it from the joint lists of its connected
-     * bodies.
-     */
-    public void destroy() {
-        getBodyA().removeJoint(this);
-        getBodyB().removeJoint(this);
-    }
-
-    /**
-     * Serialize this joint, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(nodeA, "nodeA", null);
-        capsule.write(nodeB, "nodeB", null);
-        capsule.write(pivotA, "pivotA", null);
-        capsule.write(pivotB, "pivotB", null);
-    }
-
-    /**
-     * De-serialize this joint, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        InputCapsule capsule = im.getCapsule(this);
-        this.nodeA = ((PhysicsRigidBody) capsule.readSavable("nodeA", null));
-        this.nodeB = (PhysicsRigidBody) capsule.readSavable("nodeB", null);
-        this.pivotA = (Vector3f) capsule.readSavable("pivotA", new Vector3f());
-        this.pivotB = (Vector3f) capsule.readSavable("pivotB", new Vector3f());
-    }
-
-    /**
-     * Finalize this physics joint just before it is destroyed. Should be
-     * invoked only by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing Joint {0}", Long.toHexString(objectId));
-        finalizeNative(objectId);
-    }
-
-    private native void finalizeNative(long objectId);
-}

+ 0 - 189
jme3-bullet/src/main/java/com/jme3/bullet/joints/Point2PointJoint.java

@@ -1,189 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A joint based on Bullet's btPoint2PointConstraint.
- * <p>
- * <i>From the Bullet manual:</i><br>
- * Point to point constraint limits the translation so that the local pivot
- * points of 2 rigidbodies match in worldspace. A chain of rigidbodies can be
- * connected using this constraint.
- *
- * @author normenhansen
- */
-public class Point2PointJoint extends PhysicsJoint {
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected Point2PointJoint() {
-    }
-
-    /**
-     * Instantiate a Point2PointJoint. To be effective, the joint must be added
-     * to a physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     */
-    public Point2PointJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        createJoint();
-    }
-
-    /**
-     * Alter the joint's damping.
-     *
-     * @param value the desired viscous damping ratio (0&rarr;no damping,
-     * 1&rarr;critically damped, default=1)
-     */
-    public void setDamping(float value) {
-        setDamping(objectId, value);
-    }
-
-    private native void setDamping(long objectId, float value);
-
-    /**
-     * Alter the joint's impulse clamp.
-     *
-     * @param value the desired impulse clamp value (default=0)
-     */
-    public void setImpulseClamp(float value) {
-        setImpulseClamp(objectId, value);
-    }
-
-    private native void setImpulseClamp(long objectId, float value);
-
-    /**
-     * Alter the joint's tau value.
-     *
-     * @param value the desired tau value (default=0.3)
-     */
-    public void setTau(float value) {
-        setTau(objectId, value);
-    }
-
-    private native void setTau(long objectId, float value);
-
-    /**
-     * Read the joint's damping ratio.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDamping() {
-        return getDamping(objectId);
-    }
-
-    private native float getDamping(long objectId);
-
-    /**
-     * Read the joint's impulse clamp.
-     *
-     * @return the clamp value
-     */
-    public float getImpulseClamp() {
-        return getImpulseClamp(objectId);
-    }
-
-    private native float getImpulseClamp(long objectId);
-
-    /**
-     * Read the joint's tau value.
-     *
-     * @return the tau value
-     */
-    public float getTau() {
-        return getTau(objectId);
-    }
-
-    private native float getTau(long objectId);
-
-    /**
-     * Serialize this joint, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule cap = ex.getCapsule(this);
-        cap.write(getDamping(), "damping", 1.0f);
-        cap.write(getTau(), "tau", 0.3f);
-        cap.write(getImpulseClamp(), "impulseClamp", 0f);
-    }
-
-    /**
-     * De-serialize this joint, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        createJoint();
-        InputCapsule cap = im.getCapsule(this);
-        setDamping(cap.readFloat("damping", 1.0f));
-        setDamping(cap.readFloat("tau", 0.3f));
-        setDamping(cap.readFloat("impulseClamp", 0f));
-    }
-
-    /**
-     * Create the configured joint in Bullet.
-     */
-    protected void createJoint() {
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, pivotB);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-    }
-
-    private native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Vector3f pivotB);
-}

+ 0 - 350
jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofJoint.java

@@ -1,350 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.joints.motors.RotationalLimitMotor;
-import com.jme3.bullet.joints.motors.TranslationalLimitMotor;
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A joint based on Bullet's btGeneric6DofConstraint.
- * <p>
- * <i>From the Bullet manual:</i><br>
- * This generic constraint can emulate a variety of standard constraints, by
- * configuring each of the 6 degrees of freedom (dof). The first 3 dof axis are
- * linear axis, which represent translation of rigidbodies, and the latter 3 dof
- * axis represent the angular motion. Each axis can be either locked, free or
- * limited. On construction of a new btGeneric6DofSpring2Constraint, all axis
- * are locked. Afterwards the axis can be reconfigured. Note that several
- * combinations that include free and/or limited angular degrees of freedom are
- * undefined.
- * <p>
- * For each axis:<ul>
- * <li>Lowerlimit = Upperlimit &rarr; axis is locked</li>
- * <li>Lowerlimit &gt; Upperlimit &rarr; axis is free</li>
- * <li>Lowerlimit &lt; Upperlimit &rarr; axis it limited in that range</li>
- * </ul>
- *
- * @author normenhansen
- */
-public class SixDofJoint extends PhysicsJoint {
-
-    Matrix3f rotA, rotB;
-    /**
-     * true&rarr;limits give the allowable range of movement of frameB in frameA
-     * space, false&rarr;limits give the allowable range of movement of frameA
-     * in frameB space
-     */
-    boolean useLinearReferenceFrameA;
-    LinkedList<RotationalLimitMotor> rotationalMotors = new LinkedList<RotationalLimitMotor>();
-    TranslationalLimitMotor translationalMotor;
-    /**
-     * upper limits for rotation of all 3 axes
-     */
-    Vector3f angularUpperLimit = new Vector3f(Vector3f.POSITIVE_INFINITY);
-    /**
-     * lower limits for rotation of all 3 axes
-     */
-    Vector3f angularLowerLimit = new Vector3f(Vector3f.NEGATIVE_INFINITY);
-    /**
-     * upper limit for translation of all 3 axes
-     */
-    Vector3f linearUpperLimit = new Vector3f(Vector3f.POSITIVE_INFINITY);
-    /**
-     * lower limits for translation of all 3 axes
-     */
-    Vector3f linearLowerLimit = new Vector3f(Vector3f.NEGATIVE_INFINITY);
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected SixDofJoint() {
-    }
-
-    /**
-     * Instantiate a SixDofJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     * @param rotA the local orientation of the connection to node A (not null,
-     * alias created)
-     * @param rotB the local orientation of the connection to node B (not null,
-     * alias created)
-     * @param useLinearReferenceFrameA true&rarr;use node A, false&rarr;use node
-     * B
-     */
-    public SixDofJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.useLinearReferenceFrameA = useLinearReferenceFrameA;
-        this.rotA = rotA;
-        this.rotB = rotB;
-
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB, useLinearReferenceFrameA);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-        gatherMotors();
-    }
-
-    /**
-     * Instantiate a SixDofJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     * @param useLinearReferenceFrameA true&rarr;use node A, false&rarr;use node
-     * B
-     */
-    public SixDofJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, boolean useLinearReferenceFrameA) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.useLinearReferenceFrameA = useLinearReferenceFrameA;
-        rotA = new Matrix3f();
-        rotB = new Matrix3f();
-
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB, useLinearReferenceFrameA);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-        gatherMotors();
-    }
-
-    private void gatherMotors() {
-        for (int i = 0; i < 3; i++) {
-            RotationalLimitMotor rmot = new RotationalLimitMotor(getRotationalLimitMotor(objectId, i));
-            rotationalMotors.add(rmot);
-        }
-        translationalMotor = new TranslationalLimitMotor(getTranslationalLimitMotor(objectId));
-    }
-
-    native private void getAngles(long jointId, Vector3f storeVector);
-
-    /**
-     * Copy the joint's rotation angles.
-     *
-     * @param storeResult storage for the result (modified if not null)
-     * @return the rotation angle for each local axis (in radians, either
-     * storeResult or a new vector, not null)
-     */
-    public Vector3f getAngles(Vector3f storeResult) {
-        Vector3f result = (storeResult == null) ? new Vector3f() : storeResult;
-
-        long constraintId = getObjectId();
-        getAngles(constraintId, result);
-
-        return result;
-    }
-
-    private native long getRotationalLimitMotor(long objectId, int index);
-
-    private native long getTranslationalLimitMotor(long objectId);
-
-    /**
-     * Access the TranslationalLimitMotor of this joint, the motor which
-     * influences translation on all 3 axes.
-     *
-     * @return the pre-existing instance
-     */
-    public TranslationalLimitMotor getTranslationalLimitMotor() {
-        return translationalMotor;
-    }
-
-    /**
-     * Access the indexed RotationalLimitMotor of this joint, the motor which
-     * influences rotation around one axis.
-     *
-     * @param index the axis index of the desired motor: 0&rarr;X, 1&rarr;Y,
-     * 2&rarr;Z
-     * @return the pre-existing instance
-     */
-    public RotationalLimitMotor getRotationalLimitMotor(int index) {
-        return rotationalMotors.get(index);
-    }
-
-    /**
-     * Alter the joint's upper limits for translation of all 3 axes.
-     *
-     * @param vector the desired upper limits (not null, unaffected)
-     */
-    public void setLinearUpperLimit(Vector3f vector) {
-        linearUpperLimit.set(vector);
-        setLinearUpperLimit(objectId, vector);
-    }
-
-    private native void setLinearUpperLimit(long objctId, Vector3f vector);
-
-    /**
-     * Alter the joint's lower limits for translation of all 3 axes.
-     *
-     * @param vector the desired lower limits (not null, unaffected)
-     */
-    public void setLinearLowerLimit(Vector3f vector) {
-        linearLowerLimit.set(vector);
-        setLinearLowerLimit(objectId, vector);
-    }
-
-    private native void setLinearLowerLimit(long objctId, Vector3f vector);
-
-    /**
-     * Alter the joint's upper limits for rotation of all 3 axes.
-     *
-     * @param vector the desired upper limits (in radians, not null, unaffected)
-     */
-    public void setAngularUpperLimit(Vector3f vector) {
-        angularUpperLimit.set(vector);
-        setAngularUpperLimit(objectId, vector);
-    }
-
-    private native void setAngularUpperLimit(long objctId, Vector3f vector);
-
-    /**
-     * Alter the joint's lower limits for rotation of all 3 axes.
-     *
-     * @param vector the desired lower limits (in radians, not null, unaffected)
-     */
-    public void setAngularLowerLimit(Vector3f vector) {
-        angularLowerLimit.set(vector);
-        setAngularLowerLimit(objectId, vector);
-    }
-
-    private native void setAngularLowerLimit(long objctId, Vector3f vector);
-
-    native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Matrix3f rotA, Vector3f pivotB, Matrix3f rotB, boolean useLinearReferenceFrameA);
-
-    /**
-     * De-serialize this joint, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB, useLinearReferenceFrameA);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-        gatherMotors();
-
-        setAngularUpperLimit((Vector3f) capsule.readSavable("angularUpperLimit", new Vector3f(Vector3f.POSITIVE_INFINITY)));
-        setAngularLowerLimit((Vector3f) capsule.readSavable("angularLowerLimit", new Vector3f(Vector3f.NEGATIVE_INFINITY)));
-        setLinearUpperLimit((Vector3f) capsule.readSavable("linearUpperLimit", new Vector3f(Vector3f.POSITIVE_INFINITY)));
-        setLinearLowerLimit((Vector3f) capsule.readSavable("linearLowerLimit", new Vector3f(Vector3f.NEGATIVE_INFINITY)));
-
-        for (int i = 0; i < 3; i++) {
-            RotationalLimitMotor rotationalLimitMotor = getRotationalLimitMotor(i);
-            rotationalLimitMotor.setBounce(capsule.readFloat("rotMotor" + i + "_Bounce", 0.0f));
-            rotationalLimitMotor.setDamping(capsule.readFloat("rotMotor" + i + "_Damping", 1.0f));
-            rotationalLimitMotor.setERP(capsule.readFloat("rotMotor" + i + "_ERP", 0.5f));
-            rotationalLimitMotor.setHiLimit(capsule.readFloat("rotMotor" + i + "_HiLimit", Float.POSITIVE_INFINITY));
-            rotationalLimitMotor.setLimitSoftness(capsule.readFloat("rotMotor" + i + "_LimitSoftness", 0.5f));
-            rotationalLimitMotor.setLoLimit(capsule.readFloat("rotMotor" + i + "_LoLimit", Float.NEGATIVE_INFINITY));
-            rotationalLimitMotor.setMaxLimitForce(capsule.readFloat("rotMotor" + i + "_MaxLimitForce", 300.0f));
-            rotationalLimitMotor.setMaxMotorForce(capsule.readFloat("rotMotor" + i + "_MaxMotorForce", 0.1f));
-            rotationalLimitMotor.setTargetVelocity(capsule.readFloat("rotMotor" + i + "_TargetVelocity", 0));
-            rotationalLimitMotor.setEnableMotor(capsule.readBoolean("rotMotor" + i + "_EnableMotor", false));
-        }
-        getTranslationalLimitMotor().setAccumulatedImpulse((Vector3f) capsule.readSavable("transMotor_AccumulatedImpulse", Vector3f.ZERO));
-        getTranslationalLimitMotor().setDamping(capsule.readFloat("transMotor_Damping", 1.0f));
-        getTranslationalLimitMotor().setLimitSoftness(capsule.readFloat("transMotor_LimitSoftness", 0.7f));
-        getTranslationalLimitMotor().setLowerLimit((Vector3f) capsule.readSavable("transMotor_LowerLimit", Vector3f.ZERO));
-        getTranslationalLimitMotor().setRestitution(capsule.readFloat("transMotor_Restitution", 0.5f));
-        getTranslationalLimitMotor().setUpperLimit((Vector3f) capsule.readSavable("transMotor_UpperLimit", Vector3f.ZERO));
-
-        for (int axisIndex = 0; axisIndex < 3; ++axisIndex) {
-            translationalMotor.setEnabled(axisIndex, capsule.readBoolean(
-                    "transMotor_Enable" + axisIndex, false));
-        }
-    }
-
-    /**
-     * Serialize this joint, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(angularUpperLimit, "angularUpperLimit", new Vector3f(Vector3f.POSITIVE_INFINITY));
-        capsule.write(angularLowerLimit, "angularLowerLimit", new Vector3f(Vector3f.NEGATIVE_INFINITY));
-        capsule.write(linearUpperLimit, "linearUpperLimit", new Vector3f(Vector3f.POSITIVE_INFINITY));
-        capsule.write(linearLowerLimit, "linearLowerLimit", new Vector3f(Vector3f.NEGATIVE_INFINITY));
-        int i = 0;
-        for (Iterator<RotationalLimitMotor> it = rotationalMotors.iterator(); it.hasNext();) {
-            RotationalLimitMotor rotationalLimitMotor = it.next();
-            capsule.write(rotationalLimitMotor.getBounce(), "rotMotor" + i + "_Bounce", 0.0f);
-            capsule.write(rotationalLimitMotor.getDamping(), "rotMotor" + i + "_Damping", 1.0f);
-            capsule.write(rotationalLimitMotor.getERP(), "rotMotor" + i + "_ERP", 0.5f);
-            capsule.write(rotationalLimitMotor.getHiLimit(), "rotMotor" + i + "_HiLimit", Float.POSITIVE_INFINITY);
-            capsule.write(rotationalLimitMotor.getLimitSoftness(), "rotMotor" + i + "_LimitSoftness", 0.5f);
-            capsule.write(rotationalLimitMotor.getLoLimit(), "rotMotor" + i + "_LoLimit", Float.NEGATIVE_INFINITY);
-            capsule.write(rotationalLimitMotor.getMaxLimitForce(), "rotMotor" + i + "_MaxLimitForce", 300.0f);
-            capsule.write(rotationalLimitMotor.getMaxMotorForce(), "rotMotor" + i + "_MaxMotorForce", 0.1f);
-            capsule.write(rotationalLimitMotor.getTargetVelocity(), "rotMotor" + i + "_TargetVelocity", 0);
-            capsule.write(rotationalLimitMotor.isEnableMotor(), "rotMotor" + i + "_EnableMotor", false);
-            i++;
-        }
-        capsule.write(getTranslationalLimitMotor().getAccumulatedImpulse(), "transMotor_AccumulatedImpulse", Vector3f.ZERO);
-        capsule.write(getTranslationalLimitMotor().getDamping(), "transMotor_Damping", 1.0f);
-        capsule.write(getTranslationalLimitMotor().getLimitSoftness(), "transMotor_LimitSoftness", 0.7f);
-        capsule.write(getTranslationalLimitMotor().getLowerLimit(), "transMotor_LowerLimit", Vector3f.ZERO);
-        capsule.write(getTranslationalLimitMotor().getRestitution(), "transMotor_Restitution", 0.5f);
-        capsule.write(getTranslationalLimitMotor().getUpperLimit(), "transMotor_UpperLimit", Vector3f.ZERO);
-
-        for (int axisIndex = 0; axisIndex < 3; ++axisIndex) {
-            capsule.write(translationalMotor.isEnabled(axisIndex),
-                    "transMotor_Enable" + axisIndex, false);
-        }
-    }
-}

+ 0 - 151
jme3-bullet/src/main/java/com/jme3/bullet/joints/SixDofSpringJoint.java

@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Vector3f;
-
-/**
- * A 6 degree-of-freedom joint based on Bullet's btGeneric6DofSpringConstraint.
- * <p>
- * <i>From the Bullet manual:</i><br>
- * This generic constraint can emulate a variety of standard constraints, by
- * configuring each of the 6 degrees of freedom (dof). The first 3 dof axis are
- * linear axis, which represent translation of rigidbodies, and the latter 3 dof
- * axis represent the angular motion. Each axis can be either locked, free or
- * limited. On construction of a new btGeneric6DofSpring2Constraint, all axis
- * are locked. Afterwards the axis can be reconfigured. Note that several
- * combinations that include free and/or limited angular degrees of freedom are
- * undefined.
- * <p>
- * For each axis:<ul>
- * <li>Lowerlimit = Upperlimit &rarr; axis is locked</li>
- * <li>Lowerlimit &gt; Upperlimit &rarr; axis is free</li>
- * <li>Lowerlimit &lt; Upperlimit &rarr; axis it limited in that range</li>
- * </ul>
- *
- * @author normenhansen
- */
-public class SixDofSpringJoint extends SixDofJoint {
-
-   final boolean       springEnabled[] = new boolean[6];
-   final float equilibriumPoint[] = new float[6];
-   final float springStiffness[] = new float[6];
-   final float springDamping[] = new float[6]; // between 0 and 1 (1 == no damping)
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    public SixDofSpringJoint() {
-    }
-
-    /**
-     * Instantiate a SixDofSpringJoint. To be effective, the joint must be added
-     * to a physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     * @param rotA the local orientation of the connection to node A (not
-     * null, alias created)
-     * @param rotB the local orientation of the connection to node B (not
-     * null, alias created)
-     * @param useLinearReferenceFrameA true&rarr;use node A, false&rarr;use node
-     * B
-     */
-    public SixDofSpringJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) {
-        super(nodeA, nodeB, pivotA, pivotB, rotA, rotB, useLinearReferenceFrameA);
-    }
-
-    /**
-     * Enable or disable the spring for the indexed degree of freedom.
-     *
-     * @param index which degree of freedom (&ge;0, &lt;6)
-     * @param onOff true &rarr; enable, false &rarr; disable
-     */
-    public void enableSpring(int index, boolean onOff) {
-        enableSpring(objectId, index, onOff);
-    }
-    native void enableSpring(long objctId, int index, boolean onOff);
-
-    /**
-     * Alter the spring stiffness for the indexed degree of freedom.
-     *
-     * @param index which degree of freedom (&ge;0, &lt;6)
-     * @param stiffness the desired stiffness
-     */
-    public void setStiffness(int index, float stiffness) {
-        setStiffness(objectId, index, stiffness);
-    }
-    native void setStiffness(long objctId, int index, float stiffness);
-
-    /**
-     * Alter the damping for the indexed degree of freedom.
-     *
-     * @param index which degree of freedom (&ge;0, &lt;6)
-     * @param damping the desired viscous damping ratio (0&rarr;no damping,
-     * 1&rarr;critically damped, default=1)
-     */
-    public void setDamping(int index, float damping) {
-        setDamping(objectId, index, damping);
-
-    }
-    native void setDamping(long objctId, int index, float damping);
-    /**
-     * Alter the equilibrium points for all degrees of freedom, based on the
-     * current constraint position/orientation.
-     */
-    public void setEquilibriumPoint() { // set the current constraint position/orientation as an equilibrium point for all DOF
-        setEquilibriumPoint(objectId);
-    }
-    native void setEquilibriumPoint(long objctId);
-    /**
-     * Alter the equilibrium point of the indexed degree of freedom, based on
-     * the current constraint position/orientation.
-     *
-     * @param index which degree of freedom (&ge;0, &lt;6)
-     */
-    public void setEquilibriumPoint(int index){ // set the current constraint position/orientation as an equilibrium point for given DOF
-        setEquilibriumPoint(objectId, index);
-    }
-    native void setEquilibriumPoint(long objctId, int index);
-    @Override
-    native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Matrix3f rotA, Vector3f pivotB, Matrix3f rotB, boolean useLinearReferenceFrameA);
-
-}

+ 0 - 888
jme3-bullet/src/main/java/com/jme3/bullet/joints/SliderJoint.java

@@ -1,888 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints;
-
-import com.jme3.bullet.objects.PhysicsRigidBody;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A slider joint based on Bullet's btSliderConstraint.
- * <p>
- * <i>From the Bullet manual:</i><br>
- * The slider constraint allows the body to rotate around one axis and translate
- * along this axis.
- *
- * @author normenhansen
- */
-public class SliderJoint extends PhysicsJoint {
-
-    protected Matrix3f rotA, rotB;
-    protected boolean useLinearReferenceFrameA;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected SliderJoint() {
-    }
-
-    /**
-     * Instantiate a SliderJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     * @param rotA the local orientation of the connection to node A (not null, alias created)
-     * @param rotB the local orientation of the connection to node B (not null, alias created)
-     * @param useLinearReferenceFrameA true&rarr;use node A, false&rarr;use node
-     * B
-     */
-    public SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, Matrix3f rotA, Matrix3f rotB, boolean useLinearReferenceFrameA) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.rotA = rotA;
-        this.rotB = rotB;
-        this.useLinearReferenceFrameA = useLinearReferenceFrameA;
-        createJoint();
-    }
-
-    /**
-     * Instantiate a SliderJoint. To be effective, the joint must be added to a
-     * physics space.
-     *
-     * @param nodeA the 1st body connected by the joint (not null, alias
-     * created)
-     * @param nodeB the 2nd body connected by the joint (not null, alias
-     * created)
-     * @param pivotA the local offset of the connection point in node A (not
-     * null, alias created)
-     * @param pivotB the local offset of the connection point in node B (not
-     * null, alias created)
-     * @param useLinearReferenceFrameA true&rarr;use node A, false&rarr;use node
-     * B
-     */
-    public SliderJoint(PhysicsRigidBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB, boolean useLinearReferenceFrameA) {
-        super(nodeA, nodeB, pivotA, pivotB);
-        this.rotA = new Matrix3f();
-        this.rotB = new Matrix3f();
-        this.useLinearReferenceFrameA = useLinearReferenceFrameA;
-        createJoint();
-    }
-
-    /**
-     * Read the joint's lower limit for on-axis translation.
-     *
-     * @return the lower limit
-     */
-    public float getLowerLinLimit() {
-        return getLowerLinLimit(objectId);
-    }
-
-    private native float getLowerLinLimit(long objectId);
-
-    /**
-     * Alter the joint's lower limit for on-axis translation.
-     *
-     * @param lowerLinLimit the desired lower limit (default=-1)
-     */
-    public void setLowerLinLimit(float lowerLinLimit) {
-        setLowerLinLimit(objectId, lowerLinLimit);
-    }
-
-    private native void setLowerLinLimit(long objectId, float value);
-
-    /**
-     * Read the joint's upper limit for on-axis translation.
-     *
-     * @return the upper limit
-     */
-    public float getUpperLinLimit() {
-        return getUpperLinLimit(objectId);
-    }
-
-    private native float getUpperLinLimit(long objectId);
-
-    /**
-     * Alter the joint's upper limit for on-axis translation.
-     *
-     * @param upperLinLimit the desired upper limit (default=1)
-     */
-    public void setUpperLinLimit(float upperLinLimit) {
-        setUpperLinLimit(objectId, upperLinLimit);
-    }
-
-    private native void setUpperLinLimit(long objectId, float value);
-
-    /**
-     * Read the joint's lower limit for on-axis rotation.
-     *
-     * @return the lower limit angle (in radians)
-     */
-    public float getLowerAngLimit() {
-        return getLowerAngLimit(objectId);
-    }
-
-    private native float getLowerAngLimit(long objectId);
-
-    /**
-     * Alter the joint's lower limit for on-axis rotation.
-     *
-     * @param lowerAngLimit the desired lower limit angle (in radians,
-     * default=0)
-     */
-    public void setLowerAngLimit(float lowerAngLimit) {
-        setLowerAngLimit(objectId, lowerAngLimit);
-    }
-
-    private native void setLowerAngLimit(long objectId, float value);
-
-    /**
-     * Read the joint's upper limit for on-axis rotation.
-     *
-     * @return the upper limit angle (in radians)
-     */
-    public float getUpperAngLimit() {
-        return getUpperAngLimit(objectId);
-    }
-
-    private native float getUpperAngLimit(long objectId);
-
-    /**
-     * Alter the joint's upper limit for on-axis rotation.
-     *
-     * @param upperAngLimit the desired upper limit angle (in radians,
-     * default=0)
-     */
-    public void setUpperAngLimit(float upperAngLimit) {
-        setUpperAngLimit(objectId, upperAngLimit);
-    }
-
-    private native void setUpperAngLimit(long objectId, float value);
-
-    /**
-     * Read the joint's softness for on-axis translation between the limits.
-     *
-     * @return the softness
-     */
-    public float getSoftnessDirLin() {
-        return getSoftnessDirLin(objectId);
-    }
-
-    private native float getSoftnessDirLin(long objectId);
-
-    /**
-     * Alter the joint's softness for on-axis translation between the limits.
-     *
-     * @param softnessDirLin the desired softness (default=1)
-     */
-    public void setSoftnessDirLin(float softnessDirLin) {
-        setSoftnessDirLin(objectId, softnessDirLin);
-    }
-
-    private native void setSoftnessDirLin(long objectId, float value);
-
-    /**
-     * Read the joint's restitution for on-axis translation between the limits.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitutionDirLin() {
-        return getRestitutionDirLin(objectId);
-    }
-
-    private native float getRestitutionDirLin(long objectId);
-
-    /**
-     * Alter the joint's restitution for on-axis translation between the limits.
-     *
-     * @param restitutionDirLin the desired restitution (bounce) factor
-     * (default=0.7)
-     */
-    public void setRestitutionDirLin(float restitutionDirLin) {
-        setRestitutionDirLin(objectId, restitutionDirLin);
-    }
-
-    private native void setRestitutionDirLin(long objectId, float value);
-
-    /**
-     * Read the joint's damping for on-axis translation between the limits.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDampingDirLin() {
-        return getDampingDirLin(objectId);
-    }
-
-    private native float getDampingDirLin(long objectId);
-
-    /**
-     * Alter the joint's damping for on-axis translation between the limits.
-     *
-     * @param dampingDirLin the desired viscous damping ratio (0&rarr;no
-     * damping, 1&rarr;critically damped, default=0)
-     */
-    public void setDampingDirLin(float dampingDirLin) {
-        setDampingDirLin(objectId, dampingDirLin);
-    }
-
-    private native void setDampingDirLin(long objectId, float value);
-
-    /**
-     * Read the joint's softness for on-axis rotation between the limits.
-     *
-     * @return the softness
-     */
-    public float getSoftnessDirAng() {
-        return getSoftnessDirAng(objectId);
-    }
-
-    private native float getSoftnessDirAng(long objectId);
-
-    /**
-     * Alter the joint's softness for on-axis rotation between the limits.
-     *
-     * @param softnessDirAng the desired softness (default=1)
-     */
-    public void setSoftnessDirAng(float softnessDirAng) {
-        setSoftnessDirAng(objectId, softnessDirAng);
-    }
-
-    private native void setSoftnessDirAng(long objectId, float value);
-
-    /**
-     * Read the joint's restitution for on-axis rotation between the limits.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitutionDirAng() {
-        return getRestitutionDirAng(objectId);
-    }
-
-    private native float getRestitutionDirAng(long objectId);
-
-    /**
-     * Alter the joint's restitution for on-axis rotation between the limits.
-     *
-     * @param restitutionDirAng the desired restitution (bounce) factor
-     * (default=0.7)
-     */
-    public void setRestitutionDirAng(float restitutionDirAng) {
-        setRestitutionDirAng(objectId, restitutionDirAng);
-    }
-
-    private native void setRestitutionDirAng(long objectId, float value);
-
-    /**
-     * Read the joint's damping for on-axis rotation between the limits.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDampingDirAng() {
-        return getDampingDirAng(objectId);
-    }
-
-    private native float getDampingDirAng(long objectId);
-
-    /**
-     * Alter the joint's damping for on-axis rotation between the limits.
-     *
-     * @param dampingDirAng the desired viscous damping ratio (0&rarr;no
-     * damping, 1&rarr;critically damped, default=0)
-     */
-    public void setDampingDirAng(float dampingDirAng) {
-        setDampingDirAng(objectId, dampingDirAng);
-    }
-
-    private native void setDampingDirAng(long objectId, float value);
-
-    /**
-     * Read the joint's softness for on-axis translation hitting the limits.
-     *
-     * @return the softness
-     */
-    public float getSoftnessLimLin() {
-        return getSoftnessLimLin(objectId);
-    }
-
-    private native float getSoftnessLimLin(long objectId);
-
-    /**
-     * Alter the joint's softness for on-axis translation hitting the limits.
-     *
-     * @param softnessLimLin the desired softness (default=1)
-     */
-    public void setSoftnessLimLin(float softnessLimLin) {
-        setSoftnessLimLin(objectId, softnessLimLin);
-    }
-
-    private native void setSoftnessLimLin(long objectId, float value);
-
-    /**
-     * Read the joint's restitution for on-axis translation hitting the limits.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitutionLimLin() {
-        return getRestitutionLimLin(objectId);
-    }
-
-    private native float getRestitutionLimLin(long objectId);
-
-    /**
-     * Alter the joint's restitution for on-axis translation hitting the limits.
-     *
-     * @param restitutionLimLin the desired restitution (bounce) factor
-     * (default=0.7)
-     */
-    public void setRestitutionLimLin(float restitutionLimLin) {
-        setRestitutionLimLin(objectId, restitutionLimLin);
-    }
-
-    private native void setRestitutionLimLin(long objectId, float value);
-
-    /**
-     * Read the joint's damping for on-axis translation hitting the limits.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDampingLimLin() {
-        return getDampingLimLin(objectId);
-    }
-
-    private native float getDampingLimLin(long objectId);
-
-    /**
-     * Alter the joint's damping for on-axis translation hitting the limits.
-     *
-     * @param dampingLimLin the desired viscous damping ratio (0&rarr;no
-     * damping, 1&rarr;critically damped, default=1)
-     */
-    public void setDampingLimLin(float dampingLimLin) {
-        setDampingLimLin(objectId, dampingLimLin);
-    }
-
-    private native void setDampingLimLin(long objectId, float value);
-
-    /**
-     * Read the joint's softness for on-axis rotation hitting the limits.
-     *
-     * @return the softness
-     */
-    public float getSoftnessLimAng() {
-        return getSoftnessLimAng(objectId);
-    }
-
-    private native float getSoftnessLimAng(long objectId);
-
-    /**
-     * Alter the joint's softness for on-axis rotation hitting the limits.
-     *
-     * @param softnessLimAng the desired softness (default=1)
-     */
-    public void setSoftnessLimAng(float softnessLimAng) {
-        setSoftnessLimAng(objectId, softnessLimAng);
-    }
-
-    private native void setSoftnessLimAng(long objectId, float value);
-
-    /**
-     * Read the joint's restitution for on-axis rotation hitting the limits.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitutionLimAng() {
-        return getRestitutionLimAng(objectId);
-    }
-
-    private native float getRestitutionLimAng(long objectId);
-
-    /**
-     * Alter the joint's restitution for on-axis rotation hitting the limits.
-     *
-     * @param restitutionLimAng the desired restitution (bounce) factor
-     * (default=0.7)
-     */
-    public void setRestitutionLimAng(float restitutionLimAng) {
-        setRestitutionLimAng(objectId, restitutionLimAng);
-    }
-
-    private native void setRestitutionLimAng(long objectId, float value);
-
-    /**
-     * Read the joint's damping for on-axis rotation hitting the limits.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDampingLimAng() {
-        return getDampingLimAng(objectId);
-    }
-
-    private native float getDampingLimAng(long objectId);
-
-    /**
-     * Alter the joint's damping for on-axis rotation hitting the limits.
-     *
-     * @param dampingLimAng the desired viscous damping ratio (0&rarr;no
-     * damping, 1&rarr;critically damped, default=1)
-     */
-    public void setDampingLimAng(float dampingLimAng) {
-        setDampingLimAng(objectId, dampingLimAng);
-    }
-
-    private native void setDampingLimAng(long objectId, float value);
-
-    /**
-     * Read the joint's softness for off-axis translation.
-     *
-     * @return the softness
-     */
-    public float getSoftnessOrthoLin() {
-        return getSoftnessOrthoLin(objectId);
-    }
-
-    private native float getSoftnessOrthoLin(long objectId);
-
-    /**
-     * Alter the joint's softness for off-axis translation.
-     *
-     * @param softnessOrthoLin the desired softness (default=1)
-     */
-    public void setSoftnessOrthoLin(float softnessOrthoLin) {
-        setSoftnessOrthoLin(objectId, softnessOrthoLin);
-    }
-
-    private native void setSoftnessOrthoLin(long objectId, float value);
-
-    /**
-     * Read the joint's restitution for off-axis translation.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitutionOrthoLin() {
-        return getRestitutionOrthoLin(objectId);
-    }
-
-    private native float getRestitutionOrthoLin(long objectId);
-
-    /**
-     * Alter the joint's restitution for off-axis translation.
-     *
-     * @param restitutionOrthoLin the desired restitution (bounce) factor
-     * (default=0.7)
-     */
-    public void setRestitutionOrthoLin(float restitutionOrthoLin) {
-        setRestitutionOrthoLin(objectId, restitutionOrthoLin);
-    }
-
-    private native void setRestitutionOrthoLin(long objectId, float value);
-
-    /**
-     * Read the joint's damping for off-axis translation.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDampingOrthoLin() {
-        return getDampingOrthoLin(objectId);
-    }
-
-    private native float getDampingOrthoLin(long objectId);
-
-    /**
-     * Alter the joint's damping for off-axis translation.
-     *
-     * @param dampingOrthoLin the desired viscous damping ratio (0&rarr;no
-     * damping, 1&rarr;critically damped, default=1)
-     */
-    public void setDampingOrthoLin(float dampingOrthoLin) {
-        setDampingOrthoLin(objectId, dampingOrthoLin);
-    }
-
-    private native void setDampingOrthoLin(long objectId, float value);
-
-    /**
-     * Read the joint's softness for off-axis rotation.
-     *
-     * @return the softness
-     */
-    public float getSoftnessOrthoAng() {
-        return getSoftnessOrthoAng(objectId);
-    }
-
-    private native float getSoftnessOrthoAng(long objectId);
-
-    /**
-     * Alter the joint's softness for off-axis rotation.
-     *
-     * @param softnessOrthoAng the desired softness (default=1)
-     */
-    public void setSoftnessOrthoAng(float softnessOrthoAng) {
-        setSoftnessOrthoAng(objectId, softnessOrthoAng);
-    }
-
-    private native void setSoftnessOrthoAng(long objectId, float value);
-
-    /**
-     * Read the joint's restitution for off-axis rotation.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitutionOrthoAng() {
-        return getRestitutionOrthoAng(objectId);
-    }
-
-    private native float getRestitutionOrthoAng(long objectId);
-
-    /**
-     * Alter the joint's restitution for off-axis rotation.
-     *
-     * @param restitutionOrthoAng the desired restitution (bounce) factor
-     * (default=0.7)
-     */
-    public void setRestitutionOrthoAng(float restitutionOrthoAng) {
-        setRestitutionOrthoAng(objectId, restitutionOrthoAng);
-    }
-
-    private native void setRestitutionOrthoAng(long objectId, float value);
-
-    /**
-     * Read the joint's damping for off-axis rotation.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDampingOrthoAng() {
-        return getDampingOrthoAng(objectId);
-    }
-
-    private native float getDampingOrthoAng(long objectId);
-
-    /**
-     * Alter the joint's damping for off-axis rotation.
-     *
-     * @param dampingOrthoAng the desired viscous damping ratio (0&rarr;no
-     * damping, 1&rarr;critically damped, default=1)
-     */
-    public void setDampingOrthoAng(float dampingOrthoAng) {
-        setDampingOrthoAng(objectId, dampingOrthoAng);
-    }
-
-    private native void setDampingOrthoAng(long objectId, float value);
-
-    /**
-     * Test whether the translation motor is powered.
-     *
-     * @return true if powered, otherwise false
-     */
-    public boolean isPoweredLinMotor() {
-        return isPoweredLinMotor(objectId);
-    }
-
-    private native boolean isPoweredLinMotor(long objectId);
-
-    /**
-     * Alter whether the translation motor is powered.
-     *
-     * @param poweredLinMotor true to power the motor, false to de-power it
-     * (default=false)
-     */
-    public void setPoweredLinMotor(boolean poweredLinMotor) {
-        setPoweredLinMotor(objectId, poweredLinMotor);
-    }
-
-    private native void setPoweredLinMotor(long objectId, boolean value);
-
-    /**
-     * Read the velocity target of the translation motor.
-     *
-     * @return the velocity target
-     */
-    public float getTargetLinMotorVelocity() {
-        return getTargetLinMotorVelocity(objectId);
-    }
-
-    private native float getTargetLinMotorVelocity(long objectId);
-
-    /**
-     * Alter the velocity target of the translation motor.
-     *
-     * @param targetLinMotorVelocity the desired velocity target (default=0)
-     */
-    public void setTargetLinMotorVelocity(float targetLinMotorVelocity) {
-        setTargetLinMotorVelocity(objectId, targetLinMotorVelocity);
-    }
-
-    private native void setTargetLinMotorVelocity(long objectId, float value);
-
-    /**
-     * Read the maximum force of the translation motor.
-     *
-     * @return the maximum force
-     */
-    public float getMaxLinMotorForce() {
-        return getMaxLinMotorForce(objectId);
-    }
-
-    private native float getMaxLinMotorForce(long objectId);
-
-    /**
-     * Alter the maximum force of the translation motor.
-     *
-     * @param maxLinMotorForce the desired maximum force (default=0)
-     */
-    public void setMaxLinMotorForce(float maxLinMotorForce) {
-        setMaxLinMotorForce(objectId, maxLinMotorForce);
-    }
-
-    private native void setMaxLinMotorForce(long objectId, float value);
-
-    /**
-     * Test whether the rotation motor is powered.
-     *
-     * @return true if powered, otherwise false
-     */
-    public boolean isPoweredAngMotor() {
-        return isPoweredAngMotor(objectId);
-    }
-
-    private native boolean isPoweredAngMotor(long objectId);
-
-    /**
-     * Alter whether the rotation motor is powered.
-     *
-     * @param poweredAngMotor true to power the motor, false to de-power it
-     * (default=false)
-     */
-    public void setPoweredAngMotor(boolean poweredAngMotor) {
-        setPoweredAngMotor(objectId, poweredAngMotor);
-    }
-
-    private native void setPoweredAngMotor(long objectId, boolean value);
-
-    /**
-     * Read the velocity target of the rotation motor.
-     *
-     * @return the velocity target (in radians per second)
-     */
-    public float getTargetAngMotorVelocity() {
-        return getTargetAngMotorVelocity(objectId);
-    }
-
-    private native float getTargetAngMotorVelocity(long objectId);
-
-    /**
-     * Alter the velocity target of the rotation motor.
-     *
-     * @param targetAngMotorVelocity the desired velocity target (in radians per
-     * second, default=0)
-     */
-    public void setTargetAngMotorVelocity(float targetAngMotorVelocity) {
-        setTargetAngMotorVelocity(objectId, targetAngMotorVelocity);
-    }
-
-    private native void setTargetAngMotorVelocity(long objectId, float value);
-
-    /**
-     * Read the maximum force of the rotation motor.
-     *
-     * @return the maximum force
-     */
-    public float getMaxAngMotorForce() {
-        return getMaxAngMotorForce(objectId);
-    }
-
-    private native float getMaxAngMotorForce(long objectId);
-
-    /**
-     * Alter the maximum force of the rotation motor.
-     *
-     * @param maxAngMotorForce the desired maximum force (default=0)
-     */
-    public void setMaxAngMotorForce(float maxAngMotorForce) {
-        setMaxAngMotorForce(objectId, maxAngMotorForce);
-    }
-
-    private native void setMaxAngMotorForce(long objectId, float value);
-
-    /**
-     * Serialize this joint, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        super.write(ex);
-        OutputCapsule capsule = ex.getCapsule(this);
-        //TODO: standard values..
-        capsule.write(getDampingDirAng(), "dampingDirAng", 0f);
-        capsule.write(getDampingDirLin(), "dampingDirLin", 0f);
-        capsule.write(getDampingLimAng(), "dampingLimAng", 0f);
-        capsule.write(getDampingLimLin(), "dampingLimLin", 0f);
-        capsule.write(getDampingOrthoAng(), "dampingOrthoAng", 0f);
-        capsule.write(getDampingOrthoLin(), "dampingOrthoLin", 0f);
-        capsule.write(getLowerAngLimit(), "lowerAngLimit", 0f);
-        capsule.write(getLowerLinLimit(), "lowerLinLimit", 0f);
-        capsule.write(getMaxAngMotorForce(), "maxAngMotorForce", 0f);
-        capsule.write(getMaxLinMotorForce(), "maxLinMotorForce", 0f);
-        capsule.write(isPoweredAngMotor(), "poweredAngMotor", false);
-        capsule.write(isPoweredLinMotor(), "poweredLinMotor", false);
-        capsule.write(getRestitutionDirAng(), "restitutionDirAng", 0f);
-        capsule.write(getRestitutionDirLin(), "restitutionDirLin", 0f);
-        capsule.write(getRestitutionLimAng(), "restitutionLimAng", 0f);
-        capsule.write(getRestitutionLimLin(), "restitutionLimLin", 0f);
-        capsule.write(getRestitutionOrthoAng(), "restitutionOrthoAng", 0f);
-        capsule.write(getRestitutionOrthoLin(), "restitutionOrthoLin", 0f);
-
-        capsule.write(getSoftnessDirAng(), "softnessDirAng", 0f);
-        capsule.write(getSoftnessDirLin(), "softnessDirLin", 0f);
-        capsule.write(getSoftnessLimAng(), "softnessLimAng", 0f);
-        capsule.write(getSoftnessLimLin(), "softnessLimLin", 0f);
-        capsule.write(getSoftnessOrthoAng(), "softnessOrthoAng", 0f);
-        capsule.write(getSoftnessOrthoLin(), "softnessOrthoLin", 0f);
-
-        capsule.write(getTargetAngMotorVelocity(), "targetAngMotorVelicoty", 0f);
-        capsule.write(getTargetLinMotorVelocity(), "targetLinMotorVelicoty", 0f);
-
-        capsule.write(getUpperAngLimit(), "upperAngLimit", 0f);
-        capsule.write(getUpperLinLimit(), "upperLinLimit", 0f);
-
-        capsule.write(useLinearReferenceFrameA, "useLinearReferenceFrameA", false);
-    }
-
-    /**
-     * De-serialize this joint, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        super.read(im);
-        InputCapsule capsule = im.getCapsule(this);
-        float dampingDirAng = capsule.readFloat("dampingDirAng", 0f);
-        float dampingDirLin = capsule.readFloat("dampingDirLin", 0f);
-        float dampingLimAng = capsule.readFloat("dampingLimAng", 0f);
-        float dampingLimLin = capsule.readFloat("dampingLimLin", 0f);
-        float dampingOrthoAng = capsule.readFloat("dampingOrthoAng", 0f);
-        float dampingOrthoLin = capsule.readFloat("dampingOrthoLin", 0f);
-        float lowerAngLimit = capsule.readFloat("lowerAngLimit", 0f);
-        float lowerLinLimit = capsule.readFloat("lowerLinLimit", 0f);
-        float maxAngMotorForce = capsule.readFloat("maxAngMotorForce", 0f);
-        float maxLinMotorForce = capsule.readFloat("maxLinMotorForce", 0f);
-        boolean poweredAngMotor = capsule.readBoolean("poweredAngMotor", false);
-        boolean poweredLinMotor = capsule.readBoolean("poweredLinMotor", false);
-        float restitutionDirAng = capsule.readFloat("restitutionDirAng", 0f);
-        float restitutionDirLin = capsule.readFloat("restitutionDirLin", 0f);
-        float restitutionLimAng = capsule.readFloat("restitutionLimAng", 0f);
-        float restitutionLimLin = capsule.readFloat("restitutionLimLin", 0f);
-        float restitutionOrthoAng = capsule.readFloat("restitutionOrthoAng", 0f);
-        float restitutionOrthoLin = capsule.readFloat("restitutionOrthoLin", 0f);
-
-        float softnessDirAng = capsule.readFloat("softnessDirAng", 0f);
-        float softnessDirLin = capsule.readFloat("softnessDirLin", 0f);
-        float softnessLimAng = capsule.readFloat("softnessLimAng", 0f);
-        float softnessLimLin = capsule.readFloat("softnessLimLin", 0f);
-        float softnessOrthoAng = capsule.readFloat("softnessOrthoAng", 0f);
-        float softnessOrthoLin = capsule.readFloat("softnessOrthoLin", 0f);
-
-        float targetAngMotorVelicoty = capsule.readFloat("targetAngMotorVelicoty", 0f);
-        float targetLinMotorVelicoty = capsule.readFloat("targetLinMotorVelicoty", 0f);
-
-        float upperAngLimit = capsule.readFloat("upperAngLimit", 0f);
-        float upperLinLimit = capsule.readFloat("upperLinLimit", 0f);
-
-        useLinearReferenceFrameA = capsule.readBoolean("useLinearReferenceFrameA", false);
-
-        createJoint();
-
-        setDampingDirAng(dampingDirAng);
-        setDampingDirLin(dampingDirLin);
-        setDampingLimAng(dampingLimAng);
-        setDampingLimLin(dampingLimLin);
-        setDampingOrthoAng(dampingOrthoAng);
-        setDampingOrthoLin(dampingOrthoLin);
-        setLowerAngLimit(lowerAngLimit);
-        setLowerLinLimit(lowerLinLimit);
-        setMaxAngMotorForce(maxAngMotorForce);
-        setMaxLinMotorForce(maxLinMotorForce);
-        setPoweredAngMotor(poweredAngMotor);
-        setPoweredLinMotor(poweredLinMotor);
-        setRestitutionDirAng(restitutionDirAng);
-        setRestitutionDirLin(restitutionDirLin);
-        setRestitutionLimAng(restitutionLimAng);
-        setRestitutionLimLin(restitutionLimLin);
-        setRestitutionOrthoAng(restitutionOrthoAng);
-        setRestitutionOrthoLin(restitutionOrthoLin);
-
-        setSoftnessDirAng(softnessDirAng);
-        setSoftnessDirLin(softnessDirLin);
-        setSoftnessLimAng(softnessLimAng);
-        setSoftnessLimLin(softnessLimLin);
-        setSoftnessOrthoAng(softnessOrthoAng);
-        setSoftnessOrthoLin(softnessOrthoLin);
-
-        setTargetAngMotorVelocity(targetAngMotorVelicoty);
-        setTargetLinMotorVelocity(targetLinMotorVelicoty);
-
-        setUpperAngLimit(upperAngLimit);
-        setUpperLinLimit(upperLinLimit);
-    }
-
-    /**
-     * Instantiate the configured constraint in Bullet.
-     */
-    protected void createJoint() {
-        objectId = createJoint(nodeA.getObjectId(), nodeB.getObjectId(), pivotA, rotA, pivotB, rotB, useLinearReferenceFrameA);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Joint {0}", Long.toHexString(objectId));
-        // = new SliderConstraint(nodeA.getObjectId(), nodeB.getObjectId(), transA, transB, useLinearReferenceFrameA);
-    }
-
-    private native long createJoint(long objectIdA, long objectIdB, Vector3f pivotA, Matrix3f rotA, Vector3f pivotB, Matrix3f rotB, boolean useLinearReferenceFrameA);
-}

+ 0 - 287
jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/RotationalLimitMotor.java

@@ -1,287 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints.motors;
-
-/**
- * A motor based on Bullet's btRotationalLimitMotor. Motors are used to drive
- * joints.
- *
- * @author normenhansen
- */
-public class RotationalLimitMotor {
-
-    /**
-     * Unique identifier of the btRotationalLimitMotor. The constructor sets
-     * this to a non-zero value.
-     */
-    private long motorId = 0;
-
-    /**
-     * Instantiate a motor for the identified btRotationalLimitMotor.
-     *
-     * @param motor the unique identifier (not zero)
-     */
-    public RotationalLimitMotor(long motor) {
-        this.motorId = motor;
-    }
-
-    /**
-     * Read the id of the btRotationalLimitMotor.
-     *
-     * @return the identifier of the btRotationalLimitMotor (not zero)
-     */
-    public long getMotor() {
-        return motorId;
-    }
-
-    /**
-     * Read this motor's constraint lower limit.
-     *
-     * @return the limit value
-     */
-    public float getLoLimit() {
-        return getLoLimit(motorId);
-    }
-
-    private native float getLoLimit(long motorId);
-
-    /**
-     * Alter this motor's constraint lower limit.
-     *
-     * @param loLimit the desired limit value
-     */
-    public void setLoLimit(float loLimit) {
-        setLoLimit(motorId, loLimit);
-    }
-
-    private native void setLoLimit(long motorId, float loLimit);
-
-    /**
-     * Read this motor's constraint upper limit.
-     *
-     * @return the limit value
-     */
-    public float getHiLimit() {
-        return getHiLimit(motorId);
-    }
-
-    private native float getHiLimit(long motorId);
-
-    /**
-     * Alter this motor's constraint upper limit.
-     *
-     * @param hiLimit the desired limit value
-     */
-    public void setHiLimit(float hiLimit) {
-        setHiLimit(motorId, hiLimit);
-    }
-
-    private native void setHiLimit(long motorId, float hiLimit);
-
-    /**
-     * Read this motor's target velocity.
-     *
-     * @return the target velocity (in radians per second)
-     */
-    public float getTargetVelocity() {
-        return getTargetVelocity(motorId);
-    }
-
-    private native float getTargetVelocity(long motorId);
-
-    /**
-     * Alter this motor's target velocity.
-     *
-     * @param targetVelocity the desired target velocity (in radians per second)
-     */
-    public void setTargetVelocity(float targetVelocity) {
-        setTargetVelocity(motorId, targetVelocity);
-    }
-
-    private native void setTargetVelocity(long motorId, float targetVelocity);
-
-    /**
-     * Read this motor's maximum force.
-     *
-     * @return the maximum force
-     */
-    public float getMaxMotorForce() {
-        return getMaxMotorForce(motorId);
-    }
-
-    private native float getMaxMotorForce(long motorId);
-
-    /**
-     * Alter this motor's maximum force.
-     *
-     * @param maxMotorForce the desired maximum force on the motor
-     */
-    public void setMaxMotorForce(float maxMotorForce) {
-        setMaxMotorForce(motorId, maxMotorForce);
-    }
-
-    private native void setMaxMotorForce(long motorId, float maxMotorForce);
-
-    /**
-     * Read the limit's maximum force.
-     *
-     * @return the maximum force on the limit
-     */
-    public float getMaxLimitForce() {
-        return getMaxLimitForce(motorId);
-    }
-
-    private native float getMaxLimitForce(long motorId);
-
-    /**
-     * Alter the limit's maximum force.
-     *
-     * @param maxLimitForce the desired maximum force on the limit
-     */
-    public void setMaxLimitForce(float maxLimitForce) {
-        setMaxLimitForce(motorId, maxLimitForce);
-    }
-
-    private native void setMaxLimitForce(long motorId, float maxLimitForce);
-
-    /**
-     * Read this motor's damping.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDamping() {
-        return getDamping(motorId);
-    }
-
-    private native float getDamping(long motorId);
-
-    /**
-     * Alter this motor's damping.
-     *
-     * @param damping the desired viscous damping ratio (0&rarr;no damping,
-     * 1&rarr;critically damped, default=1)
-     */
-    public void setDamping(float damping) {
-        setDamping(motorId, damping);
-    }
-
-    private native void setDamping(long motorId, float damping);
-
-    /**
-     * Read this motor's limit softness.
-     *
-     * @return the limit softness
-     */
-    public float getLimitSoftness() {
-        return getLimitSoftness(motorId);
-    }
-
-    private native float getLimitSoftness(long motorId);
-
-    /**
-     * Alter this motor's limit softness.
-     *
-     * @param limitSoftness the desired limit softness
-     */
-    public void setLimitSoftness(float limitSoftness) {
-        setLimitSoftness(motorId, limitSoftness);
-    }
-
-    private native void setLimitSoftness(long motorId, float limitSoftness);
-
-    /**
-     * Read this motor's error tolerance at limits.
-     *
-     * @return the error tolerance (&gt;0)
-     */
-    public float getERP() {
-        return getERP(motorId);
-    }
-
-    private native float getERP(long motorId);
-
-    /**
-     * Alter this motor's error tolerance at limits.
-     *
-     * @param ERP the desired error tolerance (&gt;0)
-     */
-    public void setERP(float ERP) {
-        setERP(motorId, ERP);
-    }
-
-    private native void setERP(long motorId, float ERP);
-
-    /**
-     * Read this motor's bounce.
-     *
-     * @return the bounce (restitution factor)
-     */
-    public float getBounce() {
-        return getBounce(motorId);
-    }
-
-    private native float getBounce(long motorId);
-
-    /**
-     * Alter this motor's bounce.
-     *
-     * @param bounce the desired bounce (restitution factor)
-     */
-    public void setBounce(float bounce) {
-        setBounce(motorId, bounce);
-    }
-
-    private native void setBounce(long motorId, float limitSoftness);
-
-    /**
-     * Test whether this motor is enabled.
-     *
-     * @return true if enabled, otherwise false
-     */
-    public boolean isEnableMotor() {
-        return isEnableMotor(motorId);
-    }
-
-    private native boolean isEnableMotor(long motorId);
-
-    /**
-     * Enable or disable this motor.
-     *
-     * @param enableMotor true&rarr;enable, false&rarr;disable
-     */
-    public void setEnableMotor(boolean enableMotor) {
-        setEnableMotor(motorId, enableMotor);
-    }
-
-    private native void setEnableMotor(long motorId, boolean enableMotor);
-}

+ 0 - 233
jme3-bullet/src/main/java/com/jme3/bullet/joints/motors/TranslationalLimitMotor.java

@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.joints.motors;
-
-import com.jme3.math.Vector3f;
-
-/**
- * A motor based on Bullet's btTranslationalLimitMotor. Motors are used to drive
- * joints.
- *
- * @author normenhansen
- */
-public class TranslationalLimitMotor {
-
-    /**
-     * Unique identifier of the btTranslationalLimitMotor. The constructor sets
-     * this to a non-zero value. After that, the id never changes.
-     */
-    private long motorId = 0;
-
-    /**
-     * Instantiate a motor for the identified btTranslationalLimitMotor.
-     *
-     * @param motor the unique identifier (not zero)
-     */
-    public TranslationalLimitMotor(long motor) {
-        this.motorId = motor;
-    }
-
-    /**
-     * Read the id of the btTranslationalLimitMotor.
-     *
-     * @return the unique identifier (not zero)
-     */
-    public long getMotor() {
-        return motorId;
-    }
-
-    /**
-     * Copy this motor's constraint lower limits.
-     *
-     * @return a new vector (not null)
-     */
-    public Vector3f getLowerLimit() {
-        Vector3f vec = new Vector3f();
-        getLowerLimit(motorId, vec);
-        return vec;
-    }
-
-    private native void getLowerLimit(long motorId, Vector3f vector);
-
-    /**
-     * Alter the constraint lower limits.
-     *
-     * @param lowerLimit (unaffected, not null)
-     */
-    public void setLowerLimit(Vector3f lowerLimit) {
-        setLowerLimit(motorId, lowerLimit);
-    }
-
-    private native void setLowerLimit(long motorId, Vector3f vector);
-    
-    /**
-     * Copy this motor's constraint upper limits.
-     *
-     * @return a new vector (not null)
-     */
-    public Vector3f getUpperLimit() {
-        Vector3f vec = new Vector3f();
-        getUpperLimit(motorId, vec);
-        return vec;
-    }
-
-    private native void getUpperLimit(long motorId, Vector3f vector);
-
-    /**
-     * Alter the constraint upper limits.
-     *
-     * @param upperLimit (unaffected, not null)
-     */
-    public void setUpperLimit(Vector3f upperLimit) {
-        setUpperLimit(motorId, upperLimit);
-    }
-
-    private native void setUpperLimit(long motorId, Vector3f vector);
-
-    /**
-     * Copy the accumulated impulse.
-     *
-     * @return a new vector (not null)
-     */
-    public Vector3f getAccumulatedImpulse() {
-        Vector3f vec = new Vector3f();
-        getAccumulatedImpulse(motorId, vec);
-        return vec;
-    }
-
-    private native void getAccumulatedImpulse(long motorId, Vector3f vector);
-    
-    /**
-     * Alter the accumulated impulse.
-     *
-     * @param accumulatedImpulse the desired vector (not null, unaffected)
-     */
-    public void setAccumulatedImpulse(Vector3f accumulatedImpulse) {
-        setAccumulatedImpulse(motorId, accumulatedImpulse);
-    }
-
-    private native void setAccumulatedImpulse(long motorId, Vector3f vector);
-
-    /**
-     * Read this motor's limit softness.
-     *
-     * @return the softness
-     */
-    public float getLimitSoftness() {
-        return getLimitSoftness(motorId);
-    }
-    
-    private native float getLimitSoftness(long motorId);
-
-    /**
-     * Alter the limit softness.
-     *
-     * @param limitSoftness the desired limit softness (default=0.5)
-     */
-    public void setLimitSoftness(float limitSoftness) {
-        setLimitSoftness(motorId, limitSoftness);
-    }
-    
-    private native void setLimitSoftness(long motorId, float limitSoftness);
-
-    /**
-     * Read this motor's damping.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getDamping() {
-        return getDamping(motorId);
-    }
-
-    private native float getDamping(long motorId);
-    
-    /**
-     * Alter this motor's damping.
-     *
-     * @param damping the desired viscous damping ratio (0&rarr;no damping,
-     * 1&rarr;critically damped, default=1)
-     */
-    public void setDamping(float damping) {
-        setDamping(motorId, damping);
-    }
-
-    private native void setDamping(long motorId, float damping);
-    
-    /**
-     * Read this motor's restitution.
-     *
-     * @return the restitution (bounce) factor
-     */
-    public float getRestitution() {
-        return getRestitution(motorId);
-    }
-    
-    private native float getRestitution(long motorId);
-
-    /**
-     * Alter this motor's restitution.
-     *
-     * @param restitution the desired restitution (bounce) factor
-     */
-    public void setRestitution(float restitution) {
-        setRestitution(motorId, restitution);
-    }
-
-    private native void setRestitution(long motorId, float restitution);
-
-    /**
-     * Enable or disable the indexed axis.
-     *
-     * @param axisIndex which axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     * @param enableMotor true&rarr;enable, false&rarr;disable (default=false)
-     */
-    public void setEnabled(int axisIndex, boolean enableMotor) {
-        setEnabled(motorId, axisIndex, enableMotor);
-    }
-
-    native private void setEnabled(long motorId, int axisIndex,
-            boolean enableMotor);
-
-    /**
-     * Test whether the indexed axis is enabled.
-     *
-     * @param axisIndex which axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     * @return true if enabled, otherwise false
-     */
-    public boolean isEnabled(int axisIndex) {
-        boolean result = isEnabled(motorId, axisIndex);
-        return result;
-    }
-
-    native private boolean isEnabled(long motorId, int axisIndex);
-}

+ 0 - 711
jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java

@@ -1,711 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects;
-
-import com.jme3.bullet.collision.CollisionFlag;
-import com.jme3.bullet.collision.PhysicsCollisionObject;
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Quaternion;
-import com.jme3.math.Vector3f;
-
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A collision object for simplified character simulation, based on Bullet's
- * btKinematicCharacterController.
- *
- * @author normenhansen
- */
-public class PhysicsCharacter extends PhysicsCollisionObject {
-   /**
-     * Unique identifier of btKinematicCharacterController (as opposed to its
-     * collision object, which is a ghost). Constructors are responsible for
-     * setting this to a non-zero value. The id might change if the character
-     * gets rebuilt.
-     */
-    protected long characterId = 0;
-    protected float stepHeight;
-    protected Vector3f walkDirection = new Vector3f();
-    protected float fallSpeed = 55.0f;
-    protected float jumpSpeed = 10.0f;
-    protected int upAxis = 1;
-    protected boolean locationDirty = false;
-    //TEMP VARIABLES
-    protected final Quaternion tmp_inverseWorldRotation = new Quaternion();
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected PhysicsCharacter() {
-    }
-
-    /**
-     * Instantiate a character with the specified collision shape and step
-     * height.
-     *
-     * @param shape the desired shape (not null, alias created)
-     * @param stepHeight the quantization size for vertical movement
-     */
-    public PhysicsCharacter(CollisionShape shape, float stepHeight) {
-        this.collisionShape = shape;
-//        if (shape instanceof MeshCollisionShape || shape instanceof CompoundCollisionShape) {
-//            throw (new UnsupportedOperationException("Kinematic character nodes cannot have mesh or compound collision shapes"));
-//        }
-        this.stepHeight = stepHeight;
-        buildObject();
-        /*
-         * The default gravity for a Bullet btKinematicCharacterController
-         * is (0,0,-29.4), which makes no sense for JME.
-         * So override the default.
-         */
-        setGravity(new Vector3f(0f, -29.4f, 0f));
-    }
-
-    /**
-     * Create the configured character in Bullet.
-     */
-    protected void buildObject() {
-        if (objectId == 0) {
-            objectId = createGhostObject();
-            Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Creating GhostObject {0}", Long.toHexString(objectId));
-            initUserPointer();
-        }
-        setCharacterFlags(objectId);
-        attachCollisionShape(objectId, collisionShape.getObjectId());
-        if (characterId != 0) {
-            Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Clearing Character {0}", Long.toHexString(objectId));
-            finalizeNativeCharacter(characterId);
-        }
-        characterId = createCharacterObject(objectId, collisionShape.getObjectId(), stepHeight);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Creating Character {0}", Long.toHexString(characterId));
-    }
-
-    private native long createGhostObject();
-
-    private native void setCharacterFlags(long objectId);
-
-    private native long createCharacterObject(long objectId, long shapeId, float stepHeight);
-
-    /**
-     * Directly alter the location of this character's center of mass.
-     *
-     * @param location the desired physics location (not null, unaffected)
-     */
-    public void warp(Vector3f location) {
-        warp(characterId, location);
-    }
-
-    private native void warp(long characterId, Vector3f location);
-
-    /**
-     * Alter the walk offset. The offset will continue to be applied until
-     * altered again.
-     *
-     * @param vec the desired position increment for each physics tick (not
-     * null, unaffected)
-     */
-    public void setWalkDirection(Vector3f vec) {
-        walkDirection.set(vec);
-        setWalkDirection(characterId, vec);
-    }
-
-    private native void setWalkDirection(long characterId, Vector3f vec);
-
-    /**
-     * Access the walk offset.
-     *
-     * @return the pre-existing instance
-     */
-    public Vector3f getWalkDirection() {
-        return walkDirection;
-    }
-    
-    /**
-     * @deprecated Deprecated in bullet 2.86.1 use setUp(Vector3f) instead
-     * @param axis which axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     */
-    @Deprecated
-	public void setUpAxis(int axis) {
-        switch (axis) {
-            case 0:
-                setUp(Vector3f.UNIT_X);
-                break;
-            case 1:
-                setUp(Vector3f.UNIT_Y);
-                break;
-            case 2:
-                setUp(Vector3f.UNIT_Z);
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid axis, not in range [0, 2]");
-        }
-	}
-    
-    /**
-     * Alter this character's "up" direction.
-     *
-     * @param axis the desired direction (not null, not zero, unaffected)
-     */
-    public void setUp(Vector3f axis) {
-        setUp(characterId, axis);
-    }
-
-    private native void setUp(long characterId, Vector3f axis);
-
-    /**
-     * Alter this character's angular velocity.
-     *
-     * @param v the desired angular velocity vector (not null, unaffected)
-     */
-    
-    public void setAngularVelocity(Vector3f v){
-    	setAngularVelocity(characterId,v);
-    }
-        
-    private native void setAngularVelocity(long characterId, Vector3f v);
-
-    /**
-     * Copy this character's angular velocity.
-     *
-     * @param out storage for the result (modified if not null)
-     * @return the velocity vector (either the provided storage or a new vector,
-     * not null)
-     */
-    public Vector3f getAngularVelocity(Vector3f out){
-    	if(out==null)out=new Vector3f();
-    	getAngularVelocity(characterId,out);
-    	return out;
-    }
-    
-    private native void getAngularVelocity(long characterId, Vector3f out);
-    
-
-    /**
-     * Alter the linear velocity of this character's center of mass.
-     *
-     * @param v the desired velocity vector (not null)
-     */
-    public void setLinearVelocity(Vector3f v){
-    	setLinearVelocity(characterId,v);
-    }
-        
-    private native void setLinearVelocity(long characterId, Vector3f v);
-
-    /**
-     * Copy the linear velocity of this character's center of mass.
-     *
-     * @param out storage for the result (modified if not null)
-     * @return a vector (either the provided storage or a new vector, not null)
-     */
-    public Vector3f getLinearVelocity(Vector3f out){
-    	if(out==null)out=new Vector3f();
-    	getLinearVelocity(characterId,out);
-    	return out;
-    }
-    
-    private native void getLinearVelocity(long characterId, Vector3f out);
-        
-
-    /**
-     * Read the index of the "up" axis.
-     *
-     * @return which axis: 0&rarr;X, 1&rarr;Y, 2&rarr;Z
-     */
-    public int getUpAxis() {
-        return upAxis;
-    }
-
-    /**
-     * Alter this character's fall speed.
-     *
-     * @param fallSpeed the desired speed (default=55)
-     */
-    public void setFallSpeed(float fallSpeed) {
-        this.fallSpeed = fallSpeed;
-        setFallSpeed(characterId, fallSpeed);
-    }
-
-    private native void setFallSpeed(long characterId, float fallSpeed);
-
-    /**
-     * Read this character's fall speed.
-     *
-     * @return speed
-     */
-    public float getFallSpeed() {
-        return fallSpeed;
-    }
-
-    /**
-     * Alter this character's jump speed.
-     *
-     * @param jumpSpeed the desired speed (default=10)
-     */
-    public void setJumpSpeed(float jumpSpeed) {
-        this.jumpSpeed = jumpSpeed;
-        setJumpSpeed(characterId, jumpSpeed);
-    }
-
-    private native void setJumpSpeed(long characterId, float jumpSpeed);
-
-    /**
-     * Read this character's jump speed.
-     *
-     * @return speed
-     */
-    public float getJumpSpeed() {
-        return jumpSpeed;
-    }
-
-    /**
-     * @deprecated Deprecated in bullet 2.86.1. Use setGravity(Vector3f)
-     * instead.
-     * @param value the desired downward (-Y) component of the acceleration
-     * (typically positive)
-     */
-    @Deprecated
-    public void setGravity(float value) {
-        setGravity(new Vector3f(0, -value, 0));
-    }
-
-    /**
-     * Alter this character's gravitational acceleration.
-     *
-     * @param value the desired acceleration vector (not null, unaffected)
-     */
-    public void setGravity(Vector3f value) {
-        setGravity(characterId, value);
-    }
-
-    private native void setGravity(long characterId, Vector3f gravity);
-
-    /**
-     * @deprecated Deprecated in bullet 2.86.1. Use getGravity(Vector3f)
-     * instead.
-     * @return the downward (-Y) component of the acceleration (typically
-     * positive)
-     */
-    @Deprecated
-    public float getGravity() {
-        return -getGravity(null).y;
-    }
-
-    /**
-     * Copy this character's gravitational acceleration.
-     *
-     * @param out storage for the result (modified if not null)
-     * @return the acceleration vector (either the provided storage or a new
-     * vector, not null)
-     */
-    public Vector3f getGravity(Vector3f out) {
-    	if(out==null)out=new Vector3f();
-    	getGravity(characterId,out);
-    	return out;
-    }
-
-    private native void getGravity(long characterId,Vector3f out);
-
-        
-    /**
-     * Read this character's linear damping.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */        
-    public float getLinearDamping(){
-    	return getLinearDamping(characterId);
-    }
-    
-    private native float getLinearDamping(long characterId);
-    
-    /**
-     * Alter this character's linear damping.
-     *
-     * @param v the desired viscous damping ratio (0&rarr;no damping,
-     * 1&rarr;critically damped)
-     */
-        
-    public void setLinearDamping(float v ){
-    	setLinearDamping(characterId,v );
-    }
-    
-    private native void setLinearDamping(long characterId,float v);
-    
-    
-    /**
-     * Read this character's angular damping.
-     *
-     * @return the viscous damping ratio (0&rarr;no damping, 1&rarr;critically
-     * damped)
-     */
-    public float getAngularDamping(){
-    	return getAngularDamping(characterId);
-    }
-    
-    private native float getAngularDamping(long characterId);
-    
-    /**
-     * Alter this character's angular damping.
-     *
-     * @param v the desired viscous damping ratio (0&rarr;no damping,
-     * 1&rarr;critically damped, default=0)
-     */        
-    public void setAngularDamping(float v ){
-    	setAngularDamping(characterId,v );
-    }
-    
-    private native void setAngularDamping(long characterId,float v);
-    
-    
-    /**
-     * Read this character's step height.
-     *
-     * @return the height (in physics-space units)
-     */
-    public float getStepHeight(){
-    	return getStepHeight(characterId);
-    }
-    
-    private native float getStepHeight(long characterId);
-    
-    /**
-     * Alter this character's step height.
-     *
-     * @param v the desired height (in physics-space units)
-     */        
-    public void setStepHeight(float v ){
-    	setStepHeight(characterId,v );
-    }
-    
-    private native void setStepHeight(long characterId,float v);
-    
-    
-    /**
-     * Read this character's maximum penetration depth.
-     *
-     * @return the depth (in physics-space units)
-     */
-    public float getMaxPenetrationDepth(){
-    	return getMaxPenetrationDepth(characterId);
-    }
-    
-    private native float getMaxPenetrationDepth(long characterId);
-    
-    /**
-     * Alter this character's maximum penetration depth.
-     *
-     * @param v the desired depth (in physics-space units)
-     */        
-    public void setMaxPenetrationDepth(float v ){
-    	setMaxPenetrationDepth(characterId,v );
-    }
-    
-    private native void setMaxPenetrationDepth(long characterId,float v);
-    
-
-    
-    
-    
-    /**
-     * Alter this character's maximum slope angle.
-     *
-     * @param slopeRadians the desired angle (in radians)
-     */
-    public void setMaxSlope(float slopeRadians) {
-        setMaxSlope(characterId, slopeRadians);
-    }
-
-    private native void setMaxSlope(long characterId, float slopeRadians);
-
-    /**
-     * Read this character's maximum slope angle.
-     *
-     * @return the angle (in radians)
-     */
-    public float getMaxSlope() {
-        return getMaxSlope(characterId);
-    }
-
-    private native float getMaxSlope(long characterId);
-
-    /**
-     * Enable/disable this character's contact response.
-     *
-     * @param responsive true to respond to contacts, false to ignore them
-     * (default=true)
-     */
-    public void setContactResponse(boolean responsive) {
-        int flags = getCollisionFlags(objectId);
-        if (responsive) {
-            flags &= ~CollisionFlag.NO_CONTACT_RESPONSE;
-        } else {
-            flags |= CollisionFlag.NO_CONTACT_RESPONSE;
-        }
-        setCollisionFlags(objectId, flags);
-    }
-
-    /**
-     * Test whether this character is on the ground.
-     *
-     * @return true if on the ground, otherwise false
-     */
-    public boolean onGround() {
-        return onGround(characterId);
-    }
-
-    private native boolean onGround(long characterId);
-
-    /**
-     * @deprecated Deprecated in bullet 2.86.1. Use jump(Vector3f) instead.
-     */
-    @Deprecated
-    public void jump() {
-        jump(Vector3f.ZERO);
-        /*
-         * The zero vector is treated as a special case
-         * by Bullet's btKinematicCharacterController::jump(),
-         * causing the character to jump in its "up" direction
-         * with the pre-set speed.
-         */
-    }
-
-    /**
-     * Jump in the specified direction.
-     *
-     * @param dir desired jump direction (not null, unaffected)
-     */
-    public void jump(Vector3f dir) {
-    	jump(characterId,dir);
-    }
-    
-    private native void jump(long characterId,Vector3f v);
-
-    /**
-     * Apply the specified CollisionShape to this character. Note that the
-     * character should not be in any physics space while changing shape; the
-     * character gets rebuilt on the physics side.
-     *
-     * @param collisionShape the shape to apply (not null, alias created)
-     */
-    @Override
-    public void setCollisionShape(CollisionShape collisionShape) {
-//        if (!(collisionShape.getObjectId() instanceof ConvexShape)) {
-//            throw (new UnsupportedOperationException("Kinematic character nodes cannot have mesh collision shapes"));
-//        }
-        super.setCollisionShape(collisionShape);
-        if (objectId == 0) {
-            buildObject();
-        } else {
-            attachCollisionShape(objectId, collisionShape.getObjectId());
-        }
-    }
-
-    /**
-     * Directly alter this character's location. (Same as
-     * {@link #warp(com.jme3.math.Vector3f)}).)
-     *
-     * @param location the desired location (not null, unaffected)
-     */
-    public void setPhysicsLocation(Vector3f location) {
-        warp(location);
-    }
-
-    /**
-     * Copy the location of this character's center of mass.
-     *
-     * @param trans storage for the result (modified if not null)
-     * @return the location vector (either the provided storage or a new vector,
-     * not null)
-     */
-    public Vector3f getPhysicsLocation(Vector3f trans) {
-        if (trans == null) {
-            trans = new Vector3f();
-        }
-        getPhysicsLocation(objectId, trans);
-        return trans;
-    }
-
-    private native void getPhysicsLocation(long objectId, Vector3f vec);
-
-    /**
-     * Copy the location of this character's center of mass.
-     *
-     * @return a new location vector (not null)
-     */
-    public Vector3f getPhysicsLocation() {
-        return getPhysicsLocation(null);
-    }
-
-    /**
-     * Alter this character's continuous collision detection (CCD) swept sphere
-     * radius.
-     *
-     * @param radius (&ge;0, default=0)
-     */
-    public void setCcdSweptSphereRadius(float radius) {
-        setCcdSweptSphereRadius(objectId, radius);
-    }
-
-    private native void setCcdSweptSphereRadius(long objectId, float radius);
-
-    /**
-     * Alter the amount of motion required to activate continuous collision
-     * detection (CCD).
-     * <p>
-     * This addresses the issue of fast objects passing through other objects
-     * with no collision detected.
-     *
-     * @param threshold the desired threshold velocity (&gt;0) or zero to
-     * disable CCD (default=0)
-     */
-    public void setCcdMotionThreshold(float threshold) {
-        setCcdMotionThreshold(objectId, threshold);
-    }
-
-    private native void setCcdMotionThreshold(long objectId, float threshold);
-
-    /**
-     * Read the radius of the sphere used for continuous collision detection
-     * (CCD).
-     *
-     * @return radius (&ge;0)
-     */
-    public float getCcdSweptSphereRadius() {
-        return getCcdSweptSphereRadius(objectId);
-    }
-
-    private native float getCcdSweptSphereRadius(long objectId);
-
-    /**
-     * Calculate this character's continuous collision detection (CCD) motion
-     * threshold.
-     *
-     * @return the threshold velocity (&ge;0)
-     */
-    public float getCcdMotionThreshold() {
-        return getCcdMotionThreshold(objectId);
-    }
-
-    private native float getCcdMotionThreshold(long objectId);
-
-    /**
-     * Calculate the square of this character's continuous collision detection
-     * (CCD) motion threshold.
-     *
-     * @return the threshold velocity squared (&ge;0)
-     */
-    public float getCcdSquareMotionThreshold() {
-        return getCcdSquareMotionThreshold(objectId);
-    }
-
-    private native float getCcdSquareMotionThreshold(long objectId);
-
-    /**
-     * used internally
-     *
-     * @return the Bullet id
-     */
-    public long getControllerId() {
-        return characterId;
-    }
-
-    /**
-     * Has no effect.
-     */
-    public void destroy() {
-    }
-
-    /**
-     * Serialize this character, for example when saving to a J3O file.
-     *
-     * @param e exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter e) throws IOException {
-        super.write(e);
-        OutputCapsule capsule = e.getCapsule(this);
-        capsule.write(stepHeight, "stepHeight", 1.0f);
-        capsule.write(getGravity(), "gravity", 9.8f * 3);
-        capsule.write(getMaxSlope(), "maxSlope", 1.0f);
-        capsule.write(fallSpeed, "fallSpeed", 55.0f);
-        capsule.write(jumpSpeed, "jumpSpeed", 10.0f);
-        capsule.write(upAxis, "upAxis", 1);
-        capsule.write(getCcdMotionThreshold(), "ccdMotionThreshold", 0);
-        capsule.write(getCcdSweptSphereRadius(), "ccdSweptSphereRadius", 0);
-        capsule.write(getPhysicsLocation(new Vector3f()), "physicsLocation", new Vector3f());
-    }
-
-    /**
-     * De-serialize this character from the specified importer, for example when
-     * loading from a J3O file.
-     *
-     * @param e importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter e) throws IOException {
-        super.read(e);
-        InputCapsule capsule = e.getCapsule(this);
-        stepHeight = capsule.readFloat("stepHeight", 1.0f);
-        buildObject();
-        setGravity(capsule.readFloat("gravity", 9.8f * 3));
-        setMaxSlope(capsule.readFloat("maxSlope", 1.0f));
-        setFallSpeed(capsule.readFloat("fallSpeed", 55.0f));
-        setJumpSpeed(capsule.readFloat("jumpSpeed", 10.0f));
-        setUpAxis(capsule.readInt("upAxis", 1));
-        setCcdMotionThreshold(capsule.readFloat("ccdMotionThreshold", 0));
-        setCcdSweptSphereRadius(capsule.readFloat("ccdSweptSphereRadius", 0));
-        setPhysicsLocation((Vector3f) capsule.readSavable("physicsLocation", new Vector3f()));
-    }
-
-    /**
-     * Finalize this physics character just before it is destroyed. Should be
-     * invoked only by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        finalizeNativeCharacter(characterId);
-    }
-
-    private native void finalizeNativeCharacter(long characterId);
-}

+ 0 - 402
jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsGhostObject.java

@@ -1,402 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects;
-
-import com.jme3.bullet.collision.PhysicsCollisionObject;
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Quaternion;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Spatial;
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A collision object for intangibles, based on Bullet's
- * btPairCachingGhostObject. This is useful for creating a character controller,
- * collision sensors/triggers, explosions etc.
- * <p>
- * <i>From Bullet manual:</i><br>
- * btGhostObject is a special btCollisionObject, useful for fast localized
- * collision queries.
- *
- * @author normenhansen
- */
-public class PhysicsGhostObject extends PhysicsCollisionObject {
-
-    protected boolean locationDirty = false;
-    protected final Quaternion tmp_inverseWorldRotation = new Quaternion();
-    private List<PhysicsCollisionObject> overlappingObjects = new LinkedList<PhysicsCollisionObject>();
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected PhysicsGhostObject() {
-    }
-
-    /**
-     * Instantiate an object with the specified collision shape.
-     *
-     * @param shape the desired shape (not null, alias created)
-     */
-    public PhysicsGhostObject(CollisionShape shape) {
-        collisionShape = shape;
-        buildObject();
-    }
-
-    public PhysicsGhostObject(Spatial child, CollisionShape shape) {
-        collisionShape = shape;
-        buildObject();
-    }
-
-    /**
-     * Create the configured object in Bullet.
-     */
-    protected void buildObject() {
-        if (objectId == 0) {
-//            gObject = new PairCachingGhostObject();
-            objectId = createGhostObject();
-            Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Ghost Object {0}", Long.toHexString(objectId));
-            setGhostFlags(objectId);
-            initUserPointer();
-        }
-//        if (gObject == null) {
-//            gObject = new PairCachingGhostObject();
-//            gObject.setCollisionFlags(gObject.getCollisionFlags() | CollisionFlags.NO_CONTACT_RESPONSE);
-//        }
-        attachCollisionShape(objectId, collisionShape.getObjectId());
-    }
-
-    private native long createGhostObject();
-
-    private native void setGhostFlags(long objectId);
-
-    /**
-     * Apply the specified CollisionShape to this object. Note that the object
-     * should not be in any physics space while changing shape; the object gets
-     * rebuilt on the physics side.
-     *
-     * @param collisionShape the shape to apply (not null, alias created)
-     */
-    @Override
-    public void setCollisionShape(CollisionShape collisionShape) {
-        super.setCollisionShape(collisionShape);
-        if (objectId == 0) {
-            buildObject();
-        } else {
-            attachCollisionShape(objectId, collisionShape.getObjectId());
-        }
-    }
-
-    /**
-     * Directly alter the location of this object's center.
-     *
-     * @param location the desired location (in physics-space coordinates, not
-     * null, unaffected)
-     */
-    public void setPhysicsLocation(Vector3f location) {
-        setPhysicsLocation(objectId, location);
-    }
-
-    private native void setPhysicsLocation(long objectId, Vector3f location);
-
-    /**
-     * Directly alter this object's orientation.
-     *
-     * @param rotation the desired orientation (a rotation matrix in
-     * physics-space coordinates, not null, unaffected)
-     */
-    public void setPhysicsRotation(Matrix3f rotation) {
-        setPhysicsRotation(objectId, rotation);
-    }
-
-    private native void setPhysicsRotation(long objectId, Matrix3f rotation);
-
-    /**
-     * Directly alter this object's orientation.
-     *
-     * @param rotation the desired orientation (quaternion, not null,
-     * unaffected)
-     */
-    public void setPhysicsRotation(Quaternion rotation) {
-        setPhysicsRotation(objectId, rotation);
-    }
-
-    private native void setPhysicsRotation(long objectId, Quaternion rotation);
-
-    /**
-     * Copy the location of this object's center.
-     *
-     * @param trans storage for the result (modified if not null)
-     * @return a location vector (in physics-space coordinates, either
-     * the provided storage or a new vector, not null)
-     */
-    public Vector3f getPhysicsLocation(Vector3f trans) {
-        if (trans == null) {
-            trans = new Vector3f();
-        }
-        getPhysicsLocation(objectId, trans);
-        return trans;
-    }
-
-    private native void getPhysicsLocation(long objectId, Vector3f vector);
-
-    /**
-     * Copy this object's orientation to a quaternion.
-     *
-     * @param rot storage for the result (modified if not null)
-     * @return an orientation (in physics-space coordinates, either the provided
-     * storage or a new quaternion, not null)
-     */
-    public Quaternion getPhysicsRotation(Quaternion rot) {
-        if (rot == null) {
-            rot = new Quaternion();
-        }
-        getPhysicsRotation(objectId, rot);
-        return rot;
-    }
-
-    private native void getPhysicsRotation(long objectId, Quaternion rot);
-
-    /**
-     * Copy this object's orientation to a matrix.
-     *
-     * @param rot storage for the result (modified if not null)
-     * @return an orientation (in physics-space coordinates, either the provided
-     * storage or a new matrix, not null)
-     */
-    public Matrix3f getPhysicsRotationMatrix(Matrix3f rot) {
-        if (rot == null) {
-            rot = new Matrix3f();
-        }
-        getPhysicsRotationMatrix(objectId, rot);
-        return rot;
-    }
-
-    private native void getPhysicsRotationMatrix(long objectId, Matrix3f rot);
-
-    /**
-     * Copy the location of this object's center.
-     *
-     * @return a new location vector (not null)
-     */
-    public Vector3f getPhysicsLocation() {
-        Vector3f vec = new Vector3f();
-        getPhysicsLocation(objectId, vec);
-        return vec;
-    }
-
-    /**
-     * Copy this object's orientation to a quaternion.
-     *
-     * @return a new quaternion (not null)
-     */
-    public Quaternion getPhysicsRotation() {
-        Quaternion quat = new Quaternion();
-        getPhysicsRotation(objectId, quat);
-        return quat;
-    }
-
-    /**
-     * Copy this object's orientation to a matrix.
-     *
-     * @return a new matrix (not null)
-     */
-    public Matrix3f getPhysicsRotationMatrix() {
-        Matrix3f mtx = new Matrix3f();
-        getPhysicsRotationMatrix(objectId, mtx);
-        return mtx;
-    }
-
-    /**
-     * used internally
-     */
-//    public PairCachingGhostObject getObjectId() {
-//        return gObject;
-//    }
-    /**
-     * Has no effect.
-     */
-    public void destroy() {
-    }
-
-    /**
-     * Access a list of overlapping objects.
-     *
-     * @return an internal list which may get reused (not null)
-     */
-    public List<PhysicsCollisionObject> getOverlappingObjects() {
-        overlappingObjects.clear();
-        getOverlappingObjects(objectId);
-//        for (com.bulletphysics.collision.dispatch.CollisionObject collObj : gObject.getOverlappingPairs()) {
-//            overlappingObjects.add((PhysicsCollisionObject) collObj.getUserPointer());
-//        }
-        return overlappingObjects;
-    }
-
-    protected native void getOverlappingObjects(long objectId);
-
-    /**
-     * This method is invoked from native code.
-     *
-     * @param co the collision object to add
-     */
-    private void addOverlappingObject_native(PhysicsCollisionObject co) {
-        overlappingObjects.add(co);
-    }
-
-    /**
-     * Count how many collision objects this object overlaps.
-     *
-     * @return count (&ge;0)
-     */
-    public int getOverlappingCount() {
-        return getOverlappingCount(objectId);
-    }
-
-    private native int getOverlappingCount(long objectId);
-
-    /**
-     * Access an overlapping collision object by its position in the list.
-     *
-     * @param index which list position (&ge;0, &lt;count)
-     * @return the pre-existing object
-     */
-    public PhysicsCollisionObject getOverlapping(int index) {
-        return overlappingObjects.get(index);
-    }
-
-    /**
-     * Alter the continuous collision detection (CCD) swept sphere radius for
-     * this object.
-     *
-     * @param radius (&ge;0)
-     */
-    public void setCcdSweptSphereRadius(float radius) {
-        setCcdSweptSphereRadius(objectId, radius);
-    }
-
-    private native void setCcdSweptSphereRadius(long objectId, float radius);
-
-    /**
-     * Alter the amount of motion required to trigger continuous collision
-     * detection (CCD).
-     * <p>
-     * This addresses the issue of fast objects passing through other objects
-     * with no collision detected.
-     *
-     * @param threshold the desired threshold value (squared velocity, &gt;0) or
-     * zero to disable CCD (default=0)
-     */
-    public void setCcdMotionThreshold(float threshold) {
-        setCcdMotionThreshold(objectId, threshold);
-    }
-
-    private native void setCcdMotionThreshold(long objectId, float threshold);
-
-    /**
-     * Read the radius of the sphere used for continuous collision detection
-     * (CCD).
-     *
-     * @return radius (&ge;0)
-     */
-    public float getCcdSweptSphereRadius() {
-        return getCcdSweptSphereRadius(objectId);
-    }
-
-    private native float getCcdSweptSphereRadius(long objectId);
-
-    /**
-     * Read the continuous collision detection (CCD) motion threshold for this
-     * object.
-     *
-     * @return threshold value (squared velocity, &ge;0)
-     */
-    public float getCcdMotionThreshold() {
-        return getCcdMotionThreshold(objectId);
-    }
-
-    private native float getCcdMotionThreshold(long objectId);
-
-    /**
-     * Read the CCD square motion threshold for this object.
-     *
-     * @return threshold value (&ge;0)
-     */
-    public float getCcdSquareMotionThreshold() {
-        return getCcdSquareMotionThreshold(objectId);
-    }
-
-    private native float getCcdSquareMotionThreshold(long objectId);
-
-    /**
-     * Serialize this object, for example when saving to a J3O file.
-     *
-     * @param e exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter e) throws IOException {
-        super.write(e);
-        OutputCapsule capsule = e.getCapsule(this);
-        capsule.write(getPhysicsLocation(new Vector3f()), "physicsLocation", new Vector3f());
-        capsule.write(getPhysicsRotationMatrix(new Matrix3f()), "physicsRotation", new Matrix3f());
-        capsule.write(getCcdMotionThreshold(), "ccdMotionThreshold", 0);
-        capsule.write(getCcdSweptSphereRadius(), "ccdSweptSphereRadius", 0);
-    }
-
-    /**
-     * De-serialize this object from the specified importer, for example when
-     * loading from a J3O file.
-     *
-     * @param e importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter e) throws IOException {
-        super.read(e);
-        InputCapsule capsule = e.getCapsule(this);
-        buildObject();
-        setPhysicsLocation((Vector3f) capsule.readSavable("physicsLocation", new Vector3f()));
-        setPhysicsRotation(((Matrix3f) capsule.readSavable("physicsRotation", new Matrix3f())));
-        setCcdMotionThreshold(capsule.readFloat("ccdMotionThreshold", 0));
-        setCcdSweptSphereRadius(capsule.readFloat("ccdSweptSphereRadius", 0));
-    }
-}

+ 0 - 1081
jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsRigidBody.java

@@ -1,1081 +0,0 @@
-/*
- * Copyright (c) 2009-2020 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects;
-
-import com.jme3.bullet.PhysicsSpace;
-import com.jme3.bullet.collision.CollisionFlag;
-import com.jme3.bullet.collision.PhysicsCollisionObject;
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.bullet.collision.shapes.MeshCollisionShape;
-import com.jme3.bullet.joints.PhysicsJoint;
-import com.jme3.bullet.objects.infos.RigidBodyMotionState;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Quaternion;
-import com.jme3.math.Vector3f;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A collision object for a rigid body, based on Bullet's btRigidBody.
- *
- * @author normenhansen
- */
-public class PhysicsRigidBody extends PhysicsCollisionObject {
-    /**
-     * motion state
-     */
-    protected RigidBodyMotionState motionState = new RigidBodyMotionState();
-    /**
-     * copy of mass (&gt;0) of a dynamic body, or 0 for a static body
-     * (default=1)
-     */
-    protected float mass = 1.0f;
-    /**
-     * copy of kinematic flag: true&rarr;set kinematic mode (spatial controls
-     * body), false&rarr;dynamic/static mode (body controls spatial)
-     * (default=false)
-     */
-    protected boolean kinematic = false;
-    /**
-     * joint list
-     */
-    protected ArrayList<PhysicsJoint> joints = new ArrayList<PhysicsJoint>(4);
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected PhysicsRigidBody() {
-    }
-
-    /**
-     * Instantiate a dynamic body with mass=1 and the specified collision shape.
-     *
-     * @param shape the desired shape (not null, alias created)
-     */
-    public PhysicsRigidBody(CollisionShape shape) {
-        collisionShape = shape;
-        rebuildRigidBody();
-    }
-
-    /**
-     * Instantiate a body with the specified collision shape and mass.
-     *
-     * @param shape the desired shape (not null, alias created)
-     * @param mass if 0, a static body is created; otherwise a dynamic body is
-     * created (&ge;0)
-     */
-    public PhysicsRigidBody(CollisionShape shape, float mass) {
-        collisionShape = shape;
-        this.mass = mass;
-        rebuildRigidBody();
-    }
-
-    /**
-     * Build/rebuild this body after parameters have changed.
-     */
-    protected void rebuildRigidBody() {
-        boolean removed = false;
-        if (collisionShape instanceof MeshCollisionShape && mass != 0) {
-            throw new IllegalStateException("Dynamic rigidbody can not have mesh collision shape!");
-        }
-        if (objectId != 0) {
-            if (isInWorld(objectId)) {
-                PhysicsSpace.getPhysicsSpace().remove(this);
-                removed = true;
-            }
-            Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Clearing RigidBody {0}", Long.toHexString(objectId));
-            finalizeNative(objectId);
-        }
-        preRebuild();
-        objectId = createRigidBody(mass, motionState.getObjectId(), collisionShape.getObjectId());
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created RigidBody {0}", Long.toHexString(objectId));
-        postRebuild();
-        if (removed) {
-            PhysicsSpace.getPhysicsSpace().add(this);
-        }
-    }
-
-    /**
-     * For use by subclasses.
-     */
-    protected void preRebuild() {
-    }
-
-    private native long createRigidBody(float mass, long motionStateId, long collisionShapeId);
-
-    /**
-     * For use by subclasses.
-     */
-    protected void postRebuild() {
-        if (mass == 0.0f) {
-            setStatic(objectId, true);
-        } else {
-            setStatic(objectId, false);
-        }
-        initUserPointer();
-    }
-
-    /**
-     * Access this body's motion state.
-     *
-     * @return the pre-existing instance
-     */
-    public RigidBodyMotionState getMotionState() {
-        return motionState;
-    }
-
-    /**
-     * Test whether this body is in a physics space.
-     *
-     * @return true&rarr;in a space, false&rarr;not in a space
-     */
-    public boolean isInWorld() {
-        return isInWorld(objectId);
-    }
-
-    private native boolean isInWorld(long objectId);
-
-    /**
-     * Directly alter the location of this body's center of mass.
-     *
-     * @param location the desired location (not null, unaffected)
-     */
-    public void setPhysicsLocation(Vector3f location) {
-        setPhysicsLocation(objectId, location);
-    }
-
-    private native void setPhysicsLocation(long objectId, Vector3f location);
-
-    /**
-     * Directly alter this body's orientation.
-     *
-     * @param rotation the desired orientation (rotation matrix, not null,
-     * unaffected)
-     */
-    public void setPhysicsRotation(Matrix3f rotation) {
-        setPhysicsRotation(objectId, rotation);
-    }
-
-    private native void setPhysicsRotation(long objectId, Matrix3f rotation);
-
-    /**
-     * Directly alter this body's orientation.
-     *
-     * @param rotation the desired orientation (quaternion, in physics-space
-     * coordinates, not null, unaffected)
-     */
-    public void setPhysicsRotation(Quaternion rotation) {
-        setPhysicsRotation(objectId, rotation);
-    }
-
-    private native void setPhysicsRotation(long objectId, Quaternion rotation);
-
-    /**
-     * Copy the location of this body's center of mass.
-     *
-     * @param trans storage for the result (modified if not null)
-     * @return the location (in physics-space coordinates, either the provided 
-     * storage or a new vector, not null)
-     */
-    public Vector3f getPhysicsLocation(Vector3f trans) {
-        if (trans == null) {
-            trans = new Vector3f();
-        }
-        getPhysicsLocation(objectId, trans);
-        return trans;
-    }
-
-    private native void getPhysicsLocation(long objectId, Vector3f vector);
-
-    /**
-     * Copy this body's orientation to a quaternion.
-     *
-     * @param rot storage for the result (modified if not null)
-     * @return the orientation (either the provided storage or a new quaternion,
-     * not null)
-     */
-    public Quaternion getPhysicsRotation(Quaternion rot) {
-        if (rot == null) {
-            rot = new Quaternion();
-        }
-        getPhysicsRotation(objectId, rot);
-        return rot;
-    }
-
-    /**
-     * Alter the principal components of the local inertia tensor.
-     *
-     * @param gravity (not null, unaffected)
-     */
-    public void setInverseInertiaLocal(Vector3f gravity) {
-    	setInverseInertiaLocal(objectId, gravity);
-    }
-    private native void setInverseInertiaLocal(long objectId, Vector3f gravity);
-
-    /**
-     * Copy the principal components of the local inverse inertia tensor.
-     *
-     * @param trans storage for the result (modified if not null)
-     * @return a vector (either the provided storage or a new vector, not null)
-     */
-    public Vector3f getInverseInertiaLocal(Vector3f trans) {
-        if (trans == null) {
-            trans = new Vector3f();
-        }
-        getInverseInertiaLocal(objectId, trans);
-        return trans;
-    }
-    
-    private native void getInverseInertiaLocal(long objectId, Vector3f vector);
-
-    private native void getPhysicsRotation(long objectId, Quaternion rot);
-
-    /**
-     * Copy this body's orientation to a matrix.
-     *
-     * @param rot storage for the result (modified if not null)
-     * @return the orientation (in physics-space coordinates, either the 
-     * provided storage or a new matrix, not null)
-     */
-    public Matrix3f getPhysicsRotationMatrix(Matrix3f rot) {
-        if (rot == null) {
-            rot = new Matrix3f();
-        }
-        getPhysicsRotationMatrix(objectId, rot);
-        return rot;
-    }
-
-    private native void getPhysicsRotationMatrix(long objectId, Matrix3f rot);
-
-    /**
-     * Copy the location of this body's center of mass.
-     *
-     * @return a new location vector (not null)
-     */
-    public Vector3f getPhysicsLocation() {
-        Vector3f vec = new Vector3f();
-        getPhysicsLocation(objectId, vec);
-        return vec;
-    }
-
-    /**
-     * Copy this body's orientation to a quaternion.
-     *
-     * @return a new quaternion (not null)
-     */
-    public Quaternion getPhysicsRotation() {
-        Quaternion quat = new Quaternion();
-        getPhysicsRotation(objectId, quat);
-        return quat;
-    }
-
-    /**
-     * Copy this body's orientation to a matrix.
-     *
-     * @return a new matrix (not null)
-     */
-    public Matrix3f getPhysicsRotationMatrix() {
-        Matrix3f mtx = new Matrix3f();
-        getPhysicsRotationMatrix(objectId, mtx);
-        return mtx;
-    }
-
-//    /**
-//     * Gets the physics object location
-//     * @param location the location of the actual physics object is stored in this Vector3f
-//     */
-//    public Vector3f getInterpolatedPhysicsLocation(Vector3f location) {
-//        if (location == null) {
-//            location = new Vector3f();
-//        }
-//        rBody.getInterpolationWorldTransform(tempTrans);
-//        return Converter.convert(tempTrans.origin, location);
-//    }
-//
-//    /**
-//     * Gets the physics object rotation
-//     * @param rotation the rotation of the actual physics object is stored in this Matrix3f
-//     */
-//    public Matrix3f getInterpolatedPhysicsRotation(Matrix3f rotation) {
-//        if (rotation == null) {
-//            rotation = new Matrix3f();
-//        }
-//        rBody.getInterpolationWorldTransform(tempTrans);
-//        return Converter.convert(tempTrans.basis, rotation);
-//    }
-    /**
-     * Put this body into kinematic mode or take it out of kinematic mode.
-     * <p>
-     * In kinematic mode, the body is not influenced by physics but can affect
-     * other physics objects. Its kinetic force is calculated based on its
-     * movement and weight.
-     *
-     * @param kinematic true&rarr;set kinematic mode, false&rarr;set
-     * dynamic/static mode (default=false)
-     */
-    public void setKinematic(boolean kinematic) {
-        this.kinematic = kinematic;
-        setKinematic(objectId, kinematic);
-    }
-
-    private native void setKinematic(long objectId, boolean kinematic);
-
-    /**
-     * Test whether this body is in kinematic mode.
-     * <p>
-     * In kinematic mode, the body is not influenced by physics but can affect
-     * other physics objects. Its kinetic force is calculated based on its
-     * movement and weight.
-     *
-     * @return true if in kinematic mode, otherwise false (dynamic/static mode)
-     */
-    public boolean isKinematic() {
-        return kinematic;
-    }
-
-    /**
-     * Enable/disable this body's contact response.
-     *
-     * @param responsive true to respond to contacts, false to ignore them
-     * (default=true)
-     */
-    public void setContactResponse(boolean responsive) {
-        int flags = getCollisionFlags(objectId);
-        if (responsive) {
-            flags &= ~CollisionFlag.NO_CONTACT_RESPONSE;
-        } else {
-            flags |= CollisionFlag.NO_CONTACT_RESPONSE;
-        }
-        setCollisionFlags(objectId, flags);
-    }
-
-    /**
-     * Alter the radius of the swept sphere used for continuous collision
-     * detection (CCD).
-     *
-     * @param radius the desired radius (&ge;0, default=0)
-     */
-    public void setCcdSweptSphereRadius(float radius) {
-        setCcdSweptSphereRadius(objectId, radius);
-    }
-
-    private native void setCcdSweptSphereRadius(long objectId, float radius);
-
-    /**
-     * Alter the amount of motion required to activate continuous collision
-     * detection (CCD).
-     * <p>
-     * This addresses the issue of fast objects passing through other objects
-     * with no collision detected.
-     *
-     * @param threshold the desired threshold velocity (&gt;0) or zero to
-     * disable CCD (default=0)
-     */
-    public void setCcdMotionThreshold(float threshold) {
-        setCcdMotionThreshold(objectId, threshold);
-    }
-
-    private native void setCcdMotionThreshold(long objectId, float threshold);
-
-    /**
-     * Read the radius of the swept sphere used for continuous collision
-     * detection (CCD).
-     *
-     * @return radius (&ge;0)
-     */
-    public float getCcdSweptSphereRadius() {
-        return getCcdSweptSphereRadius(objectId);
-    }
-
-    private native float getCcdSweptSphereRadius(long objectId);
-
-    /**
-     * Calculate this body's continuous collision detection (CCD) motion
-     * threshold.
-     *
-     * @return the threshold velocity (&ge;0)
-     */
-    public float getCcdMotionThreshold() {
-        return getCcdMotionThreshold(objectId);
-    }
-
-    private native float getCcdMotionThreshold(long objectId);
-
-    /**
-     * Calculate the square of this body's continuous collision detection (CCD)
-     * motion threshold.
-     *
-     * @return the threshold velocity squared (&ge;0)
-     */
-    public float getCcdSquareMotionThreshold() {
-        return getCcdSquareMotionThreshold(objectId);
-    }
-
-    private native float getCcdSquareMotionThreshold(long objectId);
-
-    /**
-     * Read this body's mass.
-     *
-     * @return the mass (&gt;0) or zero for a static body
-     */
-    public float getMass() {
-        return mass;
-    }
-
-    /**
-     * Alter this body's mass. Bodies with mass=0 are static. For dynamic
-     * bodies, it is best to keep the mass around 1.
-     *
-     * @param mass the desired mass (&gt;0) or 0 for a static body (default=1)
-     */
-    public void setMass(float mass) {
-        this.mass = mass;
-        if (collisionShape instanceof MeshCollisionShape && mass != 0) {
-            throw new IllegalStateException("Dynamic rigidbody can not have mesh collision shape!");
-        }
-        if (objectId != 0) {
-            if (collisionShape != null) {
-                updateMassProps(objectId, collisionShape.getObjectId(), mass);
-            }
-            if (mass == 0.0f) {
-                setStatic(objectId, true);
-            } else {
-                setStatic(objectId, false);
-            }
-        }
-    }
-
-    private native void setStatic(long objectId, boolean state);
-
-    private native long updateMassProps(long objectId, long collisionShapeId, float mass);
-
-    /**
-     * Copy this body's gravitational acceleration.
-     *
-     * @return a new acceleration vector (in physics-space coordinates, not 
-     * null)
-     */
-    public Vector3f getGravity() {
-        return getGravity(null);
-    }
-
-    /**
-     * Copy this body's gravitational acceleration.
-     *
-     * @param gravity storage for the result (modified if not null)
-     * @return an acceleration vector (in physics-space coordinates, either the 
-     * provided storage or a new vector, not null)
-     */
-    public Vector3f getGravity(Vector3f gravity) {
-        if (gravity == null) {
-            gravity = new Vector3f();
-        }
-        getGravity(objectId, gravity);
-        return gravity;
-    }
-
-    private native void getGravity(long objectId, Vector3f gravity);
-
-    /**
-     * Alter this body's gravitational acceleration.
-     * <p>
-     * Invoke this after adding the body to a PhysicsSpace. Adding a body to a
-     * PhysicsSpace alters its gravity.
-     *
-     * @param gravity the desired acceleration vector (not null, unaffected)
-     */
-    public void setGravity(Vector3f gravity) {
-        setGravity(objectId, gravity);
-    }
-    private native void setGravity(long objectId, Vector3f gravity);
-
-    /**
-     * Read this body's friction.
-     *
-     * @return friction value
-     */
-    public float getFriction() {
-        return getFriction(objectId);
-    }
-
-    private native float getFriction(long objectId);
-
-    /**
-     * Alter this body's friction.
-     *
-     * @param friction the desired friction value (default=0.5)
-     */
-    public void setFriction(float friction) {
-        setFriction(objectId, friction);
-    }
-
-    private native void setFriction(long objectId, float friction);
-
-    /**
-     * Alter this body's damping.
-     *
-     * @param linearDamping the desired linear damping value (default=0)
-     * @param angularDamping the desired angular damping value (default=0)
-     */
-    public void setDamping(float linearDamping, float angularDamping) {
-        setDamping(objectId, linearDamping, angularDamping);
-    }
-
-    private native void setDamping(long objectId, float linearDamping, float angularDamping);
-
-//    private native void setRestitution(long objectId, float factor);
-//
-//    public void setLinearDamping(float linearDamping) {
-//        constructionInfo.linearDamping = linearDamping;
-//        rBody.setDamping(linearDamping, constructionInfo.angularDamping);
-//    }
-//
-//    private native void setRestitution(long objectId, float factor);
-//
-    /**
-     * Alter this body's linear damping.
-     *
-     * @param linearDamping the desired linear damping value (default=0)
-     */
-    public void setLinearDamping(float linearDamping) {
-        setDamping(objectId, linearDamping, getAngularDamping());
-    }
-
-    /**
-     * Alter this body's angular damping.
-     *
-     * @param angularDamping the desired angular damping value (default=0)
-     */
-    public void setAngularDamping(float angularDamping) {
-        setAngularDamping(objectId, angularDamping);
-    }
-    private native void setAngularDamping(long objectId, float factor);
-
-    /**
-     * Read this body's linear damping.
-     *
-     * @return damping value
-     */
-    public float getLinearDamping() {
-        return getLinearDamping(objectId);
-    }
-
-    private native float getLinearDamping(long objectId);
-
-    /**
-     * Read this body's angular damping.
-     *
-     * @return damping value
-     */
-    public float getAngularDamping() {
-        return getAngularDamping(objectId);
-    }
-
-    private native float getAngularDamping(long objectId);
-
-    /**
-     * Read this body's restitution (bounciness).
-     *
-     * @return restitution value
-     */
-    public float getRestitution() {
-        return getRestitution(objectId);
-    }
-
-    private native float getRestitution(long objectId);
-
-    /**
-     * Alter this body's restitution (bounciness). For best performance, set
-     * restitution=0.
-     *
-     * @param restitution the desired value (default=0)
-     */
-    public void setRestitution(float restitution) {
-        setRestitution(objectId, restitution);
-    }
-
-    private native void setRestitution(long objectId, float factor);
-
-    /**
-     * Copy this body's angular velocity.
-     *
-     * @return a new velocity vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getAngularVelocity() {
-        Vector3f vec = new Vector3f();
-        getAngularVelocity(objectId, vec);
-        return vec;
-    }
-
-    private native void getAngularVelocity(long objectId, Vector3f vec);
-
-    /**
-     * Copy this body's angular velocity.
-     *
-     * @param vec storage for the result (in physics-space coordinates, not 
-     * null, modified)
-     */
-    public void getAngularVelocity(Vector3f vec) {
-        getAngularVelocity(objectId, vec);
-    }
-
-    /**
-     * Alter this body's angular velocity.
-     *
-     * @param vec the desired angular velocity vector (not null, unaffected)
-     */
-    public void setAngularVelocity(Vector3f vec) {
-        setAngularVelocity(objectId, vec);
-        activate();
-    }
-
-    private native void setAngularVelocity(long objectId, Vector3f vec);
-
-    /**
-     * Copy the linear velocity of this body's center of mass.
-     *
-     * @return a new velocity vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getLinearVelocity() {
-        Vector3f vec = new Vector3f();
-        getLinearVelocity(objectId, vec);
-        return vec;
-    }
-
-    private native void getLinearVelocity(long objectId, Vector3f vec);
-
-    /**
-     * Copy the linear velocity of this body's center of mass.
-     *
-     * @param vec storage for the result (in physics-space coordinates, not 
-     * null, modified)
-     */
-    public void getLinearVelocity(Vector3f vec) {
-        getLinearVelocity(objectId, vec);
-    }
-
-    /**
-     * Alter the linear velocity of this body's center of mass.
-     *
-     * @param vec the desired velocity vector (not null)
-     */
-    public void setLinearVelocity(Vector3f vec) {
-        setLinearVelocity(objectId, vec);
-        activate();
-    }
-
-    private native void setLinearVelocity(long objectId, Vector3f vec);
-
-    /**
-     * Apply a force to the PhysicsRigidBody. Effective only if the next physics
-     * update steps the physics space.
-     * <p>
-     * To apply an impulse, use applyImpulse, use applyContinuousForce to apply
-     * continuous force.
-     *
-     * @param force the force (not null, unaffected)
-     * @param location the location of the force
-     */
-    public void applyForce(Vector3f force, Vector3f location) {
-        applyForce(objectId, force, location);
-        activate();
-    }
-
-    private native void applyForce(long objectId, Vector3f force, Vector3f location);
-
-    /**
-     * Apply a force to the PhysicsRigidBody. Effective only if the next physics
-     * update steps the physics space.
-     * <p>
-     * To apply an impulse, use
-     * {@link #applyImpulse(com.jme3.math.Vector3f, com.jme3.math.Vector3f)}.
-     *
-     * @param force the force (not null, unaffected)
-     */
-    public void applyCentralForce(Vector3f force) {
-        applyCentralForce(objectId, force);
-        activate();
-    }
-
-    private native void applyCentralForce(long objectId, Vector3f force);
-
-    /**
-     * Apply a force to the PhysicsRigidBody. Effective only if the next physics
-     * update steps the physics space.
-     * <p>
-     * To apply an impulse, use
-     * {@link #applyImpulse(com.jme3.math.Vector3f, com.jme3.math.Vector3f)}.
-     *
-     * @param torque the torque (not null, unaffected)
-     */
-    public void applyTorque(Vector3f torque) {
-        applyTorque(objectId, torque);
-        activate();
-    }
-
-    private native void applyTorque(long objectId, Vector3f vec);
-
-    /**
-     * Apply an impulse to the body the next physics update.
-     *
-     * @param impulse applied impulse (not null, unaffected)
-     * @param rel_pos location relative to object (not null, unaffected)
-     */
-    public void applyImpulse(Vector3f impulse, Vector3f rel_pos) {
-        applyImpulse(objectId, impulse, rel_pos);
-        activate();
-    }
-
-    private native void applyImpulse(long objectId, Vector3f impulse, Vector3f rel_pos);
-
-    /**
-     * Apply a torque impulse to the body in the next physics update.
-     *
-     * @param vec the torque to apply
-     */
-    public void applyTorqueImpulse(Vector3f vec) {
-        applyTorqueImpulse(objectId, vec);
-        activate();
-    }
-
-    private native void applyTorqueImpulse(long objectId, Vector3f vec);
-
-    /**
-     * Clear all forces acting on this body.
-     */
-    public void clearForces() {
-        clearForces(objectId);
-    }
-
-    private native void clearForces(long objectId);
-
-    /**
-     * Apply the specified CollisionShape to this body.
-     * <p>
-     * Note that the body should not be in any physics space while changing
-     * shape; the body gets rebuilt on the physics side.
-     *
-     * @param collisionShape the shape to apply (not null, alias created)
-     */
-    @Override
-    public void setCollisionShape(CollisionShape collisionShape) {
-        super.setCollisionShape(collisionShape);
-        if (collisionShape instanceof MeshCollisionShape && mass != 0) {
-            throw new IllegalStateException("Dynamic rigidbody can not have mesh collision shape!");
-        }
-        if (objectId == 0) {
-            rebuildRigidBody();
-        } else {
-            setCollisionShape(objectId, collisionShape.getObjectId());
-            updateMassProps(objectId, collisionShape.getObjectId(), mass);
-        }
-    }
-
-    private native void setCollisionShape(long objectId, long collisionShapeId);
-
-    /**
-     * Reactivates this body if it has been deactivated due to lack of motion.
-     */
-    public void activate() {
-        activate(objectId);
-    }
-
-    private native void activate(long objectId);
-
-    /**
-     * Test whether this body has been deactivated due to lack of motion.
-     *
-     * @return true if still active, false if deactivated
-     */
-    public boolean isActive() {
-        return isActive(objectId);
-    }
-
-    private native boolean isActive(long objectId);
-
-    /**
-     * Alter this body's sleeping thresholds.
-     * <p>
-     * These thresholds determine when the body can be deactivated to save
-     * resources. Low values keep the body active when it barely moves.
-     *
-     * @param linear the desired linear sleeping threshold (&ge;0, default=0.8)
-     * @param angular the desired angular sleeping threshold (&ge;0, default=1)
-     */
-    public void setSleepingThresholds(float linear, float angular) {
-        setSleepingThresholds(objectId, linear, angular);
-    }
-
-    private native void setSleepingThresholds(long objectId, float linear, float angular);
-
-    /**
-     * Alter this body's linear sleeping threshold.
-     *
-     * @param linearSleepingThreshold the desired threshold (&ge;0, default=0.8)
-     */
-    public void setLinearSleepingThreshold(float linearSleepingThreshold) {
-        setLinearSleepingThreshold(objectId, linearSleepingThreshold);
-    }
-
-    private native void setLinearSleepingThreshold(long objectId, float linearSleepingThreshold);
-
-    /**
-     * Alter this body's angular sleeping threshold.
-     *
-     * @param angularSleepingThreshold the desired threshold (&ge;0, default=1)
-     */
-    public void setAngularSleepingThreshold(float angularSleepingThreshold) {
-        setAngularSleepingThreshold(objectId, angularSleepingThreshold);
-    }
-
-    private native void setAngularSleepingThreshold(long objectId, float angularSleepingThreshold);
-
-    /**
-     * Read this body's linear sleeping threshold.
-     *
-     * @return the linear sleeping threshold (&ge;0)
-     */
-    public float getLinearSleepingThreshold() {
-        return getLinearSleepingThreshold(objectId);
-    }
-
-    private native float getLinearSleepingThreshold(long objectId);
-
-    /**
-     * Read this body's angular sleeping threshold.
-     *
-     * @return the angular sleeping threshold (&ge;0)
-     */
-    public float getAngularSleepingThreshold() {
-        return getAngularSleepingThreshold(objectId);
-    }
-
-    private native float getAngularSleepingThreshold(long objectId);
-
-    /**
-     * Read this body's angular factor for the X axis.
-     *
-     * @return the angular factor
-     */
-    public float getAngularFactor() {
-        return getAngularFactor(null).getX();
-    }
-
-    /**
-     * Copy this body's angular factors.
-     *
-     * @param store storage for the result (modified if not null)
-     * @return the angular factor for each axis (either the provided storage or 
-     * new vector, not null)
-     */
-    public Vector3f getAngularFactor(Vector3f store) {
-        // Done this way to prevent breaking the API.
-        if (store == null) {
-            store = new Vector3f();
-        }
-        getAngularFactor(objectId, store);
-        return store;
-    }
-
-    private native void getAngularFactor(long objectId, Vector3f vec);
-
-    /**
-     * Alter this body's angular factor.
-     *
-     * @param factor the desired angular factor for all axes (not null,
-     * unaffected, default=1)
-     */
-    public void setAngularFactor(float factor) {
-        setAngularFactor(objectId, new Vector3f(factor, factor, factor));
-    }
-
-    /**
-     * Alter this body's angular factors.
-     *
-     * @param factor the desired angular factor for each axis (not null,
-     * unaffected, default=(1,1,1))
-     */
-    public void setAngularFactor(Vector3f factor) {
-	setAngularFactor(objectId, factor);
-    }
-
-    private native void setAngularFactor(long objectId, Vector3f factor);
-
-    /**
-     * Copy this body's linear factors.
-     *
-     * @return the linear factor for each axis (not null)
-     */
-    public Vector3f getLinearFactor() {
-        Vector3f vec = new Vector3f();
-	getLinearFactor(objectId, vec);
-        return vec;
-    }
-
-    private native void getLinearFactor(long objectId, Vector3f vec);
-
-    /**
-     * Alter this body's linear factors.
-     *
-     * @param factor the desired linear factor for each axis (not null,
-     * unaffected, default=(1,1,1))
-     */
-    public void setLinearFactor(Vector3f factor) {
-	setLinearFactor(objectId, factor);
-    }
-
-    private native void setLinearFactor(long objectId, Vector3f factor);
-
-
-    /**
-     * Do not invoke directly! Joints are added automatically when created.
-     *
-     * @param joint the joint to add (not null)
-     */
-    public void addJoint(PhysicsJoint joint) {
-        if (!joints.contains(joint)) {
-            joints.add(joint);
-        }
-    }
-
-    /**
-     * Do not invoke directly! Joints are removed automatically when destroyed.
-     *
-     * @param joint the joint to remove (not null)
-     */
-    public void removeJoint(PhysicsJoint joint) {
-        joints.remove(joint);
-    }
-
-    /**
-     * Access the list of joints connected with this body.
-     * <p>
-     * This list is only filled when the PhysicsRigidBody is added to a physics
-     * space.
-     *
-     * @return the pre-existing list (not null)
-     */
-    public List<PhysicsJoint> getJoints() {
-        return joints;
-    }
-
-    /**
-     * Serialize this body, for example when saving to a J3O file.
-     *
-     * @param e exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter e) throws IOException {
-        super.write(e);
-        OutputCapsule capsule = e.getCapsule(this);
-
-        capsule.write(getMass(), "mass", 1.0f);
-
-        capsule.write(getGravity(), "gravity", Vector3f.ZERO);
-        capsule.write(isContactResponse(), "contactResponse", true);
-        capsule.write(getFriction(), "friction", 0.5f);
-        capsule.write(getRestitution(), "restitution", 0);
-        Vector3f angularFactor = getAngularFactor(null);
-        if (angularFactor.x == angularFactor.y && angularFactor.y == angularFactor.z) {
-            capsule.write(getAngularFactor(), "angularFactor", 1);
-        } else {
-            capsule.write(getAngularFactor(null), "angularFactor", Vector3f.UNIT_XYZ);
-            capsule.write(getLinearFactor(), "linearFactor", Vector3f.UNIT_XYZ);
-        }
-        capsule.write(kinematic, "kinematic", false);
-
-        capsule.write(getLinearDamping(), "linearDamping", 0);
-        capsule.write(getAngularDamping(), "angularDamping", 0);
-        capsule.write(getLinearSleepingThreshold(), "linearSleepingThreshold", 0.8f);
-        capsule.write(getAngularSleepingThreshold(), "angularSleepingThreshold", 1.0f);
-
-        capsule.write(getCcdMotionThreshold(), "ccdMotionThreshold", 0);
-        capsule.write(getCcdSweptSphereRadius(), "ccdSweptSphereRadius", 0);
-
-        capsule.write(getPhysicsLocation(new Vector3f()), "physicsLocation", new Vector3f());
-        capsule.write(getPhysicsRotationMatrix(new Matrix3f()), "physicsRotation", new Matrix3f());
-        capsule.write(getLinearVelocity(), "linearVelocity", null);
-        capsule.write(getAngularVelocity(), "angularVelocity", null);
-
-        capsule.writeSavableArrayList(joints, "joints", null);
-    }
-
-    /**
-     * De-serialize this body, for example when loading from a J3O file.
-     *
-     * @param e importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    @SuppressWarnings("unchecked")
-    public void read(JmeImporter e) throws IOException {
-        super.read(e);
-
-        InputCapsule capsule = e.getCapsule(this);
-        float mass = capsule.readFloat("mass", 1.0f);
-        this.mass = mass;
-        rebuildRigidBody();
-        setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone()));
-        setContactResponse(capsule.readBoolean("contactResponse", true));
-        setFriction(capsule.readFloat("friction", 0.5f));
-        setKinematic(capsule.readBoolean("kinematic", false));
-
-        setRestitution(capsule.readFloat("restitution", 0));
-        Vector3f angularFactor = (Vector3f) capsule.readSavable("angularFactor", null);
-        if(angularFactor == null) {
-            setAngularFactor(capsule.readFloat("angularFactor", 1));
-        } else {
-            setAngularFactor(angularFactor);
-            setLinearFactor((Vector3f) capsule.readSavable("linearFactor", Vector3f.UNIT_XYZ.clone()));
-        }
-        setDamping(capsule.readFloat("linearDamping", 0), capsule.readFloat("angularDamping", 0));
-        setSleepingThresholds(capsule.readFloat("linearSleepingThreshold", 0.8f), capsule.readFloat("angularSleepingThreshold", 1.0f));
-        setCcdMotionThreshold(capsule.readFloat("ccdMotionThreshold", 0));
-        setCcdSweptSphereRadius(capsule.readFloat("ccdSweptSphereRadius", 0));
-
-        setPhysicsLocation((Vector3f) capsule.readSavable("physicsLocation", new Vector3f()));
-        setPhysicsRotation((Matrix3f) capsule.readSavable("physicsRotation", new Matrix3f()));
-        setLinearVelocity((Vector3f) capsule.readSavable("linearVelocity", new Vector3f()));
-        setAngularVelocity((Vector3f) capsule.readSavable("angularVelocity", new Vector3f()));
-
-        joints = capsule.readSavableArrayList("joints", null);
-    }
-}

+ 0 - 695
jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsVehicle.java

@@ -1,695 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects;
-
-import com.jme3.bullet.PhysicsSpace;
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.bullet.objects.infos.VehicleTuning;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Spatial;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A collision object for simplified vehicle simulation based on Bullet's
- * btRaycastVehicle.
- * <p>
- * <i>From Bullet manual:</i><br>
- * For arcade style vehicle simulations, it is recommended to use the simplified
- * Bullet vehicle model as provided in btRaycastVehicle. Instead of simulation
- * each wheel and chassis as separate rigid bodies, connected by constraints, it
- * uses a simplified model. This simplified model has many benefits, and is
- * widely used in commercial driving games.
- * <p>
- * The entire vehicle is represented as a single rigidbody, the chassis. The
- * collision detection of the wheels is approximated by ray casts, and the tire
- * friction is a basic anisotropic friction model.
- *
- * @author normenhansen
- */
-public class PhysicsVehicle extends PhysicsRigidBody {
-
-    /**
-     * Unique identifier of the btRaycastVehicle. The constructor sets this to a
-     * non-zero value.
-     */
-    protected long vehicleId = 0;
-    /**
-     * Unique identifier of the ray caster.
-     */
-    protected long rayCasterId = 0;
-    /**
-     * tuning parameters applied when a wheel is created
-     */
-    protected VehicleTuning tuning = new VehicleTuning();
-    /**
-     * list of wheels
-     */
-    protected ArrayList<VehicleWheel> wheels = new ArrayList<VehicleWheel>();
-    /**
-     * physics space where this vehicle is added, or null if none
-     */
-    protected PhysicsSpace physicsSpace;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected PhysicsVehicle() {
-    }
-
-    /**
-     * Instantiate a vehicle with the specified collision shape and mass=1.
-     *
-     * @param shape the desired shape (not null, alias created)
-     */
-    public PhysicsVehicle(CollisionShape shape) {
-        super(shape);
-    }
-
-    /**
-     * Instantiate a vehicle with the specified collision shape and mass.
-     *
-     * @param shape the desired shape (not null, alias created)
-     * @param mass (&gt;0)
-     */
-    public PhysicsVehicle(CollisionShape shape, float mass) {
-        super(shape, mass);
-    }
-
-    /**
-     * used internally
-     */
-    public void updateWheels() {
-        if (vehicleId != 0) {
-            for (int i = 0; i < wheels.size(); i++) {
-                updateWheelTransform(vehicleId, i, true);
-                wheels.get(i).updatePhysicsState();
-            }
-        }
-    }
-
-    private native void updateWheelTransform(long vehicleId, int wheel, boolean interpolated);
-
-    /**
-     * used internally
-     */
-    public void applyWheelTransforms() {
-        if (wheels != null) {
-            for (int i = 0; i < wheels.size(); i++) {
-                wheels.get(i).applyWheelTransform();
-            }
-        }
-    }
-
-    @Override
-    protected void postRebuild() {
-        super.postRebuild();
-        motionState.setVehicle(this);
-        createVehicle(physicsSpace);
-    }
-
-    /**
-     * Used internally, creates the actual vehicle constraint when vehicle is
-     * added to physics space.
-     *
-     * @param space which physics space
-     */
-    public void createVehicle(PhysicsSpace space) {
-        physicsSpace = space;
-        if (space == null) {
-            return;
-        }
-        if (space.getSpaceId() == 0) {
-            throw new IllegalStateException("Physics space is not initialized!");
-        }
-        if (rayCasterId != 0) {
-            Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Clearing RayCaster {0}", Long.toHexString(rayCasterId));
-            Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Clearing Vehicle {0}", Long.toHexString(vehicleId));
-            finalizeNative(rayCasterId, vehicleId);
-        }
-        rayCasterId = createVehicleRaycaster(objectId, space.getSpaceId());
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created RayCaster {0}", Long.toHexString(rayCasterId));
-        vehicleId = createRaycastVehicle(objectId, rayCasterId);
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created Vehicle {0}", Long.toHexString(vehicleId));
-        setCoordinateSystem(vehicleId, 0, 1, 2);
-        for (VehicleWheel wheel : wheels) {
-            wheel.setVehicleId(vehicleId, addWheel(vehicleId, wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), tuning, wheel.isFrontWheel()));
-        }
-    }
-
-    private native long createVehicleRaycaster(long objectId, long physicsSpaceId);
-
-    private native long createRaycastVehicle(long objectId, long rayCasterId);
-
-    private native void setCoordinateSystem(long objectId, int a, int b, int c);
-
-    private native int addWheel(long objectId, Vector3f location, Vector3f direction, Vector3f axle, float restLength, float radius, VehicleTuning tuning, boolean frontWheel);
-
-    /**
-     * Add a wheel to this vehicle.
-     *
-     * @param connectionPoint the location where the suspension connects to the
-     * chassis (in chassis coordinates, not null, unaffected)
-     * @param direction the suspension direction (in chassis coordinates, not
-     * null, unaffected, typically down/0,-1,0)
-     * @param axle the axis direction (in chassis coordinates, not null,
-     * unaffected, typically -1,0,0)
-     * @param suspensionRestLength the rest length of the suspension (in
-     * physics-space units)
-     * @param wheelRadius the wheel radius (in physics-space units, &gt;0)
-     * @param isFrontWheel true&rarr;front (steering) wheel,
-     * false&rarr;non-front wheel
-     * @return a new VehicleWheel for access (not null)
-     */
-    public VehicleWheel addWheel(Vector3f connectionPoint, Vector3f direction, Vector3f axle, float suspensionRestLength, float wheelRadius, boolean isFrontWheel) {
-        return addWheel(null, connectionPoint, direction, axle, suspensionRestLength, wheelRadius, isFrontWheel);
-    }
-
-    /**
-     * Add a wheel to this vehicle
-     *
-     * @param spat the associated spatial, or null if none
-     * @param connectionPoint the location where the suspension connects to the
-     * chassis (in chassis coordinates, not null, unaffected)
-     * @param direction the suspension direction (in chassis coordinates, not
-     * null, unaffected, typically down/0,-1,0)
-     * @param axle the axis direction (in chassis coordinates, not null,
-     * unaffected, typically -1,0,0)
-     * @param suspensionRestLength the rest length of the suspension (in
-     * physics-space units)
-     * @param wheelRadius the wheel radius (in physics-space units, &gt;0)
-     * @param isFrontWheel true&rarr;front (steering) wheel,
-     * false&rarr;non-front wheel
-     * @return a new VehicleWheel for access (not null)
-     */
-    public VehicleWheel addWheel(Spatial spat, Vector3f connectionPoint, Vector3f direction, Vector3f axle, float suspensionRestLength, float wheelRadius, boolean isFrontWheel) {
-        VehicleWheel wheel = null;
-        if (spat == null) {
-            wheel = new VehicleWheel(connectionPoint, direction, axle, suspensionRestLength, wheelRadius, isFrontWheel);
-        } else {
-            wheel = new VehicleWheel(spat, connectionPoint, direction, axle, suspensionRestLength, wheelRadius, isFrontWheel);
-        }
-        wheel.setFrictionSlip(tuning.frictionSlip);
-        wheel.setMaxSuspensionTravelCm(tuning.maxSuspensionTravelCm);
-        wheel.setSuspensionStiffness(tuning.suspensionStiffness);
-        wheel.setWheelsDampingCompression(tuning.suspensionCompression);
-        wheel.setWheelsDampingRelaxation(tuning.suspensionDamping);
-        wheel.setMaxSuspensionForce(tuning.maxSuspensionForce);
-        wheels.add(wheel);
-        if (vehicleId != 0) {
-            wheel.setVehicleId(vehicleId, addWheel(vehicleId, wheel.getLocation(), wheel.getDirection(), wheel.getAxle(), wheel.getRestLength(), wheel.getRadius(), tuning, wheel.isFrontWheel()));
-        }
-        return wheel;
-    }
-
-    /**
-     * Remove a wheel.
-     *
-     * @param wheel the index of the wheel to remove (&ge;0)
-     */
-    public void removeWheel(int wheel) {
-        wheels.remove(wheel);
-        rebuildRigidBody();
-//        updateDebugShape();
-    }
-
-    /**
-     * Access the indexed wheel of this vehicle.
-     *
-     * @param wheel the index of the wheel to access (&ge;0, &lt;count)
-     * @return the pre-existing instance
-     */
-    public VehicleWheel getWheel(int wheel) {
-        return wheels.get(wheel);
-    }
-
-    /**
-     * Read the number of wheels on this vehicle.
-     *
-     * @return count (&ge;0)
-     */
-    public int getNumWheels() {
-        return wheels.size();
-    }
-
-    /**
-     * Read the initial friction for new wheels.
-     *
-     * @return the coefficient of friction between tyre and ground
-     * (0.8&rarr;realistic car, 10000&rarr;kart racer)
-     */
-    public float getFrictionSlip() {
-        return tuning.frictionSlip;
-    }
-
-    /**
-     * Alter the initial friction for new wheels. Effective only before adding
-     * wheels. After adding a wheel, use {@link #setFrictionSlip(int, float)}.
-     * <p>
-     * For better handling, increase the friction.
-     *
-     * @param frictionSlip the desired coefficient of friction between tyre and
-     * ground (0.8&rarr;realistic car, 10000&rarr;kart racer, default=10.5)
-     */
-    public void setFrictionSlip(float frictionSlip) {
-        tuning.frictionSlip = frictionSlip;
-    }
-
-    /**
-     * Alter the friction of the indexed wheel.
-     * <p>
-     * For better handling, increase the friction.
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param frictionSlip the desired coefficient of friction between tyre and
-     * ground (0.8&rarr;realistic car, 10000&rarr;kart racer)
-     */
-    public void setFrictionSlip(int wheel, float frictionSlip) {
-        wheels.get(wheel).setFrictionSlip(frictionSlip);
-    }
-
-    /**
-     * Alter the roll influence of the indexed wheel.
-     * <p>
-     * The roll-influence factor reduces (or magnifies) any torque contributed
-     * by the wheel that would tend to cause the vehicle to roll over. This is a
-     * bit of a hack, but it's quite effective.
-     * <p>
-     * If the friction between the tyres and the ground is too high, you may
-     * reduce this factor to prevent the vehicle from rolling over. You should
-     * also try lowering the vehicle's center of mass.
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param rollInfluence the desired roll-influence factor (0&rarr;no roll
-     * torque, 1&rarr;realistic behavior, default=1)
-     */
-    public void setRollInfluence(int wheel, float rollInfluence) {
-        wheels.get(wheel).setRollInfluence(rollInfluence);
-    }
-
-    /**
-     * Read the initial maximum suspension travel distance for new wheels.
-     *
-     * @return the maximum distance the suspension can be compressed (in
-     * centimeters)
-     */
-    public float getMaxSuspensionTravelCm() {
-        return tuning.maxSuspensionTravelCm;
-    }
-
-    /**
-     * Alter the initial maximum suspension travel distance for new wheels.
-     * Effective only before adding wheels. After adding a wheel, use
-     * {@link #setMaxSuspensionTravelCm(int, float)}.
-     *
-     * @param maxSuspensionTravelCm the desired maximum distance the suspension
-     * can be compressed (in centimeters, default=500)
-     */
-    public void setMaxSuspensionTravelCm(float maxSuspensionTravelCm) {
-        tuning.maxSuspensionTravelCm = maxSuspensionTravelCm;
-    }
-
-    /**
-     * Alter the maximum suspension travel distance for the indexed wheel.
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param maxSuspensionTravelCm the desired maximum distance the suspension
-     * can be compressed (in centimeters)
-     */
-    public void setMaxSuspensionTravelCm(int wheel, float maxSuspensionTravelCm) {
-        wheels.get(wheel).setMaxSuspensionTravelCm(maxSuspensionTravelCm);
-    }
-
-    /**
-     * Read the initial maximum suspension force for new wheels.
-     *
-     * @return the maximum force per wheel
-     */
-    public float getMaxSuspensionForce() {
-        return tuning.maxSuspensionForce;
-    }
-
-    /**
-     * Alter the initial maximum suspension force for new wheels. Effective only
-     * before adding wheels. After adding a wheel, use
-     * {@link #setMaxSuspensionForce(int, float)}.
-     * <p>
-     * If the suspension cannot handle the vehicle's weight, increase this
-     * limit.
-     *
-     * @param maxSuspensionForce the desired maximum force per wheel
-     * (default=6000)
-     */
-    public void setMaxSuspensionForce(float maxSuspensionForce) {
-        tuning.maxSuspensionForce = maxSuspensionForce;
-    }
-
-    /**
-     * Alter the maximum suspension force for the specified wheel.
-     * <p>
-     * If the suspension cannot handle the vehicle's weight, increase this
-     * limit.
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param maxSuspensionForce the desired maximum force per wheel
-     * (default=6000)
-     */
-    public void setMaxSuspensionForce(int wheel, float maxSuspensionForce) {
-        wheels.get(wheel).setMaxSuspensionForce(maxSuspensionForce);
-    }
-
-    /**
-     * Read the initial damping (when the suspension is compressed) for new
-     * wheels.
-     *
-     * @return the damping coefficient
-     */
-    public float getSuspensionCompression() {
-        return tuning.suspensionCompression;
-    }
-
-    /**
-     * Alter the initial damping (when the suspension is compressed) for new
-     * wheels. Effective only before adding wheels. After adding a wheel, use
-     * {@link #setSuspensionCompression(int, float)}.
-     * <p>
-     * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the
-     * damping ratio:
-     * <p>
-     * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and
-     * 0.3 are good values
-     *
-     * @param suspensionCompression the desired damping coefficient
-     * (default=0.83)
-     */
-    public void setSuspensionCompression(float suspensionCompression) {
-        tuning.suspensionCompression = suspensionCompression;
-    }
-
-    /**
-     * Alter the damping (when the suspension is compressed) for the indexed
-     * wheel.
-     * <p>
-     * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the
-     * damping ratio:
-     * <p>
-     * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and
-     * 0.3 are good values
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param suspensionCompression the desired damping coefficient
-     */
-    public void setSuspensionCompression(int wheel, float suspensionCompression) {
-        wheels.get(wheel).setWheelsDampingCompression(suspensionCompression);
-    }
-
-    /**
-     * Read the initial damping (when the suspension is expanded) for new
-     * wheels.
-     *
-     * @return the damping coefficient
-     */
-    public float getSuspensionDamping() {
-        return tuning.suspensionDamping;
-    }
-
-    /**
-     * Alter the initial damping (when the suspension is expanded) for new
-     * wheels. Effective only before adding wheels. After adding a wheel, use
-     * {@link #setSuspensionCompression(int, float)}.
-     * <p>
-     * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the
-     * damping ratio:
-     * <p>
-     * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and
-     * 0.3 are good values
-     *
-     * @param suspensionDamping the desired damping coefficient (default=0.88)
-     */
-    public void setSuspensionDamping(float suspensionDamping) {
-        tuning.suspensionDamping = suspensionDamping;
-    }
-
-    /**
-     * Alter the damping (when the suspension is expanded) for the indexed
-     * wheel.
-     * <p>
-     * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the
-     * damping ratio:
-     * <p>
-     * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and
-     * 0.3 are good values
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param suspensionDamping the desired damping coefficient
-     */
-    public void setSuspensionDamping(int wheel, float suspensionDamping) {
-        wheels.get(wheel).setWheelsDampingRelaxation(suspensionDamping);
-    }
-
-    /**
-     * Read the initial suspension stiffness for new wheels.
-     *
-     * @return the stiffness constant (10&rarr;off-road buggy, 50&rarr;sports
-     * car, 200&rarr;Formula-1 race car)
-     */
-    public float getSuspensionStiffness() {
-        return tuning.suspensionStiffness;
-    }
-
-    /**
-     * Alter the initial suspension stiffness for new wheels. Effective only
-     * before adding wheels. After adding a wheel, use
-     * {@link #setSuspensionStiffness(int, float)}.
-     *
-     * @param suspensionStiffness the desired stiffness coefficient
-     * (10&rarr;off-road buggy, 50&rarr;sports car, 200&rarr;Formula-1 race car,
-     * default=5.88)
-     */
-    public void setSuspensionStiffness(float suspensionStiffness) {
-        tuning.suspensionStiffness = suspensionStiffness;
-    }
-
-    /**
-     * Alter the suspension stiffness of the indexed wheel.
-     *
-     * @param wheel the index of the wheel to modify (&ge;0)
-     * @param suspensionStiffness the desired stiffness coefficient
-     * (10&rarr;off-road buggy, 50&rarr;sports car, 200&rarr;Formula-1 race car,
-     * default=5.88)
-     */
-    public void setSuspensionStiffness(int wheel, float suspensionStiffness) {
-        wheels.get(wheel).setSuspensionStiffness(suspensionStiffness);
-    }
-
-    /**
-     * Reset this vehicle's suspension.
-     */
-    public void resetSuspension() {
-        resetSuspension(vehicleId);
-    }
-
-    private native void resetSuspension(long vehicleId);
-
-    /**
-     * Apply the specified engine force to all wheels. Works continuously.
-     *
-     * @param force the desired amount of force
-     */
-    public void accelerate(float force) {
-        for (int i = 0; i < wheels.size(); i++) {
-            accelerate(i, force);
-        }
-    }
-
-    /**
-     * Apply the given engine force to the indexed wheel. Works continuously.
-     *
-     * @param wheel the index of the wheel to apply the force to (&ge;0)
-     * @param force the desired amount of force
-     */
-    public void accelerate(int wheel, float force) {
-        applyEngineForce(vehicleId, wheel, force);
-
-    }
-
-    private native void applyEngineForce(long vehicleId, int wheel, float force);
-
-    /**
-     * Alter the steering angle of all front wheels.
-     *
-     * @param value the desired steering angle (in radians, 0=straight)
-     */
-    public void steer(float value) {
-        for (int i = 0; i < wheels.size(); i++) {
-            if (getWheel(i).isFrontWheel()) {
-                steer(i, value);
-            }
-        }
-    }
-
-    /**
-     * Alter the steering angle of the indexed wheel.
-     *
-     * @param wheel the index of the wheel to steer (&ge;0)
-     * @param value the desired steering angle (in radians, 0=straight)
-     */
-    public void steer(int wheel, float value) {
-        steer(vehicleId, wheel, value);
-    }
-
-    private native void steer(long vehicleId, int wheel, float value);
-
-    /**
-     * Apply the given brake force to all wheels. Works continuously.
-     *
-     * @param force the desired amount of force
-     */
-    public void brake(float force) {
-        for (int i = 0; i < wheels.size(); i++) {
-            brake(i, force);
-        }
-    }
-
-    /**
-     * Apply the given brake force to the indexed wheel. Works continuously.
-     *
-     * @param wheel the index of the wheel to apply the force to (&ge;0)
-     * @param force the desired amount of force
-     */
-    public void brake(int wheel, float force) {
-        brake(vehicleId, wheel, force);
-    }
-
-    private native void brake(long vehicleId, int wheel, float force);
-
-    /**
-     * Read the vehicle's speed in km/h.
-     *
-     * @return speed (in kilometers per hour)
-     */
-    public float getCurrentVehicleSpeedKmHour() {
-        return getCurrentVehicleSpeedKmHour(vehicleId);
-    }
-
-    private native float getCurrentVehicleSpeedKmHour(long vehicleId);
-
-    /**
-     * Copy the vehicle's forward direction.
-     *
-     * @param vector storage for the result (modified if not null)
-     * @return a direction vector (in physics-space coordinates, either the
-     * provided storage or a new vector, not null)
-     */
-    public Vector3f getForwardVector(Vector3f vector) {
-        if (vector == null) {
-            vector = new Vector3f();
-        }
-        getForwardVector(vehicleId, vector);
-        return vector;
-    }
-
-    private native void getForwardVector(long objectId, Vector3f vector);
-
-    /**
-     * used internally
-     *
-     * @return the unique identifier
-     */
-    public long getVehicleId() {
-        return vehicleId;
-    }
-
-    /**
-     * De-serialize this vehicle, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    @SuppressWarnings("unchecked")
-    public void read(JmeImporter im) throws IOException {
-        InputCapsule capsule = im.getCapsule(this);
-        tuning = new VehicleTuning();
-        tuning.frictionSlip = capsule.readFloat("frictionSlip", 10.5f);
-        tuning.maxSuspensionTravelCm = capsule.readFloat("maxSuspensionTravelCm", 500f);
-        tuning.maxSuspensionForce = capsule.readFloat("maxSuspensionForce", 6000f);
-        tuning.suspensionCompression = capsule.readFloat("suspensionCompression", 0.83f);
-        tuning.suspensionDamping = capsule.readFloat("suspensionDamping", 0.88f);
-        tuning.suspensionStiffness = capsule.readFloat("suspensionStiffness", 5.88f);
-        wheels = capsule.readSavableArrayList("wheelsList", new ArrayList<VehicleWheel>());
-        motionState.setVehicle(this);
-        super.read(im);
-    }
-
-    /**
-     * Serialize this vehicle, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(tuning.frictionSlip, "frictionSlip", 10.5f);
-        capsule.write(tuning.maxSuspensionTravelCm, "maxSuspensionTravelCm", 500f);
-        capsule.write(tuning.maxSuspensionForce, "maxSuspensionForce", 6000f);
-        capsule.write(tuning.suspensionCompression, "suspensionCompression", 0.83f);
-        capsule.write(tuning.suspensionDamping, "suspensionDamping", 0.88f);
-        capsule.write(tuning.suspensionStiffness, "suspensionStiffness", 5.88f);
-        capsule.writeSavableArrayList(wheels, "wheelsList", new ArrayList<VehicleWheel>());
-        super.write(ex);
-    }
-
-    /**
-     * Finalize this vehicle just before it is destroyed. Should be invoked only
-     * by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing RayCaster {0}", Long.toHexString(rayCasterId));
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing Vehicle {0}", Long.toHexString(vehicleId));
-        finalizeNative(rayCasterId, vehicleId);
-    }
-
-    private native void finalizeNative(long rayCaster, long vehicle);
-}

+ 0 - 713
jme3-bullet/src/main/java/com/jme3/bullet/objects/VehicleWheel.java

@@ -1,713 +0,0 @@
-/*
- * Copyright (c) 2009-2019 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects;
-
-import com.jme3.bullet.collision.PhysicsCollisionObject;
-import com.jme3.export.*;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Quaternion;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Spatial;
-import java.io.IOException;
-
-/**
- * Information about one wheel of a PhysicsVehicle.
- *
- * @author normenhansen
- */
-public class VehicleWheel implements Savable {
-
-    /**
-     * unique identifier of the btRaycastVehicle
-     */
-    protected long wheelId = 0;
-    /**
-     * 0-origin index among the vehicle's wheels (&ge;0)
-     */
-    protected int wheelIndex = 0;
-    /**
-     * copy of wheel type: true&rarr;front (steering) wheel,
-     * false&rarr;non-front wheel
-     */
-    protected boolean frontWheel;
-    /**
-     * location where the suspension connects to the chassis (in chassis
-     * coordinates)
-     */
-    protected Vector3f location = new Vector3f();
-    /**
-     * suspension direction (in chassis coordinates, typically down/0,-1,0)
-     */
-    protected Vector3f direction = new Vector3f();
-    /**
-     * axis direction (in chassis coordinates, typically to the right/-1,0,0)
-     */
-    protected Vector3f axle = new Vector3f();
-    /**
-     * copy of suspension stiffness constant (10&rarr;off-road buggy, 
-     * 50&rarr;sports car, 200&rarr;Formula-1 race car, default=20)
-     */
-    protected float suspensionStiffness = 20.0f;
-    /**
-     * copy of suspension damping when expanded (0&rarr;no damping, default=2.3)
-     */
-    protected float wheelsDampingRelaxation = 2.3f;
-    /**
-     * copy of suspension damping when compressed (0&rarr;no damping, 
-     * default=4.4)
-     */
-    protected float wheelsDampingCompression = 4.4f;
-    /**
-     * copy of coefficient of friction between tyre and ground
-     * (0.8&rarr;realistic car, 10000&rarr;kart racer, default=10.5)
-     */
-    protected float frictionSlip = 10.5f;
-    /**
-     * copy of roll-influence factor (0&rarr;no roll torque, 1&rarr;realistic
-     * behavior, default=1)
-     */
-    protected float rollInfluence = 1.0f;
-    /**
-     * copy of maximum suspension travel distance (in centimeters, default=500)
-     */
-    protected float maxSuspensionTravelCm = 500f;
-    /**
-     * copy of maximum force exerted by the suspension (default=6000)
-     */
-    protected float maxSuspensionForce = 6000f;
-    /**
-     * copy of wheel radius (in physics-space units, &gt;0)
-     */
-    protected float radius = 0.5f;
-    /**
-     * copy of rest length of the suspension (in physics-space units)
-     */
-    protected float restLength = 1f;
-    /**
-     * wheel location in physics-space coordinates
-     */
-    protected Vector3f wheelWorldLocation = new Vector3f();
-    /**
-     * wheel orientation in physics-space coordinates
-     */
-    protected Quaternion wheelWorldRotation = new Quaternion();
-    /**
-     * associated spatial, or null if none
-     */
-    protected Spatial wheelSpatial;
-    protected Matrix3f tmp_Matrix = new com.jme3.math.Matrix3f();
-    protected final Quaternion tmp_inverseWorldRotation = new Quaternion();
-    /**
-     * true &rarr; physics coordinates match local transform, false &rarr;
-     * physics coordinates match world transform
-     */
-    private boolean applyLocal = false;
-
-    /**
-     * No-argument constructor needed by SavableClassUtil. Do not invoke
-     * directly!
-     */
-    protected VehicleWheel() {
-    }
-
-    /**
-     * Instantiate a wheel.
-     *
-     * @param spat the associated spatial, or null if none
-     * @param location the location where the suspension connects to the chassis
-     * (in chassis coordinates, not null, unaffected)
-     * @param direction the suspension direction (in chassis coordinates, not
-     * null, unaffected, typically down/0,-1,0)
-     * @param axle the axis direction (in chassis coordinates, not null,
-     * unaffected, typically right/-1,0,0)
-     * @param restLength the rest length of the suspension (in physics-space
-     * units)
-     * @param radius the wheel's radius (in physics-space units, &ge;0)
-     * @param frontWheel true&rarr;front (steering) wheel, false&rarr;non-front
-     * wheel
-     */
-    public VehicleWheel(Spatial spat, Vector3f location, Vector3f direction, Vector3f axle,
-            float restLength, float radius, boolean frontWheel) {
-        this(location, direction, axle, restLength, radius, frontWheel);
-        wheelSpatial = spat;
-    }
-
-    /**
-     * Instantiate a wheel without an associated spatial.
-     *
-     * @param location the location where the suspension connects to the chassis
-     * (in chassis coordinates, not null, unaffected)
-     * @param direction the suspension direction (in chassis coordinates, not
-     * null, unaffected, typically down/0,-1,0)
-     * @param axle the axis direction (in chassis coordinates, not null,
-     * unaffected, typically right/-1,0,0)
-     * @param restLength the rest length of the suspension (in physics-space
-     * units)
-     * @param radius the wheel's radius (in physics-space units, &ge;0)
-     * @param frontWheel true&rarr;front (steering) wheel, false&rarr;non-front
-     * wheel
-     */
-    public VehicleWheel(Vector3f location, Vector3f direction, Vector3f axle,
-            float restLength, float radius, boolean frontWheel) {
-        this.location.set(location);
-        this.direction.set(direction);
-        this.axle.set(axle);
-        this.frontWheel = frontWheel;
-        this.restLength = restLength;
-        this.radius = radius;
-    }
-
-    /**
-     * Update this wheel's location and orientation in physics space.
-     */
-    public void updatePhysicsState() {
-        getWheelLocation(wheelId, wheelIndex, wheelWorldLocation);
-        getWheelRotation(wheelId, wheelIndex, tmp_Matrix);
-        wheelWorldRotation.fromRotationMatrix(tmp_Matrix);
-    }
-
-    private native void getWheelLocation(long vehicleId, int wheelId, Vector3f location);
-
-    private native void getWheelRotation(long vehicleId, int wheelId, Matrix3f location);
-
-    /**
-     * Apply this wheel's physics location and orientation to its associated
-     * spatial, if any.
-     */
-    public void applyWheelTransform() {
-        if (wheelSpatial == null) {
-            return;
-        }
-        Quaternion localRotationQuat = wheelSpatial.getLocalRotation();
-        Vector3f localLocation = wheelSpatial.getLocalTranslation();
-        if (!applyLocal && wheelSpatial.getParent() != null) {
-            localLocation.set(wheelWorldLocation).subtractLocal(wheelSpatial.getParent().getWorldTranslation());
-            localLocation.divideLocal(wheelSpatial.getParent().getWorldScale());
-            tmp_inverseWorldRotation.set(wheelSpatial.getParent().getWorldRotation()).inverseLocal().multLocal(localLocation);
-
-            localRotationQuat.set(wheelWorldRotation);
-            tmp_inverseWorldRotation.set(wheelSpatial.getParent().getWorldRotation()).inverseLocal().mult(localRotationQuat, localRotationQuat);
-
-            wheelSpatial.setLocalTranslation(localLocation);
-            wheelSpatial.setLocalRotation(localRotationQuat);
-        } else {
-            wheelSpatial.setLocalTranslation(wheelWorldLocation);
-            wheelSpatial.setLocalRotation(wheelWorldRotation);
-        }
-    }
-
-    /**
-     * Read the id of the btRaycastVehicle.
-     *
-     * @return the unique identifier (not zero)
-     */
-    public long getWheelId() {
-        return wheelId;
-    }
-
-    /**
-     * Assign this wheel to a vehicle.
-     *
-     * @param vehicleId the id of the btRaycastVehicle (not zero)
-     * @param wheelIndex index among the vehicle's wheels (&ge;0)
-     */
-    public void setVehicleId(long vehicleId, int wheelIndex) {
-        this.wheelId = vehicleId;
-        this.wheelIndex = wheelIndex;
-        applyInfo();
-    }
-
-    /**
-     * Test whether this wheel is a front wheel.
-     *
-     * @return true if front wheel, otherwise false
-     */
-    public boolean isFrontWheel() {
-        return frontWheel;
-    }
-
-    /**
-     * Alter whether this wheel is a front (steering) wheel.
-     *
-     * @param frontWheel true&rarr;front wheel, false&rarr;non-front wheel
-     */
-    public void setFrontWheel(boolean frontWheel) {
-        this.frontWheel = frontWheel;
-        applyInfo();
-    }
-
-    /**
-     * Access the location where the suspension connects to the chassis.
-     *
-     * @return the pre-existing location vector (in chassis coordinates, not 
-     * null)
-     */
-    public Vector3f getLocation() {
-        return location;
-    }
-
-    /**
-     * Access this wheel's suspension direction.
-     *
-     * @return the pre-existing direction vector (in chassis coordinates, not 
-     * null)
-     */
-    public Vector3f getDirection() {
-        return direction;
-    }
-
-    /**
-     * Access this wheel's axle direction.
-     *
-     * @return the pre-existing direction vector (not null)
-     */
-    public Vector3f getAxle() {
-        return axle;
-    }
-
-    /**
-     * Read the stiffness constant for this wheel's suspension.
-     *
-     * @return the stiffness constant
-     */
-    public float getSuspensionStiffness() {
-        return suspensionStiffness;
-    }
-
-    /**
-     * Alter the stiffness constant for this wheel's suspension.
-     *
-     * @param suspensionStiffness the desired stiffness constant
-     * (10&rarr;off-road buggy, 50&rarr;sports car, 200&rarr;Formula-1 race car,
-     * default=20)
-     */
-    public void setSuspensionStiffness(float suspensionStiffness) {
-        this.suspensionStiffness = suspensionStiffness;
-        applyInfo();
-    }
-
-    /**
-     * Read this wheel's damping when the suspension is expanded.
-     *
-     * @return the damping
-     */
-    public float getWheelsDampingRelaxation() {
-        return wheelsDampingRelaxation;
-    }
-
-    /**
-     * Alter this wheel's damping when the suspension is expanded.
-     * <p>
-     * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the
-     * damping ratio:
-     * <p>
-     * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and
-     * 0.3 are good values
-     *
-     * @param wheelsDampingRelaxation the desired damping (default=2.3)
-     */
-    public void setWheelsDampingRelaxation(float wheelsDampingRelaxation) {
-        this.wheelsDampingRelaxation = wheelsDampingRelaxation;
-        applyInfo();
-    }
-
-    /**
-     * Read this wheel's damping when the suspension is compressed.
-     *
-     * @return the damping
-     */
-    public float getWheelsDampingCompression() {
-        return wheelsDampingCompression;
-    }
-
-    /**
-     * Alter this wheel's damping when the suspension is compressed.
-     * <p>
-     * Set to k * 2 * FastMath.sqrt(m_suspensionStiffness) where k is the
-     * damping ratio:
-     * <p>
-     * k = 0.0 undamped and bouncy, k = 1.0 critical damping, k between 0.1 and
-     * 0.3 are good values
-     *
-     * @param wheelsDampingCompression the desired damping (default=4.4)
-     */
-    public void setWheelsDampingCompression(float wheelsDampingCompression) {
-        this.wheelsDampingCompression = wheelsDampingCompression;
-        applyInfo();
-    }
-
-    /**
-     * Read the friction between this wheel's tyre and the ground.
-     *
-     * @return the coefficient of friction
-     */
-    public float getFrictionSlip() {
-        return frictionSlip;
-    }
-
-    /**
-     * Alter the friction between this wheel's tyre and the ground.
-     * <p>
-     * Should be about 0.8 for realistic cars, but can increased for better
-     * handling. Set large (10000.0) for kart racers.
-     *
-     * @param frictionSlip the desired coefficient of friction (default=10.5)
-     */
-    public void setFrictionSlip(float frictionSlip) {
-        this.frictionSlip = frictionSlip;
-        applyInfo();
-    }
-
-    /**
-     * Read this wheel's roll influence.
-     *
-     * @return the roll-influence factor
-     */
-    public float getRollInfluence() {
-        return rollInfluence;
-    }
-
-    /**
-     * Alter this wheel's roll influence.
-     * <p>
-     * The roll-influence factor reduces (or magnifies) the torque contributed
-     * by this wheel that tends to cause the vehicle to roll over. This is a bit
-     * of a hack, but it's quite effective.
-     * <p>
-     * If the friction between the tyres and the ground is too high, you may
-     * reduce this factor to prevent the vehicle from rolling over. You should
-     * also try lowering the vehicle's centre of mass.
-     *
-     * @param rollInfluence the desired roll-influence factor (0&rarr;no roll
-     * torque, 1&rarr;realistic behaviour, default=1)
-     */
-    public void setRollInfluence(float rollInfluence) {
-        this.rollInfluence = rollInfluence;
-        applyInfo();
-    }
-
-    /**
-     * Read the travel distance for this wheel's suspension.
-     *
-     * @return the maximum travel distance (in centimeters)
-     */
-    public float getMaxSuspensionTravelCm() {
-        return maxSuspensionTravelCm;
-    }
-
-    /**
-     * Alter the travel distance for this wheel's suspension.
-     *
-     * @param maxSuspensionTravelCm the desired maximum travel distance (in
-     * centimetres, default=500)
-     */
-    public void setMaxSuspensionTravelCm(float maxSuspensionTravelCm) {
-        this.maxSuspensionTravelCm = maxSuspensionTravelCm;
-        applyInfo();
-    }
-
-    /**
-     * Read the maximum force exerted by this wheel's suspension.
-     *
-     * @return the maximum force
-     */
-    public float getMaxSuspensionForce() {
-        return maxSuspensionForce;
-    }
-
-    /**
-     * Alter the maximum force exerted by this wheel's suspension.
-     * <p>
-     * Increase this if your suspension cannot handle the weight of your
-     * vehicle.
-     *
-     * @param maxSuspensionForce the desired maximum force (default=6000)
-     */
-    public void setMaxSuspensionForce(float maxSuspensionForce) {
-        this.maxSuspensionForce = maxSuspensionForce;
-        applyInfo();
-    }
-
-    private void applyInfo() {
-        if (wheelId == 0) {
-            return;
-        }
-        applyInfo(wheelId, wheelIndex, suspensionStiffness, wheelsDampingRelaxation, wheelsDampingCompression, frictionSlip, rollInfluence, maxSuspensionTravelCm, maxSuspensionForce, radius, frontWheel, restLength);
-    }
-
-    private native void applyInfo(long wheelId, int wheelIndex,
-            float suspensionStiffness,
-            float wheelsDampingRelaxation,
-            float wheelsDampingCompression,
-            float frictionSlip,
-            float rollInfluence,
-            float maxSuspensionTravelCm,
-            float maxSuspensionForce,
-            float wheelsRadius,
-            boolean frontWheel,
-            float suspensionRestLength);
-
-    /**
-     * Read the radius of this wheel.
-     *
-     * @return the radius (in physics-space units, &ge;0)
-     */
-    public float getRadius() {
-        return radius;
-    }
-
-    /**
-     * Alter the radius of this wheel.
-     *
-     * @param radius the desired radius (in physics-space units, &ge;0,
-     * default=0.5)
-     */
-    public void setRadius(float radius) {
-        this.radius = radius;
-        applyInfo();
-    }
-
-    /**
-     * Read the rest length of this wheel.
-     *
-     * @return the length
-     */
-    public float getRestLength() {
-        return restLength;
-    }
-
-    /**
-     * Alter the rest length of the suspension of this wheel.
-     *
-     * @param restLength the desired length (default=1)
-     */
-    public void setRestLength(float restLength) {
-        this.restLength = restLength;
-        applyInfo();
-    }
-
-    /**
-     * returns the object this wheel is in contact with or null if no contact
-     * @return the PhysicsCollisionObject (PhysicsRigidBody, PhysicsGhostObject)
-     */
-    public PhysicsCollisionObject getGroundObject() {
-//        if (wheelInfo.raycastInfo.groundObject == null) {
-//            return null;
-//        } else if (wheelInfo.raycastInfo.groundObject instanceof RigidBody) {
-//            System.out.println("RigidBody");
-//            return (PhysicsRigidBody) ((RigidBody) wheelInfo.raycastInfo.groundObject).getUserPointer();
-//        } else {
-        return null;
-//        }
-    }
-
-    /**
-     * Copy the location where the wheel touches the ground.
-     *
-     * @param vec storage for the result (not null, modified)
-     * @return a new location vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getCollisionLocation(Vector3f vec) {
-        getCollisionLocation(wheelId, wheelIndex, vec);
-        return vec;
-    }
-
-    private native void getCollisionLocation(long wheelId, int wheelIndex, Vector3f vec);
-
-    /**
-     * Copy the location where the wheel collides with the ground.
-     *
-     * @return a new location vector (in physics-space coordinates)
-     */
-    public Vector3f getCollisionLocation() {
-        Vector3f vec = new Vector3f();
-        getCollisionLocation(wheelId, wheelIndex, vec);
-        return vec;
-    }
-
-    /**
-     * Copy the normal where the wheel touches the ground.
-     *
-     * @param vec storage for the result (not null, modified)
-     * @return a unit vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getCollisionNormal(Vector3f vec) {
-        getCollisionNormal(wheelId, wheelIndex, vec);
-        return vec;
-    }
-
-    private native void getCollisionNormal(long wheelId, int wheelIndex, Vector3f vec);
-
-    /**
-     * Copy the normal where the wheel touches the ground.
-     *
-     * @return a new unit vector (in physics-space coordinates, not null)
-     */
-    public Vector3f getCollisionNormal() {
-        Vector3f vec = new Vector3f();
-        getCollisionNormal(wheelId, wheelIndex, vec);
-        return vec;
-    }
-
-    /**
-     * Calculate to what extent the wheel is skidding (for skid sounds/smoke
-     * etc.)
-     *
-     * @return the relative amount of traction (0&rarr;wheel is sliding,
-     * 1&rarr;wheel has full traction)
-     */
-    public float getSkidInfo() {
-        return getSkidInfo(wheelId, wheelIndex);
-    }
-
-    public native float getSkidInfo(long wheelId, int wheelIndex);
-    
-    /**
-     * Calculate how much this wheel has turned since the last physics step.
-     *
-     * @return the rotation angle (in radians)
-     */
-    public float getDeltaRotation() {
-        return getDeltaRotation(wheelId, wheelIndex);
-    }
-    
-    public native float getDeltaRotation(long wheelId, int wheelIndex);
-
-    /**
-     * De-serialize this wheel, for example when loading from a J3O file.
-     *
-     * @param im importer (not null)
-     * @throws IOException from importer
-     */
-    @Override
-    public void read(JmeImporter im) throws IOException {
-        InputCapsule capsule = im.getCapsule(this);
-        wheelSpatial = (Spatial) capsule.readSavable("wheelSpatial", null);
-        frontWheel = capsule.readBoolean("frontWheel", false);
-        location = (Vector3f) capsule.readSavable("wheelLocation", new Vector3f());
-        direction = (Vector3f) capsule.readSavable("wheelDirection", new Vector3f());
-        axle = (Vector3f) capsule.readSavable("wheelAxle", new Vector3f());
-        suspensionStiffness = capsule.readFloat("suspensionStiffness", 20.0f);
-        wheelsDampingRelaxation = capsule.readFloat("wheelsDampingRelaxation", 2.3f);
-        wheelsDampingCompression = capsule.readFloat("wheelsDampingCompression", 4.4f);
-        frictionSlip = capsule.readFloat("frictionSlip", 10.5f);
-        rollInfluence = capsule.readFloat("rollInfluence", 1.0f);
-        maxSuspensionTravelCm = capsule.readFloat("maxSuspensionTravelCm", 500f);
-        maxSuspensionForce = capsule.readFloat("maxSuspensionForce", 6000f);
-        radius = capsule.readFloat("wheelRadius", 0.5f);
-        restLength = capsule.readFloat("restLength", 1f);
-    }
-
-    /**
-     * Serialize this wheel, for example when saving to a J3O file.
-     *
-     * @param ex exporter (not null)
-     * @throws IOException from exporter
-     */
-    @Override
-    public void write(JmeExporter ex) throws IOException {
-        OutputCapsule capsule = ex.getCapsule(this);
-        capsule.write(wheelSpatial, "wheelSpatial", null);
-        capsule.write(frontWheel, "frontWheel", false);
-        capsule.write(location, "wheelLocation", new Vector3f());
-        capsule.write(direction, "wheelDirection", new Vector3f());
-        capsule.write(axle, "wheelAxle", new Vector3f());
-        capsule.write(suspensionStiffness, "suspensionStiffness", 20.0f);
-        capsule.write(wheelsDampingRelaxation, "wheelsDampingRelaxation", 2.3f);
-        capsule.write(wheelsDampingCompression, "wheelsDampingCompression", 4.4f);
-        capsule.write(frictionSlip, "frictionSlip", 10.5f);
-        capsule.write(rollInfluence, "rollInfluence", 1.0f);
-        capsule.write(maxSuspensionTravelCm, "maxSuspensionTravelCm", 500f);
-        capsule.write(maxSuspensionForce, "maxSuspensionForce", 6000f);
-        capsule.write(radius, "wheelRadius", 0.5f);
-        capsule.write(restLength, "restLength", 1f);
-    }
-
-    /**
-     * Access the spatial associated with this wheel.
-     *
-     * @return the pre-existing instance, or null
-     */
-    public Spatial getWheelSpatial() {
-        return wheelSpatial;
-    }
-
-    /**
-     * Alter which spatial is associated with this wheel.
-     *
-     * @param wheelSpatial the desired spatial, or null for none
-     */
-    public void setWheelSpatial(Spatial wheelSpatial) {
-        this.wheelSpatial = wheelSpatial;
-    }
-
-    /**
-     * Test whether physics coordinates should match the local transform of the
-     * Spatial.
-     *
-     * @return true if matching local transform, false if matching world
-     * transform
-     */
-    public boolean isApplyLocal() {
-        return applyLocal;
-    }
-
-    /**
-     * Alter whether physics coordinates should match the local transform of the
-     * Spatial.
-     *
-     * @param applyLocal true&rarr;match local transform, false&rarr;match world
-     * transform (default=false)
-     */
-    public void setApplyLocal(boolean applyLocal) {
-        this.applyLocal = applyLocal;
-    }
-
-    /**
-     * Copy this wheel's physics-space orientation to the specified quaternion.
-     *
-     * @param store storage for the result (not null, modified)
-     */
-    public void getWheelWorldRotation(final Quaternion store) {
-        store.set(this.wheelWorldRotation);
-    }
-
-    /**
-     * Copy this wheel's physics-space location to the specified vector.
-     *
-     * @param store storage for the result (not null, modified)
-     */
-    public void getWheelWorldLocation(final Vector3f store) {
-        store.set(this.wheelWorldLocation);
-    }
-
-}

+ 0 - 207
jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/RigidBodyMotionState.java

@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects.infos;
-
-import com.jme3.bullet.objects.PhysicsVehicle;
-import com.jme3.math.Matrix3f;
-import com.jme3.math.Quaternion;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Spatial;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * The motion state (transform) of a rigid body, with thread-safe access.
- *
- * @author normenhansen
- */
-public class RigidBodyMotionState {
-    long motionStateId = 0;
-    private Vector3f worldLocation = new Vector3f();
-    private Matrix3f worldRotation = new Matrix3f();
-    private Quaternion worldRotationQuat = new Quaternion();
-    private Quaternion tmp_inverseWorldRotation = new Quaternion();
-    private PhysicsVehicle vehicle;
-    /**
-     * true &rarr; physics coordinates match local transform, false &rarr;
-     * physics coordinates match world transform
-     */
-    private boolean applyPhysicsLocal = false;
-//    protected LinkedList<PhysicsMotionStateListener> listeners = new LinkedList<PhysicsMotionStateListener>();
-
-    /**
-     * Instantiate a motion state.
-     */
-    public RigidBodyMotionState() {
-        this.motionStateId = createMotionState();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Created MotionState {0}", Long.toHexString(motionStateId));
-    }
-
-    private native long createMotionState();
-
-    /**
-     * If the motion state has been updated, apply the new transform to the
-     * specified spatial.
-     *
-     * @param spatial where to apply the physics transform (not null, modified)
-     * @return true if changed
-     */
-    public boolean applyTransform(Spatial spatial) {
-        Vector3f localLocation = spatial.getLocalTranslation();
-        Quaternion localRotationQuat = spatial.getLocalRotation();
-        boolean physicsLocationDirty = applyTransform(motionStateId, localLocation, localRotationQuat);
-        if (!physicsLocationDirty) {
-            return false;
-        }
-        if (!applyPhysicsLocal && spatial.getParent() != null) {
-            localLocation.subtractLocal(spatial.getParent().getWorldTranslation());
-            localLocation.divideLocal(spatial.getParent().getWorldScale());
-            tmp_inverseWorldRotation.set(spatial.getParent().getWorldRotation()).inverseLocal().multLocal(localLocation);
-
-//            localRotationQuat.set(worldRotationQuat);
-            tmp_inverseWorldRotation.mult(localRotationQuat, localRotationQuat);
-
-            spatial.setLocalTranslation(localLocation);
-            spatial.setLocalRotation(localRotationQuat);
-        } else {
-            spatial.setLocalTranslation(localLocation);
-            spatial.setLocalRotation(localRotationQuat);
-//            spatial.setLocalTranslation(worldLocation);
-//            spatial.setLocalRotation(worldRotationQuat);
-        }
-        if (vehicle != null) {
-            vehicle.updateWheels();
-        }
-        return true;
-    }
-
-    private native boolean applyTransform(long stateId, Vector3f location, Quaternion rotation);
-
-    /**
-     * Copy the location from this motion state.
-     *
-     * @return the pre-existing location vector (in physics-space coordinates,
-     * not null)
-     */
-    public Vector3f getWorldLocation() {
-        getWorldLocation(motionStateId, worldLocation);
-        return worldLocation;
-    }
-
-    private native void getWorldLocation(long stateId, Vector3f vec);
-
-    /**
-     * Read the rotation of this motion state (as a matrix).
-     *
-     * @return the pre-existing rotation matrix (in physics-space coordinates,
-     * not null)
-     */
-    public Matrix3f getWorldRotation() {
-        getWorldRotation(motionStateId, worldRotation);
-        return worldRotation;
-    }
-
-    private native void getWorldRotation(long stateId, Matrix3f vec);
-
-    /**
-     * Read the rotation of this motion state (as a quaternion).
-     *
-     * @return the pre-existing instance (in physics-space coordinates, not
-     * null)
-     */
-    public Quaternion getWorldRotationQuat() {
-        getWorldRotationQuat(motionStateId, worldRotationQuat);
-        return worldRotationQuat;
-    }
-
-    private native void getWorldRotationQuat(long stateId, Quaternion vec);
-
-    /**
-     * @param vehicle which vehicle will use this motion state
-     */
-    public void setVehicle(PhysicsVehicle vehicle) {
-        this.vehicle = vehicle;
-    }
-
-    /**
-     * Test whether physics-space coordinates should match the spatial's local
-     * coordinates.
-     *
-     * @return true if matching local coordinates, false if matching world
-     * coordinates
-     */
-    public boolean isApplyPhysicsLocal() {
-        return applyPhysicsLocal;
-    }
-
-    /**
-     * Alter whether physics-space coordinates should match the spatial's local
-     * coordinates.
-     *
-     * @param applyPhysicsLocal true&rarr;match local coordinates,
-     * false&rarr;match world coordinates (default=false)
-     */
-    public void setApplyPhysicsLocal(boolean applyPhysicsLocal) {
-        this.applyPhysicsLocal = applyPhysicsLocal;
-    }
-    
-    /**
-     * Read the unique id of the native object.
-     *
-     * @return id (not zero)
-     */
-    public long getObjectId(){
-        return motionStateId;
-    }
-//    public void addMotionStateListener(PhysicsMotionStateListener listener){
-//        listeners.add(listener);
-//    }
-//
-//    public void removeMotionStateListener(PhysicsMotionStateListener listener){
-//        listeners.remove(listener);
-//    }
-
-    /**
-     * Finalize this motion state just before it is destroyed. Should be invoked
-     * only by a subclass or by the garbage collector.
-     *
-     * @throws Throwable ignored by the garbage collector
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Finalizing MotionState {0}", Long.toHexString(motionStateId));
-        finalizeNative(motionStateId);
-    }
-
-    private native void finalizeNative(long objectId);
-}

+ 0 - 66
jme3-bullet/src/main/java/com/jme3/bullet/objects/infos/VehicleTuning.java

@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.objects.infos;
-
-/**
- * Typical tuning parameters for a PhysicsVehicle.
- *
- * @author normenhansen
- */
-public class VehicleTuning {
-    /**
-     * suspension stiffness constant (10&rarr;off-road buggy, 50&rarr;sports
-     * car, 200&rarr;Formula-1 race car, default=5.88)
-     */
-    public float suspensionStiffness = 5.88f;
-    /**
-     * suspension damping when compressed (0&rarr;no damping, default=0.83)
-     */
-    public float suspensionCompression = 0.83f;
-    /**
-     * suspension damping when expanded (0&rarr;no damping, default=0.88)
-     */
-    public float suspensionDamping = 0.88f;
-    /**
-     * maximum suspension travel distance (in centimeters, default=500)
-     */
-    public float maxSuspensionTravelCm = 500f;
-    /**
-     * maximum force exerted by each wheel's suspension (default=6000)
-     */
-    public float maxSuspensionForce = 6000f;
-    /**
-     * coefficient of friction between tyres and ground (0.8&rarr;realistic car,
-     * 10000&rarr;kart racer, default=10.5)
-     */
-    public float frictionSlip = 10.5f;
-}

+ 0 - 72
jme3-bullet/src/main/java/com/jme3/bullet/util/DebugMeshCallback.java

@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.util;
-
-import com.jme3.math.Vector3f;
-import com.jme3.util.BufferUtils;
-import java.nio.FloatBuffer;
-import java.util.ArrayList;
-
-/**
- *
- * @author normenhansen
- */
-public class DebugMeshCallback {
-
-    private ArrayList<Vector3f> list = new ArrayList<Vector3f>();
-
-    /**
-     * Add a vertex to the mesh under construction.
-     * <p>
-     * This method is invoked from native code.
-     *
-     * @param x local X coordinate of new vertex
-     * @param y local Y coordinate of new vertex
-     * @param z local Z coordinate of new vertex
-     * @param part ignored
-     * @param index ignored
-     */
-    public void addVector(float x, float y, float z, int part, int index) {
-        list.add(new Vector3f(x, y, z));
-    }
-
-    public FloatBuffer getVertices() {
-        FloatBuffer buf = BufferUtils.createFloatBuffer(list.size() * 3);
-        for (int i = 0; i < list.size(); i++) {
-            Vector3f vector3f = list.get(i);
-            buf.put(vector3f.x);
-            buf.put(vector3f.y);
-            buf.put(vector3f.z);
-        }
-        return buf;
-    }
-}

+ 0 - 140
jme3-bullet/src/main/java/com/jme3/bullet/util/DebugShapeFactory.java

@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.util;
-
-import com.jme3.bullet.collision.shapes.CollisionShape;
-import com.jme3.bullet.collision.shapes.CompoundCollisionShape;
-import com.jme3.bullet.collision.shapes.infos.ChildCollisionShape;
-import com.jme3.math.Matrix3f;
-import com.jme3.scene.Geometry;
-import com.jme3.scene.Mesh;
-import com.jme3.scene.Node;
-import com.jme3.scene.Spatial;
-import com.jme3.scene.VertexBuffer.Type;
-import com.jme3.util.TempVars;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A utility class to generate debug spatials from Bullet collision shapes.
- *
- * @author CJ Hare, normenhansen
- */
-public class DebugShapeFactory {
-
-    /** The maximum corner for the aabb used for triangles to include in ConcaveShape processing.*/
-//    private static final Vector3f aabbMax = new Vector3f(1e30f, 1e30f, 1e30f);
-    /** The minimum corner for the aabb used for triangles to include in ConcaveShape processing.*/
-//    private static final Vector3f aabbMin = new Vector3f(-1e30f, -1e30f, -1e30f);
-
-    /**
-     * Create a debug spatial from the specified collision shape.
-     * <p>
-     * This is mostly used internally. To attach a debug shape to a physics
-     * object, call <code>attachDebugShape(AssetManager manager);</code> on it.
-     *
-     * @param collisionShape the shape to visualize (may be null, unaffected)
-     * @return a new tree of geometries, or null
-     */
-    public static Spatial getDebugShape(CollisionShape collisionShape) {
-        if (collisionShape == null) {
-            return null;
-        }
-        Spatial debugShape;
-        if (collisionShape instanceof CompoundCollisionShape) {
-            CompoundCollisionShape shape = (CompoundCollisionShape) collisionShape;
-            List<ChildCollisionShape> children = shape.getChildren();
-            Node node = new Node("DebugShapeNode");
-            for (Iterator<ChildCollisionShape> it = children.iterator(); it.hasNext();) {
-                ChildCollisionShape childCollisionShape = it.next();
-                CollisionShape ccollisionShape = childCollisionShape.shape;
-                Geometry geometry = createDebugShape(ccollisionShape);
-
-                // apply translation
-                geometry.setLocalTranslation(childCollisionShape.location);
-
-                // apply rotation
-                TempVars vars = TempVars.get();                
-                Matrix3f tempRot = vars.tempMat3;
-
-                tempRot.set(geometry.getLocalRotation());
-                childCollisionShape.rotation.mult(tempRot, tempRot);
-                geometry.setLocalRotation(tempRot);
-
-                vars.release();
-
-                node.attachChild(geometry);
-            }
-            debugShape = node;
-        } else {
-            debugShape = createDebugShape(collisionShape);
-        }
-        if (debugShape == null) {
-            return null;
-        }
-        debugShape.updateGeometricState();
-        return debugShape;
-    }
-
-    /**
-     * Create a geometry for visualizing the specified shape.
-     *
-     * @param shape (not null, unaffected)
-     * @return a new geometry (not null)
-     */
-    private static Geometry createDebugShape(CollisionShape shape) {
-        Geometry geom = new Geometry();
-        geom.setMesh(DebugShapeFactory.getDebugMesh(shape));
-//        geom.setLocalScale(shape.getScale());
-        geom.updateModelBound();
-        return geom;
-    }
-
-    /**
-     * Create a mesh for visualizing the specified shape.
-     *
-     * @param shape (not null, unaffected)
-     * @return a new mesh (not null)
-     */
-    public static Mesh getDebugMesh(CollisionShape shape) {
-        Mesh mesh = new Mesh();
-        DebugMeshCallback callback = new DebugMeshCallback();
-        long id = shape.getObjectId();
-        getVertices(id, callback);
-
-        mesh.setBuffer(Type.Position, 3, callback.getVertices());
-        mesh.getFloatBuffer(Type.Position).clear();
-        return mesh;
-    }
-
-    private static native void getVertices(long shapeId, DebugMeshCallback buffer);
-}

+ 0 - 97
jme3-bullet/src/main/java/com/jme3/bullet/util/NativeMeshUtil.java

@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2009-2018 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.bullet.util;
-
-import com.jme3.scene.Mesh;
-import com.jme3.scene.VertexBuffer.Type;
-import com.jme3.scene.mesh.IndexBuffer;
-import com.jme3.util.BufferUtils;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-
-/**
- * A utility class for interfacing with Native Bullet.
- *
- * @author normenhansen
- */
-public class NativeMeshUtil {
-    
-    /**
-     * Pass a mesh to Native Bullet.
-     *
-     * @param mesh the JME mesh to pass (not null)
-     * @return the unique identifier of the resulting btTriangleIndexVertexArray
-     * (not 0)
-     */
-    public static long getTriangleIndexVertexArray(Mesh mesh){
-        ByteBuffer triangleIndexBase = BufferUtils.createByteBuffer(mesh.getTriangleCount() * 3 * 4);
-        ByteBuffer vertexBase = BufferUtils.createByteBuffer(mesh.getVertexCount() * 3 * 4);
-        int numVertices = mesh.getVertexCount();
-        int vertexStride = 12; //3 verts * 4 bytes each
-        int numTriangles = mesh.getTriangleCount();
-        int triangleIndexStride = 12; //3 index entries * 4 bytes each
-
-        IndexBuffer indices = mesh.getIndicesAsList();
-        FloatBuffer vertices = mesh.getFloatBuffer(Type.Position);
-        vertices.rewind();
-
-        int verticesLength = mesh.getVertexCount() * 3;
-        for (int i = 0; i < verticesLength; i++) {
-            float tempFloat = vertices.get();
-            vertexBase.putFloat(tempFloat);
-        }
-
-        int indicesLength = mesh.getTriangleCount() * 3;
-        for (int i = 0; i < indicesLength; i++) {
-            triangleIndexBase.putInt(indices.get(i));
-        }
-        vertices.rewind();
-        vertices.clear();
-
-        return createTriangleIndexVertexArray(triangleIndexBase, vertexBase, numTriangles, numVertices, vertexStride, triangleIndexStride);
-    }
-    
-    /**
-     * Instantiate a btTriangleIndexVertexArray. Native method.
-     *
-     * @param triangleIndexBase index buffer (not null)
-     * @param vertexBase vertex buffer (not null)
-     * @param numTraingles the number of triangles in the mesh (&ge;0)
-     * @param numVertices the number of vertices in the mesh (&ge;0)
-     * @param vertextStride (in bytes, &gt;0)
-     * @param triangleIndexStride (in bytes, &gt;0)
-     * @return the unique identifier of the resulting btTriangleIndexVertexArray
-     * (not 0)
-     */
-    public static native long createTriangleIndexVertexArray(ByteBuffer triangleIndexBase, ByteBuffer vertexBase, int numTraingles, int numVertices, int vertextStride, int triangleIndexStride);
-    
-}