Add initial prototype.
This commit is contained in:
234
3-mid/physics/implement/bullet/source/c/bullet-shape.cpp
Normal file
234
3-mid/physics/implement/bullet/source/c/bullet-shape.cpp
Normal file
@@ -0,0 +1,234 @@
|
||||
#include "bullet-shape.h"
|
||||
#include "bullet-space.h"
|
||||
|
||||
#include <btBulletDynamicsCommon.h>
|
||||
#include <BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h>
|
||||
|
||||
|
||||
|
||||
///////////
|
||||
// Utility
|
||||
//
|
||||
|
||||
btCollisionShape*
|
||||
to_bullet (Shape* From)
|
||||
{
|
||||
return (btCollisionShape*) From;
|
||||
}
|
||||
|
||||
|
||||
Shape*
|
||||
to_bt3 (btCollisionShape* From)
|
||||
{
|
||||
return (Shape*) From;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
/////////
|
||||
// Forge
|
||||
//
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Box (Vector_3* half_Extents)
|
||||
{
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btBoxShape (btVector3 (half_Extents->x,
|
||||
half_Extents->y,
|
||||
half_Extents->z)));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Capsule (Vector_2* Radii,
|
||||
Real Height)
|
||||
{
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btCapsuleShapeZ (Radii->x,
|
||||
Height));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Cone (Real Radius,
|
||||
Real Height)
|
||||
{
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btConeShape (Radius, Height));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_convex_Hull (Vector_3 Points[],
|
||||
int point_Count)
|
||||
{
|
||||
btConvexHullShape* bt_Hull = new btConvexHullShape ();
|
||||
|
||||
for (int i = 0; i < point_Count; i++)
|
||||
{
|
||||
bt_Hull->addPoint (btVector3 (Points [i].x,
|
||||
Points [i].y,
|
||||
Points [i].z));
|
||||
}
|
||||
|
||||
|
||||
Shape* Self = (Shape*)(btCollisionShape*) bt_Hull;
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Mesh (Vector_3 Points[],
|
||||
int point_Count,
|
||||
Triangle Triangles[],
|
||||
int triangle_Count)
|
||||
{
|
||||
btTriangleMesh* mesh = new btTriangleMesh();
|
||||
|
||||
for (int i = 0; i < triangle_Count; i++)
|
||||
{
|
||||
btVector3 bV1, bV2, bV3;
|
||||
|
||||
bV1 [0] = Points [Triangles [i].a - 1].x;
|
||||
bV1 [1] = Points [Triangles [i].a - 1].y;
|
||||
bV1 [2] = Points [Triangles [i].a - 1].z;
|
||||
|
||||
bV2 [0] = Points [Triangles [i].b - 1].x;
|
||||
bV2 [1] = Points [Triangles [i].b - 1].y;
|
||||
bV2 [2] = Points [Triangles [i].b - 1].z;
|
||||
|
||||
bV3 [0] = Points [Triangles [i].c - 1].x;
|
||||
bV3 [1] = Points [Triangles [i].c - 1].y;
|
||||
bV3 [2] = Points [Triangles [i].c - 1].z;
|
||||
|
||||
|
||||
mesh->addTriangle (bV1, bV2, bV3);
|
||||
}
|
||||
|
||||
|
||||
btBvhTriangleMeshShape* bt_Mesh = new btBvhTriangleMeshShape (mesh, true, true);
|
||||
|
||||
Shape* Self = (Shape*)(btCollisionShape*) bt_Mesh;
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Cylinder (Vector_3* half_Extents)
|
||||
{
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btCylinderShape (btVector3 (half_Extents->x,
|
||||
half_Extents->y,
|
||||
half_Extents->z)));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Heightfield (int Width,
|
||||
int Depth,
|
||||
Real Heights[],
|
||||
Real min_Height,
|
||||
Real max_Height,
|
||||
Vector_3* Scale)
|
||||
{
|
||||
btCollisionShape* Self = (btCollisionShape*) (new btHeightfieldTerrainShape (Width, Depth,
|
||||
Heights,
|
||||
1.0,
|
||||
min_Height, max_Height,
|
||||
1, PHY_FLOAT, 0));
|
||||
Self->setLocalScaling (btVector3 (Scale->x,
|
||||
Scale->y,
|
||||
Scale->z));
|
||||
return (Shape*) Self;;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_multiSphere (Vector_3* Positions,
|
||||
Real* Radii,
|
||||
int sphere_Count)
|
||||
{
|
||||
btVector3 bt_Positions [sphere_Count];
|
||||
|
||||
for (int i=0; i < sphere_Count; i++)
|
||||
{
|
||||
bt_Positions [i][0] = Positions [i].x;
|
||||
bt_Positions [i][1] = Positions [i].y;
|
||||
bt_Positions [i][2] = Positions [i].z;
|
||||
}
|
||||
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btMultiSphereShape (bt_Positions,
|
||||
Radii,
|
||||
sphere_Count));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Plane (Vector_3* Normal,
|
||||
Real Offset)
|
||||
{
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btStaticPlaneShape (btVector3 (Normal->x,
|
||||
Normal->y,
|
||||
Normal->z),
|
||||
Offset));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_new_Sphere (Real Radius)
|
||||
{
|
||||
Shape* Self = (Shape*)(btCollisionShape*) (new btSphereShape (Radius));
|
||||
return Self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////
|
||||
// Attributes
|
||||
//
|
||||
|
||||
void*
|
||||
b3d_Shape_user_Data (Shape* Self)
|
||||
{
|
||||
btCollisionShape* the_Shape = to_bullet (Self);
|
||||
|
||||
return the_Shape->getUserPointer();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
b3d_Shape_user_Data_is (Shape* Self, void* Now)
|
||||
{
|
||||
btCollisionShape* the_Shape = to_bullet (Self);
|
||||
|
||||
the_Shape->setUserPointer (Now);
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
Reference in New Issue
Block a user