This commit is contained in:
John Alanbrook 2023-01-10 23:23:11 +00:00
parent 3e4edf1ea3
commit 3baec775a8
4 changed files with 119 additions and 12 deletions

View file

@ -23,12 +23,13 @@ float phys2d_gravity = -50.f;
void phys2d_init()
{
space = cpSpaceNew();
phys2d_set_gravity(0, phys2d_gravity);
cpVect grav = {0, phys2d_gravity};
phys2d_set_gravity(grav);
cpSpaceSetGravity(space, cpv(0, phys2d_gravity));
}
void phys2d_set_gravity(float x, float y) {
cpSpaceSetGravity(space, cpv(x, y));
void phys2d_set_gravity(cpVect v) {
cpSpaceSetGravity(space, v);
}
void phys2d_update(float deltaT)
@ -36,11 +37,6 @@ void phys2d_update(float deltaT)
cpSpaceStep(space, deltaT);
}
void phys2d_apply()
{
phys2d_set_gravity(0, phys2d_gravity);
}
void phys2d_shape_apply(struct phys2d_shape *shape)
{
cpShapeSetFriction(shape->shape, shape->go->f);

View file

@ -97,10 +97,9 @@ void edge_gui(struct phys2d_edge *edge);
void phys2d_init();
void phys2d_update(float deltaT);
void phys2d_apply();
void phys2d_add_handler_type(int cmd, struct gameobject *go, void *cb);
void phys2d_set_gravity(float x, float y);
void phys2d_set_gravity(cpVect v);
void shape_gui(struct phys2d_shape *shape);

View file

@ -557,7 +557,7 @@ void editor_project_gui() {
if (nuke_push_tree_id("Physics", 0)) {
nuke_prop_float("2d Gravity", -5000.f, &phys2d_gravity, 0.f, 1.f, 0.1f);
phys2d_apply();
//phys2d_apply();
nk_tree_pop(ctx);
}

View file

@ -40,6 +40,13 @@ duk_ret_t duk_gui_text(duk_context *duk) {
return 0;
}
duk_ret_t duk_gui_img(duk_context *duk) {
const char *img = duk_to_string(duk, 0);
cpVect pos = duk2vec2(duk, 1);
gui_draw_img(img, pos.x, pos.y);
return 0;
}
duk_ret_t duk_win_make(duk_context *duk) {
const char *title = duk_to_string(duk, 0);
int w = duk_to_int(duk, 1);
@ -65,6 +72,31 @@ duk_ret_t duk_cmd(duk_context *duk) {
case 2:
register_gui(duk_get_heapptr(duk, 1));
break;
case 3:
set_timescale(duk_get_number(duk,1));
break;
case 4:
debug_draw_phys(duk_get_boolean(duk, 1));
break;
case 5:
renderMS = duk_get_number(duk, 1);
break;
case 6:
updateMS = duk_get_number(duk, 1);
break;
case 7:
physMS = duk_get_number(duk, 1);
break;
case 8:
phys2d_set_gravity(duk2vec2(duk, 1));
break;
}
return 0;
@ -231,6 +263,75 @@ duk_ret_t duk_q_body(duk_context *duk) {
return 0;
}
duk_ret_t duk_make_box2d(duk_context *duk) {
int go = duk_to_int(duk, 0);
cpVect size = duk2vec2(duk, 1);
cpVect offset = duk2vec2(duk, 2);
struct phys2d_box *box = Make2DBox(get_gameobject_from_id(go));
box->w = size.x;
box->h = size.y;
box->offset[0] = offset.x;
box->offset[1] = offset.y;
phys2d_boxinit(box, get_gameobject_from_id(go));
return 0;
}
duk_ret_t duk_make_circle2d(duk_context *duk) {
int go = duk_to_int(duk, 0);
double radius = duk2vec2(duk, 1);
cpVect offset = duk2vec2(duk, 2);
struct phys2d_circle *circle = Make2DCircle(get_gameobject_from_id(go));
circle->radius = radius;
circle->offset[0] = offset.x;
circle->offset[1] = offset.y;
phys2d_circleinit(circle, get_gameobject_from_id(go));
return 0;
}
duk_ret_t duk_anim(duk_context *duk) {
void *prop = duk_get_heapptr(duk, 0);
int keyframes = duk_get_length(duk, 1);
YughInfo("Processing %d keyframes.", keyframes);
struct anim a = make_anim();
for (int i = 0; i < keyframes; i++) {
struct keyframe k;
duk_get_prop_index(duk, 1, i); /* End of stack is now the keyframe */
cpVect v = duk2vec2(duk, duk_get_top_index(duk));
k.time = v.y;
k.val = v.x;
a = anim_add_keyframe(a, k);
}
for (double i = 0; i < 3.0; i = i + 0.1) {
YughInfo("Val is now %f at time %f", anim_val(a, i), i);
duk_push_heapptr(duk, prop);
duk_push_number(duk, anim_val(a, i));
duk_call(duk, 1);
duk_pop(duk);
}
return 0;
}
duk_ret_t duk_anim_cmd(duk_context *duk) {
return 0;
}
duk_ret_t duk_timer(duk_context *duk) {
return 0;
}
duk_ret_t duk_timer_cmd(duk_context *duk) {
return 0;
}
#define DUK_FUNC(NAME, ARGS) duk_push_c_function(duk, duk_##NAME, ARGS); duk_put_global_string(duk, #NAME);
void ffi_load()
@ -242,7 +343,18 @@ void ffi_load()
DUK_FUNC(register, 3);
DUK_FUNC(sys_cmd, 1);
DUK_FUNC(win_make, 3);
DUK_FUNC(gui_text, 3);
DUK_FUNC(make_sprite, 3);
DUK_FUNC(make_box2d, 3);
DUK_FUNC(make_circle2d, 3);
DUK_FUNC(cmd, 2);
DUK_FUNC(gui_text, 3);
DUK_FUNC(gui_img, 2);
DUK_FUNC(timer, 2);
DUK_FUNC(timer_cmd, 2);
DUK_FUNC(anim, 2);
DUK_FUNC(anim_cmd, 3);
}