diff --git a/engine/include/GearSrc/Physics.h b/engine/include/GearSrc/Physics.h index 0167777..3925f67 100644 --- a/engine/include/GearSrc/Physics.h +++ b/engine/include/GearSrc/Physics.h @@ -8,7 +8,10 @@ extern "C" { #endif -GSDECL void GSPhysicsInit(void); +GSDECL void GSPhysicsInit(void); +GSDECL GSPhysics GSPhysicsCreate(GSServer server); +GSDECL void GSPhysicsDestroy(GSPhysics physics); +GSDECL void GSPhysicsStep(GSPhysics physics); #ifdef __cplusplus } diff --git a/engine/include/GearSrc/TypeDefs.h b/engine/include/GearSrc/TypeDefs.h index a0b1fc9..488ad10 100644 --- a/engine/include/GearSrc/TypeDefs.h +++ b/engine/include/GearSrc/TypeDefs.h @@ -66,6 +66,7 @@ typedef struct _GSSound* GSSound; typedef struct _GSNetClient* GSNetClient; typedef struct _GSNetServer* GSNetServer; typedef struct _GSNetSocket* GSNetSocket; +typedef struct _GSPhysics* GSPhysics; typedef struct _GSModelFace GSModelFace; typedef struct _GSModelMaterial GSModelMaterial; @@ -86,6 +87,7 @@ typedef void* GSSound; typedef void* GSNetClient; typedef void* GSNetServer; typedef void* GSNetSocket; +typedef void* GSPhysics; #endif typedef float GSNumber; typedef GSNumber GSVector2[2]; @@ -311,6 +313,13 @@ struct _GSNetSocket { GSBool client; }; +struct _GSPhysics { + GSEngine engine; + + dWorldID world; + dSpaceID space; +}; + struct _GSClient { GSEngine engine; @@ -343,6 +352,8 @@ struct _GSServer { GSEngine engine; GSNetServer net; + + GSPhysics physics; }; struct _GSEngineLog { diff --git a/engine/src/physics.c b/engine/src/physics.c index 8fa1383..45aff69 100644 --- a/engine/src/physics.c +++ b/engine/src/physics.c @@ -4,6 +4,33 @@ #include -void GSPhysicsInit(void){ +void GSPhysicsInit(void) { dInitODE2(0); } + +GSPhysics GSPhysicsCreate(GSServer server) { + GSPhysics physics = malloc(sizeof(*physics)); + + memset(physics, 0, sizeof(*physics)); + + physics->engine = server->engine; + + physics->world = dWorldCreate(); + physics->space = dSimpleSpaceCreate(0); + + GSLog(server->engine, GSLogInfo, "Created physics engine"); + + return physics; +} + +void GSPhysicsDestroy(GSPhysics physics) { + dSpaceDestroy(physics->space); + dWorldDestroy(physics->world); + + GSLog(physics->engine, GSLogInfo, "Destroyed physics engine"); + + free(physics); +} + +void GSPhysicsStep(GSPhysics physics) { +} diff --git a/engine/src/server.c b/engine/src/server.c index a8d4022..82807ca 100644 --- a/engine/src/server.c +++ b/engine/src/server.c @@ -2,6 +2,7 @@ #include #include +#include GSServer GSServerCreate(GSEngine engine) { GSServer server = malloc(sizeof(*server)); @@ -17,6 +18,13 @@ GSServer GSServerCreate(GSEngine engine) { return NULL; } + if((server->physics = GSPhysicsCreate(server)) == NULL) { + GSLog(engine, GSLogError, "Failed to create physics engine"); + GSServerDestroy(server); + + return NULL; + } + GSLog(engine, GSLogInfo, "Created server"); return server; @@ -24,6 +32,7 @@ GSServer GSServerCreate(GSEngine engine) { void GSServerDestroy(GSServer server) { if(server->net != NULL) GSNetServerClose(server->net); + if(server->physics != NULL) GSPhysicsDestroy(server->physics); GSLog(server->engine, GSLogInfo, "Destroyed server");