/* * Java port of Bullet (c) 2008 Martin Dvorak <jezek2@advel.cz> * * Bullet Continuous Collision Detection and Physics Library * Copyright (c) 2003-2008 Erwin Coumans http://www.bulletphysics.com/ * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ package com.bulletphysics.collision.narrowphase; import com.bulletphysics.collision.narrowphase.ConvexCast.CastResult; import com.bulletphysics.collision.shapes.ConvexShape; import com.bulletphysics.collision.shapes.TriangleCallback; import com.bulletphysics.collision.shapes.TriangleShape; import com.bulletphysics.linearmath.Transform; import javax.vecmath.Vector3f; /** * * @author jezek2 */ public abstract class TriangleConvexcastCallback extends TriangleCallback { public ConvexShape convexShape; public final Transform convexShapeFrom = new Transform(); public final Transform convexShapeTo = new Transform(); public final Transform triangleToWorld = new Transform(); public float hitFraction; public float triangleCollisionMargin; public TriangleConvexcastCallback(ConvexShape convexShape, Transform convexShapeFrom, Transform convexShapeTo, Transform triangleToWorld, float triangleCollisionMargin) { this.convexShape = convexShape; this.convexShapeFrom.set(convexShapeFrom); this.convexShapeTo.set(convexShapeTo); this.triangleToWorld.set(triangleToWorld); this.hitFraction = 1f; this.triangleCollisionMargin = triangleCollisionMargin; } public void processTriangle(Vector3f[] triangle, int partId, int triangleIndex) { TriangleShape triangleShape = new TriangleShape(triangle[0], triangle[1], triangle[2]); triangleShape.setMargin(triangleCollisionMargin); VoronoiSimplexSolver simplexSolver = new VoronoiSimplexSolver(); GjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver = new GjkEpaPenetrationDepthSolver(); //#define USE_SUBSIMPLEX_CONVEX_CAST 1 //if you reenable USE_SUBSIMPLEX_CONVEX_CAST see commented out code below //#ifdef USE_SUBSIMPLEX_CONVEX_CAST // TODO: implement ContinuousConvexCollision SubsimplexConvexCast convexCaster = new SubsimplexConvexCast(convexShape, triangleShape, simplexSolver); //#else // //btGjkConvexCast convexCaster(m_convexShape,&triangleShape,&simplexSolver); //btContinuousConvexCollision convexCaster(m_convexShape,&triangleShape,&simplexSolver,&gjkEpaPenetrationSolver); //#endif //#USE_SUBSIMPLEX_CONVEX_CAST CastResult castResult = new CastResult(); castResult.fraction = 1f; if (convexCaster.calcTimeOfImpact(convexShapeFrom, convexShapeTo, triangleToWorld, triangleToWorld, castResult)) { // add hit if (castResult.normal.lengthSquared() > 0.0001f) { if (castResult.fraction < hitFraction) { /* btContinuousConvexCast's normal is already in world space */ /* //#ifdef USE_SUBSIMPLEX_CONVEX_CAST // rotate normal into worldspace convexShapeFrom.basis.transform(castResult.normal); //#endif //USE_SUBSIMPLEX_CONVEX_CAST */ castResult.normal.normalize(); reportHit(castResult.normal, castResult.hitPoint, castResult.fraction, partId, triangleIndex); } } } } public abstract float reportHit(Vector3f hitNormalLocal, Vector3f hitPointLocal, float hitFraction, int partId, int triangleIndex); }