aboutsummaryrefslogtreecommitdiff
path: root/engine/src/bullet-native/com_jme3_bullet_util_DebugShapeFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/bullet-native/com_jme3_bullet_util_DebugShapeFactory.cpp')
-rw-r--r--engine/src/bullet-native/com_jme3_bullet_util_DebugShapeFactory.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/engine/src/bullet-native/com_jme3_bullet_util_DebugShapeFactory.cpp b/engine/src/bullet-native/com_jme3_bullet_util_DebugShapeFactory.cpp
new file mode 100644
index 0000000..7d6c0b0
--- /dev/null
+++ b/engine/src/bullet-native/com_jme3_bullet_util_DebugShapeFactory.cpp
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2009-2010 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.
+ */
+
+/**
+ * Author: Normen Hansen, CJ Hare
+ */
+#include "com_jme3_bullet_util_DebugShapeFactory.h"
+#include "jmeBulletUtil.h"
+#include "BulletCollision/CollisionShapes/btShapeHull.h"
+
+class DebugCallback : public btTriangleCallback, public btInternalTriangleIndexCallback {
+public:
+ JNIEnv* env;
+ jobject callback;
+
+ DebugCallback(JNIEnv* env, jobject object) {
+ this->env = env;
+ this->callback = object;
+ }
+
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) {
+ processTriangle(triangle, partId, triangleIndex);
+ }
+
+ virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) {
+ btVector3 vertexA, vertexB, vertexC;
+ vertexA = triangle[0];
+ vertexB = triangle[1];
+ vertexC = triangle[2];
+ env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexA.getX(), vertexA.getY(), vertexA.getZ(), partId, triangleIndex);
+ if (env->ExceptionCheck()) {
+ env->Throw(env->ExceptionOccurred());
+ return;
+ }
+// triangle =
+ env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexB.getX(), vertexB.getY(), vertexB.getZ(), partId, triangleIndex);
+ if (env->ExceptionCheck()) {
+ env->Throw(env->ExceptionOccurred());
+ return;
+ }
+ env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexC.getX(), vertexC.getY(), vertexC.getZ(), partId, triangleIndex);
+ if (env->ExceptionCheck()) {
+ env->Throw(env->ExceptionOccurred());
+ return;
+ }
+ }
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Inaccessible static: _00024assertionsDisabled */
+
+ /*
+ * Class: com_jme3_bullet_util_DebugShapeFactory
+ * Method: getVertices
+ * Signature: (JLcom/jme3/bullet/util/DebugMeshCallback;)V
+ */
+ JNIEXPORT void JNICALL Java_com_jme3_bullet_util_DebugShapeFactory_getVertices
+ (JNIEnv *env, jclass clazz, jlong shapeId, jobject callback) {
+ btCollisionShape* shape = reinterpret_cast<btCollisionShape*>(shapeId);
+ if (shape->isConcave()) {
+ btConcaveShape* concave = reinterpret_cast<btConcaveShape*>(shape);
+ DebugCallback* clb = new DebugCallback(env, callback);
+ btVector3 min = btVector3(-1e30, -1e30, -1e30);
+ btVector3 max = btVector3(1e30, 1e30, 1e30);
+ concave->processAllTriangles(clb, min, max);
+ delete(clb);
+ } else if (shape->isConvex()) {
+ btConvexShape* convexShape = reinterpret_cast<btConvexShape*>(shape);
+ // Check there is a hull shape to render
+ if (convexShape->getUserPointer() == NULL) {
+ // create a hull approximation
+ btShapeHull* hull = new btShapeHull(convexShape);
+ float margin = convexShape->getMargin();
+ hull->buildHull(margin);
+ convexShape->setUserPointer(hull);
+ }
+
+ btShapeHull* hull = (btShapeHull*) convexShape->getUserPointer();
+
+ int numberOfTriangles = hull->numTriangles();
+ int numberOfFloats = 3 * 3 * numberOfTriangles;
+ int byteBufferSize = numberOfFloats * 4;
+
+ // Loop variables
+ const unsigned int* hullIndices = hull->getIndexPointer();
+ const btVector3* hullVertices = hull->getVertexPointer();
+ btVector3 vertexA, vertexB, vertexC;
+ int index = 0;
+
+ for (int i = 0; i < numberOfTriangles; i++) {
+ // Grab the data for this triangle from the hull
+ vertexA = hullVertices[hullIndices[index++]];
+ vertexB = hullVertices[hullIndices[index++]];
+ vertexC = hullVertices[hullIndices[index++]];
+
+ // Put the verticies into the vertex buffer
+ env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexA.getX(), vertexA.getY(), vertexA.getZ());
+ if (env->ExceptionCheck()) {
+ env->Throw(env->ExceptionOccurred());
+ return;
+ }
+ env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexB.getX(), vertexB.getY(), vertexB.getZ());
+ if (env->ExceptionCheck()) {
+ env->Throw(env->ExceptionOccurred());
+ return;
+ }
+ env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexC.getX(), vertexC.getY(), vertexC.getZ());
+ if (env->ExceptionCheck()) {
+ env->Throw(env->ExceptionOccurred());
+ return;
+ }
+ }
+ delete hull;
+ convexShape->setUserPointer(NULL);
+ }
+ }
+
+#ifdef __cplusplus
+}
+#endif