btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles,unsigned int* triangleIndexBase,int numVertices,btScalar* vertexBase) : m_hasAabb(0) { btIndexedMesh mesh; mesh.m_numTriangles = numTriangles; mesh.m_triangleIndexBase = triangleIndexBase; mesh.m_numVertices = numVertices; mesh.m_vertexBase = vertexBase; addIndexedMesh(mesh); }
void PhysicsShapeMesh::addMesh(const Vector3Array& vertices, const std::vector<std::uint32_t>& face) noexcept { _vertexBase = vertices; _indexBase = face; btIndexedMesh mesh; mesh.m_vertexType = PHY_FLOAT; mesh.m_numVertices = _vertexBase.size(); mesh.m_vertexStride = sizeof(Vector3); mesh.m_vertexBase = (unsigned char*)_vertexBase.data(); mesh.m_indexType = PHY_INTEGER; mesh.m_numTriangles = _indexBase.size() / 3; mesh.m_triangleIndexStride = sizeof(std::uint32_t) * 3; mesh.m_triangleIndexBase = (unsigned char*)_indexBase.data(); if (_indexBase.empty()) { auto array = new btTriangleMesh; for (std::size_t i = 0; i < mesh.m_numVertices; i += 3) { btVector3 v1; v1.setX(_vertexBase[i].x); v1.setY(_vertexBase[i].y); v1.setZ(_vertexBase[i].z); btVector3 v2; v2.setX(_vertexBase[i + 1].x); v2.setY(_vertexBase[i + 1].y); v2.setZ(_vertexBase[i + 1].z); btVector3 v3; v3.setX(_vertexBase[i + 2].x); v3.setY(_vertexBase[i + 2].y); v3.setZ(_vertexBase[i + 2].z); array->addTriangle(v1, v2, v3); } _array = array; } else { auto array = new btTriangleIndexVertexArray; array->addIndexedMesh(mesh); _array = array; } }
btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,btScalar* vertexBase,int vertexStride) : m_hasAabb(0) { btIndexedMesh mesh; mesh.m_numTriangles = numTriangles; mesh.m_triangleIndexBase = (const unsigned char *)triangleIndexBase; mesh.m_triangleIndexStride = triangleIndexStride; mesh.m_numVertices = numVertices; mesh.m_vertexBase = (const unsigned char *)vertexBase; mesh.m_vertexStride = vertexStride; addIndexedMesh(mesh); }
PhysicsInterface::BodyTemplateObject Bullet::createBodyTemplateFromGeometry(const Vector<Vec3>& vertices, const Vector<RawIndexedTriangle>& triangles, bool deleteOnceUnused, float customCollisionMargin) { if (vertices.empty() || triangles.empty()) return nullptr; auto bodyTemplate = new BodyTemplate(deleteOnceUnused); bodyTemplates_.append(bodyTemplate); // Copy the geometry data bodyTemplate->vertices = vertices; bodyTemplate->triangles = triangles; // Create interface to the geometry data for Bullet to use auto mesh = btIndexedMesh(); mesh.m_numTriangles = bodyTemplate->triangles.size(); mesh.m_triangleIndexBase = reinterpret_cast<byte_t*>(bodyTemplate->triangles.getData()); mesh.m_triangleIndexStride = 3 * sizeof(unsigned int); mesh.m_numVertices = bodyTemplate->vertices.size(); mesh.m_vertexBase = bodyTemplate->vertices.as<byte_t>(); mesh.m_vertexStride = 3 * sizeof(float); auto meshInterface = new btTriangleIndexVertexArray(); meshInterface->addIndexedMesh(mesh); // Calculate an AABB around the geometry auto aabb = AABB(bodyTemplate->vertices); // Create the collision shape bodyTemplate->collisionShape = new btBvhTriangleMeshShape(meshInterface, true, toBullet(aabb.getMinimum()), toBullet(aabb.getMaximum())); if (customCollisionMargin > 0.0f) bodyTemplate->collisionShape->setMargin(customCollisionMargin); return bodyTemplate; }