partial
This commit is contained in:
parent
f44fdb35e6
commit
cf33c3c2dd
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009-2012 jMonkeyEngine
|
* Copyright (c) 2009-2018 jMonkeyEngine
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -143,6 +143,42 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: com_jme3_bullet_collision_PhysicsCollisionObject
|
||||||
|
* Method: getCollisionFlags
|
||||||
|
* Signature: (J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_getCollisionFlags
|
||||||
|
(JNIEnv *env, jobject object, jlong objectId) {
|
||||||
|
btCollisionObject* collisionObject = reinterpret_cast<btCollisionObject*> (objectId);
|
||||||
|
if (collisionObject == NULL) {
|
||||||
|
jclass newExc = env->FindClass("java/lang/NullPointerException");
|
||||||
|
env->ThrowNew(newExc, "The native object does not exist.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint result = collisionObject->getCollisionFlags();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: com_jme3_bullet_collision_PhysicsCollisionObject
|
||||||
|
* Method: setCollisionFlags
|
||||||
|
* Signature: (JI)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_com_jme3_bullet_collision_PhysicsCollisionObject_setCollisionFlags
|
||||||
|
(JNIEnv *env, jobject object, jlong objectId, jint desiredFlags) {
|
||||||
|
btCollisionObject* collisionObject = reinterpret_cast<btCollisionObject*> (objectId);
|
||||||
|
if (collisionObject == NULL) {
|
||||||
|
jclass newExc = env->FindClass("java/lang/NullPointerException");
|
||||||
|
env->ThrowNew(newExc, "The native object does not exist.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
collisionObject->setCollisionFlags(desiredFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -150,6 +150,7 @@ public class RigidBodyControl extends PhysicsRigidBody implements PhysicsControl
|
|||||||
control.setCcdSweptSphereRadius(getCcdSweptSphereRadius());
|
control.setCcdSweptSphereRadius(getCcdSweptSphereRadius());
|
||||||
control.setCollideWithGroups(getCollideWithGroups());
|
control.setCollideWithGroups(getCollideWithGroups());
|
||||||
control.setCollisionGroup(getCollisionGroup());
|
control.setCollisionGroup(getCollisionGroup());
|
||||||
|
control.setContactResponse(isContactResponse());
|
||||||
control.setDamping(getLinearDamping(), getAngularDamping());
|
control.setDamping(getLinearDamping(), getAngularDamping());
|
||||||
control.setFriction(getFriction());
|
control.setFriction(getFriction());
|
||||||
control.setGravity(getGravity());
|
control.setGravity(getGravity());
|
||||||
|
@ -168,6 +168,7 @@ public class VehicleControl extends PhysicsVehicle implements PhysicsControl, Jm
|
|||||||
control.setCcdSweptSphereRadius(getCcdSweptSphereRadius());
|
control.setCcdSweptSphereRadius(getCcdSweptSphereRadius());
|
||||||
control.setCollideWithGroups(getCollideWithGroups());
|
control.setCollideWithGroups(getCollideWithGroups());
|
||||||
control.setCollisionGroup(getCollisionGroup());
|
control.setCollisionGroup(getCollisionGroup());
|
||||||
|
control.setContactResponse(isContactResponse());
|
||||||
control.setDamping(getLinearDamping(), getAngularDamping());
|
control.setDamping(getLinearDamping(), getAngularDamping());
|
||||||
control.setFriction(getFriction());
|
control.setFriction(getFriction());
|
||||||
control.setGravity(getGravity());
|
control.setGravity(getGravity());
|
||||||
|
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* 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 sgold@sonic.net
|
||||||
|
* @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;
|
||||||
|
}
|
@ -254,6 +254,17 @@ public abstract class PhysicsCollisionObject implements Savable {
|
|||||||
return userObject;
|
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.
|
* Associate a user object (such as a Spatial) with this collision object.
|
||||||
*
|
*
|
||||||
@ -314,6 +325,24 @@ public abstract class PhysicsCollisionObject implements Savable {
|
|||||||
collisionShape = shape;
|
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
|
* Finalize this collision object just before it is destroyed. Should be
|
||||||
* invoked only by a subclass or by the garbage collector.
|
* invoked only by a subclass or by the garbage collector.
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
package com.jme3.bullet.objects;
|
package com.jme3.bullet.objects;
|
||||||
|
|
||||||
import com.jme3.bullet.PhysicsSpace;
|
import com.jme3.bullet.PhysicsSpace;
|
||||||
|
import com.jme3.bullet.collision.CollisionFlag;
|
||||||
import com.jme3.bullet.collision.PhysicsCollisionObject;
|
import com.jme3.bullet.collision.PhysicsCollisionObject;
|
||||||
import com.jme3.bullet.collision.shapes.CollisionShape;
|
import com.jme3.bullet.collision.shapes.CollisionShape;
|
||||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape;
|
import com.jme3.bullet.collision.shapes.MeshCollisionShape;
|
||||||
@ -57,6 +58,11 @@ import java.util.logging.Logger;
|
|||||||
*/
|
*/
|
||||||
public class PhysicsRigidBody extends PhysicsCollisionObject {
|
public class PhysicsRigidBody extends PhysicsCollisionObject {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* copy of the contact response state: true→responds to contacts,
|
||||||
|
* false→doesn't respond (default=true)
|
||||||
|
*/
|
||||||
|
private boolean contactResponseState = true;
|
||||||
/**
|
/**
|
||||||
* motion state
|
* motion state
|
||||||
*/
|
*/
|
||||||
@ -370,6 +376,24 @@ public class PhysicsRigidBody extends PhysicsCollisionObject {
|
|||||||
return kinematic;
|
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);
|
||||||
|
|
||||||
|
contactResponseState = responsive;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Alter the radius of the swept sphere used for continuous collision
|
* Alter the radius of the swept sphere used for continuous collision
|
||||||
* detection (CCD).
|
* detection (CCD).
|
||||||
@ -993,6 +1017,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject {
|
|||||||
capsule.write(getMass(), "mass", 1.0f);
|
capsule.write(getMass(), "mass", 1.0f);
|
||||||
|
|
||||||
capsule.write(getGravity(), "gravity", Vector3f.ZERO);
|
capsule.write(getGravity(), "gravity", Vector3f.ZERO);
|
||||||
|
capsule.write(isContactResponse(), "contactResponse", true);
|
||||||
capsule.write(getFriction(), "friction", 0.5f);
|
capsule.write(getFriction(), "friction", 0.5f);
|
||||||
capsule.write(getRestitution(), "restitution", 0);
|
capsule.write(getRestitution(), "restitution", 0);
|
||||||
Vector3f angularFactor = getAngularFactor(null);
|
Vector3f angularFactor = getAngularFactor(null);
|
||||||
@ -1033,6 +1058,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject {
|
|||||||
this.mass = mass;
|
this.mass = mass;
|
||||||
rebuildRigidBody();
|
rebuildRigidBody();
|
||||||
setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone()));
|
setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone()));
|
||||||
|
setContactResponse(capsule.readBoolean("contactResponse", true));
|
||||||
setFriction(capsule.readFloat("friction", 0.5f));
|
setFriction(capsule.readFloat("friction", 0.5f));
|
||||||
setKinematic(capsule.readBoolean("kinematic", false));
|
setKinematic(capsule.readBoolean("kinematic", false));
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009-2012 jMonkeyEngine
|
* Copyright (c) 2009-2018 jMonkeyEngine
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -276,6 +276,26 @@ public class PhysicsRigidBody extends PhysicsCollisionObject {
|
|||||||
return kinematic;
|
return kinematic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/disable this body's contact response.
|
||||||
|
*
|
||||||
|
* @param newState true to respond to contacts (default=true)
|
||||||
|
*/
|
||||||
|
public void setContactResponse(boolean newState) {
|
||||||
|
if (!newState) {
|
||||||
|
throw new UnsupportedOperationException("Not implemented.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether this body responds to contacts.
|
||||||
|
*
|
||||||
|
* @return true if responsive, otherwise false
|
||||||
|
*/
|
||||||
|
public boolean isContactResponse() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void setCcdSweptSphereRadius(float radius) {
|
public void setCcdSweptSphereRadius(float radius) {
|
||||||
rBody.setCcdSweptSphereRadius(radius);
|
rBody.setCcdSweptSphereRadius(radius);
|
||||||
}
|
}
|
||||||
@ -650,6 +670,7 @@ public class PhysicsRigidBody extends PhysicsCollisionObject {
|
|||||||
this.mass = mass;
|
this.mass = mass;
|
||||||
rebuildRigidBody();
|
rebuildRigidBody();
|
||||||
setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone()));
|
setGravity((Vector3f) capsule.readSavable("gravity", Vector3f.ZERO.clone()));
|
||||||
|
setContactResponse(capsule.readBoolean("contactResponse", true));
|
||||||
setFriction(capsule.readFloat("friction", 0.5f));
|
setFriction(capsule.readFloat("friction", 0.5f));
|
||||||
setKinematic(capsule.readBoolean("kinematic", false));
|
setKinematic(capsule.readBoolean("kinematic", false));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user