|
|
@@ -459,9 +459,6 @@ void CollisionShape::DrawDebugGeometry(DebugRenderer* debug, bool depthTest)
|
|
|
{
|
|
|
if (debug && physicsWorld_ && shape_ && node_ && IsEnabledEffective())
|
|
|
{
|
|
|
- physicsWorld_->SetDebugRenderer(debug);
|
|
|
- physicsWorld_->SetDebugDepthTest(depthTest);
|
|
|
-
|
|
|
// Use the rigid body's world transform if possible, as it may be different from the rendering transform
|
|
|
Matrix3x4 worldTransform;
|
|
|
RigidBody* body = GetComponent<RigidBody>();
|
|
|
@@ -474,22 +471,49 @@ void CollisionShape::DrawDebugGeometry(DebugRenderer* debug, bool depthTest)
|
|
|
else
|
|
|
worldTransform = node_->GetWorldTransform();
|
|
|
|
|
|
- Vector3 position = position_;
|
|
|
- // For terrains, undo the height centering performed automatically by Bullet
|
|
|
- if (shapeType_ == SHAPE_TERRAIN && geometry_)
|
|
|
+ // Special case code for convex hull: bypass Bullet's own rendering to draw triangles correctly, not just edges
|
|
|
+ if (shapeType_ == SHAPE_CONVEXHULL)
|
|
|
{
|
|
|
- HeightfieldData* heightfield = static_cast<HeightfieldData*>(geometry_.Get());
|
|
|
- position.y_ += (heightfield->minHeight_ + heightfield->maxHeight_) * 0.5f;
|
|
|
+ ConvexData *convexData = static_cast<ConvexData*>(GetGeometryData());
|
|
|
+ RigidBody* body = GetComponent<RigidBody>();
|
|
|
+ Color color = bodyActive ? Color::WHITE : Color::GREEN;
|
|
|
+ Matrix3x4 shapeTransform(worldTransform * position_, worldTransform.Rotation() * rotation_, worldTransform.Scale());
|
|
|
+
|
|
|
+ if (convexData)
|
|
|
+ {
|
|
|
+ for (unsigned i = 0; i < convexData->indexCount_; i += 3)
|
|
|
+ {
|
|
|
+ Vector3 a = shapeTransform * convexData->vertexData_[convexData->indexData_[i + 0]];
|
|
|
+ Vector3 b = shapeTransform * convexData->vertexData_[convexData->indexData_[i + 1]];
|
|
|
+ Vector3 c = shapeTransform * convexData->vertexData_[convexData->indexData_[i + 2]];
|
|
|
+ debug->AddLine(a, b, color, depthTest);
|
|
|
+ debug->AddLine(b, c, color, depthTest);
|
|
|
+ debug->AddLine(a, c, color, depthTest);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ physicsWorld_->SetDebugRenderer(debug);
|
|
|
+ physicsWorld_->SetDebugDepthTest(depthTest);
|
|
|
|
|
|
- Vector3 worldPosition(worldTransform * position);
|
|
|
- Quaternion worldRotation(worldTransform.Rotation() * rotation_);
|
|
|
+ Vector3 position = position_;
|
|
|
+ // For terrains, undo the height centering performed automatically by Bullet
|
|
|
+ if (shapeType_ == SHAPE_TERRAIN && geometry_)
|
|
|
+ {
|
|
|
+ HeightfieldData* heightfield = static_cast<HeightfieldData*>(geometry_.Get());
|
|
|
+ position.y_ += (heightfield->minHeight_ + heightfield->maxHeight_) * 0.5f;
|
|
|
+ }
|
|
|
|
|
|
- btDiscreteDynamicsWorld* world = physicsWorld_->GetWorld();
|
|
|
- world->debugDrawObject(btTransform(ToBtQuaternion(worldRotation), ToBtVector3(worldPosition)), shape_.Get(), bodyActive ?
|
|
|
- WHITE : GREEN);
|
|
|
+ Vector3 worldPosition(worldTransform * position);
|
|
|
+ Quaternion worldRotation(worldTransform.Rotation() * rotation_);
|
|
|
|
|
|
- physicsWorld_->SetDebugRenderer(0);
|
|
|
+ btDiscreteDynamicsWorld* world = physicsWorld_->GetWorld();
|
|
|
+ world->debugDrawObject(btTransform(ToBtQuaternion(worldRotation), ToBtVector3(worldPosition)), shape_.Get(), bodyActive ?
|
|
|
+ WHITE : GREEN);
|
|
|
+
|
|
|
+ physicsWorld_->SetDebugRenderer(0);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|