transform work
This commit is contained in:
parent
51438a5328
commit
f6161d04b0
2
Makefile
2
Makefile
|
@ -61,7 +61,7 @@ else
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += -DHAVE_CEIL -DCP_USE_CGTYPES=0 -DHAVE_FLOOR -DHAVE_FMOD -DHAVE_LRINT -DHAVE_LRINTF $(includeflag) -MD $(WARNING_FLAGS) -I. -DVER=\"$(VER)\" -DINFO=\"$(INFO)\"
|
CFLAGS += -DHAVE_CEIL -DCP_USE_CGTYPES=0 -DCP_USE_DOUBLES=0 -DTINYSPLINE_FLOAT_PRECISION -DHAVE_FLOOR -DHAVE_FMOD -DHAVE_LRINT -DHAVE_LRINTF $(includeflag) -MD $(WARNING_FLAGS) -I. -DVER=\"$(VER)\" -DINFO=\"$(INFO)\"
|
||||||
|
|
||||||
PKGCMD = tar --directory $(BIN) --exclude="./*.a" --exclude="./obj" -czf $(DISTDIR)/$(DIST) .
|
PKGCMD = tar --directory $(BIN) --exclude="./*.a" --exclude="./obj" -czf $(DISTDIR)/$(DIST) .
|
||||||
ZIP = .tar.gz
|
ZIP = .tar.gz
|
||||||
|
|
|
@ -55,7 +55,12 @@ var gameobject = {
|
||||||
get max_angularvelocity() { return Math.rad2deg(cmd(155, this.body)); },
|
get max_angularvelocity() { return Math.rad2deg(cmd(155, this.body)); },
|
||||||
set torque(x) { if (!(x >= 0 && x <= Infinity)) return; cmd(153, this.body, x); },
|
set torque(x) { if (!(x >= 0 && x <= Infinity)) return; cmd(153, this.body, x); },
|
||||||
gscale() { return cmd(103,this.body); },
|
gscale() { return cmd(103,this.body); },
|
||||||
sgscale(x) { cmd(36,this.body,x) },
|
sgscale(x) {
|
||||||
|
if (typeof x === 'number')
|
||||||
|
cmd(36,this.body, [x,x]);
|
||||||
|
else
|
||||||
|
cmd(36,this.body,x)
|
||||||
|
},
|
||||||
get scale() {
|
get scale() {
|
||||||
if (!this.level) return this.gscale();
|
if (!this.level) return this.gscale();
|
||||||
return this.gscale()/this.level.gscale();
|
return this.gscale()/this.level.gscale();
|
||||||
|
@ -64,7 +69,9 @@ var gameobject = {
|
||||||
if (this.level)
|
if (this.level)
|
||||||
x *= this.level.gscale();
|
x *= this.level.gscale();
|
||||||
var pct = x/this.gscale();
|
var pct = x/this.gscale();
|
||||||
cmd(36, this.body, x);
|
|
||||||
|
this.sgscale(x);
|
||||||
|
// cmd(36, this.body, x);
|
||||||
|
|
||||||
this.objects?.forEach(function(obj) {
|
this.objects?.forEach(function(obj) {
|
||||||
obj.sgscale(obj.gscale()*pct);
|
obj.sgscale(obj.gscale()*pct);
|
||||||
|
@ -72,29 +79,6 @@ var gameobject = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
get flipx() { return cmd(104,this.body); },
|
|
||||||
set flipx(x) {
|
|
||||||
cmd(55, this.body, x);
|
|
||||||
return;
|
|
||||||
this.objects.forEach(function(obj) {
|
|
||||||
obj.flipx = !obj.flipx;
|
|
||||||
var rp = obj.pos;
|
|
||||||
obj.pos = [-rp.x, rp.y].add(this.worldpos());
|
|
||||||
obj.angle = -obj.angle;
|
|
||||||
},this);
|
|
||||||
},
|
|
||||||
|
|
||||||
get flipy() { return cmd(105,this.body); },
|
|
||||||
set flipy(x) {
|
|
||||||
cmd(56, this.body, x);
|
|
||||||
return;
|
|
||||||
this.objects.forEach(function(obj) {
|
|
||||||
var rp = obj.pos;
|
|
||||||
obj.pos = [rp.x, -rp.y].add(this.worldpos());
|
|
||||||
obj.angle = -obj.angle;
|
|
||||||
},this);
|
|
||||||
},
|
|
||||||
|
|
||||||
set pos(x) {
|
set pos(x) {
|
||||||
this.set_worldpos(Vector.rotate(x.scale(this.level.gscale()),Math.deg2rad(this.level.worldangle())).add(this.level.worldpos()));
|
this.set_worldpos(Vector.rotate(x.scale(this.level.gscale()),Math.deg2rad(this.level.worldangle())).add(this.level.worldpos()));
|
||||||
},
|
},
|
||||||
|
|
|
@ -83,7 +83,7 @@ void querylistbodies(cpBody *body, void *data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int *phys2d_query_box_points(cpVect pos, cpVect wh, cpVect *points, int n) {
|
int *phys2d_query_box_points(HMM_Vec2 pos, HMM_Vec2 wh, HMM_Vec2 *points, int n) {
|
||||||
cpShape *box = cpBoxShapeNew(NULL, wh.x, wh.y, 0.f);
|
cpShape *box = cpBoxShapeNew(NULL, wh.x, wh.y, 0.f);
|
||||||
cpTransform T = {0};
|
cpTransform T = {0};
|
||||||
T.a = 1;
|
T.a = 1;
|
||||||
|
@ -97,7 +97,7 @@ int *phys2d_query_box_points(cpVect pos, cpVect wh, cpVect *points, int n) {
|
||||||
if (qhits) arrfree(qhits);
|
if (qhits) arrfree(qhits);
|
||||||
|
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
if (cpBBContainsVect(bbox, points[i]))
|
if (cpBBContainsVect(bbox, points[i].cp))
|
||||||
arrpush(qhits, i);
|
arrpush(qhits, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ int *phys2d_query_box_points(cpVect pos, cpVect wh, cpVect *points, int n) {
|
||||||
return qhits;
|
return qhits;
|
||||||
}
|
}
|
||||||
|
|
||||||
int *phys2d_query_box(cpVect pos, cpVect wh) {
|
int *phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh) {
|
||||||
cpShape *box = cpBoxShapeNew(NULL, wh.x, wh.y, 0.f);
|
cpShape *box = cpBoxShapeNew(NULL, wh.x, wh.y, 0.f);
|
||||||
cpTransform T = {0};
|
cpTransform T = {0};
|
||||||
T.a = 1;
|
T.a = 1;
|
||||||
|
@ -220,24 +220,21 @@ void phys2d_circledel(struct phys2d_circle *c) {
|
||||||
phys2d_shape_del(&c->shape);
|
phys2d_shape_del(&c->shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
HMM_Vec2 bodytransformpoint(cpBody *body, HMM_Vec2 offset) {
|
HMM_Vec2 bodytransformpoint(cpBody *body, cpVect offset) {
|
||||||
HMM_Vec2 pos;
|
HMM_Vec2 pos;
|
||||||
pos.cp = cpBodyGetPosition(body);
|
pos.cp = offset;
|
||||||
float d = sqrt(pow(offset.X, 2.f) + pow(offset.Y, 2.f));
|
struct gameobject *go = id2go(body2id(body));
|
||||||
float a = atan2(offset.Y, offset.X) + cpBodyGetAngle(body);
|
return go2world(go, pos);
|
||||||
pos.X += d * cos(a);
|
|
||||||
pos.Y += d * sin(a);
|
|
||||||
return pos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void phys2d_dbgdrawcpcirc(cpCircleShape *c) {
|
void phys2d_dbgdrawcpcirc(cpCircleShape *c) {
|
||||||
HMM_Vec2 pos = bodytransformpoint(cpShapeGetBody(c), (HMM_Vec2)cpCircleShapeGetOffset(c));
|
HMM_Vec2 pos = bodytransformpoint(cpShapeGetBody(c), cpCircleShapeGetOffset(c));
|
||||||
float radius = cpCircleShapeGetRadius(c);
|
float radius = cpCircleShapeGetRadius(c);
|
||||||
struct rgba color = shape_color(c);
|
struct rgba color = shape_color(c);
|
||||||
float seglen = cpShapeGetSensor(c) ? 5 : -1;
|
float seglen = cpShapeGetSensor(c) ? 5 : -1;
|
||||||
draw_circle(pos.cp, radius, 1, color, seglen);
|
draw_circle(pos, radius, 1, color, seglen);
|
||||||
color.a = col_alpha;
|
color.a = col_alpha;
|
||||||
draw_circle(pos.cp,radius,radius,color,-1);
|
draw_circle(pos,radius,radius,color,-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void phys2d_dbgdrawcircle(struct phys2d_circle *circle) {
|
void phys2d_dbgdrawcircle(struct phys2d_circle *circle) {
|
||||||
|
@ -247,7 +244,7 @@ void phys2d_dbgdrawcircle(struct phys2d_circle *circle) {
|
||||||
void phys2d_applycircle(struct phys2d_circle *circle) {
|
void phys2d_applycircle(struct phys2d_circle *circle) {
|
||||||
struct gameobject *go = id2go(circle->shape.go);
|
struct gameobject *go = id2go(circle->shape.go);
|
||||||
|
|
||||||
float radius = circle->radius * HMM_LenSqrV2(go->scale.XY);
|
float radius = circle->radius * HMM_MAX(HMM_ABS(go->scale.X), HMM_ABS(go->scale.Y));
|
||||||
cpCircleShapeSetRadius(circle->shape.shape, radius);
|
cpCircleShapeSetRadius(circle->shape.shape, radius);
|
||||||
|
|
||||||
cpCircleShapeSetOffset(circle->shape.shape, HMM_MulV2(go->scale.XY, circle->offset).cp);
|
cpCircleShapeSetOffset(circle->shape.shape, HMM_MulV2(go->scale.XY, circle->offset).cp);
|
||||||
|
@ -304,9 +301,13 @@ void phys2d_applybox(struct phys2d_box *box) {
|
||||||
void phys2d_dbgdrawbox(struct phys2d_box *box) {
|
void phys2d_dbgdrawbox(struct phys2d_box *box) {
|
||||||
int n = cpPolyShapeGetCount(box->shape.shape);
|
int n = cpPolyShapeGetCount(box->shape.shape);
|
||||||
HMM_Vec2 points[n * 2];
|
HMM_Vec2 points[n * 2];
|
||||||
|
struct gameobject *go = shape2go(box->shape.shape);
|
||||||
|
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++) {
|
||||||
points[i] = bodytransformpoint(cpShapeGetBody(box->shape.shape), cpPolyShapeGetVert(box->shape.shape, i)).cp;
|
HMM_Vec2 p;
|
||||||
|
p.cp = cpPolyShapeGetVert(box->shape.shape, i);
|
||||||
|
points[i] = go2world(go, p);
|
||||||
|
}
|
||||||
|
|
||||||
struct rgba c = shape_color(box->shape.shape);
|
struct rgba c = shape_color(box->shape.shape);
|
||||||
struct rgba cl = c;
|
struct rgba cl = c;
|
||||||
|
@ -382,7 +383,7 @@ void phys2d_dbgdrawpoly(struct phys2d_poly *poly) {
|
||||||
|
|
||||||
if (arrlen(poly->points) >= 3) {
|
if (arrlen(poly->points) >= 3) {
|
||||||
int n = cpPolyShapeGetCount(poly->shape.shape);
|
int n = cpPolyShapeGetCount(poly->shape.shape);
|
||||||
cpVect points[n];
|
HMM_Vec2 points[n];
|
||||||
|
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
points[i] = bodytransformpoint(cpShapeGetBody(poly->shape.shape), cpPolyShapeGetVert(poly->shape.shape, i));
|
points[i] = bodytransformpoint(cpShapeGetBody(poly->shape.shape), cpPolyShapeGetVert(poly->shape.shape, i));
|
||||||
|
@ -513,7 +514,7 @@ void phys2d_dbgdrawedge(struct phys2d_edge *edge) {
|
||||||
|
|
||||||
for (int i = 0; i < arrlen(edge->points); i++) {
|
for (int i = 0; i < arrlen(edge->points); i++) {
|
||||||
drawpoints[i] = goscale(go, edge->points[i]);
|
drawpoints[i] = goscale(go, edge->points[i]);
|
||||||
drawpoints[i] = bodytransformpoint(cpShapeGetBody(edge->shapes[0]), drawpoints[i]);
|
drawpoints[i] = bodytransformpoint(cpShapeGetBody(edge->shapes[0]), drawpoints[i].cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
float seglen = cpShapeGetSensor(edge->shapes[0]) ? sensor_seg : 0;
|
float seglen = cpShapeGetSensor(edge->shapes[0]) ? sensor_seg : 0;
|
||||||
|
@ -580,7 +581,7 @@ void flush_collide_cbs() {
|
||||||
arrsetlen(begins,0);
|
arrsetlen(begins,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void duk_call_phys_cb(cpVect norm, struct callee c, int hit, cpArbiter *arb) {
|
void duk_call_phys_cb(HMM_Vec2 norm, struct callee c, int hit, cpArbiter *arb) {
|
||||||
cpShape *shape1;
|
cpShape *shape1;
|
||||||
cpShape *shape2;
|
cpShape *shape2;
|
||||||
cpArbiterGetShapes(arb, &shape1, &shape2);
|
cpArbiterGetShapes(arb, &shape1, &shape2);
|
||||||
|
@ -589,8 +590,11 @@ void duk_call_phys_cb(cpVect norm, struct callee c, int hit, cpArbiter *arb) {
|
||||||
JS_SetPropertyStr(js, obj, "normal", vec2js(norm));
|
JS_SetPropertyStr(js, obj, "normal", vec2js(norm));
|
||||||
JS_SetPropertyStr(js, obj, "hit", JS_NewInt32(js, hit));
|
JS_SetPropertyStr(js, obj, "hit", JS_NewInt32(js, hit));
|
||||||
JS_SetPropertyStr(js, obj, "sensor", JS_NewBool(js, cpShapeGetSensor(shape2)));
|
JS_SetPropertyStr(js, obj, "sensor", JS_NewBool(js, cpShapeGetSensor(shape2)));
|
||||||
JS_SetPropertyStr(js, obj, "velocity", vec2js(cpArbiterGetSurfaceVelocity(arb)));
|
HMM_Vec2 srfv;
|
||||||
JS_SetPropertyStr(js, obj, "pos", vec2js(cpArbiterGetPointA(arb, 0)));
|
srfv.cp = cpArbiterGetSurfaceVelocity(arb);
|
||||||
|
JS_SetPropertyStr(js, obj, "velocity", vec2js(srfv));
|
||||||
|
srfv.cp = cpArbiterGetPointA(arb,0);
|
||||||
|
JS_SetPropertyStr(js, obj, "pos", vec2js(srfv));
|
||||||
JS_SetPropertyStr(js,obj,"depth", num2js(cpArbiterGetDepth(arb,0)));
|
JS_SetPropertyStr(js,obj,"depth", num2js(cpArbiterGetDepth(arb,0)));
|
||||||
JS_SetPropertyStr(js, obj, "id", JS_NewInt32(js,hit));
|
JS_SetPropertyStr(js, obj, "id", JS_NewInt32(js,hit));
|
||||||
JS_SetPropertyStr(js,obj,"obj", JS_DupValue(js,id2go(hit)->ref));
|
JS_SetPropertyStr(js,obj,"obj", JS_DupValue(js,id2go(hit)->ref));
|
||||||
|
@ -619,7 +623,8 @@ static cpBool handle_collision(cpArbiter *arb, int type) {
|
||||||
struct phys2d_shape *pshape1 = cpShapeGetUserData(shape1);
|
struct phys2d_shape *pshape1 = cpShapeGetUserData(shape1);
|
||||||
struct phys2d_shape *pshape2 = cpShapeGetUserData(shape2);
|
struct phys2d_shape *pshape2 = cpShapeGetUserData(shape2);
|
||||||
|
|
||||||
cpVect norm1 = cpArbiterGetNormal(arb);
|
HMM_Vec2 norm1;
|
||||||
|
norm1.cp = cpArbiterGetNormal(arb);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case CTYPE_BEGIN:
|
case CTYPE_BEGIN:
|
||||||
|
|
|
@ -109,7 +109,7 @@ void phys2d_edge_set_enabled(struct phys2d_edge *edge, int enabled);
|
||||||
void phys2d_init();
|
void phys2d_init();
|
||||||
void phys2d_update(float deltaT);
|
void phys2d_update(float deltaT);
|
||||||
cpShape *phys2d_query_pos(cpVect pos);
|
cpShape *phys2d_query_pos(cpVect pos);
|
||||||
int *phys2d_query_box(cpVect pos, cpVect wh);
|
int *phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh);
|
||||||
|
|
||||||
struct phys_cbs {
|
struct phys_cbs {
|
||||||
struct callee begin;
|
struct callee begin;
|
||||||
|
@ -136,7 +136,7 @@ struct rgba shape_color_s(cpShape *shape);
|
||||||
void shape_gui(struct phys2d_shape *shape);
|
void shape_gui(struct phys2d_shape *shape);
|
||||||
void phys2d_setup_handlers(int go);
|
void phys2d_setup_handlers(int go);
|
||||||
int *phys2d_query_shape(struct phys2d_shape *shape);
|
int *phys2d_query_shape(struct phys2d_shape *shape);
|
||||||
int *phys2d_query_box_points(cpVect pos, cpVect wh, cpVect *points, int n);
|
int *phys2d_query_box_points(HMM_Vec2 pos, HMM_Vec2 wh, HMM_Vec2 *points, int n);
|
||||||
|
|
||||||
void flush_collide_cbs();
|
void flush_collide_cbs();
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -212,7 +212,6 @@ void debugdraw_init()
|
||||||
});
|
});
|
||||||
|
|
||||||
csg = sg_make_shader(circle_shader_desc(sg_query_backend()));
|
csg = sg_make_shader(circle_shader_desc(sg_query_backend()));
|
||||||
|
|
||||||
circle_pipe = sg_make_pipeline(&(sg_pipeline_desc){
|
circle_pipe = sg_make_pipeline(&(sg_pipeline_desc){
|
||||||
.shader = csg,
|
.shader = csg,
|
||||||
.layout = {
|
.layout = {
|
||||||
|
@ -295,15 +294,15 @@ void debugdraw_init()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_line(cpVect *a_points, int n, struct rgba color, float seg_len, int closed, float seg_speed)
|
void draw_line(HMM_Vec2 *a_points, int n, struct rgba color, float seg_len, int closed, float seg_speed)
|
||||||
{
|
{
|
||||||
if (n < 2) return;
|
if (n < 2) return;
|
||||||
cpVect *points = a_points;
|
HMM_Vec2 *points = a_points;
|
||||||
seg_speed = 1;
|
seg_speed = 1;
|
||||||
if (closed) {
|
if (closed) {
|
||||||
n++;
|
n++;
|
||||||
points = malloc(sizeof(cpVect) * n);
|
points = malloc(sizeof(HMM_Vec2) * n);
|
||||||
memcpy(points, a_points, sizeof(cpVect)*(n-1));
|
memcpy(points, a_points, sizeof(HMM_Vec2)*(n-1));
|
||||||
|
|
||||||
points[n-1] = points[0];
|
points[n-1] = points[0];
|
||||||
}
|
}
|
||||||
|
@ -321,7 +320,7 @@ void draw_line(cpVect *a_points, int n, struct rgba color, float seg_len, int cl
|
||||||
|
|
||||||
v[0].dist = 0;
|
v[0].dist = 0;
|
||||||
for (int i = 1; i < n; i++) {
|
for (int i = 1; i < n; i++) {
|
||||||
dist += cpvdist(points[i-1], points[i]);
|
dist += HMM_DistV2(points[i-1], points[i]);
|
||||||
v[i].dist = dist;
|
v[i].dist = dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,9 +351,9 @@ void draw_line(cpVect *a_points, int n, struct rgba color, float seg_len, int cl
|
||||||
if (closed) free(points);
|
if (closed) free(points);
|
||||||
}
|
}
|
||||||
|
|
||||||
cpVect center_of_vects(cpVect *v, int n)
|
HMM_Vec2 center_of_vects(HMM_Vec2 *v, int n)
|
||||||
{
|
{
|
||||||
cpVect c;
|
HMM_Vec2 c;
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
c.x += v[i].x;
|
c.x += v[i].x;
|
||||||
c.y += v[i].y;
|
c.y += v[i].y;
|
||||||
|
@ -365,15 +364,15 @@ cpVect center_of_vects(cpVect *v, int n)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
float vecs2m(cpVect a, cpVect b)
|
float vecs2m(HMM_Vec2 a, HMM_Vec2 b)
|
||||||
{
|
{
|
||||||
return (b.y-a.y)/(b.x-a.x);
|
return (b.y-a.y)/(b.x-a.x);
|
||||||
}
|
}
|
||||||
|
|
||||||
cpVect *inflatepoints(cpVect *p, float d, int n)
|
HMM_Vec2 *inflatepoints(HMM_Vec2 *p, float d, int n)
|
||||||
{
|
{
|
||||||
if (d == 0) {
|
if (d == 0) {
|
||||||
cpVect *ret = NULL;
|
HMM_Vec2 *ret = NULL;
|
||||||
arraddn(ret,n);
|
arraddn(ret,n);
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
ret[i] = p[i];
|
ret[i] = p[i];
|
||||||
|
@ -402,7 +401,7 @@ cpVect *inflatepoints(cpVect *p, float d, int n)
|
||||||
.closed = 0,
|
.closed = 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
cpVect *ret = NULL;
|
HMM_Vec2 *ret = NULL;
|
||||||
arraddn(ret,mesh->num_vertices);
|
arraddn(ret,mesh->num_vertices);
|
||||||
for (int i = 0; i < mesh->num_vertices; i++) {
|
for (int i = 0; i < mesh->num_vertices; i++) {
|
||||||
ret[i].x = mesh->positions[i].x;
|
ret[i].x = mesh->positions[i].x;
|
||||||
|
@ -411,16 +410,16 @@ cpVect *inflatepoints(cpVect *p, float d, int n)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_edge(cpVect *points, int n, struct rgba color, int thickness, int closed, int flags, struct rgba line_color, float line_seg)
|
void draw_edge(HMM_Vec2 *points, int n, struct rgba color, int thickness, int closed, int flags, struct rgba line_color, float line_seg)
|
||||||
{
|
{
|
||||||
// static_assert(sizeof(cpVect) == 2*sizeof(float));
|
// static_assert(sizeof(HMM_Vec2) == 2*sizeof(float));
|
||||||
if (thickness == 0) {
|
if (thickness == 0) {
|
||||||
draw_line(points,n,color,0,closed,0);
|
draw_line(points,n,color,0,closed,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* todo: should be dashed, and filled. use a texture. */
|
/* todo: should be dashed, and filled. use a texture. */
|
||||||
/* draw polygon outline */
|
/* draw polygon outline */
|
||||||
if (cpveql(points[0], points[n-1])) {
|
if (HMM_EqV2(points[0], points[n-1])) {
|
||||||
closed = true;
|
closed = true;
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
|
@ -471,8 +470,8 @@ void draw_edge(cpVect *points, int n, struct rgba color, int thickness, int clos
|
||||||
if (thickness == 1) {
|
if (thickness == 1) {
|
||||||
draw_line(points,n,line_color,line_seg, closed, 0);
|
draw_line(points,n,line_color,line_seg, closed, 0);
|
||||||
} else {
|
} else {
|
||||||
cpVect in_p[n];
|
HMM_Vec2 in_p[n];
|
||||||
cpVect out_p[n];
|
HMM_Vec2 out_p[n];
|
||||||
|
|
||||||
for (int i = 0, v = 0; i < n*2+1; i+=2, v++) {
|
for (int i = 0, v = 0; i < n*2+1; i+=2, v++) {
|
||||||
in_p[v].x = vertices[i].pos.x;
|
in_p[v].x = vertices[i].pos.x;
|
||||||
|
@ -485,7 +484,7 @@ void draw_edge(cpVect *points, int n, struct rgba color, int thickness, int clos
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!closed) {
|
if (!closed) {
|
||||||
cpVect p[n*2];
|
HMM_Vec2 p[n*2];
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
p[i] = in_p[i];
|
p[i] = in_p[i];
|
||||||
for (int i = n-1, v = n; i >= 0; i--,v++)
|
for (int i = n-1, v = n; i >= 0; i--,v++)
|
||||||
|
@ -500,7 +499,7 @@ void draw_edge(cpVect *points, int n, struct rgba color, int thickness, int clos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_circle(cpVect pos, float radius, float pixels, struct rgba color, float seg)
|
void draw_circle(HMM_Vec2 pos, float radius, float pixels, struct rgba color, float seg)
|
||||||
{
|
{
|
||||||
struct circle_vertex cv;
|
struct circle_vertex cv;
|
||||||
cv.pos.x = pos.x;
|
cv.pos.x = pos.x;
|
||||||
|
@ -513,12 +512,12 @@ void draw_circle(cpVect pos, float radius, float pixels, struct rgba color, floa
|
||||||
circle_count++;
|
circle_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_box(struct cpVect c, struct cpVect wh, struct rgba color)
|
void draw_box(HMM_Vec2 c, HMM_Vec2 wh, struct rgba color)
|
||||||
{
|
{
|
||||||
float hw = wh.x / 2.f;
|
float hw = wh.x / 2.f;
|
||||||
float hh = wh.y / 2.f;
|
float hh = wh.y / 2.f;
|
||||||
|
|
||||||
cpVect verts[4] = {
|
HMM_Vec2 verts[4] = {
|
||||||
{ .x = c.x-hw, .y = c.y-hh },
|
{ .x = c.x-hw, .y = c.y-hh },
|
||||||
{ .x = c.x+hw, .y = c.y-hh },
|
{ .x = c.x+hw, .y = c.y-hh },
|
||||||
{ .x = c.x+hw, .y = c.y+hh },
|
{ .x = c.x+hw, .y = c.y+hh },
|
||||||
|
@ -528,17 +527,17 @@ void draw_box(struct cpVect c, struct cpVect wh, struct rgba color)
|
||||||
draw_poly(verts, 4, color);
|
draw_poly(verts, 4, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_arrow(struct cpVect start, struct cpVect end, struct rgba color, int capsize)
|
void draw_arrow(HMM_Vec2 start, HMM_Vec2 end, struct rgba color, int capsize)
|
||||||
{
|
{
|
||||||
cpVect points[2] = {start, end};
|
HMM_Vec2 points[2] = {start, end};
|
||||||
draw_line(points, 2, color, 0, 0,0);
|
draw_line(points, 2, color, 0, 0,0);
|
||||||
draw_cppoint(end, capsize, color);
|
draw_cppoint(end, capsize, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_grid(float width, float span, struct rgba color)
|
void draw_grid(float width, float span, struct rgba color)
|
||||||
{
|
{
|
||||||
cpVect offset = cam_pos();
|
HMM_Vec2 offset = (HMM_Vec2)cam_pos();
|
||||||
offset = cpvmult(offset, 1/cam_zoom());
|
offset = HMM_MulV2F(offset, 1/cam_zoom());
|
||||||
|
|
||||||
float ubo[4];
|
float ubo[4];
|
||||||
ubo[0] = offset.x;
|
ubo[0] = offset.x;
|
||||||
|
@ -560,25 +559,25 @@ void draw_grid(float width, float span, struct rgba color)
|
||||||
sg_draw(0,4,1);
|
sg_draw(0,4,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_cppoint(struct cpVect point, float r, struct rgba color)
|
void draw_cppoint(HMM_Vec2 point, float r, struct rgba color)
|
||||||
{
|
{
|
||||||
struct point_vertex p = {
|
struct point_vertex p = {
|
||||||
.color = color,
|
.color = color,
|
||||||
.radius = r
|
.radius = r
|
||||||
};
|
};
|
||||||
p.pos.x = point.x;
|
p.pos.x = point.X;
|
||||||
p.pos.y = point.y;
|
p.pos.y = point.Y;
|
||||||
sg_append_buffer(point_bind.vertex_buffers[0], &(sg_range){.ptr = &p, .size = sizeof(struct point_vertex)});
|
sg_append_buffer(point_bind.vertex_buffers[0], &(sg_range){.ptr = &p, .size = sizeof(struct point_vertex)});
|
||||||
point_c++;
|
point_c++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_points(struct cpVect *points, int n, float size, struct rgba color)
|
void draw_points(HMM_Vec2 *points, int n, float size, struct rgba color)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
draw_cppoint(points[i], size, color);
|
draw_cppoint(points[i], size, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_poly(cpVect *points, int n, struct rgba color)
|
void draw_poly(HMM_Vec2 *points, int n, struct rgba color)
|
||||||
{
|
{
|
||||||
/* Find polygon mesh */
|
/* Find polygon mesh */
|
||||||
int tric = n - 2;
|
int tric = n - 2;
|
||||||
|
|
|
@ -6,17 +6,17 @@
|
||||||
struct rgba;
|
struct rgba;
|
||||||
|
|
||||||
void debugdraw_init();
|
void debugdraw_init();
|
||||||
void draw_cppoint(struct cpVect point, float r, struct rgba color);
|
void draw_cppoint(HMM_Vec2 point, float r, struct rgba color);
|
||||||
void draw_points(struct cpVect *points, int n, float size, struct rgba color);
|
void draw_points(HMM_Vec2 *points, int n, float size, struct rgba color);
|
||||||
|
|
||||||
void draw_line(cpVect *points, int n, struct rgba color, float seg_len, int closed, float seg_speed);
|
void draw_line(HMM_Vec2 *points, int n, struct rgba color, float seg_len, int closed, float seg_speed);
|
||||||
void draw_arrow(struct cpVect start, struct cpVect end, struct rgba, int capsize);
|
void draw_arrow(HMM_Vec2 start, HMM_Vec2 end, struct rgba, int capsize);
|
||||||
void draw_edge(struct cpVect *points, int n, struct rgba color, int thickness, int closed, int flags, struct rgba line_color, float line_seg);
|
void draw_edge(HMM_Vec2 *points, int n, struct rgba color, int thickness, int closed, int flags, struct rgba line_color, float line_seg);
|
||||||
|
|
||||||
/* pixels - how many pixels thick, segsize - dashed line seg len */
|
/* pixels - how many pixels thick, segsize - dashed line seg len */
|
||||||
void draw_circle(cpVect c, float radius, float pixels, struct rgba color, float seg);
|
void draw_circle(HMM_Vec2 c, float radius, float pixels, struct rgba color, float seg);
|
||||||
void draw_box(cpVect c, cpVect wh, struct rgba color);
|
void draw_box(HMM_Vec2 c, HMM_Vec2 wh, struct rgba color);
|
||||||
void draw_poly(cpVect *points, int n, struct rgba color);
|
void draw_poly(HMM_Vec2 *points, int n, struct rgba color);
|
||||||
|
|
||||||
void draw_grid(float width, float span, struct rgba color);
|
void draw_grid(float width, float span, struct rgba color);
|
||||||
|
|
||||||
|
@ -24,6 +24,6 @@ void debug_flush(HMM_Mat4 *view);
|
||||||
void debug_newframe();
|
void debug_newframe();
|
||||||
void debug_nextpass();
|
void debug_nextpass();
|
||||||
|
|
||||||
cpVect *inflatepoints(cpVect *p, float d, int n);
|
HMM_Vec2 *inflatepoints(HMM_Vec2 *p, float d, int n);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -188,7 +188,7 @@ void draw_underline_cursor(HMM_Vec2 pos, float scale, struct rgba color)
|
||||||
|
|
||||||
void draw_char_box(struct Character c, HMM_Vec2 cursor, float scale, struct rgba color)
|
void draw_char_box(struct Character c, HMM_Vec2 cursor, float scale, struct rgba color)
|
||||||
{
|
{
|
||||||
cpVect wh;
|
HMM_Vec2 wh;
|
||||||
color.a = 30;
|
color.a = 30;
|
||||||
|
|
||||||
wh.x = c.Size[0] * scale + 2;
|
wh.x = c.Size[0] * scale + 2;
|
||||||
|
@ -196,7 +196,7 @@ void draw_char_box(struct Character c, HMM_Vec2 cursor, float scale, struct rgba
|
||||||
cursor.X += c.Bearing[0] * scale + 1;
|
cursor.X += c.Bearing[0] * scale + 1;
|
||||||
cursor.Y -= (c.Bearing[1] * scale + 1);
|
cursor.Y -= (c.Bearing[1] * scale + 1);
|
||||||
|
|
||||||
cpVect b;
|
HMM_Vec2 b;
|
||||||
b.x = cursor.X + wh.x/2;
|
b.x = cursor.X + wh.x/2;
|
||||||
b.y = cursor.Y + wh.y/2;
|
b.y = cursor.Y + wh.y/2;
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ HMM_Vec2 world2go(struct gameobject *go, HMM_Vec2 pos)
|
||||||
return HMM_MulM3V3(t_world2go(go), (HMM_Vec3){pos.X, pos.Y, 1.0}).XY;
|
return HMM_MulM3V3(t_world2go(go), (HMM_Vec3){pos.X, pos.Y, 1.0}).XY;
|
||||||
}
|
}
|
||||||
|
|
||||||
HMM_Vec2 goscale(struct gameobject *go, HMM_Vec2 pos);
|
HMM_Vec2 goscale(struct gameobject *go, HMM_Vec2 pos)
|
||||||
{
|
{
|
||||||
return HMM_MulV2(go->scale.XY, pos);
|
return HMM_MulV2(go->scale.XY, pos);
|
||||||
}
|
}
|
||||||
|
@ -116,8 +116,8 @@ HMM_Mat3 t_world2go(struct gameobject *go)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int pos2gameobject(cpVect pos) {
|
int pos2gameobject(HMM_Vec2 pos) {
|
||||||
cpShape *hit = phys2d_query_pos(pos);
|
cpShape *hit = phys2d_query_pos(pos.cp);
|
||||||
|
|
||||||
if (hit) {
|
if (hit) {
|
||||||
return shape2gameobject(hit);
|
return shape2gameobject(hit);
|
||||||
|
@ -126,7 +126,7 @@ int pos2gameobject(cpVect pos) {
|
||||||
for (int i = 0; i < arrlen(gameobjects); i++) {
|
for (int i = 0; i < arrlen(gameobjects); i++) {
|
||||||
if (!gameobjects[i].body) continue;
|
if (!gameobjects[i].body) continue;
|
||||||
cpVect gpos = cpBodyGetPosition(gameobjects[i].body);
|
cpVect gpos = cpBodyGetPosition(gameobjects[i].body);
|
||||||
float dist = cpvlength(cpvsub(gpos, pos));
|
float dist = cpvlength(cpvsub(gpos, pos.cp));
|
||||||
|
|
||||||
if (dist <= 25) return i;
|
if (dist <= 25) return i;
|
||||||
}
|
}
|
||||||
|
@ -332,7 +332,7 @@ void gameobjects_cleanup() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gameobject_move(struct gameobject *go, cpVect vec) {
|
void gameobject_move(struct gameobject *go, HMM_Vec2 vec) {
|
||||||
cpVect p = cpBodyGetPosition(go->body);
|
cpVect p = cpBodyGetPosition(go->body);
|
||||||
p.x += vec.x;
|
p.x += vec.x;
|
||||||
p.y += vec.y;
|
p.y += vec.y;
|
||||||
|
|
|
@ -80,9 +80,9 @@ uint32_t go2mask(struct gameobject *go);
|
||||||
void go_shape_apply(cpBody *body, cpShape *shape, struct gameobject *go);
|
void go_shape_apply(cpBody *body, cpShape *shape, struct gameobject *go);
|
||||||
|
|
||||||
/* Tries a few methods to select a gameobject; if none is selected returns -1 */
|
/* Tries a few methods to select a gameobject; if none is selected returns -1 */
|
||||||
int pos2gameobject(cpVect pos);
|
int pos2gameobject(HMM_Vec2 pos);
|
||||||
|
|
||||||
void gameobject_move(struct gameobject *go, cpVect vec);
|
void gameobject_move(struct gameobject *go, HMM_Vec2 vec);
|
||||||
void gameobject_rotate(struct gameobject *go, float as);
|
void gameobject_rotate(struct gameobject *go, float as);
|
||||||
void gameobject_setangle(struct gameobject *go, float angle);
|
void gameobject_setangle(struct gameobject *go, float angle);
|
||||||
void gameobject_setpos(struct gameobject *go, cpVect vec);
|
void gameobject_setpos(struct gameobject *go, cpVect vec);
|
||||||
|
|
|
@ -16,9 +16,9 @@ float deltaT = 0;
|
||||||
static int mouse_states[3] = {INPUT_UP};
|
static int mouse_states[3] = {INPUT_UP};
|
||||||
static int key_states[512] = {INPUT_UP};
|
static int key_states[512] = {INPUT_UP};
|
||||||
|
|
||||||
cpVect mousewheel = {0,0};
|
HMM_Vec2 mousewheel = {0,0};
|
||||||
cpVect mouse_pos = {0, 0};
|
HMM_Vec2 mouse_pos = {0, 0};
|
||||||
cpVect mouse_delta = {0, 0};
|
HMM_Vec2 mouse_delta = {0, 0};
|
||||||
|
|
||||||
struct joystick {
|
struct joystick {
|
||||||
int id;
|
int id;
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
#include <chipmunk/chipmunk.h>
|
#include <chipmunk/chipmunk.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
extern cpVect mousewheel;
|
extern HMM_Vec2 mousewheel;
|
||||||
extern cpVect mouse_pos;
|
extern HMM_Vec2 mouse_pos;
|
||||||
extern cpVect mouse_delta;
|
extern HMM_Vec2 mouse_delta;
|
||||||
|
|
||||||
#define INPUT_DOWN 0
|
#define INPUT_DOWN 0
|
||||||
#define INPUT_UP 1
|
#define INPUT_UP 1
|
||||||
|
|
|
@ -214,7 +214,7 @@ struct boundingbox js2bb(JSValue v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HMM_Vec2 js2hmmv2(JSValue v)
|
HMM_Vec2 js2vec2(JSValue v)
|
||||||
{
|
{
|
||||||
HMM_Vec2 v2;
|
HMM_Vec2 v2;
|
||||||
v2.X = js2number(js_getpropidx(v,0));
|
v2.X = js2number(js_getpropidx(v,0));
|
||||||
|
@ -222,13 +222,6 @@ HMM_Vec2 js2hmmv2(JSValue v)
|
||||||
return v2;
|
return v2;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpVect js2vec2(JSValue v) {
|
|
||||||
cpVect vect;
|
|
||||||
vect.x = js2number(js_getpropidx(v,0));
|
|
||||||
vect.y = js2number(js_getpropidx(v,1));
|
|
||||||
return vect;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpBitmask js2bitmask(JSValue v) {
|
cpBitmask js2bitmask(JSValue v) {
|
||||||
cpBitmask mask = 0;
|
cpBitmask mask = 0;
|
||||||
int len = js_arrlen(v);
|
int len = js_arrlen(v);
|
||||||
|
@ -243,10 +236,10 @@ cpBitmask js2bitmask(JSValue v) {
|
||||||
return mask;
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpVect *cpvecarr = NULL;
|
HMM_Vec2 *cpvecarr = NULL;
|
||||||
|
|
||||||
/* Does not need to be freed by returning; but not reentrant */
|
/* Does not need to be freed by returning; but not reentrant */
|
||||||
cpVect *js2cpvec2arr(JSValue v) {
|
HMM_Vec2 *js2cpvec2arr(JSValue v) {
|
||||||
if (cpvecarr)
|
if (cpvecarr)
|
||||||
arrfree(cpvecarr);
|
arrfree(cpvecarr);
|
||||||
|
|
||||||
|
@ -266,12 +259,12 @@ JSValue bitmask2js(cpBitmask mask) {
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vec2float(cpVect v, float *f) {
|
void vec2float(HMM_Vec2 v, float *f) {
|
||||||
f[0] = v.x;
|
f[0] = v.x;
|
||||||
f[1] = v.y;
|
f[1] = v.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSValue vec2js(cpVect v) {
|
JSValue vec2js(HMM_Vec2 v) {
|
||||||
JSValue array = JS_NewArray(js);
|
JSValue array = JS_NewArray(js);
|
||||||
js_setprop_num(array,0,JS_NewFloat64(js,v.x));
|
js_setprop_num(array,0,JS_NewFloat64(js,v.x));
|
||||||
js_setprop_num(array,1,JS_NewFloat64(js,v.y));
|
js_setprop_num(array,1,JS_NewFloat64(js,v.y));
|
||||||
|
@ -280,11 +273,11 @@ JSValue vec2js(cpVect v) {
|
||||||
|
|
||||||
JSValue v22js(HMM_Vec2 v)
|
JSValue v22js(HMM_Vec2 v)
|
||||||
{
|
{
|
||||||
cpVect c = { v.X, v.Y };
|
HMM_Vec2 c = { v.X, v.Y };
|
||||||
return vec2js(c);
|
return vec2js(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSValue vecarr2js(cpVect *points, int n) {
|
JSValue vecarr2js(HMM_Vec2 *points, int n) {
|
||||||
JSValue array = JS_NewArray(js);
|
JSValue array = JS_NewArray(js);
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
js_setprop_num(array,i,vec2js(points[i]));
|
js_setprop_num(array,i,vec2js(points[i]));
|
||||||
|
@ -294,7 +287,7 @@ JSValue vecarr2js(cpVect *points, int n) {
|
||||||
|
|
||||||
JSValue duk_ui_text(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_ui_text(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
const unsigned char *s = JS_ToCString(js, argv[0]);
|
const unsigned char *s = JS_ToCString(js, argv[0]);
|
||||||
HMM_Vec2 pos = js2hmmv2(argv[1]);
|
HMM_Vec2 pos = js2vec2(argv[1]);
|
||||||
|
|
||||||
float size = js2number(argv[2]);
|
float size = js2number(argv[2]);
|
||||||
struct rgba c = js2color(argv[3]);
|
struct rgba c = js2color(argv[3]);
|
||||||
|
@ -330,7 +323,7 @@ int js_print_exception(JSValue v)
|
||||||
|
|
||||||
JSValue duk_gui_img(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_gui_img(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
const char *img = JS_ToCString(js, argv[0]);
|
const char *img = JS_ToCString(js, argv[0]);
|
||||||
gui_draw_img(img, js2hmmv2(argv[1]), js2hmmv2(argv[2]), js2number(argv[3]), js2bool(argv[4]), js2hmmv2(argv[5]), 1.0, js2color(argv[6]));
|
gui_draw_img(img, js2vec2(argv[1]), js2vec2(argv[2]), js2number(argv[3]), js2bool(argv[4]), js2vec2(argv[5]), 1.0, js2color(argv[6]));
|
||||||
JS_FreeCString(js, img);
|
JS_FreeCString(js, img);
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
}
|
}
|
||||||
|
@ -366,14 +359,14 @@ JSValue bb2js(struct boundingbox bb)
|
||||||
|
|
||||||
|
|
||||||
JSValue duk_spline_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_spline_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
static_assert(sizeof(tsReal) * 2 == sizeof(cpVect));
|
static_assert(sizeof(tsReal) * 2 == sizeof(HMM_Vec2));
|
||||||
|
|
||||||
tsBSpline spline;
|
tsBSpline spline;
|
||||||
|
|
||||||
int degrees = js2int(argv[1]);
|
int degrees = js2int(argv[1]);
|
||||||
int d = js2int(argv[2]); /* dimensions */
|
int d = js2int(argv[2]); /* dimensions */
|
||||||
int type = js2int(argv[3]);
|
int type = js2int(argv[3]);
|
||||||
cpVect *points = js2cpvec2arr(argv[4]);
|
HMM_Vec2 *points = js2cpvec2arr(argv[4]);
|
||||||
size_t nsamples = js2int(argv[5]);
|
size_t nsamples = js2int(argv[5]);
|
||||||
|
|
||||||
tsStatus status;
|
tsStatus status;
|
||||||
|
@ -387,7 +380,7 @@ JSValue duk_spline_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst
|
||||||
if (status.code)
|
if (status.code)
|
||||||
YughCritical("Spline creation error %d: %s", status.code, status.message);
|
YughCritical("Spline creation error %d: %s", status.code, status.message);
|
||||||
|
|
||||||
cpVect *samples = malloc(nsamples*sizeof(cpVect));
|
HMM_Vec2 *samples = malloc(nsamples*sizeof(HMM_Vec2));
|
||||||
|
|
||||||
size_t rsamples;
|
size_t rsamples;
|
||||||
/* TODO: This does not work with Clang/GCC due to UB */
|
/* TODO: This does not work with Clang/GCC due to UB */
|
||||||
|
@ -412,20 +405,20 @@ JSValue ints2js(int *ints) {
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vec_between(cpVect p, cpVect a, cpVect b) {
|
int vec_between(HMM_Vec2 p, HMM_Vec2 a, HMM_Vec2 b) {
|
||||||
cpVect n;
|
HMM_Vec2 n;
|
||||||
n.x = b.x - a.x;
|
n.x = b.x - a.x;
|
||||||
n.y = b.y - a.y;
|
n.y = b.y - a.y;
|
||||||
n = cpvnormalize(n);
|
n = HMM_NormV2(n);
|
||||||
|
|
||||||
return (cpvdot(n, cpvsub(p, a)) > 0 && cpvdot(cpvneg(n), cpvsub(p, b)) > 0);
|
return HMM_DotV2(n, HMM_SubV2(p,a)) > 0 && HMM_DotV2(HMM_MulV2F(n, -1), HMM_SubV2(p,b)) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determines between which two points in 'segs' point 'p' falls.
|
/* Determines between which two points in 'segs' point 'p' falls.
|
||||||
0 indicates 'p' comes before the first point.
|
0 indicates 'p' comes before the first point.
|
||||||
arrlen(segs) indicates it comes after the last point.
|
arrlen(segs) indicates it comes after the last point.
|
||||||
*/
|
*/
|
||||||
int point2segindex(cpVect p, cpVect *segs, double slop) {
|
int point2segindex(HMM_Vec2 p, HMM_Vec2 *segs, double slop) {
|
||||||
float shortest = slop < 0 ? INFINITY : slop;
|
float shortest = slop < 0 ? INFINITY : slop;
|
||||||
int best = -1;
|
int best = -1;
|
||||||
|
|
||||||
|
@ -444,10 +437,10 @@ int point2segindex(cpVect p, cpVect *segs, double slop) {
|
||||||
shortest = dist;
|
shortest = dist;
|
||||||
best = i + 1;
|
best = i + 1;
|
||||||
} else {
|
} else {
|
||||||
if (i == 0 && cpvdist(p, segs[0]) < slop) {
|
if (i == 0 && HMM_DistV2(p,segs[0]) < slop) {
|
||||||
shortest = dist;
|
shortest = dist;
|
||||||
best = i;
|
best = i;
|
||||||
} else if (i == arrlen(segs) - 2 && cpvdist(p, arrlast(segs)) < slop) {
|
} else if (i == arrlen(segs) - 2 && HMM_DistV2(p,arrlast(segs)) < slop) {
|
||||||
shortest = dist;
|
shortest = dist;
|
||||||
best = arrlen(segs);
|
best = arrlen(segs);
|
||||||
}
|
}
|
||||||
|
@ -455,12 +448,12 @@ int point2segindex(cpVect p, cpVect *segs, double slop) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (best == 1) {
|
if (best == 1) {
|
||||||
cpVect n;
|
HMM_Vec2 n;
|
||||||
n.x = segs[1].x - segs[0].x;
|
n.x = segs[1].x - segs[0].x;
|
||||||
n.y = segs[1].y - segs[0].y;
|
n.y = segs[1].y - segs[0].y;
|
||||||
n = cpvnormalize(n);
|
n = HMM_NormV2(n);
|
||||||
if (cpvdot(n, cpvsub(p, segs[0])) < 0) {
|
if (HMM_DotV2(n, HMM_SubV2(p,segs[0])) < 0 ){
|
||||||
if (cpvdist(p, segs[0]) >= slop)
|
if (HMM_DistV2(p, segs[0]) >= slop)
|
||||||
best = -1;
|
best = -1;
|
||||||
else
|
else
|
||||||
best = 0;
|
best = 0;
|
||||||
|
@ -468,13 +461,13 @@ int point2segindex(cpVect p, cpVect *segs, double slop) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (best == arrlen(segs) - 1) {
|
if (best == arrlen(segs) - 1) {
|
||||||
cpVect n;
|
HMM_Vec2 n;
|
||||||
n.x = segs[best - 1].x - segs[best].x;
|
n.x = segs[best - 1].x - segs[best].x;
|
||||||
n.y = segs[best - 1].y - segs[best - 1].y;
|
n.y = segs[best - 1].y - segs[best - 1].y;
|
||||||
n = cpvnormalize(n);
|
n = HMM_NormV2(n);
|
||||||
|
|
||||||
if (cpvdot(n, cpvsub(p, segs[best])) < 0) {
|
if (HMM_DotV2(n, HMM_SubV2(p, segs[best])) < 0) {
|
||||||
if (cpvdist(p, segs[best]) >= slop)
|
if (HMM_DistV2(p, segs[best]) >= slop)
|
||||||
best = -1;
|
best = -1;
|
||||||
else
|
else
|
||||||
best = arrlen(segs);
|
best = arrlen(segs);
|
||||||
|
@ -530,7 +523,7 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
phys2d_set_gravity(js2vec2(argv[1]));
|
phys2d_set_gravity(js2vec2(argv[1]).cp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
|
@ -647,15 +640,14 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36:
|
case 36:
|
||||||
id2go(js2int(argv[1]))->scale = js2number(argv[2]);
|
id2go(js2int(argv[1]))->scale.XY = js2vec2(argv[2]);
|
||||||
id2go(js2int(argv[1]))->scale3 = HMM_V3i(js2number(argv[2]));
|
|
||||||
gameobject_apply(id2go(js2int(argv[1])));
|
gameobject_apply(id2go(js2int(argv[1])));
|
||||||
cpSpaceReindexShapesForBody(space, id2go(js2int(argv[1]))->body);
|
cpSpaceReindexShapesForBody(space, id2go(js2int(argv[1]))->body);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 37:
|
case 37:
|
||||||
if (!id2sprite(js2int(argv[1]))) break;
|
if (!id2sprite(js2int(argv[1]))) break;
|
||||||
id2sprite(js2int(argv[1]))->pos = js2hmmv2(argv[2]);
|
id2sprite(js2int(argv[1]))->pos = js2vec2(argv[2]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 38:
|
case 38:
|
||||||
|
@ -733,19 +725,19 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 55:
|
case 55:
|
||||||
js2go(argv[1])->flipx = JS_ToBool(js, argv[2]) ? -1 : 1;
|
|
||||||
break;
|
break;
|
||||||
|
// js2go(argv[1])->flipx = JS_ToBool(js, argv[2]) ? -1 : 1;
|
||||||
|
|
||||||
case 56:
|
case 56:
|
||||||
js2go(argv[1])->flipy = JS_ToBool(js, argv[2]) ? -1 : 1;
|
// js2go(argv[1])->flipy = JS_ToBool(js, argv[2]) ? -1 : 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 57:
|
case 57:
|
||||||
ret = JS_NewBool(js, js2go(argv[1])->flipx == -1 ? 1 : 0);
|
// ret = JS_NewBool(js, js2go(argv[1])->flipx == -1 ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 58:
|
case 58:
|
||||||
ret = JS_NewBool(js, js2go(argv[1])->flipy == -1 ? 1 : 0);
|
// ret = JS_NewBool(js, js2go(argv[1])->flipy == -1 ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 59:
|
case 59:
|
||||||
|
@ -804,7 +796,7 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 72:
|
case 72:
|
||||||
ret = vec2js(cpSpaceGetGravity(space));
|
ret = vec2js((HMM_Vec2)cpSpaceGetGravity(space));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 73:
|
case 73:
|
||||||
|
@ -855,7 +847,7 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 85:
|
case 85:
|
||||||
ret = vec2js(cpvproject(js2vec2(argv[1]), js2vec2(argv[2])));
|
ret = vec2js(HMM_ProjV2(js2vec2(argv[1]), js2vec2(argv[2])));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 86:
|
case 86:
|
||||||
|
@ -934,15 +926,15 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 103:
|
case 103:
|
||||||
ret = num2js(js2go(argv[1])->scale);
|
ret = num2js(js2go(argv[1])->scale.X);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 104:
|
case 104:
|
||||||
ret = bool2js(js2go(argv[1])->flipx == -1 ? 1 : 0);
|
// ret = bool2js(js2go(argv[1])->flipx == -1 ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 105:
|
case 105:
|
||||||
ret = bool2js(js2go(argv[1])->flipy == -1 ? 1 : 0);
|
// ret = bool2js(js2go(argv[1])->flipy == -1 ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 106:
|
case 106:
|
||||||
|
@ -1070,11 +1062,11 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 136:
|
case 136:
|
||||||
ret = v22js(world2screen(js2hmmv2(argv[1])));
|
ret = v22js(world2screen(js2vec2(argv[1])));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 137:
|
case 137:
|
||||||
ret = v22js(screen2world(js2hmmv2(argv[1])));
|
ret = v22js(screen2world(js2vec2(argv[1])));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 138:
|
case 138:
|
||||||
|
@ -1355,7 +1347,7 @@ JSValue duk_set_body(JSContext *js, JSValueConst this, int argc, JSValueConst *a
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
cpBodySetPosition(go->body, js2vec2(argv[2]));
|
cpBodySetPosition(go->body, js2vec2(argv[2]).cp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -1363,15 +1355,15 @@ JSValue duk_set_body(JSContext *js, JSValueConst this, int argc, JSValueConst *a
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
cpBodyApplyImpulseAtWorldPoint(go->body, js2vec2(argv[2]), cpBodyGetPosition(go->body));
|
cpBodyApplyImpulseAtWorldPoint(go->body, js2vec2(argv[2]).cp, cpBodyGetPosition(go->body));
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
go->flipx = JS_ToBool(js, argv[2]);
|
// go->flipx = JS_ToBool(js, argv[2]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
go->flipy = JS_ToBool(js, argv[2]);
|
// go->flipy = JS_ToBool(js, argv[2]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
|
@ -1385,7 +1377,7 @@ JSValue duk_set_body(JSContext *js, JSValueConst this, int argc, JSValueConst *a
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
cpBodySetVelocity(go->body, js2vec2(argv[2]));
|
cpBodySetVelocity(go->body, js2vec2(argv[2]).cp);
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
|
|
||||||
case 10:
|
case 10:
|
||||||
|
@ -1397,14 +1389,14 @@ JSValue duk_set_body(JSContext *js, JSValueConst this, int argc, JSValueConst *a
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
cpBodyApplyForceAtWorldPoint(go->body, js2vec2(argv[2]), cpBodyGetPosition(go->body));
|
cpBodyApplyForceAtWorldPoint(go->body, js2vec2(argv[2]).cp, cpBodyGetPosition(go->body));
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
|
|
||||||
case 13:
|
case 13:
|
||||||
cpBodySetMoment(go->body, js2number(argv[2]));
|
cpBodySetMoment(go->body, js2number(argv[2]));
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
case 14:
|
case 14:
|
||||||
cpBodyApplyForceAtLocalPoint(go->body, js2vec2(argv[2]), js2vec2(argv[3]));
|
cpBodyApplyForceAtLocalPoint(go->body, js2vec2(argv[2]).cp, js2vec2(argv[3]).cp);
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1425,13 +1417,13 @@ JSValue duk_q_body(JSContext *js, JSValueConst this, int argc, JSValueConst *arg
|
||||||
return JS_NewInt64(js, cpBodyGetType(go->body));
|
return JS_NewInt64(js, cpBodyGetType(go->body));
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
return vec2js(cpBodyGetPosition(go->body));
|
return vec2js((HMM_Vec2)cpBodyGetPosition(go->body));
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
return JS_NewFloat64(js, cpBodyGetAngle(go->body));
|
return JS_NewFloat64(js, cpBodyGetAngle(go->body));
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
return vec2js(cpBodyGetVelocity(go->body));
|
return vec2js((HMM_Vec2)cpBodyGetVelocity(go->body));
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
return JS_NewFloat64(js, cpBodyGetAngularVelocity(go->body));
|
return JS_NewFloat64(js, cpBodyGetAngularVelocity(go->body));
|
||||||
|
@ -1474,14 +1466,12 @@ JSValue duk_make_anim2d(JSContext *js, JSValueConst this, int argc, JSValueConst
|
||||||
|
|
||||||
JSValue duk_make_box2d(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_make_box2d(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
int go = js2int(argv[0]);
|
int go = js2int(argv[0]);
|
||||||
cpVect size = js2vec2(argv[1]);
|
HMM_Vec2 size = js2vec2(argv[1]);
|
||||||
cpVect offset = js2vec2(argv[2]);
|
|
||||||
|
|
||||||
struct phys2d_box *box = Make2DBox(go);
|
struct phys2d_box *box = Make2DBox(go);
|
||||||
box->w = size.x;
|
box->w = size.x;
|
||||||
box->h = size.y;
|
box->h = size.y;
|
||||||
box->offset[0] = offset.x;
|
box->offset = js2vec2(argv[2]);
|
||||||
box->offset[1] = offset.y;
|
|
||||||
|
|
||||||
phys2d_applybox(box);
|
phys2d_applybox(box);
|
||||||
|
|
||||||
|
@ -1494,7 +1484,7 @@ JSValue duk_make_box2d(JSContext *js, JSValueConst this, int argc, JSValueConst
|
||||||
JSValue duk_cmd_box2d(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_cmd_box2d(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
int cmd = js2int(argv[0]);
|
int cmd = js2int(argv[0]);
|
||||||
struct phys2d_box *box = js2ptr(argv[1]);
|
struct phys2d_box *box = js2ptr(argv[1]);
|
||||||
cpVect arg;
|
HMM_Vec2 arg;
|
||||||
|
|
||||||
if (!box) return JS_NULL;
|
if (!box) return JS_NULL;
|
||||||
|
|
||||||
|
@ -1506,9 +1496,7 @@ JSValue duk_cmd_box2d(JSContext *js, JSValueConst this, int argc, JSValueConst *
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
arg = js2vec2(argv[2]);
|
box->offset = js2vec2(argv[2]);
|
||||||
box->offset[0] = arg.x;
|
|
||||||
box->offset[1] = arg.y;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -1596,12 +1584,12 @@ JSValue duk_make_edge2d(JSContext *js, JSValueConst this, int argc, JSValueConst
|
||||||
struct phys2d_edge *edge = Make2DEdge(go);
|
struct phys2d_edge *edge = Make2DEdge(go);
|
||||||
|
|
||||||
int n = js_arrlen(argv[1]);
|
int n = js_arrlen(argv[1]);
|
||||||
cpVect points[n];
|
HMM_Vec2 points[n];
|
||||||
|
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
points[i] = js2vec2(js_getpropidx(argv[1],i));
|
points[i] = js2vec2(js_getpropidx(argv[1],i));
|
||||||
phys2d_edgeaddvert(edge);
|
phys2d_edgeaddvert(edge);
|
||||||
phys2d_edge_setvert(edge, i, points[i]);
|
phys2d_edge_setvert(edge, i, points[i].cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSValue edgeval = JS_NewObject(js);
|
JSValue edgeval = JS_NewObject(js);
|
||||||
|
@ -1634,10 +1622,10 @@ JSValue duk_cmd_edge2d(JSContext *js, JSValueConst this, int argc, JSValueConst
|
||||||
}
|
}
|
||||||
|
|
||||||
JSValue duk_inflate_cpv(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_inflate_cpv(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
cpVect *points = js2cpvec2arr(argv[0]);
|
HMM_Vec2 *points = js2cpvec2arr(argv[0]);
|
||||||
int n = js2int(argv[1]);
|
int n = js2int(argv[1]);
|
||||||
double d = js2number(argv[2]);
|
double d = js2number(argv[2]);
|
||||||
cpVect *infl = inflatepoints(points,d,n);
|
HMM_Vec2 *infl = inflatepoints(points,d,n);
|
||||||
JSValue arr = vecarr2js(infl,arrlen(infl));
|
JSValue arr = vecarr2js(infl,arrlen(infl));
|
||||||
arrfree(infl);
|
arrfree(infl);
|
||||||
return arr;
|
return arr;
|
||||||
|
@ -1653,7 +1641,7 @@ JSValue duk_anim(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
|
|
||||||
for (int i = 0; i < keyframes; i++) {
|
for (int i = 0; i < keyframes; i++) {
|
||||||
struct keyframe k;
|
struct keyframe k;
|
||||||
cpVect v = js2vec2(js_getpropidx( argv[1], i));
|
HMM_Vec2 v = js2vec2(js_getpropidx( argv[1], i));
|
||||||
k.time = v.y;
|
k.time = v.y;
|
||||||
k.val = v.x;
|
k.val = v.x;
|
||||||
a = anim_add_keyframe(a, k);
|
a = anim_add_keyframe(a, k);
|
||||||
|
@ -1680,7 +1668,7 @@ JSValue duk_make_timer(JSContext *js, JSValueConst this, int argc, JSValueConst
|
||||||
JSValue duk_cmd_points(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
JSValue duk_cmd_points(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
{
|
{
|
||||||
int n = js_arrlen(argv[1]);
|
int n = js_arrlen(argv[1]);
|
||||||
cpVect points[n];
|
HMM_Vec2 points[n];
|
||||||
|
|
||||||
for (int i = 0; i < n; i++)
|
for (int i = 0; i < n; i++)
|
||||||
points[i] = js2vec2(js_arridx(argv[1], i));
|
points[i] = js2vec2(js_arridx(argv[1], i));
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
|
|
||||||
void ffi_load();
|
void ffi_load();
|
||||||
|
|
||||||
JSValue vec2js(cpVect v);
|
JSValue vec2js(HMM_Vec2 v);
|
||||||
cpVect js2vec2(JSValue v);
|
HMM_Vec2 js2vec2(JSValue v);
|
||||||
|
|
||||||
JSValue bitmask2js(cpBitmask mask);
|
JSValue bitmask2js(cpBitmask mask);
|
||||||
cpBitmask js2bitmask(JSValue v);
|
cpBitmask js2bitmask(JSValue v);
|
||||||
|
|
|
@ -219,7 +219,7 @@ void trace_make_pipeline(const sg_pipeline_desc *d, sg_pipeline result, void *da
|
||||||
|
|
||||||
void trace_apply_pipeline(sg_pipeline pip, void *data)
|
void trace_apply_pipeline(sg_pipeline pip, void *data)
|
||||||
{
|
{
|
||||||
// YughInfo("Applying pipeline %d", pip);
|
YughInfo("Applying pipeline %d", pip);
|
||||||
}
|
}
|
||||||
|
|
||||||
void trace_fail_pipeline(sg_pipeline pip, void *data)
|
void trace_fail_pipeline(sg_pipeline pip, void *data)
|
||||||
|
|
|
@ -261,7 +261,7 @@ void callee_int(struct callee c, int i) {
|
||||||
JS_FreeValue(js, v);
|
JS_FreeValue(js, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void callee_vec2(struct callee c, cpVect vec) {
|
void callee_vec2(struct callee c, HMM_Vec2 vec) {
|
||||||
JSValue v = vec2js(vec);
|
JSValue v = vec2js(vec);
|
||||||
js_callee_exec(&c, 1, &v);
|
js_callee_exec(&c, 1, &v);
|
||||||
JS_FreeValue(js, v);
|
JS_FreeValue(js, v);
|
||||||
|
|
|
@ -357,9 +357,9 @@ struct glrect tex_get_rect(struct Texture *tex) {
|
||||||
return ST_UNIT;
|
return ST_UNIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpVect tex_get_dimensions(struct Texture *tex) {
|
HMM_Vec2 tex_get_dimensions(struct Texture *tex) {
|
||||||
if (!tex) return cpvzero;
|
if (!tex) return (HMM_Vec2){0,0};
|
||||||
cpVect d;
|
HMM_Vec2 d;
|
||||||
d.x = tex->width;
|
d.x = tex->width;
|
||||||
d.y = tex->height;
|
d.y = tex->height;
|
||||||
return d;
|
return d;
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include <chipmunk/chipmunk.h>
|
#include <chipmunk/chipmunk.h>
|
||||||
#include "sokol/sokol_gfx.h"
|
#include "sokol/sokol_gfx.h"
|
||||||
|
#include "HandmadeMath.h"
|
||||||
|
|
||||||
|
|
||||||
#define TEX_SPEC 0
|
#define TEX_SPEC 0
|
||||||
|
@ -105,7 +106,7 @@ void anim_decr(struct anim2d *anim);
|
||||||
int gif_nframes(const char *path);
|
int gif_nframes(const char *path);
|
||||||
|
|
||||||
struct glrect tex_get_rect(struct Texture *tex);
|
struct glrect tex_get_rect(struct Texture *tex);
|
||||||
cpVect tex_get_dimensions(struct Texture *tex);
|
HMM_Vec2 tex_get_dimensions(struct Texture *tex);
|
||||||
struct glrect anim_get_rect(struct anim2d *anim);
|
struct glrect anim_get_rect(struct anim2d *anim);
|
||||||
|
|
||||||
int anim_frames(struct TexAnim *a);
|
int anim_frames(struct TexAnim *a);
|
||||||
|
|
Loading…
Reference in a new issue