diff --git a/panda/src/bullet/bulletTriangleMesh.cxx b/panda/src/bullet/bulletTriangleMesh.cxx index 7dd5d00c69..8a74e61ff5 100644 --- a/panda/src/bullet/bulletTriangleMesh.cxx +++ b/panda/src/bullet/bulletTriangleMesh.cxx @@ -53,6 +53,10 @@ void BulletTriangleMesh:: preallocate(int num_verts, int num_indices) { _vertices.reserve(num_verts); _indices.reserve(num_indices); + + btIndexedMesh &mesh = _mesh.getIndexedMeshArray()[0]; + mesh.m_vertexBase = (unsigned char*)&_vertices[0]; + mesh.m_triangleIndexBase = (unsigned char *)&_indices[0]; } /** @@ -160,12 +164,22 @@ add_geom(const Geom *geom, bool remove_duplicate_vertices, const TransformState _indices.reserve(_indices.size() + num_vertices); mesh.m_numTriangles += num_vertices / 3; - GeomVertexReader index(prim->get_vertices(), 0); - while (!index.is_at_end()) { - _indices.push_back(index_offset + index.get_data1i()); + CPT(GeomVertexArrayData) vertices = prim->get_vertices(); + if (vertices != nullptr) { + GeomVertexReader index(move(vertices), 0); + while (!index.is_at_end()) { + _indices.push_back(index_offset + index.get_data1i()); + } + } else { + int index = index_offset + prim->get_first_vertex(); + int end_index = index + num_vertices; + while (index < end_index) { + _indices.push_back(index++); + } } } } + nassertv(mesh.m_numTriangles * 3 == _indices.size()); } else { // Collect points @@ -193,12 +207,22 @@ add_geom(const Geom *geom, bool remove_duplicate_vertices, const TransformState _indices.reserve(_indices.size() + num_vertices); mesh.m_numTriangles += num_vertices / 3; - GeomVertexReader index(prim->get_vertices(), 0); - while (!index.is_at_end()) { - _indices.push_back(find_or_add_vertex(points[index.get_data1i()])); + CPT(GeomVertexArrayData) vertices = prim->get_vertices(); + if (vertices != nullptr) { + GeomVertexReader index(move(vertices), 0); + while (!index.is_at_end()) { + _indices.push_back(find_or_add_vertex(points[index.get_data1i()])); + } + } else { + int index = prim->get_first_vertex(); + int end_index = index + num_vertices; + while (index < end_index) { + _indices.push_back(find_or_add_vertex(points[index])); + } } } } + nassertv(mesh.m_numTriangles * 3 == _indices.size()); } // Reset the pointers, since the vectors may have been reallocated. @@ -282,7 +306,7 @@ unsigned int BulletTriangleMesh:: find_or_add_vertex(const LVecBase3 &p) { btVector3 vertex = LVecBase3_to_btVector3(p); - for (unsigned int i = 0; i < _vertices.size(); ++i) { + for (int i = 0; i < _vertices.size(); ++i) { if ((_vertices[i] - vertex).length2() <= _welding_distance) { return i; }