component rework

This commit is contained in:
John Alanbrook 2023-01-03 15:06:36 +00:00
parent 09036d075d
commit 7ce8cd22ad
6 changed files with 78 additions and 62 deletions

View file

@ -15,6 +15,10 @@
#include "log.h" #include "log.h"
#include "registry.h"
register_component(0, 0, 0, 0, 0, 0, 0, 0, 0);
cpSpace *space = NULL; cpSpace *space = NULL;
float phys2d_gravity = -50.f; float phys2d_gravity = -50.f;
@ -88,13 +92,26 @@ void circle_gui(struct phys2d_circle *circle)
phys2d_applycircle(circle); phys2d_applycircle(circle);
} }
void phys2d_dbgdrawcpcirc(cpCircleShape *c)
{
cpVect pos = cpBodyGetPosition(cpShapeGetBody(c));
cpVect offset = cpCircleShapeGetOffset(c);
float radius = cpCircleShapeGetRadius(c);
float d = sqrt(pow(offset.x, 2.f) + pow(offset.y, 2.f));
float a = atan2(offset.y, offset.x) + cpBodyGetAngle(cpShapeGetBody(c));
draw_circle(pos.x + (d * cos(a)), pos.y + (d*sin(a)), radius, 1);
}
void phys2d_dbgdrawcircle(struct phys2d_circle *circle) void phys2d_dbgdrawcircle(struct phys2d_circle *circle)
{ {
phys2d_dbgdrawcpcirc((cpCircleShape *)circle->shape.shape);
/*
cpVect p = cpBodyGetPosition(circle->shape.go->body); cpVect p = cpBodyGetPosition(circle->shape.go->body);
cpVect o = cpCircleShapeGetOffset(circle->shape.shape); cpVect o = cpCircleShapeGetOffset(circle->shape.shape);
float d = sqrt(pow(o.x, 2.f) + pow(o.y, 2.f)); 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(circle->shape.go->body);
draw_circle(p.x + (d * cos(a)), p.y + (d * sin(a)), cpCircleShapeGetRadius(circle->shape.shape), 1); draw_circle(p.x + (d * cos(a)), p.y + (d * sin(a)), cpCircleShapeGetRadius(circle->shape.shape), 1);
*/
} }
struct phys2d_segment *Make2DSegment(struct gameobject *go) struct phys2d_segment *Make2DSegment(struct gameobject *go)

View file

@ -68,12 +68,13 @@ int MakeGameobject()
return arrlen(gameobjects)-1; return arrlen(gameobjects)-1;
} }
void gameobject_addcomponent(struct gameobject *go, struct component *c) void gameobject_addcomponent(struct gameobject *go, struct component_interface *c)
{ {
arrput(go->components, *c); struct component new;
struct component *newc = &arrlast(go->components); new.interface = c;
newc->go = go; new.data = c->make(go);
newc->data = newc->make(newc->go); new.go = go;
arrput(go->components, c);
} }
void gameobject_delete(int id) void gameobject_delete(int id)

View file

@ -541,7 +541,9 @@ s7_pointer s7_make_circ2d(s7_scheme *sc, s7_pointer args) {
circle->offset[0] = offset.x; circle->offset[0] = offset.x;
circle->offset[1] = offset.y; circle->offset[1] = offset.y;
phys2d_applycircle(circle); phys2d_circleinit(circle, get_gameobject_from_id(go));
return s7_make_integer(sc, get_gameobject_from_id(go));
} }
#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, "")

View file

@ -3,25 +3,14 @@
#include "2dphysics.h" #include "2dphysics.h"
#include "editor.h" #include "editor.h"
#include "sprite.h" #include "sprite.h"
#include "stb_ds.h"
struct component components[MAXNAME] = { 0 }; struct component *components;
struct component_interface *interfaces;
int ncomponent = 0;
#define REGISTER_COMP(NAME) register_component(#NAME, sizeof(struct NAME), make_NAME, dbgdraw_NAME, NAME_gui, NAME_init,
void registry_init() void registry_init()
{ {
/*
REGISTER_COMP(sprite);
REGISTER_COMP(2d_circle);
REGISTER_COMP(2d_segment);
REGISTER_COMP(2d_box);
REGISTER_COMP(2d_polygon);
REGISTER_COMP(2d_edge);
*/
register_component("Sprite", register_component("Sprite",
sizeof(struct sprite), sizeof(struct sprite),
make_sprite, make_sprite,
@ -40,41 +29,59 @@ void registry_init()
circle_gui, circle_gui,
phys2d_circleinit); phys2d_circleinit);
register_component("2D Segment", sizeof(struct phys2d_segment), phys2d_segdel, NULL, Make2DSegment, phys2d_dbgdrawseg, segment_gui, phys2d_seginit); 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 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 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); 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 register_component(const char *name, size_t size,
void (*make)(struct gameobject * go, struct component * c), void (*make)(struct gameobject * go),
void (*delete)(void *data), void (*delete)(void *data),
void (*io)(void *data, FILE *f, int read), void (*io)(void *data, FILE *f, int read),
void(*draw_debug)(void *data), void(*draw_debug)(void *data),
void(*draw_gui)(void *data), void(*draw_gui)(void *data),
void(*init)(void *data, struct gameobject * go)) void(*init)(void *data, struct gameobject * go))
{ {
struct component *c = &components[ncomponent++]; struct component_interface c;
c->name = name; c.name = name;
c->make = make; c.make = make;
c->io = io; c.io = io;
c->draw_debug = draw_debug; c.draw_debug = draw_debug;
c->draw_gui = draw_gui; c.draw_gui = draw_gui;
c->init = init; c.delete = delete;
c->data = NULL; c.init = init;
c->delete = delete; arrput(interfaces, c);
c->id = ncomponent - 1; }
c->datasize = size;
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) { void comp_draw_debug(struct component *c) {
c->draw_debug(c->data); c->ref->draw_debug(c->data);
} }
void comp_draw_gui(struct component *c) { void comp_draw_gui(struct component *c) {
c->draw_gui(c->data); c->ref->draw_gui(c->data);
} }
void c_draw_debug(struct compref *c) { void comp_delete(struct component *c)
c->ref->draw_debug(c->data); {
c->ref->delete(c->data);
}
void comp_init(struct component *c)
{
c->ref->init(c->data);
}
void comp_io(struct component *c, int read)
{
c->ref->io(c->data, read);
} }

View file

@ -8,30 +8,29 @@
struct gameobject; struct gameobject;
struct compref { struct component_interface {
void *data; const char *name;
struct component *ref; 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 { struct component {
const char *name;
void *(*make)(struct gameobject * go); /* Called to create the component */
void (*io)(void *data, FILE *f, int read); /* Pulls data from a component file into the component */
void *data; void *data;
struct gameobject *go; struct gameobject *go;
void (*draw_debug)(void *data); /* Draw debugging info in editor */ struct component_interface *ref;
void (*draw_gui)(void *data); /* Use to draw GUI for editing the component in editor */
void (*delete)(void *data); /* Deletes and cleans up component */
int id;
int datasize;
void (*init)(void *data, struct gameobject * go); /* Inits the component */
}; };
extern struct component components[MAXNAME]; struct component comp_make(struct component_interface *interface);
extern int ncomponent;
void comp_draw_debug(struct component *c); void comp_draw_debug(struct component *c);
void comp_draw_gui(struct component *c); void comp_draw_gui(struct component *c);
void comp_delete(struct component *c);
void comp_init(struct component *c);
void comp_io(struct component *c, int read);
void comp_update(struct component *c, struct gameobject *go); void comp_update(struct component *c, struct gameobject *go);

View file

@ -14,8 +14,6 @@
#include "yugine.h" #include "yugine.h"
#include "2dphysics.h" #include "2dphysics.h"
#include "parson.h"
#if ED #if ED
#include "editor.h" #include "editor.h"
#endif #endif
@ -152,14 +150,6 @@ int main(int argc, char **args) {
engine_init(); engine_init();
JSON_Value *rv = json_value_init_object();
JSON_Object *ro = json_value_get_object(rv);
json_object_set_string(ro, "name", "yugine");
json_object_set_number(ro, "age", 30);
char *serialized = json_serialize_to_file(rv, "test2.json");
json_value_free(rv);
const GLFWvidmode *vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); const GLFWvidmode *vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
YughInfo("Refresh rate is %d", vidmode->refreshRate); YughInfo("Refresh rate is %d", vidmode->refreshRate);