This commit is contained in:
Nishi 2026-02-01 08:09:18 +09:00
commit ae67600abf
Signed by: nishi
GPG key ID: 27EF69B208EB9343
11 changed files with 178 additions and 94 deletions

View file

@ -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);
}