physics fixes
This commit is contained in:
parent
a8f7f20d6e
commit
591f48c703
5
Makefile
5
Makefile
|
@ -13,6 +13,11 @@ QFLAGS :=
|
||||||
ifdef DBG
|
ifdef DBG
|
||||||
QFLAGS += -O0 -g -DDBG
|
QFLAGS += -O0 -g -DDBG
|
||||||
INFO = dbg
|
INFO = dbg
|
||||||
|
|
||||||
|
ifeq ($(CC),tcc)
|
||||||
|
QFLAGS +=
|
||||||
|
endif
|
||||||
|
|
||||||
else
|
else
|
||||||
QFLAGS += -O2
|
QFLAGS += -O2
|
||||||
INFO = rel
|
INFO = rel
|
||||||
|
|
|
@ -173,6 +173,7 @@ void phys2d_set_gravity(cpVect v) {
|
||||||
|
|
||||||
void phys2d_update(float deltaT) {
|
void phys2d_update(float deltaT) {
|
||||||
cpSpaceStep(space, deltaT);
|
cpSpaceStep(space, deltaT);
|
||||||
|
flush_collide_cbs();
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_phys2dshape(struct phys2d_shape *shape, int go, void *data) {
|
void init_phys2dshape(struct phys2d_shape *shape, int go, void *data) {
|
||||||
|
@ -262,9 +263,9 @@ void phys2d_dbgdrawcpcirc(cpCircleShape *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.x, pos.y, radius, 1, color, seglen);
|
draw_circle(pos, radius, 1, color, seglen);
|
||||||
color.a = col_alpha;
|
color.a = col_alpha;
|
||||||
draw_circle(pos.x,pos.y,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) {
|
||||||
|
@ -586,6 +587,21 @@ void phys2d_reindex_body(cpBody *body) {
|
||||||
cpSpaceReindexShapesForBody(space, body);
|
cpSpaceReindexShapesForBody(space, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct postphys_cb {
|
||||||
|
struct callee c;
|
||||||
|
JSValue send;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct postphys_cb begins[512];
|
||||||
|
static uint32_t bptr;
|
||||||
|
|
||||||
|
void flush_collide_cbs() {
|
||||||
|
for (int i = 0; i < bptr; i++)
|
||||||
|
script_callee(begins[i].c, 1, &begins[i].send);
|
||||||
|
|
||||||
|
bptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void duk_call_phys_cb(cpVect norm, struct callee c, int hit, cpArbiter *arb) {
|
void duk_call_phys_cb(cpVect norm, struct callee c, int hit, cpArbiter *arb) {
|
||||||
cpShape *shape1;
|
cpShape *shape1;
|
||||||
cpShape *shape2;
|
cpShape *shape2;
|
||||||
|
@ -599,7 +615,11 @@ void duk_call_phys_cb(cpVect norm, struct callee c, int hit, cpArbiter *arb) {
|
||||||
JS_SetPropertyStr(js, obj, "pos", vec2js(cpArbiterGetPointA(arb, 0)));
|
JS_SetPropertyStr(js, obj, "pos", vec2js(cpArbiterGetPointA(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));
|
||||||
script_callee(c, 1, &obj);
|
|
||||||
|
begins[bptr].c = c;
|
||||||
|
begins[bptr].send = obj;
|
||||||
|
bptr++;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CTYPE_BEGIN 0
|
#define CTYPE_BEGIN 0
|
||||||
|
|
|
@ -138,6 +138,8 @@ 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(cpVect pos, cpVect wh, cpVect *points, int n);
|
||||||
|
|
||||||
|
void flush_collide_cbs();
|
||||||
|
|
||||||
void phys2d_reindex_body(cpBody *body);
|
void phys2d_reindex_body(cpBody *body);
|
||||||
cpVect world2go(struct gameobject *go, cpVect worldpos);
|
cpVect world2go(struct gameobject *go, cpVect worldpos);
|
||||||
cpVect go2world(struct gameobject *go, cpVect gopos);
|
cpVect go2world(struct gameobject *go, cpVect gopos);
|
||||||
|
|
|
@ -70,7 +70,7 @@ static sg_bindings circle_bind;
|
||||||
static sg_shader csg;
|
static sg_shader csg;
|
||||||
static int circle_count = 0;
|
static int circle_count = 0;
|
||||||
struct circle_vertex {
|
struct circle_vertex {
|
||||||
float pos[2];
|
cpVect pos;
|
||||||
float radius;
|
float radius;
|
||||||
struct rgba color;
|
struct rgba color;
|
||||||
float segsize;
|
float segsize;
|
||||||
|
@ -507,11 +507,10 @@ void draw_edge(cpVect *points, int n, struct rgba color, int thickness, int clos
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_circle(int x, int y, float radius, float pixels, struct rgba color, float seg)
|
void draw_circle(cpVect pos, float radius, float pixels, struct rgba color, float seg)
|
||||||
{
|
{
|
||||||
struct circle_vertex cv;
|
struct circle_vertex cv;
|
||||||
cv.pos[0] = x;
|
cv.pos = pos;
|
||||||
cv.pos[1] = y;
|
|
||||||
cv.radius = radius;
|
cv.radius = radius;
|
||||||
cv.color = color;
|
cv.color = color;
|
||||||
cv.segsize = seg/radius;
|
cv.segsize = seg/radius;
|
||||||
|
|
|
@ -13,8 +13,8 @@ void draw_arrow(struct cpVect start, struct cpVect 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(struct cpVect *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(int x, int y, float radius, float pixels, struct rgba color, float seg);
|
void draw_circle(cpVect c, float radius, float pixels, struct rgba color, float seg);
|
||||||
void draw_box(struct cpVect c, struct cpVect wh, struct rgba color);
|
void draw_box(cpVect c, cpVect wh, struct rgba color);
|
||||||
void draw_poly(cpVect *points, int n, struct rgba color);
|
void draw_poly(cpVect *points, int n, struct rgba color);
|
||||||
|
|
||||||
void draw_grid(int width, int span, struct rgba color);
|
void draw_grid(int width, int span, struct rgba color);
|
||||||
|
|
|
@ -19,9 +19,8 @@ int logLevel = 1;
|
||||||
3 critical
|
3 critical
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//char *logstr[] = { "INFO", "WARN", "\x1b[1;31mERROR\x1b[0m", "CRITICAL" };
|
|
||||||
char *logstr[] = { "info", "warn", "error", "critical" };
|
char *logstr[] = { "info", "warn", "error", "critical" };
|
||||||
char *catstr[] = {"engine", "script"};
|
char *catstr[] = {"engine", "script", "render"};
|
||||||
|
|
||||||
FILE *logfile = NULL;
|
FILE *logfile = NULL;
|
||||||
|
|
||||||
|
@ -48,12 +47,12 @@ void mYughLog(int category, int priority, int line, const char *file, const char
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
char buffer[ERROR_BUFFER] = { '\0' };
|
char buffer[ERROR_BUFFER] = { '\0' };
|
||||||
snprintf(buffer, ERROR_BUFFER, "%g | %s:%d: %s, %s: %s\n", ticks, file, line, logstr[priority], catstr[category], msgbuffer);
|
snprintf(buffer, ERROR_BUFFER, "%s:%d: %s, %s: %s\n", file, line, logstr[priority], catstr[category], msgbuffer);
|
||||||
|
|
||||||
log_print(buffer);
|
log_print(buffer);
|
||||||
|
|
||||||
if (category == 1 && priority >= 2)
|
// if (category != LOG_SCRIPT && priority >= 2)
|
||||||
js_stacktrace();
|
// js_stacktrace();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,10 @@
|
||||||
#define LOG_ERROR 2
|
#define LOG_ERROR 2
|
||||||
#define LOG_CRITICAL 3
|
#define LOG_CRITICAL 3
|
||||||
|
|
||||||
|
#define LOG_ENGINE 0
|
||||||
|
#define LOG_SCRIPT 1
|
||||||
|
#define LOG_RENDER 2
|
||||||
|
|
||||||
#define M_PI 3.14
|
#define M_PI 3.14
|
||||||
|
|
||||||
extern char lastlog[];
|
extern char lastlog[];
|
||||||
|
|
|
@ -1017,6 +1017,10 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
|
|
||||||
case 114:
|
case 114:
|
||||||
return bool2js(js2sprite(argv[1])->enabled);
|
return bool2js(js2sprite(argv[1])->enabled);
|
||||||
|
|
||||||
|
case 115:
|
||||||
|
draw_circle(js2vec2(argv[1]), js2number(argv[2]), js2number(argv[2]), js2color(argv[3]), -1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str)
|
if (str)
|
||||||
|
|
|
@ -98,7 +98,7 @@ int js_print_exception(JSValue v) {
|
||||||
const char *name = JS_ToCString(js, JS_GetPropertyStr(js, exception, "name"));
|
const char *name = JS_ToCString(js, JS_GetPropertyStr(js, exception, "name"));
|
||||||
const char *msg = JS_ToCString(js, JS_GetPropertyStr(js, exception, "message"));
|
const char *msg = JS_ToCString(js, JS_GetPropertyStr(js, exception, "message"));
|
||||||
const char *stack = JS_ToCString(js, val);
|
const char *stack = JS_ToCString(js, val);
|
||||||
YughWarn("%s :: %s\n%s", name, msg,stack);
|
YughLog(LOG_SCRIPT, LOG_ERROR, "%s :: %s\n%s", name, msg,stack);
|
||||||
|
|
||||||
JS_FreeCString(js, name);
|
JS_FreeCString(js, name);
|
||||||
JS_FreeCString(js, msg);
|
JS_FreeCString(js, msg);
|
||||||
|
|
|
@ -62,16 +62,33 @@ int fps;
|
||||||
#define SIM_PAUSE 2
|
#define SIM_PAUSE 2
|
||||||
#define SIM_STEP 3
|
#define SIM_STEP 3
|
||||||
|
|
||||||
|
#ifdef __TINYC__
|
||||||
|
int backtrace(void **buffer, int size) {
|
||||||
|
extern uint64_t *__libc_stack_end;
|
||||||
|
uint64_t **p, *bp, *frame;
|
||||||
|
asm ("mov %%rbp, %0;" : "=r" (bp));
|
||||||
|
p = (uint64_t**) bp;
|
||||||
|
int i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
frame = p[0];
|
||||||
|
if (frame < bp || frame > __libc_stack_end) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
buffer[i++] = p[1];
|
||||||
|
p = (uint64_t**) frame;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void print_stacktrace() {
|
void print_stacktrace() {
|
||||||
void *ents[512];
|
void *ents[512];
|
||||||
size_t size;
|
size_t size = backtrace(ents, 512);
|
||||||
|
|
||||||
size = backtrace(ents, 512);
|
|
||||||
|
|
||||||
YughCritical("====================BACKTRACE====================");
|
YughCritical("====================BACKTRACE====================");
|
||||||
char **stackstr = backtrace_symbols(ents, size);
|
char **stackstr = backtrace_symbols(ents, size);
|
||||||
|
|
||||||
YughInfo("Stack size is %d.", size);
|
YughCritical("Stack size is %d.", size);
|
||||||
|
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
YughCritical(stackstr[i]);
|
YughCritical(stackstr[i]);
|
||||||
|
|
|
@ -6,6 +6,13 @@ var Gizmos = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var Shape = {
|
||||||
|
circle(pos, radius, color) {
|
||||||
|
|
||||||
|
cmd(115, pos, radius, color);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
var Debug = {
|
var Debug = {
|
||||||
draw_grid(width, span, color) {
|
draw_grid(width, span, color) {
|
||||||
color = color ? color : Color.green;
|
color = color ? color : Color.green;
|
||||||
|
|
|
@ -12,8 +12,6 @@ function load(file) {
|
||||||
files[file] = modtime;
|
files[file] = modtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
load("scripts/base.js");
|
load("scripts/base.js");
|
||||||
|
|
||||||
var Log = {
|
var Log = {
|
||||||
|
@ -62,7 +60,6 @@ var Log = {
|
||||||
},
|
},
|
||||||
|
|
||||||
stack(skip = 0) {
|
stack(skip = 0) {
|
||||||
Log.warn("Printing stack");
|
|
||||||
var stack = (new Error()).stack;
|
var stack = (new Error()).stack;
|
||||||
var n = stack.next('\n',0)+1;
|
var n = stack.next('\n',0)+1;
|
||||||
for (var i = 0; i < skip; i++)
|
for (var i = 0; i < skip; i++)
|
||||||
|
@ -456,18 +453,28 @@ function state2str(state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var Register = {
|
var Register = {
|
||||||
|
inloop: false,
|
||||||
|
loopcbs: [],
|
||||||
|
finloop() {
|
||||||
|
this.loopcbs.forEach(x => x());
|
||||||
|
this.loopcbs = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
wraploop(loop) {
|
||||||
|
this.inloop = true;
|
||||||
|
loop();
|
||||||
|
this.inloop = false;
|
||||||
|
this.finloop();
|
||||||
|
},
|
||||||
|
|
||||||
updates: [],
|
updates: [],
|
||||||
update(dt) {
|
update(dt) {
|
||||||
this.updates.forEach(x => x[0].call(x[1], dt));
|
this.wraploop(() => this.updates.forEach(x => x[0].call(x[1], dt)));
|
||||||
},
|
},
|
||||||
|
|
||||||
physupdates: [],
|
physupdates: [],
|
||||||
postphys_cbs: [],
|
|
||||||
physupdate(dt) {
|
physupdate(dt) {
|
||||||
this.postphys_cbs.forEach(x => x());
|
this.wraploop(() => this.physupdates.forEach(x => x[0].call(x[1], dt)));
|
||||||
this.postphys_cbs = [];
|
|
||||||
|
|
||||||
this.physupdates.forEach(x => x[0].call(x[1], dt));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
guis: [],
|
guis: [],
|
||||||
|
@ -520,6 +527,15 @@ var Register = {
|
||||||
draw() {
|
draw() {
|
||||||
this.draws.forEach(x => x[0].call(x[1]));
|
this.draws.forEach(x => x[0].call(x[1]));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
endofloop(fn) {
|
||||||
|
if (!this.inloop)
|
||||||
|
fn();
|
||||||
|
else {
|
||||||
|
Log.warn("resgieted ...");
|
||||||
|
this.loopcbs.push(fn);
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Register.unregister_obj(null);
|
Register.unregister_obj(null);
|
||||||
|
@ -1464,26 +1480,26 @@ var gameobject = {
|
||||||
stop() {},
|
stop() {},
|
||||||
|
|
||||||
kill() {
|
kill() {
|
||||||
Log.warn(`Killing ${this.toString()}`);
|
Register.endofloop(() => {
|
||||||
cmd(2, this.body);
|
cmd(2, this.body);
|
||||||
|
delete Game.objects[this.body];
|
||||||
|
|
||||||
delete Game.objects[this.body];
|
if (this.level)
|
||||||
|
this.level.unregister(this);
|
||||||
|
|
||||||
if (this.level)
|
this.uncontrol();
|
||||||
this.level.unregister(this);
|
this.instances.remove(this);
|
||||||
|
Register.unregister_obj(this);
|
||||||
|
Signal.clear_obj(this);
|
||||||
|
|
||||||
this.uncontrol();
|
this.body = -1;
|
||||||
this.instances.remove(this);
|
for (var key in this.components) {
|
||||||
Register.unregister_obj(this);
|
Register.unregister_obj(this.components[key]);
|
||||||
Signal.clear_obj(this);
|
this.components[key].kill();
|
||||||
|
}
|
||||||
|
|
||||||
this.body = -1;
|
this.stop();
|
||||||
for (var key in this.components) {
|
});
|
||||||
Register.unregister_obj(this.components[key]);
|
|
||||||
this.components[key].kill();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.stop();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
get up() {
|
get up() {
|
||||||
|
|
Loading…
Reference in a new issue