• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (c) 2009-2010 jMonkeyEngine
3   * All rights reserved.
4   *
5   * Redistribution and use in source and binary forms, with or without
6   * modification, are permitted provided that the following conditions are
7   * met:
8   *
9   * * Redistributions of source code must retain the above copyright
10   *   notice, this list of conditions and the following disclaimer.
11   *
12   * * Redistributions in binary form must reproduce the above copyright
13   *   notice, this list of conditions and the following disclaimer in the
14   *   documentation and/or other materials provided with the distribution.
15   *
16   * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17   *   may be used to endorse or promote products derived from this software
18   *   without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23   * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31   */
32  
33  /**
34   * Author: Normen Hansen
35   */
36  
37  #include "com_jme3_bullet_objects_PhysicsCharacter.h"
38  #include "jmeBulletUtil.h"
39  #include "BulletCollision/CollisionDispatch/btGhostObject.h"
40  #include "BulletDynamics/Character/btKinematicCharacterController.h"
41  
42  #ifdef __cplusplus
43  extern "C" {
44  #endif
45  
46      /*
47       * Class:     com_jme3_bullet_objects_PhysicsCharacter
48       * Method:    createGhostObject
49       * Signature: ()J
50       */
Java_com_jme3_bullet_objects_PhysicsCharacter_createGhostObject(JNIEnv * env,jobject object)51      JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createGhostObject
52      (JNIEnv * env, jobject object) {
53          jmeClasses::initJavaClasses(env);
54          btPairCachingGhostObject* ghost = new btPairCachingGhostObject();
55          return reinterpret_cast<jlong>(ghost);
56      }
57  
58      /*
59       * Class:     com_jme3_bullet_objects_PhysicsCharacter
60       * Method:    setCharacterFlags
61       * Signature: (J)V
62       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setCharacterFlags(JNIEnv * env,jobject object,jlong ghostId)63      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCharacterFlags
64      (JNIEnv *env, jobject object, jlong ghostId) {
65          btPairCachingGhostObject* ghost = reinterpret_cast<btPairCachingGhostObject*>(ghostId);
66          if (ghost == NULL) {
67              jclass newExc = env->FindClass("java/lang/NullPointerException");
68              env->ThrowNew(newExc, "The native object does not exist.");
69              return;
70          }
71          ghost->setCollisionFlags(/*ghost->getCollisionFlags() |*/ btCollisionObject::CF_CHARACTER_OBJECT);
72          ghost->setCollisionFlags(ghost->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE);
73      }
74  
75      /*
76       * Class:     com_jme3_bullet_objects_PhysicsCharacter
77       * Method:    createCharacterObject
78       * Signature: (JJF)J
79       */
Java_com_jme3_bullet_objects_PhysicsCharacter_createCharacterObject(JNIEnv * env,jobject object,jlong objectId,jlong shapeId,jfloat stepHeight)80      JNIEXPORT jlong JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_createCharacterObject
81      (JNIEnv *env, jobject object, jlong objectId, jlong shapeId, jfloat stepHeight) {
82          btPairCachingGhostObject* ghost = reinterpret_cast<btPairCachingGhostObject*>(objectId);
83          if (ghost == NULL) {
84              jclass newExc = env->FindClass("java/lang/NullPointerException");
85              env->ThrowNew(newExc, "The native object does not exist.");
86              return 0;
87          }
88          //TODO: check convexshape!
89          btConvexShape* shape = reinterpret_cast<btConvexShape*>(shapeId);
90          btKinematicCharacterController* character = new btKinematicCharacterController(ghost, shape, stepHeight);
91          return reinterpret_cast<jlong>(character);
92      }
93  
94      /*
95       * Class:     com_jme3_bullet_objects_PhysicsCharacter
96       * Method:    warp
97       * Signature: (JLcom/jme3/math/Vector3f;)V
98       */
Java_com_jme3_bullet_objects_PhysicsCharacter_warp(JNIEnv * env,jobject object,jlong objectId,jobject vector)99      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_warp
100      (JNIEnv *env, jobject object, jlong objectId, jobject vector) {
101          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
102          if (character == NULL) {
103              jclass newExc = env->FindClass("java/lang/NullPointerException");
104              env->ThrowNew(newExc, "The native object does not exist.");
105              return;
106          }
107          btVector3 vec = btVector3();
108          jmeBulletUtil::convert(env, vector, &vec);
109          character->warp(vec);
110      }
111  
112      /*
113       * Class:     com_jme3_bullet_objects_PhysicsCharacter
114       * Method:    setWalkDirection
115       * Signature: (JLcom/jme3/math/Vector3f;)V
116       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setWalkDirection(JNIEnv * env,jobject object,jlong objectId,jobject vector)117      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setWalkDirection
118      (JNIEnv *env, jobject object, jlong objectId, jobject vector) {
119          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
120          if (character == NULL) {
121              jclass newExc = env->FindClass("java/lang/NullPointerException");
122              env->ThrowNew(newExc, "The native object does not exist.");
123              return;
124          }
125          btVector3 vec = btVector3();
126          jmeBulletUtil::convert(env, vector, &vec);
127          character->setWalkDirection(vec);
128      }
129  
130      /*
131       * Class:     com_jme3_bullet_objects_PhysicsCharacter
132       * Method:    setUpAxis
133       * Signature: (JI)V
134       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setUpAxis(JNIEnv * env,jobject object,jlong objectId,jint value)135      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setUpAxis
136      (JNIEnv *env, jobject object, jlong objectId, jint value) {
137          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
138          if (character == NULL) {
139              jclass newExc = env->FindClass("java/lang/NullPointerException");
140              env->ThrowNew(newExc, "The native object does not exist.");
141              return;
142          }
143          character->setUpAxis(value);
144      }
145  
146      /*
147       * Class:     com_jme3_bullet_objects_PhysicsCharacter
148       * Method:    setFallSpeed
149       * Signature: (JF)V
150       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setFallSpeed(JNIEnv * env,jobject object,jlong objectId,jfloat value)151      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setFallSpeed
152      (JNIEnv *env, jobject object, jlong objectId, jfloat value) {
153          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
154          if (character == NULL) {
155              jclass newExc = env->FindClass("java/lang/NullPointerException");
156              env->ThrowNew(newExc, "The native object does not exist.");
157              return;
158          }
159          character->setFallSpeed(value);
160      }
161  
162      /*
163       * Class:     com_jme3_bullet_objects_PhysicsCharacter
164       * Method:    setJumpSpeed
165       * Signature: (JF)V
166       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setJumpSpeed(JNIEnv * env,jobject object,jlong objectId,jfloat value)167      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setJumpSpeed
168      (JNIEnv *env, jobject object, jlong objectId, jfloat value) {
169          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
170          if (character == NULL) {
171              jclass newExc = env->FindClass("java/lang/NullPointerException");
172              env->ThrowNew(newExc, "The native object does not exist.");
173              return;
174          }
175          character->setJumpSpeed(value);
176      }
177  
178      /*
179       * Class:     com_jme3_bullet_objects_PhysicsCharacter
180       * Method:    setGravity
181       * Signature: (JF)V
182       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setGravity(JNIEnv * env,jobject object,jlong objectId,jfloat value)183      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setGravity
184      (JNIEnv *env, jobject object, jlong objectId, jfloat value) {
185          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
186          if (character == NULL) {
187              jclass newExc = env->FindClass("java/lang/NullPointerException");
188              env->ThrowNew(newExc, "The native object does not exist.");
189              return;
190          }
191          character->setGravity(value);
192      }
193  
194      /*
195       * Class:     com_jme3_bullet_objects_PhysicsCharacter
196       * Method:    getGravity
197       * Signature: (J)F
198       */
Java_com_jme3_bullet_objects_PhysicsCharacter_getGravity(JNIEnv * env,jobject object,jlong objectId)199      JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getGravity
200      (JNIEnv *env, jobject object, jlong objectId) {
201          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
202          if (character == NULL) {
203              jclass newExc = env->FindClass("java/lang/NullPointerException");
204              env->ThrowNew(newExc, "The native object does not exist.");
205              return 0;
206          }
207          return character->getGravity();
208      }
209  
210      /*
211       * Class:     com_jme3_bullet_objects_PhysicsCharacter
212       * Method:    setMaxSlope
213       * Signature: (JF)V
214       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setMaxSlope(JNIEnv * env,jobject object,jlong objectId,jfloat value)215      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setMaxSlope
216      (JNIEnv *env, jobject object, jlong objectId, jfloat value) {
217          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
218          if (character == NULL) {
219              jclass newExc = env->FindClass("java/lang/NullPointerException");
220              env->ThrowNew(newExc, "The native object does not exist.");
221              return;
222          }
223          character->setMaxSlope(value);
224      }
225  
226      /*
227       * Class:     com_jme3_bullet_objects_PhysicsCharacter
228       * Method:    getMaxSlope
229       * Signature: (J)F
230       */
Java_com_jme3_bullet_objects_PhysicsCharacter_getMaxSlope(JNIEnv * env,jobject object,jlong objectId)231      JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getMaxSlope
232      (JNIEnv *env, jobject object, jlong objectId) {
233          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
234          if (character == NULL) {
235              jclass newExc = env->FindClass("java/lang/NullPointerException");
236              env->ThrowNew(newExc, "The native object does not exist.");
237              return 0;
238          }
239          return character->getMaxSlope();
240      }
241  
242      /*
243       * Class:     com_jme3_bullet_objects_PhysicsCharacter
244       * Method:    onGround
245       * Signature: (J)Z
246       */
Java_com_jme3_bullet_objects_PhysicsCharacter_onGround(JNIEnv * env,jobject object,jlong objectId)247      JNIEXPORT jboolean JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_onGround
248      (JNIEnv *env, jobject object, jlong objectId) {
249          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
250          if (character == NULL) {
251              jclass newExc = env->FindClass("java/lang/NullPointerException");
252              env->ThrowNew(newExc, "The native object does not exist.");
253              return false;
254          }
255          return character->onGround();
256      }
257  
258      /*
259       * Class:     com_jme3_bullet_objects_PhysicsCharacter
260       * Method:    jump
261       * Signature: (J)V
262       */
Java_com_jme3_bullet_objects_PhysicsCharacter_jump(JNIEnv * env,jobject object,jlong objectId)263      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_jump
264      (JNIEnv *env, jobject object, jlong objectId) {
265          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
266          if (character == NULL) {
267              jclass newExc = env->FindClass("java/lang/NullPointerException");
268              env->ThrowNew(newExc, "The native object does not exist.");
269              return;
270          }
271          character->jump();
272      }
273  
274      /*
275       * Class:     com_jme3_bullet_objects_PhysicsCharacter
276       * Method:    getPhysicsLocation
277       * Signature: (JLcom/jme3/math/Vector3f;)V
278       */
Java_com_jme3_bullet_objects_PhysicsCharacter_getPhysicsLocation(JNIEnv * env,jobject object,jlong objectId,jobject value)279      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getPhysicsLocation
280      (JNIEnv *env, jobject object, jlong objectId, jobject value) {
281          btGhostObject* ghost = reinterpret_cast<btGhostObject*>(objectId);
282          if (ghost == NULL) {
283              jclass newExc = env->FindClass("java/lang/NullPointerException");
284              env->ThrowNew(newExc, "The native object does not exist.");
285              return;
286          }
287          jmeBulletUtil::convert(env, &ghost->getWorldTransform().getOrigin(), value);
288      }
289  
290      /*
291       * Class:     com_jme3_bullet_objects_PhysicsCharacter
292       * Method:    setCcdSweptSphereRadius
293       * Signature: (JF)V
294       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdSweptSphereRadius(JNIEnv * env,jobject object,jlong objectId,jfloat value)295      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdSweptSphereRadius
296      (JNIEnv *env, jobject object, jlong objectId, jfloat value) {
297          btGhostObject* ghost = reinterpret_cast<btGhostObject*>(objectId);
298          if (ghost == NULL) {
299              jclass newExc = env->FindClass("java/lang/NullPointerException");
300              env->ThrowNew(newExc, "The native object does not exist.");
301              return;
302          }
303          ghost->setCcdSweptSphereRadius(value);
304      }
305  
306      /*
307       * Class:     com_jme3_bullet_objects_PhysicsCharacter
308       * Method:    setCcdMotionThreshold
309       * Signature: (JF)V
310       */
Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdMotionThreshold(JNIEnv * env,jobject object,jlong objectId,jfloat value)311      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_setCcdMotionThreshold
312      (JNIEnv *env, jobject object, jlong objectId, jfloat value) {
313          btGhostObject* ghost = reinterpret_cast<btGhostObject*>(objectId);
314          if (ghost == NULL) {
315              jclass newExc = env->FindClass("java/lang/NullPointerException");
316              env->ThrowNew(newExc, "The native object does not exist.");
317              return;
318          }
319          ghost->setCcdMotionThreshold(value);
320      }
321  
322      /*
323       * Class:     com_jme3_bullet_objects_PhysicsCharacter
324       * Method:    getCcdSweptSphereRadius
325       * Signature: (J)F
326       */
Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSweptSphereRadius(JNIEnv * env,jobject object,jlong objectId)327      JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSweptSphereRadius
328      (JNIEnv *env, jobject object, jlong objectId) {
329          btGhostObject* ghost = reinterpret_cast<btGhostObject*>(objectId);
330          if (ghost == NULL) {
331              jclass newExc = env->FindClass("java/lang/NullPointerException");
332              env->ThrowNew(newExc, "The native object does not exist.");
333              return 0;
334          }
335          return ghost->getCcdSweptSphereRadius();
336      }
337  
338      /*
339       * Class:     com_jme3_bullet_objects_PhysicsCharacter
340       * Method:    getCcdMotionThreshold
341       * Signature: (J)F
342       */
Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdMotionThreshold(JNIEnv * env,jobject object,jlong objectId)343      JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdMotionThreshold
344      (JNIEnv *env, jobject object, jlong objectId) {
345          btGhostObject* ghost = reinterpret_cast<btGhostObject*>(objectId);
346          if (ghost == NULL) {
347              jclass newExc = env->FindClass("java/lang/NullPointerException");
348              env->ThrowNew(newExc, "The native object does not exist.");
349              return 0;
350          }
351          return ghost->getCcdMotionThreshold();
352      }
353  
354      /*
355       * Class:     com_jme3_bullet_objects_PhysicsCharacter
356       * Method:    getCcdSquareMotionThreshold
357       * Signature: (J)F
358       */
Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSquareMotionThreshold(JNIEnv * env,jobject object,jlong objectId)359      JNIEXPORT jfloat JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_getCcdSquareMotionThreshold
360      (JNIEnv *env, jobject object, jlong objectId) {
361          btGhostObject* ghost = reinterpret_cast<btGhostObject*>(objectId);
362          if (ghost == NULL) {
363              jclass newExc = env->FindClass("java/lang/NullPointerException");
364              env->ThrowNew(newExc, "The native object does not exist.");
365              return 0;
366          }
367          return ghost->getCcdSquareMotionThreshold();
368      }
369  
370      /*
371       * Class:     com_jme3_bullet_objects_PhysicsCharacter
372       * Method:    finalizeNativeCharacter
373       * Signature: (J)V
374       */
Java_com_jme3_bullet_objects_PhysicsCharacter_finalizeNativeCharacter(JNIEnv * env,jobject object,jlong objectId)375      JNIEXPORT void JNICALL Java_com_jme3_bullet_objects_PhysicsCharacter_finalizeNativeCharacter
376      (JNIEnv *env, jobject object, jlong objectId) {
377          btKinematicCharacterController* character = reinterpret_cast<btKinematicCharacterController*>(objectId);
378          if (character == NULL) {
379              jclass newExc = env->FindClass("java/lang/NullPointerException");
380              env->ThrowNew(newExc, "The native object does not exist.");
381              return;
382          }
383          delete(character);
384      }
385  
386  #ifdef __cplusplus
387  }
388  #endif
389