2
0
Эх сурвалжийг харах

implement setContactResponse(boolean) for PhysicsCharacter (issue #964) (#971)

Stephen Gold 6 жил өмнө
parent
commit
d8acd30a27

+ 1 - 0
jme3-bullet/src/common/java/com/jme3/bullet/control/CharacterControl.java

@@ -102,6 +102,7 @@ public class CharacterControl extends PhysicsCharacter implements PhysicsControl
         control.setCcdSweptSphereRadius(getCcdSweptSphereRadius());
         control.setCollideWithGroups(getCollideWithGroups());
         control.setCollisionGroup(getCollisionGroup());
+        control.setContactResponse(isContactResponse());
         control.setFallSpeed(getFallSpeed());
         control.setGravity(getGravity());
         control.setJumpSpeed(getJumpSpeed());

+ 17 - 1
jme3-bullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java

@@ -31,6 +31,7 @@
  */
 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;
@@ -50,7 +51,6 @@ import java.util.logging.Logger;
  * @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
@@ -456,6 +456,22 @@ public class PhysicsCharacter extends PhysicsCollisionObject {
 
     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.
      *

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

@@ -57,12 +57,6 @@ import java.util.logging.Logger;
  * @author normenhansen
  */
 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
      */
@@ -390,8 +384,6 @@ public class PhysicsRigidBody extends PhysicsCollisionObject {
             flags |= CollisionFlag.NO_CONTACT_RESPONSE;
         }
         setCollisionFlags(objectId, flags);
-
-        contactResponseState = responsive;
     }
 
     /**

+ 22 - 1
jme3-jbullet/src/main/java/com/jme3/bullet/objects/PhysicsCharacter.java

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009-2012 jMonkeyEngine
+ * Copyright (c) 2009-2018 jMonkeyEngine
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -169,6 +169,26 @@ public class PhysicsCharacter extends PhysicsCollisionObject {
         return character.getMaxSlope();
     }
 
+    /**
+     * 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 boolean onGround() {
         return character.onGround();
     }
@@ -279,6 +299,7 @@ public class PhysicsCharacter extends PhysicsCollisionObject {
         buildObject();
         character = new KinematicCharacterController(gObject, (ConvexShape) collisionShape.getCShape(), stepHeight);
         setGravity(capsule.readFloat("gravity", 9.8f * 3));
+        setContactResponse(capsule.readBoolean("contactResponse", true));
         setMaxSlope(capsule.readFloat("maxSlope", 1.0f));
         setFallSpeed(capsule.readFloat("fallSpeed", 55.0f));
         setJumpSpeed(capsule.readFloat("jumpSpeed", 10.0f));