Code: Select all
#include <new>
#define STORE_STATIC_MEMORY(CLASSNAME,MEMORY,POINTER) char MEMORY##[sizeof(CLASSNAME)]; CLASSNAME##* POINTER;
#define POINT_TO_STATIC_MEMORY(CLASSNAME,MEMORY,POINTER) POINTER = (CLASSNAME##*)(&##(MEMORY));
struct PhysicsCore {
STORE_STATIC_MEMORY(btDefaultCollisionConfiguration,collisionConfigurationData,collisionConfiguration)
STORE_STATIC_MEMORY(btCollisionDispatcher,dispatcherData,dispatcher)
STORE_STATIC_MEMORY(btDbvtBroadphase,overlappingPairCacheData,overlappingPairCache)
STORE_STATIC_MEMORY(btSequentialImpulseConstraintSolver,solverData,solver)
STORE_STATIC_MEMORY(btDiscreteDynamicsWorld,dynamicsWorldData,dynamicsWorld)
};
void Physics_Init(PhysicsCore* Core) {
// Connect pointers to static data
POINT_TO_STATIC_MEMORY(btDefaultCollisionConfiguration,Core->collisionConfigurationData,Core->collisionConfiguration)
POINT_TO_STATIC_MEMORY(btCollisionDispatcher,Core->dispatcherData,Core->dispatcher)
POINT_TO_STATIC_MEMORY(btDbvtBroadphase,Core->overlappingPairCacheData,Core->overlappingPairCache)
POINT_TO_STATIC_MEMORY(btSequentialImpulseConstraintSolver,Core->solverData,Core->solver)
POINT_TO_STATIC_MEMORY(btDiscreteDynamicsWorld,Core->dynamicsWorldData,Core->dynamicsWorld)
// Use placement new for initializing the classes
Core->collisionConfiguration = new(Core->collisionConfiguration) btDefaultCollisionConfiguration();
Core->dispatcher = new(Core->dispatcher) btCollisionDispatcher(Core->collisionConfiguration);
Core->overlappingPairCache = new(Core->overlappingPairCache) btDbvtBroadphase();
Core->solver = new(Core->solver) btSequentialImpulseConstraintSolver();
Core->dynamicsWorld = new(Core->dynamicsWorld) btDiscreteDynamicsWorld(Core->dispatcher,Core->overlappingPairCache,Core->solver,Core->collisionConfiguration);
}
void Physics_Terminate(PhysicsCore* Core) {
// Terminate the classes
Core->dynamicsWorld-> ~btDiscreteDynamicsWorld();
Core->solver-> ~btSequentialImpulseConstraintSolver();
Core->overlappingPairCache-> ~btDbvtBroadphase();
Core->dispatcher-> ~btCollisionDispatcher();
Core->collisionConfiguration-> ~btDefaultCollisionConfiguration();
}
struct RigidBody_Struct {
COLLECTION_STRUCT_DATA(RigidBody)
STORE_STATIC_MEMORY(btRigidBody,StaticBody,Body)
CollisionShape_Struct* Shape;
float LinearMass;
float AngularMass;
};
RigidBody_Struct* EngineCore::RigidBody_Create(CollisionShape_Struct* Shape, float LinearMass, float AngularMass,float PosX,float PosY,float PosZ) {
RigidBody_Struct* newBody;
if (m_Running == true) {
// Add to collection
AddToCollection(RigidBody,newBody)
// Create the body.
btRigidBody::btRigidBodyConstructionInfo cinfo(LinearMass,0,Shape->Shape,Shape->localInertia * AngularMass);
POINT_TO_STATIC_MEMORY(btRigidBody,newBody->StaticBody,newBody->Body)
newBody->Body = new(newBody->StaticBody) btRigidBody(cinfo);
// Place the body
btTransform NewTrans;
NewTrans.setIdentity();
NewTrans.setOrigin(btVector3(PosX,PosY,PosZ));
newBody->Body->setWorldTransform(NewTrans);
// Add it to the dynamics world
m_PhysicsCore.dynamicsWorld->addRigidBody(newBody->Body);
// Remember the linear and angular mass
newBody->LinearMass = LinearMass;
newBody->AngularMass = AngularMass;
// Add 1 use of Shape
newBody->Shape = Shape;
Shape->useCount++;
return newBody;
} else {
MQ->InsertMessage(L"You can't create a rigid body before starting the engine.");
return 0;
}
}
The error remained when using btSimpleDynamicsWorld.