• 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, CJ Hare
35  */
36 #include "com_jme3_bullet_util_DebugShapeFactory.h"
37 #include "jmeBulletUtil.h"
38 #include "BulletCollision/CollisionShapes/btShapeHull.h"
39 
40 class DebugCallback : public btTriangleCallback, public btInternalTriangleIndexCallback {
41 public:
42     JNIEnv* env;
43     jobject callback;
44 
DebugCallback(JNIEnv * env,jobject object)45     DebugCallback(JNIEnv* env, jobject object) {
46         this->env = env;
47         this->callback = object;
48     }
49 
internalProcessTriangleIndex(btVector3 * triangle,int partId,int triangleIndex)50     virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) {
51         processTriangle(triangle, partId, triangleIndex);
52     }
53 
processTriangle(btVector3 * triangle,int partId,int triangleIndex)54     virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex) {
55         btVector3 vertexA, vertexB, vertexC;
56         vertexA = triangle[0];
57         vertexB = triangle[1];
58         vertexC = triangle[2];
59         env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexA.getX(), vertexA.getY(), vertexA.getZ(), partId, triangleIndex);
60         if (env->ExceptionCheck()) {
61             env->Throw(env->ExceptionOccurred());
62             return;
63         }
64 //        triangle =
65         env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexB.getX(), vertexB.getY(), vertexB.getZ(), partId, triangleIndex);
66         if (env->ExceptionCheck()) {
67             env->Throw(env->ExceptionOccurred());
68             return;
69         }
70         env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexC.getX(), vertexC.getY(), vertexC.getZ(), partId, triangleIndex);
71         if (env->ExceptionCheck()) {
72             env->Throw(env->ExceptionOccurred());
73             return;
74         }
75     }
76 };
77 
78 #ifdef __cplusplus
79 extern "C" {
80 #endif
81 
82     /* Inaccessible static: _00024assertionsDisabled */
83 
84     /*
85      * Class:     com_jme3_bullet_util_DebugShapeFactory
86      * Method:    getVertices
87      * Signature: (JLcom/jme3/bullet/util/DebugMeshCallback;)V
88      */
Java_com_jme3_bullet_util_DebugShapeFactory_getVertices(JNIEnv * env,jclass clazz,jlong shapeId,jobject callback)89     JNIEXPORT void JNICALL Java_com_jme3_bullet_util_DebugShapeFactory_getVertices
90     (JNIEnv *env, jclass clazz, jlong shapeId, jobject callback) {
91         btCollisionShape* shape = reinterpret_cast<btCollisionShape*>(shapeId);
92         if (shape->isConcave()) {
93             btConcaveShape* concave = reinterpret_cast<btConcaveShape*>(shape);
94             DebugCallback* clb = new DebugCallback(env, callback);
95             btVector3 min = btVector3(-1e30, -1e30, -1e30);
96             btVector3 max = btVector3(1e30, 1e30, 1e30);
97             concave->processAllTriangles(clb, min, max);
98             delete(clb);
99         } else if (shape->isConvex()) {
100             btConvexShape* convexShape = reinterpret_cast<btConvexShape*>(shape);
101             // Check there is a hull shape to render
102             if (convexShape->getUserPointer() == NULL) {
103                 // create a hull approximation
104                 btShapeHull* hull = new btShapeHull(convexShape);
105                 float margin = convexShape->getMargin();
106                 hull->buildHull(margin);
107                 convexShape->setUserPointer(hull);
108             }
109 
110             btShapeHull* hull = (btShapeHull*) convexShape->getUserPointer();
111 
112             int numberOfTriangles = hull->numTriangles();
113             int numberOfFloats = 3 * 3 * numberOfTriangles;
114             int byteBufferSize = numberOfFloats * 4;
115 
116             // Loop variables
117             const unsigned int* hullIndices = hull->getIndexPointer();
118             const btVector3* hullVertices = hull->getVertexPointer();
119             btVector3 vertexA, vertexB, vertexC;
120             int index = 0;
121 
122             for (int i = 0; i < numberOfTriangles; i++) {
123                 // Grab the data for this triangle from the hull
124                 vertexA = hullVertices[hullIndices[index++]];
125                 vertexB = hullVertices[hullIndices[index++]];
126                 vertexC = hullVertices[hullIndices[index++]];
127 
128                 // Put the verticies into the vertex buffer
129                 env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexA.getX(), vertexA.getY(), vertexA.getZ());
130                 if (env->ExceptionCheck()) {
131                     env->Throw(env->ExceptionOccurred());
132                     return;
133                 }
134                 env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexB.getX(), vertexB.getY(), vertexB.getZ());
135                 if (env->ExceptionCheck()) {
136                     env->Throw(env->ExceptionOccurred());
137                     return;
138                 }
139                 env->CallVoidMethod(callback, jmeClasses::DebugMeshCallback_addVector, vertexC.getX(), vertexC.getY(), vertexC.getZ());
140                 if (env->ExceptionCheck()) {
141                     env->Throw(env->ExceptionOccurred());
142                     return;
143                 }
144             }
145             delete hull;
146             convexShape->setUserPointer(NULL);
147         }
148     }
149 
150 #ifdef __cplusplus
151 }
152 #endif
153