Generate tetrahedral cylinder. Also added some assertion code.
This commit is contained in:
parent
c972052f3b
commit
e1b5e615e3
@ -40,6 +40,8 @@ struct b3QSoftBodyMesh : public b3SoftBodyMesh
|
|||||||
~b3QSoftBodyMesh();
|
~b3QSoftBodyMesh();
|
||||||
|
|
||||||
void SetAsSphere(float32 radius, u32 subdivisions);
|
void SetAsSphere(float32 radius, u32 subdivisions);
|
||||||
|
|
||||||
|
void SetAsCylinder(float32 radius, float32 ey, u32 segments);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <bounce/softbody/softbody_mesh.h>
|
#include <bounce/softbody/softbody_mesh.h>
|
||||||
#include <bounce/meshgen/sphere_mesh.h>
|
#include <bounce/meshgen/sphere_mesh.h>
|
||||||
|
#include <bounce/meshgen/cylinder_mesh.h>
|
||||||
|
|
||||||
b3QSoftBodyMesh::b3QSoftBodyMesh()
|
b3QSoftBodyMesh::b3QSoftBodyMesh()
|
||||||
{
|
{
|
||||||
@ -38,6 +39,7 @@ void b3QSoftBodyMesh::SetAsSphere(float32 radius, u32 subdivisions)
|
|||||||
smMesh mesh;
|
smMesh mesh;
|
||||||
smCreateMesh(mesh, subdivisions);
|
smCreateMesh(mesh, subdivisions);
|
||||||
|
|
||||||
|
B3_ASSERT(vertexCount == 0);
|
||||||
vertexCount = 1 + mesh.vertexCount;
|
vertexCount = 1 + mesh.vertexCount;
|
||||||
vertices = (b3Vec3*)b3Alloc(vertexCount * sizeof(b3Vec3));
|
vertices = (b3Vec3*)b3Alloc(vertexCount * sizeof(b3Vec3));
|
||||||
vertices[0].SetZero();
|
vertices[0].SetZero();
|
||||||
@ -46,6 +48,7 @@ void b3QSoftBodyMesh::SetAsSphere(float32 radius, u32 subdivisions)
|
|||||||
vertices[1 + i] = mesh.vertices[i];
|
vertices[1 + i] = mesh.vertices[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
B3_ASSERT(tetrahedronCount == 0);
|
||||||
tetrahedronCount = mesh.indexCount / 3;
|
tetrahedronCount = mesh.indexCount / 3;
|
||||||
tetrahedrons = (b3SoftBodyMeshTetrahedron*)b3Alloc(tetrahedronCount * sizeof(b3SoftBodyMeshTetrahedron));
|
tetrahedrons = (b3SoftBodyMeshTetrahedron*)b3Alloc(tetrahedronCount * sizeof(b3SoftBodyMeshTetrahedron));
|
||||||
for (u32 i = 0; i < mesh.indexCount / 3; ++i)
|
for (u32 i = 0; i < mesh.indexCount / 3; ++i)
|
||||||
@ -66,4 +69,45 @@ void b3QSoftBodyMesh::SetAsSphere(float32 radius, u32 subdivisions)
|
|||||||
{
|
{
|
||||||
vertices[i] *= radius;
|
vertices[i] *= radius;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void b3QSoftBodyMesh::SetAsCylinder(float32 radius, float32 ey, u32 segments)
|
||||||
|
{
|
||||||
|
cymMesh mesh;
|
||||||
|
cymCreateMesh(mesh, segments);
|
||||||
|
|
||||||
|
B3_ASSERT(vertexCount == 0);
|
||||||
|
vertexCount = 1 + mesh.vertexCount;
|
||||||
|
vertices = (b3Vec3*)b3Alloc(vertexCount * sizeof(b3Vec3));
|
||||||
|
vertices[0].SetZero();
|
||||||
|
for (u32 i = 0; i < mesh.vertexCount; ++i)
|
||||||
|
{
|
||||||
|
vertices[1 + i] = mesh.vertices[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
B3_ASSERT(tetrahedronCount == 0);
|
||||||
|
tetrahedronCount = mesh.indexCount / 3;
|
||||||
|
tetrahedrons = (b3SoftBodyMeshTetrahedron*)b3Alloc(tetrahedronCount * sizeof(b3SoftBodyMeshTetrahedron));
|
||||||
|
for (u32 i = 0; i < mesh.indexCount / 3; ++i)
|
||||||
|
{
|
||||||
|
u32 v1 = mesh.indices[3 * i + 0];
|
||||||
|
u32 v2 = mesh.indices[3 * i + 1];
|
||||||
|
u32 v3 = mesh.indices[3 * i + 2];
|
||||||
|
|
||||||
|
b3SoftBodyMeshTetrahedron* t = tetrahedrons + i;
|
||||||
|
|
||||||
|
t->v1 = 1 + v3;
|
||||||
|
t->v2 = 1 + v2;
|
||||||
|
t->v3 = 1 + v1;
|
||||||
|
t->v4 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float32 height = 2.0f * ey;
|
||||||
|
|
||||||
|
for (u32 i = 0; i < vertexCount; ++i)
|
||||||
|
{
|
||||||
|
vertices[i].x *= radius;
|
||||||
|
vertices[i].y *= height;
|
||||||
|
vertices[i].z *= radius;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user