From 06d40afeacbaacb13de1e0b2e924481d9282b00f Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 14 Jul 2016 13:30:57 -0700 Subject: [PATCH] don't forget to use the transform of child shapes --- .../physics/src/CollisionRenderMeshCache.cpp | 102 +++++++++--------- 1 file changed, 53 insertions(+), 49 deletions(-) diff --git a/libraries/physics/src/CollisionRenderMeshCache.cpp b/libraries/physics/src/CollisionRenderMeshCache.cpp index c7ce892e52..6cf2f91ce2 100644 --- a/libraries/physics/src/CollisionRenderMeshCache.cpp +++ b/libraries/physics/src/CollisionRenderMeshCache.cpp @@ -20,67 +20,71 @@ float verts[3 * MAX_HULL_POINTS]; -void copyHullToMesh(const btShapeHull& hull, model::MeshPointer mesh) { - if ((bool)mesh) { - const uint32_t* hullIndices = hull.getIndexPointer(); - int32_t numIndices = hull.numIndices(); - assert(numIndices <= 6 * MAX_HULL_POINTS); +void copyShapeToMesh(const btTransform& transform, const btConvexShape* shape, model::MeshPointer mesh) { + assert((bool)mesh); + assert(shape); - { // new part - model::Mesh::Part part; - part._startIndex = mesh->getIndexBuffer().getNumElements(); - part._numIndices = (model::Index)numIndices; - part._baseVertex = mesh->getVertexBuffer().getNumElements(); + btShapeHull hull(shape); + const btScalar MARGIN = 0.0f; + hull.buildHull(MARGIN); - gpu::BufferView::Size numBytes = sizeof(model::Mesh::Part); - const gpu::Byte* data = reinterpret_cast(&part); - mesh->getPartBuffer()._buffer->append(numBytes, data); + const uint32_t* hullIndices = hull.getIndexPointer(); + int32_t numIndices = hull.numIndices(); + assert(numIndices <= 6 * MAX_HULL_POINTS); + + { // new part + model::Mesh::Part part; + part._startIndex = mesh->getIndexBuffer().getNumElements(); + part._numIndices = (model::Index)numIndices; + part._baseVertex = mesh->getVertexBuffer().getNumElements(); + + gpu::BufferView::Size numBytes = sizeof(model::Mesh::Part); + const gpu::Byte* data = reinterpret_cast(&part); + mesh->getPartBuffer()._buffer->append(numBytes, data); + } + + { // new vertices + const btVector3* hullVertices = hull.getVertexPointer(); + int32_t numVertices = hull.numVertices(); + assert(numVertices <= MAX_HULL_POINTS); + for (int32_t i = 0; i < numVertices; ++i) { + btVector3 transformedPoint = transform * hullVertices[i]; + memcpy(transformedPoint.m_floats, verts + 3 * i, 3 * sizeof(float)); + //data[0] = transformedPoint.getX(); + //data[1] = transformedPoint.getY(); + //data[2] = transformedPoint.getZ(); } - { // new vertices - const btVector3* hullVertices = hull.getVertexPointer(); - int32_t numVertices = hull.numVertices(); - assert(numVertices <= MAX_HULL_POINTS); - for (int32_t i = 0; i < numVertices; ++i) { - float* data = verts + 3 * i; - data[0] = hullVertices[i].getX(); - data[1] = hullVertices[i].getY(); - data[2] = hullVertices[i].getZ(); - } + gpu::BufferView::Size numBytes = sizeof(float) * (3 * numVertices); + const gpu::Byte* data = reinterpret_cast(verts); + mesh->getVertexBuffer()._buffer->append(numBytes, data); + } - gpu::BufferView::Size numBytes = sizeof(float) * (3 * numVertices); - const gpu::Byte* data = reinterpret_cast(verts); - mesh->getVertexBuffer()._buffer->append(numBytes, data); - } - - { // new indices - gpu::BufferView::Size numBytes = (gpu::BufferView::Size)(sizeof(uint32_t) * hull.numIndices()); - const gpu::Byte* data = reinterpret_cast(hullIndices); - mesh->getIndexBuffer()._buffer->append(numBytes, data); - } + { // new indices + gpu::BufferView::Size numBytes = (gpu::BufferView::Size)(sizeof(uint32_t) * hull.numIndices()); + const gpu::Byte* data = reinterpret_cast(hullIndices); + mesh->getIndexBuffer()._buffer->append(numBytes, data); } } model::MeshPointer createMeshFromShape(const btCollisionShape* shape) { - if (!shape) { - return std::make_shared(); - } model::MeshPointer mesh = std::make_shared(); - int32_t shapeType = shape->getShapeType(); - if (shapeType == (int32_t)COMPOUND_SHAPE_PROXYTYPE) { - const btScalar MARGIN = 0.0f; - const btCompoundShape* compoundShape = static_cast(shape); - int32_t numSubShapes = compoundShape->getNumChildShapes(); - for (int i = 0; i < numSubShapes; ++i) { - const btCollisionShape* childShape = compoundShape->getChildShape(i); - if (childShape->isConvex()) { - const btConvexShape* convexShape = static_cast(childShape); - btShapeHull shapeHull(convexShape); - shapeHull.buildHull(MARGIN); - copyHullToMesh(shapeHull, mesh); + if (shape) { + int32_t shapeType = shape->getShapeType(); + if (shapeType == (int32_t)COMPOUND_SHAPE_PROXYTYPE) { + const btCompoundShape* compoundShape = static_cast(shape); + int32_t numSubShapes = compoundShape->getNumChildShapes(); + for (int i = 0; i < numSubShapes; ++i) { + const btCollisionShape* childShape = compoundShape->getChildShape(i); + if (childShape->isConvex()) { + const btConvexShape* convexShape = static_cast(childShape); + copyShapeToMesh(compoundShape->getChildTransform(i), convexShape, mesh); + } } + } else if (shape->isConvex()) { + const btConvexShape* convexShape = static_cast(shape); + copyShapeToMesh(btTransform(), convexShape, mesh); } - } else if (shape->isConvex()) { } return mesh; }