Moderators: Sascha Willems, walaber
dgInt32 dgWorld::CalculatePolySoupToHullContactsDescrete (dgCollisionParamProxy& proxy) const
{
dgInt32 count = 0;
dgAssert (proxy.m_floatingCollision->IsType (dgCollision::dgCollisionMesh_RTTI));
dgAssert (proxy.m_referenceCollision->IsType (dgCollision::dgCollisionConvexShape_RTTI));
dgCollisionInstance* const polySoupInstance = proxy.m_floatingCollision;
dgPolygonMeshDesc& data = *proxy.m_polyMeshData;
dgAssert (data.m_faceCount);
dgCollisionConvexPolygon polygon (m_allocator);
dgCollisionInstance polyInstance (*polySoupInstance, &polygon);
polyInstance.SetScale(dgVector (dgFloat32 (1.0f)));
proxy.m_floatingCollision = &polyInstance;
polygon.m_vertex = data.m_vertex;
polygon.m_stride = dgInt32 (data.m_vertexStrideInBytes / sizeof (dgFloat32));
dgInt32 maxContacts = proxy.m_maxContacts;
dgInt32 maxReduceLimit = maxContacts >> 2;
dgInt32 countleft = maxContacts;
dgAssert (proxy.m_contactJoint);
dgVector separatingVector (proxy.m_matrix.m_posit & dgVector::m_triplexMask);
dgFloat32 mag2 = separatingVector.DotProduct4 (separatingVector).m_x;
if (mag2 > dgFloat32 (0.0f)) {
separatingVector = separatingVector.Scale3 (dgRsqrt (mag2));
} else {
separatingVector = dgVector(dgFloat32 (1.0f), dgFloat32 (0.0f), dgFloat32 (0.0f), dgFloat32 (0.0f));
}
const dgVector& scale = polySoupInstance->GetScale();
const dgVector& invScale = polySoupInstance->GetInvScale();
const dgInt32 stride = polygon.m_stride;
const dgFloat32* const vertex = polygon.m_vertex;
dgAssert (polyInstance.m_scaleType == dgCollisionInstance::m_unit);
dgFloat32 closestDist = dgFloat32 (1.0e10f);
dgContactPoint* const contactOut = proxy.m_contacts;
dgContact* const contactJoint = proxy.m_contactJoint;
dgInt32* const indexArray = (dgInt32*)data.m_faceVertexIndex;
data.SortFaceArray();
for (dgInt32 i = data.m_faceCount - 1; (i >= 0) && (count < 32); i --) {
dgInt32 address = data.m_faceIndexStart[i];
const dgInt32* const localIndexArray = &indexArray[address];
polygon.m_vertexIndex = localIndexArray;
[color=#FF0040]// set a break point here and see why the face is bad, since you are doing terrain collision
// face count should be three.
[/color] polygon.m_count = data.m_faceIndexCount[i];
polygon.m_adjacentFaceEdgeNormalIndex = data.GetAdjacentFaceEdgeNormalArray (localIndexArray, polygon.m_count);
polygon.m_faceId = data.GetFaceId (localIndexArray, polygon.m_count);
polygon.m_faceClipSize = data.GetFaceSize (localIndexArray, polygon.m_count);
polygon.m_faceNormalIndex = data.GetNormalIndex (localIndexArray, polygon.m_count);
polygon.m_normal = dgVector (&vertex[polygon.m_faceNormalIndex * stride]);
dgAssert (dgAbsf(polygon.m_normal % polygon.m_normal - dgFloat32 (1.0f)) < dgFloat32 (1.0e-4f));
dgAssert (polygon.m_normal.m_w == dgFloat32 (0.0f));
contactJoint->m_separtingVector = separatingVector;
proxy.m_maxContacts = countleft;
proxy.m_contacts = &contactOut[count];
dgInt32 count1 = polygon.CalculateContactToConvexHullDescrete (proxy, scale, invScale);
closestDist = dgMin(closestDist, contactJoint->m_closestDistance);
dgCollisionMesh* const polysoup = (dgCollisionMesh *) data.m_polySoupCollision->GetChildShape();
polysoup->GetCollidingFaces (&data);
Is you collison happening between a big convex shape and a high rest terrain?
269
0
1
322
0
6
354
0
6
340
0
6
289
1
6
226
6
6
177
6
6
139
6
6
6
6
103
6
6
6
6
52
26
4
0
2
1
1
0
0
0
0
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
6
3
10
27
164
134
113
94
83
69
61
88
119
161
173
181
177
179
186
191
192
202
214
221
224
224
221
219
217
(crash)
dgIntersectStatus dgCollisionBVH::GetPolygon (void* const context, const dgFloat32* const polygon, dgInt32 strideInBytes, const dgInt32* const indexArray, dgInt32 indexCount, dgFloat32 hitDistance)
{
dgPolygonMeshDesc& data = (*(dgPolygonMeshDesc*) context);
if (data.m_faceCount >= DG_MAX_COLLIDING_FACES) {
dgTrace (("buffer Over float, try using a lower resolution mesh for collision\n"));
return t_StopSearh;
}
if ((data.m_globalIndexCount + indexCount * 2 + 3) >= DG_MAX_COLLIDING_INDICES) {
dgTrace (("buffer Over float, try using a lower resolution mesh for collision\n"));
return t_StopSearh;
}
for (dgInt32 z = z0; (z < z1) && (faceCount < DG_MAX_COLLIDING_FACES); z ++) {
dgInt32 zStep = z * m_width;
for (dgInt32 x = x0; (x < x1) && (faceCount < DG_MAX_COLLIDING_FACES); x ++) {
const dgInt32* const indirectIndex = &m_cellIndices[dgInt32 (m_diagonals[zStep + x])][0];
Users browsing this forum: No registered users and 0 guests