Normand Briere
2018-07-07 09ddd38fd4a8a7100c834a5e976f4796fae53541
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
 * 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);
   
}