Add gravity, starting and stopping simulation
This commit is contained in:
parent
d81f2f373c
commit
efaf8736d8
|
@ -19,9 +19,14 @@ float phys2d_gravity = -50.f;
|
||||||
void phys2d_init()
|
void phys2d_init()
|
||||||
{
|
{
|
||||||
space = cpSpaceNew();
|
space = cpSpaceNew();
|
||||||
|
phys2d_set_gravity(0, phys2d_gravity);
|
||||||
cpSpaceSetGravity(space, cpv(0, phys2d_gravity));
|
cpSpaceSetGravity(space, cpv(0, phys2d_gravity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void phys2d_set_gravity(float x, float y) {
|
||||||
|
cpSpaceSetGravity(space, cpv(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
void phys2d_update(float deltaT)
|
void phys2d_update(float deltaT)
|
||||||
{
|
{
|
||||||
cpSpaceStep(space, deltaT);
|
cpSpaceStep(space, deltaT);
|
||||||
|
@ -29,7 +34,7 @@ void phys2d_update(float deltaT)
|
||||||
|
|
||||||
void phys2d_apply()
|
void phys2d_apply()
|
||||||
{
|
{
|
||||||
cpSpaceSetGravity(space, cpv(0, phys2d_gravity));
|
phys2d_set_gravity(0, phys2d_gravity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void phys2d_shape_apply(struct phys2d_shape *shape)
|
void phys2d_shape_apply(struct phys2d_shape *shape)
|
||||||
|
@ -42,7 +47,6 @@ void init_phys2dshape(struct phys2d_shape *shape, struct gameobject *go)
|
||||||
{
|
{
|
||||||
shape->go = go;
|
shape->go = go;
|
||||||
cpShapeSetCollisionType(shape->shape, go);
|
cpShapeSetCollisionType(shape->shape, go);
|
||||||
YughInfo("Added shape type %d", go);
|
|
||||||
phys2d_shape_apply(shape);
|
phys2d_shape_apply(shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +62,6 @@ struct phys2d_circle *Make2DCircle(struct gameobject *go)
|
||||||
new->radius = 10.f;
|
new->radius = 10.f;
|
||||||
new->offset[0] = 0.f;
|
new->offset[0] = 0.f;
|
||||||
new->offset[1] = 0.f;
|
new->offset[1] = 0.f;
|
||||||
phys2d_circleinit(new, go);
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +103,7 @@ struct phys2d_segment *Make2DSegment(struct gameobject *go)
|
||||||
new->a[1] = 0.f;
|
new->a[1] = 0.f;
|
||||||
new->b[0] = 0.f;
|
new->b[0] = 0.f;
|
||||||
new->b[1] = 0.f;
|
new->b[1] = 0.f;
|
||||||
phys2d_seginit(new, go);
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
@ -134,8 +137,6 @@ struct phys2d_box *Make2DBox(struct gameobject *go)
|
||||||
new->offset[0] = 0.f;
|
new->offset[0] = 0.f;
|
||||||
new->offset[1] = 0.f;
|
new->offset[1] = 0.f;
|
||||||
|
|
||||||
phys2d_boxinit(new, go);
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,8 +170,6 @@ struct phys2d_poly *Make2DPoly(struct gameobject *go)
|
||||||
new->points = NULL;
|
new->points = NULL;
|
||||||
new->radius = 0.f;
|
new->radius = 0.f;
|
||||||
|
|
||||||
phys2d_polyinit(new, go);
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,8 +219,6 @@ struct phys2d_edge *Make2DEdge(struct gameobject *go)
|
||||||
new->thickness = 0.f;
|
new->thickness = 0.f;
|
||||||
new->shapes = malloc(sizeof(cpShape *));
|
new->shapes = malloc(sizeof(cpShape *));
|
||||||
|
|
||||||
phys2d_edgeinit(new, go);
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -458,8 +455,6 @@ static cpBool s7_phys_cb_begin(cpArbiter *arb, cpSpace *space, void *data) {
|
||||||
struct gameobject *go = data;
|
struct gameobject *go = data;
|
||||||
script_call_sym(go->cbs->begin);
|
script_call_sym(go->cbs->begin);
|
||||||
|
|
||||||
YughInfo("Gameobject %p began collision.", data);
|
|
||||||
|
|
||||||
cpBody *body1;
|
cpBody *body1;
|
||||||
cpBody *body2;
|
cpBody *body2;
|
||||||
cpArbiterGetBodies(arb, &body1, &body2);
|
cpArbiterGetBodies(arb, &body1, &body2);
|
||||||
|
@ -468,8 +463,6 @@ static cpBool s7_phys_cb_begin(cpArbiter *arb, cpSpace *space, void *data) {
|
||||||
cpShape *shape2;
|
cpShape *shape2;
|
||||||
cpArbiterGetShapes(arb, &shape1, &shape2);
|
cpArbiterGetShapes(arb, &shape1, &shape2);
|
||||||
|
|
||||||
YughInfo("Body %p began collision with body %p.", body1, body2);
|
|
||||||
YughInfo("Shape %p began collision with shape %p.", shape1, shape2);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,7 +486,6 @@ void phys2d_add_handler_type(int cmd, struct gameobject *go, s7_pointer cb) {
|
||||||
go->cbs = malloc(sizeof(*go->cbs));
|
go->cbs = malloc(sizeof(*go->cbs));
|
||||||
|
|
||||||
handler->userData = go;
|
handler->userData = go;
|
||||||
YughInfo("Making phys handler %d for type %d", cmd, go);
|
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -101,6 +101,7 @@ void phys2d_update(float deltaT);
|
||||||
void phys2d_apply();
|
void phys2d_apply();
|
||||||
|
|
||||||
void phys2d_add_handler_type(int cmd, struct gameobject *go, s7_pointer cb);
|
void phys2d_add_handler_type(int cmd, struct gameobject *go, s7_pointer cb);
|
||||||
|
void phys2d_set_gravity(float x, float y);
|
||||||
|
|
||||||
void shape_gui(struct phys2d_shape *shape);
|
void shape_gui(struct phys2d_shape *shape);
|
||||||
|
|
||||||
|
|
|
@ -7,4 +7,6 @@ extern void (*asset_command)(char *asset);
|
||||||
|
|
||||||
void print_file(char *file);
|
void print_file(char *file);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -145,6 +145,7 @@ int gameobject_makefromprefab(char *path)
|
||||||
void gameobject_init(struct gameobject *go, FILE * fprefab)
|
void gameobject_init(struct gameobject *go, FILE * fprefab)
|
||||||
{
|
{
|
||||||
go->body = cpSpaceAddBody(space, cpBodyNew(go->mass, 1.f));
|
go->body = cpSpaceAddBody(space, cpBodyNew(go->mass, 1.f));
|
||||||
|
cpBodySetType(go->body, go->bodytype);
|
||||||
|
|
||||||
int comp_n;
|
int comp_n;
|
||||||
fread(&comp_n, sizeof(int), 1, fprefab);
|
fread(&comp_n, sizeof(int), 1, fprefab);
|
||||||
|
@ -165,6 +166,8 @@ void gameobject_init(struct gameobject *go, FILE * fprefab)
|
||||||
|
|
||||||
newc->init(newc->data, go);
|
newc->init(newc->data, go);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void gameobject_saveprefab(struct gameobject *go)
|
void gameobject_saveprefab(struct gameobject *go)
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "gameobject.h"
|
#include "gameobject.h"
|
||||||
#include "openglrender.h"
|
#include "openglrender.h"
|
||||||
|
#include "2dphysics.h"
|
||||||
|
|
||||||
|
#include "yugine.h"
|
||||||
|
|
||||||
#include "s7.h"
|
#include "s7.h"
|
||||||
|
|
||||||
|
@ -176,6 +179,29 @@ s7_pointer s7_sys_cmd(s7_scheme *sc, s7_pointer args) {
|
||||||
case 0:
|
case 0:
|
||||||
quit();
|
quit();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
sim_start();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
sim_stop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
sim_pause();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
sim_step();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
return s7_make_boolean(sc, sim_playing());
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
return s7_make_boolean(sc, sim_paused());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
|
@ -291,6 +317,26 @@ s7_pointer s7_phys_cmd(s7_scheme *sc, s7_pointer args) {
|
||||||
phys2d_add_handler_type(cmd, get_gameobject_from_id(go), env);
|
phys2d_add_handler_type(cmd, get_gameobject_from_id(go), env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Query physics bodies */
|
||||||
|
s7_pointer s7_phys_q(s7_scheme *sc, s7_pointer args) {
|
||||||
|
struct gameobject * go = get_gameobject_from_id(s7_integer(s7_car(args)));
|
||||||
|
int q = s7_integer(s7_cadr(args));
|
||||||
|
|
||||||
|
switch(q) {
|
||||||
|
case 0:
|
||||||
|
return s7_make_integer(sc, cpBodyGetType(go->body));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s7_pointer s7_phys_set(s7_scheme *sc, s7_pointer args) {
|
||||||
|
int cmd = s7_integer(s7_car(args));
|
||||||
|
double x = s7_real(s7_cadr(args));
|
||||||
|
double y = s7_real(s7_caddr(args));
|
||||||
|
|
||||||
|
phys2d_set_gravity(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
#define S7_FUNC(NAME, ARGS) s7_define_function(s7, #NAME, s7_ ##NAME, ARGS, 0, 0, "")
|
#define S7_FUNC(NAME, ARGS) s7_define_function(s7, #NAME, s7_ ##NAME, ARGS, 0, 0, "")
|
||||||
|
|
||||||
void ffi_load() {
|
void ffi_load() {
|
||||||
|
@ -314,5 +360,7 @@ void ffi_load() {
|
||||||
S7_FUNC(set_body, 3);
|
S7_FUNC(set_body, 3);
|
||||||
S7_FUNC(set_body_pos, 4);
|
S7_FUNC(set_body_pos, 4);
|
||||||
S7_FUNC(phys_cmd, 3);
|
S7_FUNC(phys_cmd, 3);
|
||||||
|
S7_FUNC(phys_q, 2);
|
||||||
|
S7_FUNC(phys_set, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,10 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "editorstate.h"
|
||||||
|
#include "yugine.h"
|
||||||
|
#include "2dphysics.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
|
@ -31,6 +35,8 @@ double physMS = 1/120.f;
|
||||||
double updateMS = 1/60.f;
|
double updateMS = 1/60.f;
|
||||||
|
|
||||||
static int ed = 1;
|
static int ed = 1;
|
||||||
|
static int sim_play = 0;
|
||||||
|
static double lastTick;
|
||||||
|
|
||||||
void seghandle(int sig) {
|
void seghandle(int sig) {
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
@ -147,9 +153,7 @@ int main(int argc, char **args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
openglInit();
|
openglInit();
|
||||||
|
sim_stop();
|
||||||
double lastTick;
|
|
||||||
|
|
||||||
while (!want_quit()) {
|
while (!want_quit()) {
|
||||||
double elapsed = glfwGetTime() - lastTick;
|
double elapsed = glfwGetTime() - lastTick;
|
||||||
deltaT = elapsed;
|
deltaT = elapsed;
|
||||||
|
@ -158,18 +162,17 @@ int main(int argc, char **args) {
|
||||||
|
|
||||||
timer_update(lastTick);
|
timer_update(lastTick);
|
||||||
|
|
||||||
call_updates();
|
if (sim_play) {
|
||||||
|
physlag += elapsed;
|
||||||
renderlag += elapsed;
|
call_updates();
|
||||||
physlag += elapsed;
|
if (physlag >= physMS) {
|
||||||
|
physlag -= physMS;
|
||||||
if (physlag >= physMS) {
|
phys2d_update(physMS);
|
||||||
physlag -= physMS;
|
call_physics();
|
||||||
phys2d_update(physMS);
|
}
|
||||||
call_physics();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
renderlag += elapsed;
|
||||||
if (renderlag >= renderMS) {
|
if (renderlag >= renderMS) {
|
||||||
renderlag -= renderMS;
|
renderlag -= renderMS;
|
||||||
window_renderall();
|
window_renderall();
|
||||||
|
@ -183,3 +186,29 @@ int main(int argc, char **args) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int sim_playing() { return sim_play; }
|
||||||
|
void sim_start() {
|
||||||
|
/* Save starting state of everything */
|
||||||
|
sim_play = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sim_pause() {
|
||||||
|
sim_play = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sim_paused() {
|
||||||
|
return sim_play;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sim_stop() {
|
||||||
|
/* Revert starting state of everything from sim_start */
|
||||||
|
sim_play = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sim_step() {
|
||||||
|
|
||||||
|
}
|
12
source/engine/yugine.h
Normal file
12
source/engine/yugine.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#ifndef YUGINE_H
|
||||||
|
#define YUGINE_H
|
||||||
|
|
||||||
|
int sim_playing();
|
||||||
|
int sim_paused();
|
||||||
|
void sim_start();
|
||||||
|
void sim_pause();
|
||||||
|
void sim_stop();
|
||||||
|
void sim_step();
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -90,8 +90,18 @@
|
||||||
(define (body_pos! body x y) (set_body_pos body 0 x y))
|
(define (body_pos! body x y) (set_body_pos body 0 x y))
|
||||||
(define (body_move! body x y) (set_body_pos body 1 x y))
|
(define (body_move! body x y) (set_body_pos body 1 x y))
|
||||||
|
|
||||||
|
(define (gravity! x y) (phys_set 0 x y))
|
||||||
|
|
||||||
(define (b2i val) (if (eq? val #f) 0 1))
|
(define (b2i val) (if (eq? val #f) 0 1))
|
||||||
(define (dbg_draw_phys val) (settings_cmd 3 (b2i val)))
|
(define (dbg_draw_phys val) (settings_cmd 3 (b2i val)))
|
||||||
|
(define (sim_play) (sys_cmd 1))
|
||||||
|
(define (sim_stop) (sys_cmd 2))
|
||||||
|
(define (sim_pause) (sys_cmd 3))
|
||||||
|
(define (sim_step) (sys_cmd 4))
|
||||||
|
(define (sim_play?) (sys_cmd 5))
|
||||||
|
(define (sim_pause?) (sys_cmd 6))
|
||||||
|
|
||||||
|
(define (bodytype? body) (phys_q body 0))
|
||||||
|
|
||||||
(define-macro (register-phys type body . expr)
|
(define-macro (register-phys type body . expr)
|
||||||
(let ((f (gensym)))
|
(let ((f (gensym)))
|
||||||
|
@ -101,8 +111,8 @@
|
||||||
((collide) 0)
|
((collide) 0)
|
||||||
((separate) 3)) ,f))))
|
((separate) 3)) ,f))))
|
||||||
|
|
||||||
(define (collide . expr)
|
(define-macro (collide . expr)
|
||||||
(register-phys collide body expr))
|
`(register-phys collide body ,@expr))
|
||||||
|
|
||||||
(define-macro (separate . expr)
|
(define-macro (separate . expr)
|
||||||
`(register-phys separate body ,@expr))
|
`(register-phys separate body ,@expr))
|
||||||
|
|
Loading…
Reference in a new issue