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
|
#include "ConvexTriangleCallback.h"
#include "NarrowPhaseCollision/PersistentManifold.h"
#include "NarrowPhaseCollision/ManifoldContactAddResult.h"
#include "NarrowPhaseCollision/GjkPairDetector.h"
#include "NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.h"
#include "TriangleShape.h"
//m_manifoldPtr = m_dispatcher->GetNewManifold(proxy0->m_clientObject,proxy1->m_clientObject);
//m_dispatcher->ReleaseManifold( m_manifoldPtr );
ConvexTriangleCallback::ConvexTriangleCallback(PersistentManifold* manifold,ConvexShape* convexShape,const SimdTransform&convexTransform,const SimdTransform& triangleMeshTransform)
:m_triangleMeshTransform(triangleMeshTransform),
m_convexTransform(convexTransform),
m_convexShape(convexShape),
m_manifoldPtr(manifold),
m_triangleCount(0)
{
}
ConvexTriangleCallback::~ConvexTriangleCallback()
{
}
void ConvexTriangleCallback::ClearCache()
{
m_manifoldPtr->ClearManifold();
};
void ConvexTriangleCallback::ProcessTriangle(SimdVector3* triangle)
{
//triangle, convex
TriangleShape tm(triangle[0],triangle[1],triangle[2]);
tm.SetMargin(m_collisionMarginTriangle);
GjkPairDetector::ClosestPointInput input;
input.m_transformA = m_triangleMeshTransform;
input.m_transformB = m_convexTransform;
ManifoldContactAddResult output(m_triangleMeshTransform,m_convexTransform,m_manifoldPtr);
VoronoiSimplexSolver simplexSolver;
MinkowskiPenetrationDepthSolver penetrationDepthSolver;
GjkPairDetector gjkDetector(&tm,m_convexShape,&simplexSolver,&penetrationDepthSolver);
gjkDetector.SetMinkowskiA(&tm);
gjkDetector.SetMinkowskiB(m_convexShape);
input.m_maximumDistanceSquared = tm.GetMargin()+ m_convexShape->GetMargin() + m_manifoldPtr->GetManifoldMargin();
input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
input.m_maximumDistanceSquared = 1e30f;//?
gjkDetector.GetClosestPoints(input,output);
}
void ConvexTriangleCallback::Update(float collisionMarginTriangle)
{
m_triangleCount = 0;
m_collisionMarginTriangle = collisionMarginTriangle;
SimdTransform boxInTriangleSpace;
boxInTriangleSpace = m_triangleMeshTransform.inverse() * m_convexTransform;
m_convexShape->GetAabb(boxInTriangleSpace,m_aabbMin,m_aabbMax);
float extraMargin = CONVEX_DISTANCE_MARGIN;
SimdVector3 extra(extraMargin,extraMargin,extraMargin);
m_aabbMax += extra;
m_aabbMin -= extra;
}
|