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);

}
Exemple #2
0
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);

}
Exemple #4
0
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;
}