diff --git a/source/engine/2dphysics.c b/source/engine/2dphysics.c index 50c1628..4dfca53 100644 --- a/source/engine/2dphysics.c +++ b/source/engine/2dphysics.c @@ -15,8 +15,6 @@ #include "log.h" -#include "registry.h" - cpSpace *space = NULL; float phys2d_gravity = -50.f; @@ -39,15 +37,14 @@ void phys2d_update(float deltaT) void phys2d_shape_apply(struct phys2d_shape *shape) { - cpShapeSetFriction(shape->shape, shape->go->f); - cpShapeSetElasticity(shape->shape, shape->go->e); + cpShapeSetFriction(shape->shape, id2go(shape->go)->f); + cpShapeSetElasticity(shape->shape, id2go(shape->go)->e); } -void init_phys2dshape(struct phys2d_shape *shape, struct gameobject *go) +void init_phys2dshape(struct phys2d_shape *shape, int go) { - YughInfo("Making shape with GO %p", go); shape->go = go; - cpShapeSetCollisionType(shape->shape, go); + cpShapeSetCollisionType(shape->shape, id2go(go)); phys2d_shape_apply(shape); } @@ -56,7 +53,7 @@ void phys2d_shape_del(struct phys2d_shape *shape) cpSpaceRemoveShape(space, shape->shape); } -struct phys2d_circle *Make2DCircle(struct gameobject *go) +struct phys2d_circle *Make2DCircle(int go) { struct phys2d_circle *new = malloc(sizeof(struct phys2d_circle)); @@ -64,13 +61,10 @@ struct phys2d_circle *Make2DCircle(struct gameobject *go) new->offset[0] = 0.f; new->offset[1] = 0.f; - return new; -} + new->shape.shape = cpSpaceAddShape(space, cpCircleShapeNew(id2go(go)->body, new->radius, cpvzero)); + init_phys2dshape(&new->shape, go); -void phys2d_circleinit(struct phys2d_circle *circle, struct gameobject *go) -{ - circle->shape.shape = cpSpaceAddShape(space, cpCircleShapeNew(go->body, circle->radius, cpvzero)); - init_phys2dshape(&circle->shape, go); + return new; } void phys2d_circledel(struct phys2d_circle *c) @@ -88,6 +82,7 @@ void circle_gui(struct phys2d_circle *circle) void phys2d_dbgdrawcpcirc(cpCircleShape *c) { + YughInfo("DRAW CIRCLE"); cpVect pos = cpBodyGetPosition(cpShapeGetBody(c)); cpVect offset = cpCircleShapeGetOffset(c); float radius = cpCircleShapeGetRadius(c); @@ -98,17 +93,21 @@ void phys2d_dbgdrawcpcirc(cpCircleShape *c) void phys2d_dbgdrawcircle(struct phys2d_circle *circle) { + YughInfo("Drawing a circle"); phys2d_dbgdrawcpcirc((cpCircleShape *)circle->shape.shape); - /* - cpVect p = cpBodyGetPosition(circle->shape.go->body); + + cpVect p = cpBodyGetPosition(cpShapeGetBody(circle->shape.shape)); cpVect o = cpCircleShapeGetOffset(circle->shape.shape); float d = sqrt(pow(o.x, 2.f) + pow(o.y, 2.f)); - float a = atan2(o.y, o.x) + cpBodyGetAngle(circle->shape.go->body); + float a = atan2(o.y, o.x) + cpBodyGetAngle(cpShapeGetBody(circle->shape.shape)); draw_circle(p.x + (d * cos(a)), p.y + (d * sin(a)), cpCircleShapeGetRadius(circle->shape.shape), 1); - */ + } -struct phys2d_segment *Make2DSegment(struct gameobject *go) + +/*********** SEGMENT2D **************/ + +struct phys2d_segment *Make2DSegment(int go) { struct phys2d_segment *new = malloc(sizeof(struct phys2d_segment)); @@ -118,16 +117,12 @@ struct phys2d_segment *Make2DSegment(struct gameobject *go) new->b[0] = 0.f; new->b[1] = 0.f; + new->shape.shape = cpSpaceAddShape(space, cpSegmentShapeNew(id2go(go)->body, cpvzero, cpvzero, new->thickness)); + init_phys2dshape(&new->shape, go); return new; } -void phys2d_seginit(struct phys2d_segment *seg, struct gameobject *go) -{ - seg->shape.shape = cpSpaceAddShape(space, cpSegmentShapeNew(go->body, cpvzero, cpvzero, seg->thickness)); - init_phys2dshape(&seg->shape, go); -} - void phys2d_segdel(struct phys2d_segment *seg) { phys2d_shape_del(&seg->shape); @@ -141,7 +136,10 @@ void segment_gui(struct phys2d_segment *seg) phys2d_applyseg(seg); } -struct phys2d_box *Make2DBox(struct gameobject *go) + +/************* BOX2D ************/ + +struct phys2d_box *Make2DBox(int go) { struct phys2d_box *new = malloc(sizeof(struct phys2d_box)); @@ -151,14 +149,11 @@ struct phys2d_box *Make2DBox(struct gameobject *go) new->offset[0] = 0.f; new->offset[1] = 0.f; - return new; -} + new->shape.shape = cpSpaceAddShape(space, cpBoxShapeNew(id2go(go)->body, new->w, new->h, new->r)); + init_phys2dshape(&new->shape, go); + phys2d_applybox(new); -void phys2d_boxinit(struct phys2d_box *box, struct gameobject *go) -{ - box->shape.shape = cpSpaceAddShape(space, cpBoxShapeNew(go->body, box->w, box->h, box->r)); - init_phys2dshape(&box->shape, go); - phys2d_applybox(box); + return new; } void phys2d_boxdel(struct phys2d_box *box) @@ -175,8 +170,9 @@ void box_gui(struct phys2d_box *box) phys2d_applybox(box); } +/************** POLYGON ************/ -struct phys2d_poly *Make2DPoly(struct gameobject *go) +struct phys2d_poly *Make2DPoly(int go) { struct phys2d_poly *new = malloc(sizeof(struct phys2d_poly)); @@ -184,16 +180,12 @@ struct phys2d_poly *Make2DPoly(struct gameobject *go) new->points = NULL; new->radius = 0.f; - return new; -} - -void phys2d_polyinit(struct phys2d_poly *poly, struct gameobject *go) -{ cpTransform T = { 0 }; - poly->shape.shape = - cpSpaceAddShape(space, cpPolyShapeNew(go->body, 0, NULL, T, poly->radius)); - init_phys2dshape(&poly->shape, go); - phys2d_applypoly(poly); + new->shape.shape = cpSpaceAddShape(space, cpPolyShapeNew(id2go(go)->body, 0, NULL, T, new->radius)); + init_phys2dshape(&new->shape, go); + phys2d_applypoly(new); + + return new; } void phys2d_polydel(struct phys2d_poly *poly) @@ -224,7 +216,11 @@ void poly_gui(struct phys2d_poly *poly) phys2d_applypoly(poly); } -struct phys2d_edge *Make2DEdge(struct gameobject *go) + + +/****************** EDGE 2D**************/ + +struct phys2d_edge *Make2DEdge(int go) { struct phys2d_edge *new = malloc(sizeof(struct phys2d_edge)); @@ -233,19 +229,15 @@ struct phys2d_edge *Make2DEdge(struct gameobject *go) new->thickness = 0.f; new->shapes = malloc(sizeof(cpShape *)); + new->shapes[0] = cpSpaceAddShape(space, cpSegmentShapeNew(id2go(go)->body, cpvzero, cpvzero, new->thickness)); + new->shape.go = go; + phys2d_edgeshapeapply(&new->shape, new->shapes[0]); + + phys2d_applyedge(new); + return new; } -void phys2d_edgeinit(struct phys2d_edge *edge, struct gameobject *go) -{ - edge->shapes[0] = - cpSpaceAddShape(space, cpSegmentShapeNew(go->body, cpvzero, cpvzero, edge->thickness)); - edge->shape.go = go; - phys2d_edgeshapeapply(&edge->shape, edge->shapes[0]); - - phys2d_applyedge(edge); -} - void phys2d_edgedel(struct phys2d_edge *edge) { phys2d_shape_del(&edge->shape); @@ -253,8 +245,8 @@ void phys2d_edgedel(struct phys2d_edge *edge) void phys2d_edgeshapeapply(struct phys2d_shape *mshape, cpShape * shape) { - cpShapeSetFriction(shape, mshape->go->f); - cpShapeSetElasticity(shape, mshape->go->e); + cpShapeSetFriction(shape, id2go(mshape->go)->f); + cpShapeSetElasticity(shape, id2go(mshape->go)->e); } void phys2d_edgeaddvert(struct phys2d_edge *edge) @@ -273,10 +265,7 @@ void phys2d_edgeaddvert(struct phys2d_edge *edge) cpVect b = { edge->points[(edge->n - 1) * 2], edge->points[(edge->n - 1) * 2 + 1] }; - edge->shapes[edge->n - 2] = - cpSpaceAddShape(space, - cpSegmentShapeNew(edge->shape.go->body, a, b, - edge->thickness)); + edge->shapes[edge->n - 2] = cpSpaceAddShape(space, cpSegmentShapeNew(id2go(edge->shape.go)->body, a, b, edge->thickness)); phys2d_edgeshapeapply(&edge->shape, edge->shapes[edge->n - 2]); free(oldp); @@ -299,18 +288,20 @@ void edge_gui(struct phys2d_edge *edge) void phys2d_applycircle(struct phys2d_circle *circle) { - float radius = circle->radius * circle->shape.go->scale; - float s = circle->shape.go->scale; + struct gameobject *go = id2go(circle->shape.go); + + float radius = circle->radius * go->scale; + float s = go->scale; cpVect offset = { circle->offset[0] * s, circle->offset[1] * s }; cpCircleShapeSetRadius(circle->shape.shape, radius); cpCircleShapeSetOffset(circle->shape.shape, offset); - cpBodySetMoment(circle->shape.go->body, cpMomentForCircle(circle->shape.go->mass, 0, radius, offset)); + cpBodySetMoment(go->body, cpMomentForCircle(go->mass, 0, radius, offset)); } void phys2d_applyseg(struct phys2d_segment *seg) { - float s = seg->shape.go->scale; + float s = id2go(seg->shape.go)->scale; cpVect a = { seg->a[0] * s, seg->a[1] * s }; cpVect b = { seg->b[0] * s, seg->b[1] * s }; cpSegmentShapeSetEndpoints(seg->shape.shape, a, b); @@ -319,7 +310,7 @@ void phys2d_applyseg(struct phys2d_segment *seg) void phys2d_applybox(struct phys2d_box *box) { - float s = box->shape.go->scale; + float s = id2go(box->shape.go)->scale; cpTransform T = { 0 }; T.a = s; T.d = s; @@ -344,7 +335,7 @@ void phys2d_applypoly(struct phys2d_poly *poly) CP_CONVEX_HULL(poly->n, verts, hullCount, hullVerts); - float s = poly->shape.go->scale; + float s = id2go(poly->shape.go)->scale; cpTransform T = { 0 }; T.a = s; T.d = s; @@ -355,7 +346,7 @@ void phys2d_applypoly(struct phys2d_poly *poly) void phys2d_applyedge(struct phys2d_edge *edge) { - float s = edge->shape.go->scale; + float s = id2go(edge->shape.go)->scale; for (int i = 0; i < edge->n - 1; i++) { cpVect a = @@ -371,24 +362,23 @@ void phys2d_applyedge(struct phys2d_edge *edge) void phys2d_dbgdrawseg(struct phys2d_segment *seg) { - cpVect p = cpBodyGetPosition(seg->shape.go->body); + cpVect p = cpBodyGetPosition(cpShapeGetBody(seg->shape.shape)); cpVect a = cpSegmentShapeGetA(seg->shape.shape); cpVect b = cpSegmentShapeGetB(seg->shape.shape); - float angle = cpBodyGetAngle(seg->shape.go->body); + float angle = cpBodyGetAngle(cpShapeGetBody(seg->shape.shape)); float ad = sqrt(pow(a.x, 2.f) + pow(a.y, 2.f)); float bd = sqrt(pow(b.x, 2.f) + pow(b.y, 2.f)); float aa = atan2(a.y, a.x) + angle; float ba = atan2(b.y, b.x) + angle; - draw_line(ad * cos(aa) + p.x, ad * sin(aa) + p.y, bd * cos(ba) + p.x, - bd * sin(ba) + p.y); + draw_line(ad * cos(aa) + p.x, ad * sin(aa) + p.y, bd * cos(ba) + p.x, bd * sin(ba) + p.y); } void phys2d_dbgdrawbox(struct phys2d_box *box) { int n = cpPolyShapeGetCount(box->shape.shape); - cpVect b = cpBodyGetPosition(box->shape.go->body); - float angle = cpBodyGetAngle(box->shape.go->body); + cpVect b = cpBodyGetPosition(cpShapeGetBody(box->shape.shape)); + float angle = cpBodyGetAngle(cpShapeGetBody(box->shape.shape)); float points[n * 2]; for (int i = 0; i < n; i++) { @@ -404,16 +394,13 @@ void phys2d_dbgdrawbox(struct phys2d_box *box) void phys2d_dbgdrawpoly(struct phys2d_poly *poly) { - cpVect b = cpBodyGetPosition(poly->shape.go->body); - float angle = cpBodyGetAngle(poly->shape.go->body); + cpVect b = cpBodyGetPosition(cpShapeGetBody(poly->shape.shape)); + float angle = cpBodyGetAngle(cpShapeGetBody(poly->shape.shape)); - float s = poly->shape.go->scale; + float s = id2go(poly->shape.go)->scale; for (int i = 0; i < poly->n; i++) { - float d = - sqrt(pow(poly->points[i * 2] * s, 2.f) + - pow(poly->points[i * 2 + 1] * s, 2.f)); - float a = - atan2(poly->points[i * 2 + 1], poly->points[i * 2]) + angle; + float d = sqrt(pow(poly->points[i * 2] * s, 2.f) + pow(poly->points[i * 2 + 1] * s, 2.f)); + float a = atan2(poly->points[i * 2 + 1], poly->points[i * 2]) + angle; draw_point(b.x + d * cos(a), b.y + d * sin(a), 3); } @@ -436,16 +423,13 @@ void phys2d_dbgdrawpoly(struct phys2d_poly *poly) void phys2d_dbgdrawedge(struct phys2d_edge *edge) { - cpVect p = cpBodyGetPosition(edge->shape.go->body); - float s = edge->shape.go->scale; - float angle = cpBodyGetAngle(edge->shape.go->body); + cpVect p = cpBodyGetPosition(cpShapeGetBody(edge->shape.shape)); + float s = id2go(edge->shape.go)->scale; + float angle = cpBodyGetAngle(cpShapeGetBody(edge->shape.shape)); for (int i = 0; i < edge->n; i++) { - float d = - sqrt(pow(edge->points[i * 2] * s, 2.f) + - pow(edge->points[i * 2 + 1] * s, 2.f)); - float a = - atan2(edge->points[i * 2 + 1], edge->points[i * 2]) + angle; + float d = sqrt(pow(edge->points[i * 2] * s, 2.f) + pow(edge->points[i * 2 + 1] * s, 2.f)); + float a = atan2(edge->points[i * 2 + 1], edge->points[i * 2]) + angle; draw_point(p.x + d * cos(a), p.y + d * sin(a), 3); } @@ -485,7 +469,7 @@ static cpBool script_phys_cb_begin(cpArbiter *arb, cpSpace *space, void *data) { vect2duk(cpArbiterGetNormal(arb)); duk_put_prop_literal(duk, obj, "normal"); - duk_push_int(duk, g2->editor.id); + duk_push_int(duk, g2); duk_put_prop_literal(duk, obj, "hit"); duk_call_method(duk, 1); @@ -507,15 +491,16 @@ static void s7_phys_cb_separate(cpArbiter *Arb, cpSpace *space, void *data) { //script_call_sym(go->cbs->separate); } -void phys2d_add_handler_type(int cmd, struct gameobject *go, struct callee c) { +void phys2d_add_handler_type(int cmd, int go, struct callee c) { +/* cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, go); - handler->userData = go; + handler->userData = id2go(go); switch (cmd) { case 0: handler->beginFunc = script_phys_cb_begin; - go->cbs.begin = c; + id2go(go)->cbs.begin = c; break; case 1: @@ -529,4 +514,5 @@ void phys2d_add_handler_type(int cmd, struct gameobject *go, struct callee c) { //go->cbs->separate = cb; break; } + */ } \ No newline at end of file diff --git a/source/engine/2dphysics.h b/source/engine/2dphysics.h index 0267cb6..91109d6 100644 --- a/source/engine/2dphysics.h +++ b/source/engine/2dphysics.h @@ -4,8 +4,6 @@ #include #include "script.h" -struct gameobject; - extern cpBody *ballBody; extern float phys2d_gravity; extern int physOn; @@ -13,7 +11,7 @@ extern cpSpace *space; struct phys2d_shape { cpShape *shape; - struct gameobject *go; + int go; }; struct phys2d_circle { @@ -52,37 +50,32 @@ struct phys2d_poly { struct phys2d_shape shape; }; -struct phys2d_circle *Make2DCircle(struct gameobject *go); -void phys2d_circleinit(struct phys2d_circle *circle, struct gameobject *go); +struct phys2d_circle *Make2DCircle(int go); void phys2d_circledel(struct phys2d_circle *c); void phys2d_applycircle(struct phys2d_circle *circle); void phys2d_dbgdrawcircle(struct phys2d_circle *circle); void circle_gui(struct phys2d_circle *circle); -struct phys2d_segment *Make2DSegment(struct gameobject *go); -void phys2d_seginit(struct phys2d_segment *seg, struct gameobject *go); +struct phys2d_segment *Make2DSegment(int go); void phys2d_segdel(struct phys2d_segment *seg); void phys2d_applyseg(struct phys2d_segment *seg); void phys2d_dbgdrawseg(struct phys2d_segment *seg); void segment_gui(struct phys2d_segment *seg); -struct phys2d_box *Make2DBox(struct gameobject *go); -void phys2d_boxinit(struct phys2d_box *box, struct gameobject *go); +struct phys2d_box *Make2DBox(int go); void phys2d_boxdel(struct phys2d_box *box); void phys2d_applybox(struct phys2d_box *box); void phys2d_dbgdrawbox(struct phys2d_box *box); void box_gui(struct phys2d_box *box); -struct phys2d_poly *Make2DPoly(struct gameobject *go); -void phys2d_polyinit(struct phys2d_poly *poly, struct gameobject *go); +struct phys2d_poly *Make2DPoly(int go); void phys2d_polydel(struct phys2d_poly *poly); void phys2d_applypoly(struct phys2d_poly *poly); void phys2d_dbgdrawpoly(struct phys2d_poly *poly); void phys2d_polyaddvert(struct phys2d_poly *poly); void poly_gui(struct phys2d_poly *poly); -struct phys2d_edge *Make2DEdge(struct gameobject *go); -void phys2d_edgeinit(struct phys2d_edge *edge, struct gameobject *go); +struct phys2d_edge *Make2DEdge(int go); void phys2d_edgedel(struct phys2d_edge *edge); void phys2d_applyedge(struct phys2d_edge *edge); void phys2d_edgeshapeapply(struct phys2d_shape *mshape, cpShape * shape); @@ -99,7 +92,7 @@ struct phys_cbs { struct callee separate; }; -void phys2d_add_handler_type(int cmd, struct gameobject *go, struct callee c); +void phys2d_add_handler_type(int cmd, int go, struct callee c); void register_collide(void *sym); void phys2d_set_gravity(cpVect v); diff --git a/source/engine/editor/editor.c b/source/engine/editor/editor.c index fbac78a..65bdcd2 100644 --- a/source/engine/editor/editor.c +++ b/source/engine/editor/editor.c @@ -1,3 +1,8 @@ +void editor_init(){} + + +#ifdef GOOGLE + #include "editor.h" #include "ed_project.h" @@ -13,7 +18,6 @@ #include "level.h" #include "math.h" #include "openglrender.h" -#include "registry.h" #include "resources.h" #include "script.h" #include "shader.h" @@ -1023,3 +1027,4 @@ void sprite_gui(struct sprite *sprite) { } +#endif \ No newline at end of file diff --git a/source/engine/engine.c b/source/engine/engine.c index 7f56383..6aa1371 100644 --- a/source/engine/engine.c +++ b/source/engine/engine.c @@ -30,7 +30,6 @@ #include "sprite.h" #include "2dphysics.h" #include "gameobject.h" -#include "registry.h" #include "log.h" #include "resources.h" #include "timer.h" @@ -60,7 +59,6 @@ void engine_init() YughInfo("Starting scripts ..."); script_init(); - registry_init(); YughInfo("Starting physics ..."); phys2d_init(); diff --git a/source/engine/ffi.c b/source/engine/ffi.c index 97a1af2..ec8da70 100644 --- a/source/engine/ffi.c +++ b/source/engine/ffi.c @@ -68,7 +68,7 @@ duk_ret_t duk_cmd(duk_context *duk) { break; case 2: - + gameobject_delete(duk_get_int(duk, 1)); break; case 3: @@ -96,7 +96,7 @@ duk_ret_t duk_cmd(duk_context *duk) { break; case 9: - + sprite_delete(duk_to_int(duk, 1)); break; case 10: @@ -225,18 +225,7 @@ duk_ret_t duk_loginfo(duk_context *duk) { return 0; } -duk_ret_t duk_make_sprite(duk_context *duk) { - int go = duk_to_int(duk, 0); - const char *path = duk_to_string(duk, 1); - cpVect pos = duk2vec2(duk, 2); - struct sprite *sp = make_sprite(get_gameobject_from_id(go)); - sprite_loadtex(sp, path); - sp->pos[0] = pos.x; - sp->pos[1] = pos.y; - - return 0; -} duk_ret_t duk_set_body(duk_context *duk) { int cmd = duk_to_int(duk, 0); @@ -272,6 +261,10 @@ duk_ret_t duk_set_body(duk_context *duk) { go->flipy = duk_to_boolean(duk, 2); break; + case 7: + cpBodySetMass(go->body, duk_to_number(duk, 2)); + break; + } return 0; @@ -312,17 +305,44 @@ duk_ret_t duk_q_body(duk_context *duk) { return 0; } +duk_ret_t duk_sprite(duk_context *duk) { + int cmd = duk_to_int(duk, 0); + int id = duk_to_int(duk, 1); + + switch (cmd) { + case 0: + + } +} + +duk_ret_t duk_make_sprite(duk_context *duk) { + int go = duk_to_int(duk, 0); + const char *path = duk_to_string(duk, 1); + cpVect pos = duk2vec2(duk, 2); + + int sprite = make_sprite(go); + struct sprite *sp = id2sprite(sprite); + sprite_loadtex(sp, path); + sp->pos[0] = pos.x; + sp->pos[1] = pos.y; + + + duk_push_int(duk, sprite); + return 1; +} + 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)); + struct phys2d_box *box = Make2DBox(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)); + + phys2d_applybox(box); return 0; } @@ -332,12 +352,12 @@ duk_ret_t duk_make_circle2d(duk_context *duk) { double radius = duk_to_number(duk, 1); cpVect offset = duk2vec2(duk, 2); - struct phys2d_circle *circle = Make2DCircle(get_gameobject_from_id(go)); + struct phys2d_circle *circle = Make2DCircle(go); circle->radius = radius; circle->offset[0] = offset.x; circle->offset[1] = offset.y; - phys2d_circleinit(circle, get_gameobject_from_id(go)); + phys2d_applycircle(circle); return 0; } @@ -369,6 +389,8 @@ duk_ret_t duk_anim(duk_context *duk) { return 0; } + + duk_ret_t duk_anim_cmd(duk_context *duk) { return 0; } @@ -389,6 +411,9 @@ void ffi_load() DUK_FUNC(make_gameobject, 7); DUK_FUNC(set_body, 3); DUK_FUNC(q_body, 2); + + DUK_FUNC(sprite, 3); + DUK_FUNC(sys_cmd, 1); DUK_FUNC(win_make, 3); diff --git a/source/engine/gameobject.c b/source/engine/gameobject.c index 0be6049..c6a44d4 100644 --- a/source/engine/gameobject.c +++ b/source/engine/gameobject.c @@ -2,7 +2,6 @@ #include "shader.h" #include "sprite.h" -#include "registry.h" #include "2dphysics.h" #include "script.h" #include "input.h" @@ -16,6 +15,7 @@ #include "stb_ds.h" struct gameobject *gameobjects = NULL; +struct gameobject *first = NULL; const int nameBuf[MAXNAME] = { 0 }; const int prefabNameBuf[MAXNAME] = { 0 }; @@ -26,6 +26,12 @@ struct gameobject *get_gameobject_from_id(int id) return &gameobjects[id]; } +struct gameobject *id2go(int id) { + if (id < 0) return NULL; + + return &gameobjects[id]; +} + int id_from_gameobject(struct gameobject *go) { for (int i = 0; i < arrlen(gameobjects); i++) { if (&gameobjects[i] == go) return i; @@ -44,6 +50,7 @@ void gameobject_apply(struct gameobject *go) static void gameobject_setpickcolor(struct gameobject *go) { +/* float r = ((go->editor.id & 0x000000FF) >> 0) / 255.f; float g = ((go->editor.id & 0x0000FF00) >> 8) / 255.f; float b = ((go->editor.id & 0x00FF0000) >> 16) / 255.f; @@ -51,57 +58,54 @@ static void gameobject_setpickcolor(struct gameobject *go) go->editor.color[0] = r; go->editor.color[1] = g; go->editor.color[2] = b; + */ } int MakeGameobject() { - if (gameobjects == NULL) arrsetcap(gameobjects, 50); - struct gameobject go = { - .editor.id = arrlen(gameobjects), .scale = 1.f, .bodytype = CP_BODY_TYPE_STATIC, .mass = 1.f }; - gameobject_setpickcolor(&go); - strncpy(go.editor.mname, "New object", MAXNAME); go.body = cpSpaceAddBody(space, cpBodyNew(go.mass, 1.f)); - arrput(gameobjects, go); + struct gameobject *tar; - cpBodySetUserData(go.body, &arrlast(gameobjects)); + int retid; - return arrlen(gameobjects)-1; -} + if (!first) { + arrput(gameobjects, go); + tar = &arrlast(gameobjects); + retid = arrlen(gameobjects)-1; + tar->id = retid; + } else { -void gameobject_addcomponent(struct gameobject *go, struct component_interface *c) -{ - struct component new; - new.ref = c; - new.data = c->make(go); - new.go = go; - arrput(go->components, new); + retid = first->id; + struct gameobject *next = first->next; + YughInfo("Created in slot %d.", retid); + tar = first; + *first = go; + first->id = retid; + first = next; + } + + cpBodySetUserData(go.body, tar); + + YughInfo("Made game object with ID ===== %d", retid); + return retid; } void gameobject_delete(int id) { YughInfo("Deleting gameobject with id %d.", id); - struct gameobject *go = &gameobjects[id]; - for (int i = 0; i < arrlen(go->components); i++) { - comp_delete(&go->components[i]); - arrdel(go->components, i); - } + struct gameobject *go = id2go(id); + cpSpaceRemoveBody(space, go->body); + go->next = first; + first = go; - - - arrdelswap(gameobjects, id); -} - -void gameobject_delcomponent(struct gameobject *go, int n) -{ - comp_delete(&go->components[n]); - arrdel(go->components, n); + YughInfo("Did it to %d.", first->id); } void gameobject_save(struct gameobject *go, FILE * file) @@ -126,6 +130,7 @@ void gameobject_save(struct gameobject *go, FILE * file) int gameobject_makefromprefab(char *path) { +/* FILE *fprefab = fopen(path, "rb"); if (fprefab == NULL) { YughError("Could not find prefab %s.", path); @@ -143,6 +148,7 @@ int gameobject_makefromprefab(char *path) arrlast(gameobjects).editor.id = arrlen(gameobjects)-1; return arrlen(gameobjects)-1; + */ } void gameobject_init(struct gameobject *go, FILE * fprefab) @@ -180,6 +186,7 @@ void gameobject_init(struct gameobject *go, FILE * fprefab) void gameobject_saveprefab(struct gameobject *go) { +/* char prefabfname[60] = { '\0' }; strncat(prefabfname, go->editor.prefabName, MAXNAME); strncat(prefabfname, EXT_PREFAB, 10); @@ -188,6 +195,7 @@ void gameobject_saveprefab(struct gameobject *go) fclose(pfile); findPrefabs(); + */ } @@ -212,6 +220,7 @@ void gameobject_revertprefab(struct gameobject *go) void toggleprefab(struct gameobject *go) { +/* go->editor.prefabSync = !go->editor.prefabSync; if (go->editor.prefabSync) { @@ -220,11 +229,7 @@ void toggleprefab(struct gameobject *go) } else { go->editor.prefabName[0] = '\0'; } -} - -int gameobject_ncomponents(struct gameobject *go) -{ - return arrlen(go->components); + */ } void gameobject_move(struct gameobject *go, cpVect vec) @@ -261,6 +266,7 @@ void gameobject_setpos(struct gameobject *go, cpVect vec) { void object_gui(struct gameobject *go) { +/* float temp_pos[2]; temp_pos[0] = cpBodyGetPosition(go->body).x; temp_pos[1] = cpBodyGetPosition(go->body).y; @@ -321,16 +327,20 @@ void object_gui(struct gameobject *go) if (n >= 0) gameobject_delcomponent(go, n); - +*/ } void gameobject_draw_debugs() { +/* + YughInfo("DRAWING DEBUG"); for (int i = 0; i < arrlen(gameobjects); i++) { + YughInfo("Drawing this many ... %d", arrlen(gameobjects[i].components)); for (int j = 0; j < arrlen(gameobjects[i].components); j++) { struct component *c = &gameobjects[i].components[j]; comp_draw_debug(c); } } + */ } diff --git a/source/engine/gameobject.h b/source/engine/gameobject.h index 27317df..9459473 100644 --- a/source/engine/gameobject.h +++ b/source/engine/gameobject.h @@ -7,7 +7,6 @@ #include #include #include "2dphysics.h" -#include "registry.h" struct shader; struct sprite; @@ -25,7 +24,10 @@ struct editor { }; struct gameobject { - cpBodyType bodytype; + union { + cpBodyType bodytype; + struct gameobject *next; + }; float scale; float mass; float f; /* friction */ @@ -33,30 +35,22 @@ struct gameobject { int flipx; /* 1 or -1 */ int flipy; cpBody *body; - struct component *components; + int id; struct phys_cbs cbs; - struct editor editor; }; extern struct gameobject *gameobjects; int MakeGameobject(); void gameobject_apply(struct gameobject *go); -void init_gameobjects(); void gameobject_delete(int id); -void clear_gameobjects(); -int number_of_gameobjects(); -void set_n_gameobjects(int n); void toggleprefab(struct gameobject *go); struct gameobject *get_gameobject_from_id(int id); +struct gameobject *id2go(int id); int id_from_gameobject(struct gameobject *go); void gameobject_save(struct gameobject *go, FILE * file); -void gameobject_addcomponent(struct gameobject *go, struct component_interface *c); -void gameobject_delcomponent(struct gameobject *go, int n); -void gameobject_loadcomponent(struct gameobject *go, int id); -int gameobject_ncomponents(struct gameobject *go); void gameobject_saveprefab(struct gameobject *go); int gameobject_makefromprefab(char *path); diff --git a/source/engine/level.c b/source/engine/level.c index aa19955..6095fba 100644 --- a/source/engine/level.c +++ b/source/engine/level.c @@ -24,6 +24,7 @@ void save_level(char name[MAXNAME]) void load_level(char name[MAXNAME]) { +/* FILE *lfile = fopen(name, "rb"); if (!lfile) return; @@ -43,6 +44,7 @@ void load_level(char name[MAXNAME]) } fclose(lfile); + */ } void new_level() diff --git a/source/engine/registry.c b/source/engine/registry.c deleted file mode 100644 index 6d7447b..0000000 --- a/source/engine/registry.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "registry.h" -#include "gameobject.h" -#include "2dphysics.h" -#include "editor.h" -#include "sprite.h" -#include "stb_ds.h" - -struct component *components; -struct component_interface *interfaces; - -void registry_init() -{ - - register_component("Sprite", - sizeof(struct sprite), - make_sprite, - sprite_delete, - sprite_io, - NULL, - sprite_gui, - sprite_init); - - register_component("2D Circle Collider", - sizeof(struct phys2d_circle), - Make2DCircle, - phys2d_circledel, - NULL, - phys2d_dbgdrawcircle, - circle_gui, - phys2d_circleinit); - - register_component("2D Segment", sizeof(struct phys2d_segment), Make2DSegment, phys2d_segdel, NULL, phys2d_dbgdrawseg, segment_gui, phys2d_seginit); - register_component("2D Box", sizeof(struct phys2d_box), Make2DBox, phys2d_boxdel, NULL, phys2d_dbgdrawbox, box_gui, phys2d_boxinit); - register_component("2D Polygon", sizeof(struct phys2d_poly), Make2DPoly, phys2d_polydel, NULL, phys2d_dbgdrawpoly, poly_gui,phys2d_polyinit); - register_component("2D Edge", sizeof(struct phys2d_edge), Make2DEdge, phys2d_edgedel, NULL, phys2d_dbgdrawedge, edge_gui, phys2d_edgeinit); -} - -void register_component(const char *name, size_t size, - void (*make)(struct gameobject * go), - void (*delete)(void *data), - void (*io)(void *data, FILE *f, int read), - void(*draw_debug)(void *data), - void(*draw_gui)(void *data), - void(*init)(void *data, struct gameobject * go)) -{ - struct component_interface c; - c.name = name; - c.make = make; - c.io = io; - c.draw_debug = draw_debug; - c.draw_gui = draw_gui; - c.delete = delete; - c.init = init; - arrput(interfaces, c); -} - -struct component comp_make(struct component_interface *interface) -{ - struct component c; - c.data = interface->make(NULL); - c.ref = interface; - - return c; -} - -void comp_draw_debug(struct component *c) { - c->ref->draw_debug(c->data); -} - -void comp_draw_gui(struct component *c) { - c->ref->draw_gui(c->data); -} - -void comp_delete(struct component *c) -{ - c->ref->delete(c->data); -} - -void comp_init(struct component *c, struct gameobject *go) -{ - c->ref->init(c->data, go); -} - -void comp_io(struct component *c, FILE *f, int read) -{ - c->ref->io(c->data, f, read); -} \ No newline at end of file diff --git a/source/engine/registry.h b/source/engine/registry.h deleted file mode 100644 index c227db1..0000000 --- a/source/engine/registry.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef REGISTRY_H -#define REGISTRY_H - -#include -#include - -#include "config.h" - -struct gameobject; - -struct component_interface { - const char *name; - void *(*make)(struct gameobject * go); /* Called to create the component */ - void (*io)(void *data, FILE *f, int read); - void (*draw_debug)(void *data); /* Draw debugging info in editor */ - void (*draw_gui)(void *data); - void (*init)(void *data, struct gameobject * go); - void (*delete)(void *data); -}; - -struct component { - void *data; - struct gameobject *go; - struct component_interface *ref; -}; - -struct component comp_make(struct component_interface *interface); -void comp_draw_debug(struct component *c); -void comp_draw_gui(struct component *c); -void comp_delete(struct component *c); -void comp_init(struct component *c, struct gameobject *go); -void comp_io(struct component *c, FILE *f, int read); - -void comp_update(struct component *c, struct gameobject *go); - - -void registry_init(); -void register_component(const char *name, size_t size, - void (*make)(struct gameobject * go), - void (*delete)(void *data), - void (*io)(void *data, FILE *f, int read), - void(*draw_debug)(void *data), - void(*draw_gui)(void *data), - void(*init)(void *data, struct gameobject * go)); - -#endif diff --git a/source/engine/sprite.c b/source/engine/sprite.c index f4574cb..618b80d 100644 --- a/source/engine/sprite.c +++ b/source/engine/sprite.c @@ -15,27 +15,42 @@ struct TextureOptions TEX_SPRITE = { 1, 0, 0 }; struct sprite *sprites; +struct sprite *first; static uint32_t VBO; -struct sprite *make_sprite(struct gameobject *go) +int make_sprite(int go) { - if (arrcap(sprites) == 0) - arrsetcap(sprites, 100); + YughInfo("Making sprite with gameobject %d", go); struct sprite sprite = { .color = {1.f, 1.f, 1.f}, .size = {1.f, 1.f}, - .tex = texture_loadfromfile("ph.png") }; - sprite_init(&sprite, go); - arrput(sprites, sprite); + .tex = texture_loadfromfile("ph.png"), + .go = go, + .next = NULL }; - return &arrlast(sprites); + int ret; + + if (!first) { + YughInfo("Making a brand new sprite."); + arrput(sprites, sprite); + arrlast(sprites).id = arrlen(sprites)-1; + return arrlen(sprites)-1; + } else { + YughInfo("Reusing a sprite slot."); + int slot = first->id; + struct sprite *next = first->next; + *first = sprite; + first->id = slot; + first = next; + + return slot; + } } -void sprite_init(struct sprite *sprite, struct gameobject *go) -{ - sprite->go = go; +struct sprite *id2sprite(int id) { + return &sprites[id]; } void sprite_io(struct sprite *sprite, FILE *f, int read) @@ -57,25 +72,20 @@ void sprite_io(struct sprite *sprite, FILE *f, int read) } } -void sprite_delete(struct sprite *sprite) +void sprite_delete(int id) { - YughInfo("Attempting to delete sprite, address is %p.", sprite); - YughInfo("Number of sprites is %d.", arrlen(sprites)); - for (int i = 0; i < arrlen(sprites); i++) { - YughInfo("Address of try sprite is %p.", &sprites[i]); - if (&sprites[i] == sprite) { - YughInfo("Deleted a sprite."); - arrdel(sprites, i); - return; - } - } + struct sprite *sp = id2sprite(id); + sp->go = -1; + sp->next = first; + first = sp; } void sprite_draw_all() { //shader_use(spriteShader); - for (int i = 0; i < arrlen(sprites); i++) - sprite_draw(&sprites[i]); + for (int i = 0; i < arrlen(sprites); i++) { + if (sprites[i].go >= 0) sprite_draw(&sprites[i]); + } } void sprite_loadtex(struct sprite *sprite, const char *path) @@ -155,19 +165,21 @@ void tex_draw(struct Texture *tex, float pos[2], float angle, float size[2], flo void sprite_draw(struct sprite *sprite) { + struct gameobject *go = id2go(sprite->go); + if (sprite->tex) { - cpVect cpos = cpBodyGetPosition(sprite->go->body); + cpVect cpos = cpBodyGetPosition(go->body); float pos[2] = {cpos.x, cpos.y}; if (sprite->tex->opts.animation) { float size[2]; - //size[0] = sprite->tex->anim.dimensions[0] * sprite->go->scale; - //size[1] = sprite->tex->anim.dimensions[1] * sprite->go->scale; - tex_draw(sprite->tex, pos, cpBodyGetAngle(sprite->go->body), size, sprite->pos, anim_get_rect(&sprite->anim)); + //size[0] = sprite->tex->anim.dimensions[0] * go->scale; + //size[1] = sprite->tex->anim.dimensions[1] * go->scale; + tex_draw(sprite->tex, pos, cpBodyGetAngle(go->body), size, sprite->pos, anim_get_rect(&sprite->anim)); } else { - float size[2] = { sprite->size[0] * sprite->go->scale * sprite->go->flipx, sprite->size[1] * sprite->go->scale * sprite->go->flipy }; + float size[2] = { sprite->size[0] * go->scale * go->flipx, sprite->size[1] * go->scale * go->flipy }; - tex_draw(sprite->tex, pos, cpBodyGetAngle(sprite->go->body), size, sprite->pos, tex_get_rect(sprite->tex)); + tex_draw(sprite->tex, pos, cpBodyGetAngle(go->body), size, sprite->pos, tex_get_rect(sprite->tex)); } } } diff --git a/source/engine/sprite.h b/source/engine/sprite.h index 184656e..4606d2d 100644 --- a/source/engine/sprite.h +++ b/source/engine/sprite.h @@ -10,22 +10,21 @@ struct datastream; struct gameobject; struct Texture; -struct timer; - struct sprite { mfloat_t pos[2]; mfloat_t size[2]; float rotation; mfloat_t color[3]; - + int go; + int id; struct TexAnimation anim; - struct gameobject *go; struct Texture *tex; + struct sprite *next; }; -struct sprite *make_sprite(struct gameobject *go); -void sprite_delete(struct sprite *sprite); -void sprite_init(struct sprite *sprite, struct gameobject *go); +int make_sprite(int go); +struct sprite *id2sprite(int id); +void sprite_delete(int id); void sprite_io(struct sprite *sprite, FILE *f, int read); void sprite_loadtex(struct sprite *sprite, const char *path); void sprite_settex(struct sprite *sprite, struct Texture *tex);