idk
This commit is contained in:
parent
7193bcbc41
commit
ae67600abf
11 changed files with 178 additions and 94 deletions
|
|
@ -16,11 +16,13 @@ GSPhysics GSPhysicsCreate(GSServer server) {
|
|||
physics->engine = server->engine;
|
||||
|
||||
physics->world = dWorldCreate();
|
||||
physics->space = dSimpleSpaceCreate(0);
|
||||
physics->space = dHashSpaceCreate(0);
|
||||
physics->contact_group = dJointGroupCreate(0);
|
||||
|
||||
dWorldSetGravity(physics->world, 0, 0, -9.81);
|
||||
|
||||
dCreatePlane(physics->space, 0, 0, 1, 0);
|
||||
|
||||
GSLog(server->engine, GSLogInfo, "Created physics engine");
|
||||
|
||||
return physics;
|
||||
|
|
@ -67,3 +69,71 @@ void GSPhysicsStep(GSPhysics physics) {
|
|||
dWorldStep(physics->world, 1.0 / physics->engine->tps);
|
||||
dJointGroupEmpty(physics->contact_group);
|
||||
}
|
||||
|
||||
GSPhysicsObject GSPhysicsCreateBox(GSPhysics physics, GSNumber mass, GSVector3 size) {
|
||||
dMass m;
|
||||
GSPhysicsObject obj = malloc(sizeof(*obj));
|
||||
dMatrix3 mat;
|
||||
|
||||
memset(obj, 0, sizeof(*obj));
|
||||
|
||||
obj->geom = dCreateBox(physics->space, size[0], size[2], size[1]);
|
||||
obj->body = dBodyCreate(physics->world);
|
||||
|
||||
dMassSetBox(&m, 1, size[0], size[2], size[1]);
|
||||
dMassAdjust(&m, mass);
|
||||
|
||||
dBodySetMass(obj->body, &m);
|
||||
dGeomSetBody(obj->geom, obj->body);
|
||||
|
||||
dRSetIdentity(mat);
|
||||
dBodySetRotation(obj->body, mat);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
GSPhysicsObject GSPhysicsCreateSphere(GSPhysics physics, GSNumber mass, GSNumber radius) {
|
||||
dMass m;
|
||||
GSPhysicsObject obj = malloc(sizeof(*obj));
|
||||
|
||||
memset(obj, 0, sizeof(*obj));
|
||||
|
||||
obj->geom = dCreateSphere(physics->space, radius);
|
||||
obj->body = dBodyCreate(physics->world);
|
||||
|
||||
dMassSetSphere(&m, 1, radius);
|
||||
dMassAdjust(&m, mass);
|
||||
|
||||
dBodySetMass(obj->body, &m);
|
||||
dGeomSetBody(obj->geom, obj->body);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
void GSPhysicsSetPosition(GSPhysicsObject obj, GSVector3 vec) {
|
||||
dBodySetPosition(obj->body, vec[0], -vec[2], vec[1]);
|
||||
}
|
||||
|
||||
void GSPhysicsGetPosition(GSPhysicsObject obj, GSVector3 vec) {
|
||||
const dReal* r = dBodyGetPosition(obj->body);
|
||||
|
||||
vec[0] = r[0];
|
||||
vec[1] = r[2];
|
||||
vec[2] = -r[1];
|
||||
}
|
||||
|
||||
void GSPhysicsGetRotation(GSPhysicsObject obj, GSMatrix3x3 mat) {
|
||||
const dReal* r = dBodyGetRotation(obj->body);
|
||||
int y, x;
|
||||
|
||||
for(y = 0; y < 3; y++) {
|
||||
for(x = 0; x < 3; x++) mat[3 * y + x] = r[4 * y + x];
|
||||
}
|
||||
}
|
||||
|
||||
void GSPhysicsDestroyObject(GSPhysicsObject obj) {
|
||||
dBodyDestroy(obj->body);
|
||||
dGeomDestroy(obj->geom);
|
||||
|
||||
free(obj);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue