Home | History | Annotate | Download | only in bullet-native
      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 
     45     DebugCallback(JNIEnv* env, jobject object) {
     46         this->env = env;
     47         this->callback = object;
     48     }
     49 
     50     virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) {
     51         processTriangle(triangle, partId, triangleIndex);
     52     }
     53 
     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      */
     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