Moderators: Sascha Willems, Thomas
inline dgFloat32 dgCollisionInstance::RayCast (const dgVector& localP0, const dgVector& localP1, dgContactPoint& contactOut, OnRayPrecastAction preFilter, const dgBody* const body, void* const userData) const
{
_ASSERTE (m_isUnitScale);
if (!preFilter || preFilter(body, this, userData)) {
if (m_isUnitScale) {
dgFloat32 t = m_childShape->RayCast (localP0, localP1, contactOut, body, userData);
if (t <= 1.0f) {
if (!m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI)) {
contactOut.m_userId = GetUserDataID();
}
}
return t;
} else {
_ASSERTE (0);
}
}
return dgFloat32 (1.2f);
}
Crashy wrote:in this function
- Code: Select all
inline dgFloat32 dgCollisionInstance::RayCast (const dgVector& localP0, const dgVector& localP1, dgContactPoint& contactOut, OnRayPrecastAction preFilter, const dgBody* const body, void* const userData) const
{
_ASSERTE (m_isUnitScale);
if (!preFilter || preFilter(body, this, userData)) {
if (m_isUnitScale) {
dgFloat32 t = m_childShape->RayCast (localP0, localP1, contactOut, body, userData);
if (t <= 1.0f) {
if (!m_childShape->IsType(dgCollision::dgCollisionMesh_RTTI)) {
contactOut.m_userId = GetUserDataID();
}
}
return t;
} else {
_ASSERTE (0);
}
}
return dgFloat32 (1.2f);
}
Crashy wrote:I use the vehicle joint yes, but I use it to handle a landing gear of an aircraft. About that I'd have a special request, will it be possible to disable/enable a tire on the fly?
void NewtonStaticCollisionSetDebugCallback(const NewtonCollision* const staticCollision, NewtonTreeCollisionCallback userCallback)
{
TRACE_FUNCTION(__FUNCTION__);
dgCollisionInstance* const collision = (dgCollisionInstance*) staticCollision;
if (collision->IsType (dgCollision::dgCollisionMesh_RTTI)) {
dgCollisionMesh* const mesh = (dgCollisionMesh*) collision->GetChildShape();
mesh->SetCollisionCallback ((dgCollisionMeshCollisionCallback) userCallback);
} else if (collision->IsType (dgCollision::dgCollisionScene_RTTI)) {
dgCollisionScene* const scene = (dgCollisionScene*) collision->GetChildShape();
scene->SetCollisionCallback ((dgCollisionMeshCollisionCallback) userCallback);
}
}
void ShowMeshCollidingFaces (const NewtonBody* staticCollisionBody, const NewtonBody* body, int faceID, int vertexCount, const dFloat* vertex, int vertexstrideInBytes)
{
#ifdef USE_STATIC_MESHES_DEBUG_COLLISION
if (debugMode) {
if ((debugDisplayCount + vertexCount * 2) < sizeof (debugDisplayCallback) / sizeof(debugDisplayCallback[0])) {
// we are coping data to and array of memory, another call back may be doing the same thing
// here fore we need to avoid race conditions
NewtonWorldCriticalSectionLock (NewtonBodyGetWorld (staticCollisionBody), 0);
int stride = vertexstrideInBytes / sizeof (dFloat);
dVector l0 (vertex[(vertexCount-1) * stride + 0], vertex[(vertexCount-1) * stride + 1], vertex[(vertexCount-1) * stride + 2], 0.0f);
for (int j = 0; j < vertexCount; j ++) {
dVector l1 (vertex[j * stride + 0], vertex[j * stride + 1] , vertex[j * stride + 2], 0.0f);
debugDisplayCallback[debugDisplayCount + 0] = l0;
debugDisplayCallback[debugDisplayCount + 1] = l1;
debugDisplayCount += 2;
l0 = l1;
}
// unlock the critical section
NewtonWorldCriticalSectionUnlock (NewtonBodyGetWorld (staticCollisionBody));
}
}
#endif
}
if (GetDebugCollisionCallback())
{
dgTriplex triplex[3];
const dgMatrix& matrix = data->m_polySoupBody->GetCollisionMatrix();
for (dgInt32 i = 0; i < faceCount; i ++) {
for (dgInt32 j = 0; j < 3; j ++) {
dgVector p (matrix.TransformVector(vertex[indices[i * 3 + j]]));
triplex[j].m_x = p.m_x;
triplex[j].m_y = p.m_y;
triplex[j].m_z = p.m_z;
}
GetDebugCollisionCallback() (data->m_polySoupBody, data->m_objBody, attributes[i], 3, &triplex[0].m_x, sizeof (dgTriplex));
}
}
Users browsing this forum: No registered users and 5 guests