many bug fixes; const correctness; restrict; memory leaks fixed

This commit is contained in:
John Alanbrook 2023-12-21 23:21:01 +00:00
parent e84d3b60af
commit 2ae45a5bb8
29 changed files with 166 additions and 135 deletions

View file

@ -50,8 +50,10 @@ ifdef NQOA
CPPFLAGS += -DNQOA CPPFLAGS += -DNQOA
endif endif
CPPFLAGS += -ffast-math
ifeq ($(DBG),1) ifeq ($(DBG),1)
CPPFLAGS += -g #-fsanitize=address CPPFLAGS += -g -fsanitize=address
INFO += _dbg INFO += _dbg
else else
CPPFLAGS += -DNDEBUG CPPFLAGS += -DNDEBUG
@ -76,7 +78,7 @@ else
endif endif
endif endif
CPPFLAGS += -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)\" #-DENABLE_SINC_MEDIUM_CONVERTER -DENABLE_SINC_FAST_CONVERTER CPPFLAGS += -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)\" #-DENABLE_SINC_MEDIUM_CONVERTER -DENABLE_SINC_FAST_CONVERTER -DCP_COLLISION_TYPE_TYPE=uintptr_t -DCP_BITMASK_TYPE=uintptr_t
# ENABLE_SINC_[BEST|FAST|MEDIUM]_CONVERTER # ENABLE_SINC_[BEST|FAST|MEDIUM]_CONVERTER
# default, fast and medium available in game at runtime; best available in editor # default, fast and medium available in game at runtime; best available in editor
@ -166,7 +168,7 @@ ifdef STEAM
# BIN += /steam # BIN += /steam
endif endif
WARNING_FLAGS = -Wno-incompatible-function-pointer-types -Wno-incompatible-pointer-types -Wno-unused-function -Wno-unused-const-variable -Wno-address-of-temporary WARNING_FLAGS = -Wno-incompatible-function-pointer-types
NAME = primum$(EXT) NAME = primum$(EXT)
SEM = 0.0.1 SEM = 0.0.1

View file

@ -523,6 +523,7 @@ function world_start() {
}; };
Primum.toString = function() { return "Primum"; }; Primum.toString = function() { return "Primum"; };
Primum.ur = undefined; Primum.ur = undefined;
Primum.kill = function() { this.clear(); };
} }
load("scripts/physics.js"); load("scripts/physics.js");

View file

@ -62,7 +62,7 @@ int p_compare(void *a, void *b)
{ {
if (a > b) return 1; if (a > b) return 1;
if (a < b) return -1; if (a < b) return -1;
if (a == b) return 0; return 0;
} }
gameobject **clean_ids(gameobject **ids) gameobject **clean_ids(gameobject **ids)
@ -105,7 +105,7 @@ int *phys2d_query_box_points(HMM_Vec2 pos, HMM_Vec2 wh, HMM_Vec2 *points, int n)
} }
/* Return all gameobjects within the given box */ /* Return all gameobjects within the given box */
gameobject *phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh) { gameobject **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;
@ -128,7 +128,7 @@ gameobject *phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh) {
return clean_ids(qb.ids); return clean_ids(qb.ids);
} }
gameobject *phys2d_query_shape(struct phys2d_shape *shape) gameobject **phys2d_query_shape(struct phys2d_shape *shape)
{ {
gameobject **ids = NULL; gameobject **ids = NULL;
cpSpaceShapeQuery(space, shape->shape, querylist, ids); cpSpaceShapeQuery(space, shape->shape, querylist, ids);
@ -184,7 +184,7 @@ void init_phys2dshape(struct phys2d_shape *shape, gameobject *go, void *data) {
shape->data = data; shape->data = data;
shape->t.scale = (HMM_Vec2){1.0,1.0}; shape->t.scale = (HMM_Vec2){1.0,1.0};
go_shape_apply(go->body, shape->shape, go); go_shape_apply(go->body, shape->shape, go);
cpShapeSetCollisionType(shape->shape, (int)go); cpShapeSetCollisionType(shape->shape, (cpCollisionType)go);
cpShapeSetUserData(shape->shape, shape); cpShapeSetUserData(shape->shape, shape);
} }
@ -221,7 +221,7 @@ void phys2d_circledel(struct phys2d_circle *c) {
phys2d_shape_del(&c->shape); phys2d_shape_del(&c->shape);
} }
void phys2d_dbgdrawcpcirc(cpCircleShape *c) { void phys2d_dbgdrawcpcirc(cpShape *c) {
HMM_Vec2 pos = mat_t_pos(t_go2world(shape2go(c)), (HMM_Vec2)cpCircleShapeGetOffset(c)); HMM_Vec2 pos = mat_t_pos(t_go2world(shape2go(c)), (HMM_Vec2)cpCircleShapeGetOffset(c));
float radius = cpCircleShapeGetRadius(c); float radius = cpCircleShapeGetRadius(c);
struct rgba color = shape_color(c); struct rgba color = shape_color(c);
@ -232,7 +232,7 @@ void phys2d_dbgdrawcpcirc(cpCircleShape *c) {
} }
void phys2d_dbgdrawcircle(struct phys2d_circle *circle) { void phys2d_dbgdrawcircle(struct phys2d_circle *circle) {
phys2d_dbgdrawcpcirc((cpCircleShape *)circle->shape.shape); phys2d_dbgdrawcpcirc(circle->shape.shape);
} }
void phys2d_applycircle(struct phys2d_circle *circle) { void phys2d_applycircle(struct phys2d_circle *circle) {
@ -308,7 +308,7 @@ struct phys2d_poly *Make2DPoly(gameobject *go) {
arrsetlen(new->points, 0); arrsetlen(new->points, 0);
new->radius = 0.f; new->radius = 0.f;
new->shape.shape = cpSpaceAddShape(space, cpPolyShapeNewRaw(go->body, 0, new->points, new->radius)); new->shape.shape = cpSpaceAddShape(space, cpPolyShapeNewRaw(go->body, 0, (cpVect*)new->points, new->radius));
new->shape.debugdraw = phys2d_dbgdrawpoly; new->shape.debugdraw = phys2d_dbgdrawpoly;
new->shape.moi = phys2d_poly_moi; new->shape.moi = phys2d_poly_moi;
new->shape.apply = phys2d_applypoly; new->shape.apply = phys2d_applypoly;
@ -317,7 +317,7 @@ struct phys2d_poly *Make2DPoly(gameobject *go) {
} }
float phys2d_poly_moi(struct phys2d_poly *poly, float m) { float phys2d_poly_moi(struct phys2d_poly *poly, float m) {
float moi = cpMomentForPoly(m, arrlen(poly->points), poly->points, cpvzero, poly->radius); float moi = cpMomentForPoly(m, arrlen(poly->points), (cpVect*)poly->points, cpvzero, poly->radius);
if (isnan(moi)) { if (isnan(moi)) {
// YughError("Polygon MOI returned an error. Returning 0."); // YughError("Polygon MOI returned an error. Returning 0.");
return 0; return 0;
@ -335,16 +335,14 @@ void phys2d_polyaddvert(struct phys2d_poly *poly) {
arrput(poly->points, v2zero); arrput(poly->points, v2zero);
} }
void phys2d_poly_setverts(struct phys2d_poly *poly, cpVect *verts) { void phys2d_poly_setverts(struct phys2d_poly *poly, HMM_Vec2 *verts) {
if (!verts) return; if (!verts) return;
if (poly->points) if (poly->points)
arrfree(poly->points); arrfree(poly->points);
arrsetlen(poly->points, arrlen(verts)); arrsetlen(poly->points, arrlen(verts));
for (int i = 0; i < arrlen(verts); i++) { for (int i = 0; i < arrlen(verts); i++)
poly->points[i].X = verts[i].x; poly->points[i] = verts[i];
poly->points[i].Y = verts[i].y;
}
phys2d_applypoly(poly); phys2d_applypoly(poly);
} }
@ -354,7 +352,7 @@ void phys2d_applypoly(struct phys2d_poly *poly) {
assert(sizeof(poly->points[0]) == sizeof(cpVect)); assert(sizeof(poly->points[0]) == sizeof(cpVect));
struct gameobject *go = poly->shape.go; struct gameobject *go = poly->shape.go;
// cpTransform T = m3_to_cpt(transform2d2mat(poly->t)); // cpTransform T = m3_to_cpt(transform2d2mat(poly->t));
cpPolyShapeSetVerts(poly->shape.shape, arrlen(poly->points), poly->points, cpTransformIdentity); cpPolyShapeSetVerts(poly->shape.shape, arrlen(poly->points), (cpVect*)poly->points, cpTransformIdentity);
cpPolyShapeSetRadius(poly->shape.shape, poly->radius); cpPolyShapeSetRadius(poly->shape.shape, poly->radius);
cpSpaceReindexShapesForBody(space, cpShapeGetBody(poly->shape.shape)); cpSpaceReindexShapesForBody(space, cpShapeGetBody(poly->shape.shape));
} }
@ -634,14 +632,14 @@ static cpBool script_phys_cb_separate(cpArbiter *arb, cpSpace *space, void *data
} }
void phys2d_rm_go_handlers(gameobject *go) { void phys2d_rm_go_handlers(gameobject *go) {
cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (int)go); cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (cpCollisionType)go);
handler->userData = NULL; handler->userData = NULL;
handler->beginFunc = NULL; handler->beginFunc = NULL;
handler->separateFunc = NULL; handler->separateFunc = NULL;
} }
void phys2d_setup_handlers(gameobject *go) { void phys2d_setup_handlers(gameobject *go) {
cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (int)go); cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (cpCollisionType)go);
handler->userData = go; handler->userData = go;
handler->beginFunc = script_phys_cb_begin; handler->beginFunc = script_phys_cb_begin;
handler->separateFunc = script_phys_cb_separate; handler->separateFunc = script_phys_cb_separate;

View file

@ -86,7 +86,7 @@ void phys2d_polydel(struct phys2d_poly *poly);
void phys2d_applypoly(struct phys2d_poly *poly); void phys2d_applypoly(struct phys2d_poly *poly);
void phys2d_dbgdrawpoly(struct phys2d_poly *poly); void phys2d_dbgdrawpoly(struct phys2d_poly *poly);
void phys2d_polyaddvert(struct phys2d_poly *poly); void phys2d_polyaddvert(struct phys2d_poly *poly);
void phys2d_poly_setverts(struct phys2d_poly *poly, cpVect *verts); void phys2d_poly_setverts(struct phys2d_poly *poly, HMM_Vec2 *verts);
float phys2d_poly_moi(struct phys2d_poly *poly, float m); float phys2d_poly_moi(struct phys2d_poly *poly, float m);
struct phys2d_edge *Make2DEdge(gameobject *go); struct phys2d_edge *Make2DEdge(gameobject *go);
@ -108,7 +108,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);
gameobject *phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh); gameobject **phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh);
struct shape_cb { struct shape_cb {
@ -130,7 +130,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(gameobject *go); void phys2d_setup_handlers(gameobject *go);
gameobject *phys2d_query_shape(struct phys2d_shape *shape); gameobject **phys2d_query_shape(struct phys2d_shape *shape);
int *phys2d_query_box_points(HMM_Vec2 pos, HMM_Vec2 wh, HMM_Vec2 *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();

View file

@ -6,7 +6,6 @@
#include "font.h" #include "font.h"
#include "window.h" #include "window.h"
#include "gameobject.h" #include "gameobject.h"
#include "libgen.h"
//#include "diffuse.sglsl.h" //#include "diffuse.sglsl.h"
#include "unlit.sglsl.h" #include "unlit.sglsl.h"
@ -144,7 +143,7 @@ void mesh_add_material(mesh *mesh, cgltf_material *mat)
cgltf_buffer_view *buf = img->buffer_view; cgltf_buffer_view *buf = img->buffer_view;
mesh->bind.fs.images[0] = texture_fromdata(buf->buffer->data, buf->size)->id; mesh->bind.fs.images[0] = texture_fromdata(buf->buffer->data, buf->size)->id;
} else { } else {
const char *imp = seprint("%s/%s", dirname(mesh->model->path), img->uri); char *imp = seprint("%s/%s", dirname(mesh->model->path), img->uri);
mesh->bind.fs.images[0] = texture_pullfromfile(imp)->id; mesh->bind.fs.images[0] = texture_pullfromfile(imp)->id;
free(imp); free(imp);
} }
@ -258,6 +257,9 @@ void mesh_add_primitive(mesh *mesh, cgltf_primitive *prim)
case cgltf_attribute_type_texcoord: case cgltf_attribute_type_texcoord:
mesh->bind.vertex_buffers[1] = texcoord_floats(vs, verts, comp); mesh->bind.vertex_buffers[1] = texcoord_floats(vs, verts, comp);
break; break;
case cgltf_attribute_type_invalid:
YughWarn("Invalid type.");
break;
} }
} }
/* /*

View file

@ -39,7 +39,6 @@ HMM_Vec4 sample_sampler(sampler *sampler, float time)
float td = sampler->times[next_time]-sampler->times[previous_time]; float td = sampler->times[next_time]-sampler->times[previous_time];
float t = (time - sampler->times[previous_time])/td; float t = (time - sampler->times[previous_time])/td;
switch(sampler->type) { switch(sampler->type) {
case LINEAR: case LINEAR:
return sample_linear(sampler,t,previous_time,next_time); return sample_linear(sampler,t,previous_time,next_time);
@ -51,4 +50,5 @@ HMM_Vec4 sample_sampler(sampler *sampler, float time)
return sample_cubicspline(sampler,t, previous_time, next_time); return sample_cubicspline(sampler,t, previous_time, next_time);
break; break;
} }
return sample_cubicspline(sampler,t, previous_time, next_time);
} }

View file

@ -8,17 +8,35 @@ unsigned long long triCount = 0;
void prof_start(struct d_prof *prof) void prof_start(struct d_prof *prof)
{ {
#ifndef NDEBUG arrsetlen(prof->ms, prof->laps);
prof->lap = stm_now();
#endif
} }
void prof(struct d_prof *prof) void prof_reset(struct d_prof *prof)
{ {
#ifndef NDEBUG prof->lap = stm_now();
}
float prof_lap_avg(struct d_prof *prof)
{
float avg;
for (int i = 0; i < arrlen(prof->ms); i++)
avg += prof->ms[i];
avg /= arrlen(prof->ms);
return avg;
}
void prof_lap(struct d_prof *prof)
{
if (prof->ms == NULL)
prof_start(prof);
if (arrlen(prof->ms) >= prof->laps) {
YughWarn("Profiled time of %s is avg %g", prof->name, prof_lap_avg(prof));
arrsetlen(prof->ms, 0);
}
uint64_t t = stm_since(prof->lap); uint64_t t = stm_since(prof->lap);
arrput(prof->ms, stm_sec(t)); arrput(prof->ms, stm_sec(t));
#endif
} }
void resetTriangles() void resetTriangles()

View file

@ -1,21 +1,20 @@
#ifndef DEBUG_GUI_H #ifndef DEBUG_GUI_H
#define DEBUG_GUI_H #define DEBUG_GUI_H
//#ifndef static_assert
//#define static_assert(pred) switch(0){case 0:case pred:;}
//#endif
#include <stdint.h> #include <stdint.h>
struct d_prof { struct d_prof {
char *name; char *name;
float *ms; float *ms;
uint64_t lap; uint64_t lap;
int laps;
}; };
extern unsigned long long triCount; extern unsigned long long triCount;
void resetTriangles(); void resetTriangles();
void prof_start(struct d_prof *prof); void prof_start(struct d_prof *prof);
void prof(struct d_prof *prof); void prof_reset(struct d_prof *prof);
void prof_lap(struct d_prof *prof);
float prof_lap_avg(struct d_prof *prof);
#endif #endif

View file

@ -292,7 +292,6 @@ void debugdraw_init()
.cull_mode = SG_CULLMODE_BACK, .cull_mode = SG_CULLMODE_BACK,
.label = "grid pipeline", .label = "grid pipeline",
.colors[0].blend = blend_trans, .colors[0].blend = blend_trans,
.label = "dbg grid",
}); });
grid_bind.vertex_buffers[0] = circle_bind.vertex_buffers[1]; grid_bind.vertex_buffers[0] = circle_bind.vertex_buffers[1];

View file

@ -118,7 +118,7 @@ struct sFont *MakeFont(const char *fontfile, int height) {
struct sFont *newfont = calloc(1, sizeof(struct sFont)); struct sFont *newfont = calloc(1, sizeof(struct sFont));
newfont->height = height; newfont->height = height;
unsigned char *ttf_buffer = slurp_text(fontfile, NULL); unsigned char *ttf_buffer = slurp_file(fontfile, NULL);
unsigned char *bitmap = malloc(packsize * packsize); unsigned char *bitmap = malloc(packsize * packsize);
stbtt_packedchar glyphs[95]; stbtt_packedchar glyphs[95];
@ -251,7 +251,7 @@ void text_settype(struct sFont *mfont) {
font = mfont; font = mfont;
} }
unsigned char *esc_color(unsigned char *c, struct rgba *color, struct rgba defc) const char *esc_color(const char *c, struct rgba *color, struct rgba defc)
{ {
struct rgba d; struct rgba d;
if (!color) color = &d; if (!color) color = &d;
@ -278,13 +278,13 @@ unsigned char *esc_color(unsigned char *c, struct rgba *color, struct rgba defc)
return c; return c;
} }
struct boundingbox text_bb(const unsigned char *text, float scale, float lw, float tracking) struct boundingbox text_bb(const char *text, float scale, float lw, float tracking)
{ {
struct rgba dummy; struct rgba dummy;
HMM_Vec2 cursor = {0,0}; HMM_Vec2 cursor = {0,0};
const unsigned char *c = text; const char *c = text;
const unsigned char *line, *wordstart, *drawstart; const char *line, *wordstart, *drawstart;
line = drawstart = (unsigned char *)text; line = drawstart = text;
while (*line != '\0') { while (*line != '\0') {
if (isblank(*line)) { if (isblank(*line)) {
@ -332,13 +332,13 @@ void check_caret(int caret, int l, HMM_Vec2 pos, float scale, struct rgba color)
/* pos given in screen coordinates */ /* pos given in screen coordinates */
int renderText(const unsigned char *text, HMM_Vec2 pos, float scale, struct rgba color, float lw, int caret, float tracking) { int renderText(const char *text, HMM_Vec2 pos, float scale, struct rgba color, float lw, int caret, float tracking) {
int len = strlen(text); int len = strlen(text);
HMM_Vec2 cursor = pos; HMM_Vec2 cursor = pos;
const unsigned char *line, *wordstart, *drawstart; const char *line, *wordstart, *drawstart;
line = drawstart = (unsigned char *)text; line = drawstart = text;
struct rgba usecolor = color; struct rgba usecolor = color;
check_caret(caret, line-drawstart, cursor, scale, usecolor); check_caret(caret, line-drawstart, cursor, scale, usecolor);

View file

@ -33,8 +33,8 @@ void font_init();
struct sFont *MakeFont(const char *fontfile, int height); struct sFont *MakeFont(const char *fontfile, int height);
void sdrawCharacter(struct Character c, HMM_Vec2 cursor, float scale, struct rgba color); void sdrawCharacter(struct Character c, HMM_Vec2 cursor, float scale, struct rgba color);
void text_settype(struct sFont *font); void text_settype(struct sFont *font);
struct boundingbox text_bb(const unsigned char *text, float scale, float lw, float tracking); struct boundingbox text_bb(const char *text, float scale, float lw, float tracking);
int renderText(const unsigned char *text, HMM_Vec2 pos, float scale, struct rgba color, float lw, int caret, float tracking); int renderText(const char *text, HMM_Vec2 pos, float scale, struct rgba color, float lw, int caret, float tracking);
// void text_frame(); // void text_frame();
void text_flush(HMM_Mat4 *proj); void text_flush(HMM_Mat4 *proj);

View file

@ -13,9 +13,9 @@ struct freelistheader
}; };
#define freelist_header(p) ((struct freelistheader*)p-1) #define freelist_header(p) ((struct freelistheader*)p-1)
static inline void *freelist_make(struct freelistheader *list, size_t elemsize, unsigned int n) static inline void *freelist_make(size_t elemsize, unsigned int n)
{ {
list = malloc(elemsize*n*sizeof(struct freelistheader)); struct freelistheader *list = malloc(elemsize*n*sizeof(struct freelistheader));
list->first = 0; list->first = 0;
list->len = n; list->len = n;
list->count = 0; list->count = 0;
@ -29,7 +29,7 @@ static inline unsigned int freelist_check(struct freelistheader *h, void *data,
return id; return id;
} }
#define freelist_size(p,l) do{p = freelist_make(p,sizeof(*p),l); for(int i = 0; i < l; i++) { p[i].next = i+1; }}while(0) #define freelist_size(p,l) do{p = freelist_make(sizeof(*p),l); for(int i = 0; i < l; i++) { p[i].next = i+1; }}while(0)
#define freelist_len(p) (freelist_header(p)->len) #define freelist_len(p) (freelist_header(p)->len)
#define freelist_first(p) (freelist_header(p)->first) #define freelist_first(p) (freelist_header(p)->first)
#define freelist_grab(i,p) do{i=freelist_header(p)->first; freelist_header(p)->first = p[i].next; p[i].next = -1;freelist_header(p)->count++;}while(0) #define freelist_grab(i,p) do{i=freelist_header(p)->first; freelist_header(p)->first = p[i].next; p[i].next = -1;freelist_header(p)->count++;}while(0)

View file

@ -77,10 +77,10 @@ unsigned int editor_cat = 1<<31;
void go_shape_apply(cpBody *body, cpShape *shape, gameobject *go) { void go_shape_apply(cpBody *body, cpShape *shape, gameobject *go) {
cpShapeSetFriction(shape, go->f); cpShapeSetFriction(shape, go->f);
cpShapeSetElasticity(shape, go->e); cpShapeSetElasticity(shape, go->e);
cpShapeSetCollisionType(shape, (int)go); cpShapeSetCollisionType(shape, (cpCollisionType)go);
cpShapeFilter filter; cpShapeFilter filter;
filter.group = (int)go; filter.group = (cpCollisionType)go;
filter.categories = 1<<go->layer | editor_cat; filter.categories = 1<<go->layer | editor_cat;
// filter.mask = CP_ALL_CATEGORIES; // filter.mask = CP_ALL_CATEGORIES;
filter.mask = category_masks[go->layer] | editor_cat; filter.mask = category_masks[go->layer] | editor_cat;

View file

@ -140,7 +140,7 @@ JSValue int2js(int i) { return JS_NewInt64(js, i); }
JSValue str2js(const char *c) { return JS_NewString(js, c); } JSValue str2js(const char *c) { return JS_NewString(js, c); }
const char *js2str(JSValue v) { return JS_ToCString(js, v); } const char *js2str(JSValue v) { return JS_ToCString(js, v); }
JSValue strarr2js(const char **c) JSValue strarr2js(char **c)
{ {
JSValue arr = JS_NewArray(js); JSValue arr = JS_NewArray(js);
for (int i = 0; i < arrlen(c); i++) for (int i = 0; i < arrlen(c); i++)
@ -306,7 +306,7 @@ JSValue vecarr2js(HMM_Vec2 *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 char *s = JS_ToCString(js, argv[0]);
HMM_Vec2 pos = js2vec2(argv[1]); HMM_Vec2 pos = js2vec2(argv[1]);
float size = js2number(argv[2]); float size = js2number(argv[2]);
@ -497,10 +497,11 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
int cmd = js2int(argv[0]); int cmd = js2int(argv[0]);
const char *str = NULL; const char *str = NULL;
const char *str2 = NULL; const char *str2 = NULL;
const void *d1 = NULL; void *d1 = NULL;
const void *d2 = NULL; void *d2 = NULL;
const void *v1 = NULL; void *v1 = NULL;
gameobject *ids = NULL; gameobject **ids = NULL;
int *intids = NULL;
gameobject *go = NULL; gameobject *go = NULL;
JSValue ret = JS_UNDEFINED; JSValue ret = JS_UNDEFINED;
@ -874,9 +875,9 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
case 86: case 86:
v1 = js2cpvec2arr(argv[3]); v1 = js2cpvec2arr(argv[3]);
ids = phys2d_query_box_points(js2vec2(argv[1]), js2vec2(argv[2]), v1, js2int(argv[4])); intids = phys2d_query_box_points(js2vec2(argv[1]), js2vec2(argv[2]), v1, js2int(argv[4]));
ret = gos2ref(ids); ret = ints2js(intids);
arrfree(ids); arrfree(intids);
break; break;
case 87: case 87:

View file

@ -42,7 +42,7 @@ static struct {
double timer; double timer;
double spf; double spf;
int rec; int rec;
char *buffer; uint8_t *buffer;
} gif; } gif;
static struct { static struct {
@ -95,7 +95,7 @@ void gif_rec_start(int w, int h, int cpf, int bitdepth)
}); });
} }
void gif_rec_end(char *path) void gif_rec_end(const char *path)
{ {
if (!gif.rec) return; if (!gif.rec) return;
@ -109,7 +109,7 @@ void gif_rec_end(char *path)
gif.rec = 0; gif.rec = 0;
} }
void capture_screen(int x, int y, int w, int h, char *path) void capture_screen(int x, int y, int w, int h, const char *path)
{ {
int n = 4; int n = 4;
void *data = malloc(w*h*n); void *data = malloc(w*h*n);
@ -297,7 +297,7 @@ void render_init() {
model_init(); model_init();
sg_color c; sg_color c;
rgba2floats(&c, editorClearColor); rgba2floats((float*)&c, editorClearColor);
pass_action = (sg_pass_action){ pass_action = (sg_pass_action){
.colors[0] = {.load_action = SG_LOADACTION_CLEAR, .clear_value = c} .colors[0] = {.load_action = SG_LOADACTION_CLEAR, .clear_value = c}
}; };

View file

@ -70,7 +70,7 @@ void opengl_rendermode(enum RenderMode r);
void openglInit3d(struct window *window); void openglInit3d(struct window *window);
void openglRender3d(struct window *window, struct mCamera *camera); void openglRender3d(struct window *window, struct mCamera *camera);
void capture_screen(int x, int y, int w, int h, char *path); void capture_screen(int x, int y, int w, int h, const char *path);
void render_winsize(); void render_winsize();
@ -86,7 +86,7 @@ HMM_Vec2 screen2world(HMM_Vec2 pos);
sg_shader sg_compile_shader(const char *v, const char *f, sg_shader_desc *d); sg_shader sg_compile_shader(const char *v, const char *f, sg_shader_desc *d);
void gif_rec_start(int w, int h, int cpf, int bitdepth); void gif_rec_start(int w, int h, int cpf, int bitdepth);
void gif_rec_end(char *path); void gif_rec_end(const char *path);
struct uv_n { struct uv_n {
unsigned short u; unsigned short u;

View file

@ -72,11 +72,13 @@ char *get_filename_from_path(char *path, int extension) {
return filename; return filename;
} }
char *get_directory_from_path(char *path) { char *dirname(const char *path)
{
const char *dirpos = strrchr(path, '/'); const char *dirpos = strrchr(path, '/');
char *directory = (char *)malloc(sizeof(char) * (dirpos - path + 1)); if (!dirpos) return ".";
strncpy(directory, path, dirpos - path); char *dir = malloc(dirpos-path+1);
return directory; strncpy(dir,path,dirpos-path);
return dir;
} }
FILE *res_open(char *path, const char *tag) { FILE *res_open(char *path, const char *tag) {
@ -135,7 +137,7 @@ static int ls_ftw(const char *path, const struct stat *sb, int typeflag)
return 0; return 0;
} }
char **ls(char *path) char **ls(const char *path)
{ {
if (ls_paths) { if (ls_paths) {
for (int i = 0; i < arrlen(ls_paths); i++) for (int i = 0; i < arrlen(ls_paths); i++)
@ -189,13 +191,13 @@ void *cdb_slurp(struct cdb *cdb, const char *file, size_t *size)
return data; return data;
} }
int fexists(char *path) int fexists(const char *path)
{ {
return !access(path,R_OK); return !access(path,R_OK);
int len = strlen(path); int len = strlen(path);
if (cdb_find(&game_cdb, path,len)) return 1; if (cdb_find(&game_cdb, path,len)) return 1;
else if (cdb_find(&core_cdb, path, len)) return 1; else if (cdb_find(&corecdb, path, len)) return 1;
else if (!access(path, R_OK)) return 1; else if (!access(path, R_OK)) return 1;
return 0; return 0;
@ -247,7 +249,7 @@ char *slurp_text(const char *filename, size_t *size)
return retstr; return retstr;
} }
int cp(char *p1, char *p2) int cp(const char *p1, const char *p2)
{ {
size_t len; size_t len;
void *data = slurp_file(p1, &len); void *data = slurp_file(p1, &len);
@ -275,7 +277,7 @@ void rek_mkdir(char *path) {
printf("error while trying to create '%s'\n%m\n", path); printf("error while trying to create '%s'\n%m\n", path);
} }
FILE *fopen_mkdir(char *path, char *mode) { FILE *fopen_mkdir(const char *path, const char *mode) {
char *sep = strrchr(path, '/'); char *sep = strrchr(path, '/');
if(sep) { if(sep) {
char *path0 = strdup(path); char *path0 = strdup(path);

View file

@ -15,10 +15,12 @@ char *str_replace_ext(const char *s, const char *newext);
FILE *res_open(char *path, const char *tag); FILE *res_open(char *path, const char *tag);
FILE *path_open(const char *tag, const char *fmt, ...); FILE *path_open(const char *tag, const char *fmt, ...);
char *make_path(const char *file); char *make_path(const char *file);
char **ls(char *path); char **ls(const char *path);
int cp(char *p1, char *p2); int cp(const char *p1, const char *p2);
int fexists(char *path); int fexists(const char *path);
FILE *fopen_mkdir(char *path, char *mode); FILE *fopen_mkdir(const char *path, const char *mode);
char *dirname(const char *path);
void *slurp_file(const char *filename, size_t *size); void *slurp_file(const char *filename, size_t *size);
char *slurp_text(const char *filename, size_t *size); char *slurp_text(const char *filename, size_t *size);

View file

@ -193,7 +193,7 @@ time_t jso_file(const char *file)
JSValue script_runfile(const char *file) JSValue script_runfile(const char *file)
{ {
size_t len; size_t len;
const char *script = slurp_text(file, &len); char *script = slurp_text(file, &len);
if (!script) return JS_UNDEFINED; if (!script) return JS_UNDEFINED;
JSValue obj = JS_Eval(js, script, len, file, JS_EVAL_FLAGS); JSValue obj = JS_Eval(js, script, len, file, JS_EVAL_FLAGS);

View file

@ -24,7 +24,7 @@ void iir_free(struct dsp_iir *iir)
free(iir); free(iir);
} }
void interleave(soundbyte *a, soundbyte *b, soundbyte *stereo, int frames) void interleave(soundbyte *a, soundbyte *b, soundbyte *restrict stereo, int frames)
{ {
for (int i = 0; i < frames; i++) { for (int i = 0; i < frames; i++) {
stereo[i*2] = a[i]; stereo[i*2] = a[i];
@ -32,7 +32,7 @@ void interleave(soundbyte *a, soundbyte *b, soundbyte *stereo, int frames)
} }
} }
void deinterleave(soundbyte *stereo, soundbyte *out, int frames, int channels, int chout) void deinterleave(soundbyte *restrict stereo, soundbyte *restrict out, int frames, int channels, int chout)
{ {
chout--; chout--;
for (int i = 0; i < frames; i++) for (int i = 0; i < frames; i++)
@ -44,7 +44,7 @@ void mono_to_stero(soundbyte *a, soundbyte *stereo, int frames)
interleave(a,a,stereo, frames); interleave(a,a,stereo, frames);
} }
void mono_expand(soundbyte *buffer, int to, int frames) void mono_expand(soundbyte *restrict buffer, int to, int frames)
{ {
soundbyte hold[frames]; soundbyte hold[frames];
memcpy(hold, buffer, sizeof(soundbyte)*frames); memcpy(hold, buffer, sizeof(soundbyte)*frames);
@ -86,7 +86,7 @@ soundbyte *dsp_node_out(dsp_node *node)
return node->cache; return node->cache;
} }
void filter_am_mod(dsp_node *mod, soundbyte *buffer, int frames) void filter_am_mod(dsp_node *restrict mod, soundbyte *restrict buffer, int frames)
{ {
soundbyte *m = dsp_node_out(mod); soundbyte *m = dsp_node_out(mod);
for (int i = 0; i < frames*CHANNELS; i++) buffer[i] *= m[i]; for (int i = 0; i < frames*CHANNELS; i++) buffer[i] *= m[i];
@ -98,7 +98,7 @@ dsp_node *dsp_am_mod(dsp_node *mod)
} }
/* Add b into a */ /* Add b into a */
void sum_soundbytes(soundbyte *a, soundbyte *b, int samples) void sum_soundbytes(soundbyte *restrict a, soundbyte *restrict b, int samples)
{ {
for (int i = 0; i < samples; i++) a[i] += b[i]; for (int i = 0; i < samples; i++) a[i] += b[i];
} }
@ -107,7 +107,7 @@ void norm_soundbytes(soundbyte *a, float lvl, int samples)
{ {
float tar = lvl; float tar = lvl;
float max = 0 ; float max = 0 ;
for (int i = 0; i < samples; i++) max = (fabsf(a[i] > max) ? fabsf(a[i]) : max); for (int i = 0; i < samples; i++) max = fabsf(a[i]) > max ? fabsf(a[i]) : max;
float mult = max/tar; float mult = max/tar;
scale_soundbytes(a, mult, samples); scale_soundbytes(a, mult, samples);
} }
@ -118,7 +118,7 @@ void scale_soundbytes(soundbyte *a, float scale, int samples)
for (int i = 0; i < samples; i++) a[i] *= scale; for (int i = 0; i < samples; i++) a[i] *= scale;
} }
void zero_soundbytes(soundbyte *a, int samples) { memset(a, 0, sizeof(soundbyte)*samples); } void zero_soundbytes(soundbyte *restrict a, int samples) { memset(a, 0, sizeof(soundbyte)*samples); }
void set_soundbytes(soundbyte *a, soundbyte *b, int samples) void set_soundbytes(soundbyte *a, soundbyte *b, int samples)
{ {
@ -152,9 +152,12 @@ void node_free(dsp_node *node)
if (node == masterbus) return; /* Simple check to not delete the masterbus */ if (node == masterbus) return; /* Simple check to not delete the masterbus */
pthread_mutex_lock(&soundrun); pthread_mutex_lock(&soundrun);
unplug_node(node); unplug_node(node);
if (node->data) if (node->data) {
if (node->data_free) node->data_free(node->data); if (node->data_free)
else free(node->data); node->data_free(node->data);
else
free(node->data);
}
free(node); free(node);
pthread_mutex_unlock(&soundrun); pthread_mutex_unlock(&soundrun);
@ -229,9 +232,9 @@ dsp_node *dsp_phasor(float amp, float freq, float (*filter)(float))
return make_node(p, filter_phasor, NULL); return make_node(p, filter_phasor, NULL);
} }
void filter_rectify(void *data, soundbyte *out, int n) void filter_rectify(void *restrict data, soundbyte *restrict out, int n)
{ {
for (int i = 0; i < n; i++) out[i] = abs(out[i]); for (int i = 0; i < n; i++) out[i] = fabsf(out[i]);
} }
dsp_node *dsp_rectify() dsp_node *dsp_rectify()
@ -246,7 +249,9 @@ soundbyte sample_whitenoise()
void gen_whitenoise(void *data, soundbyte *out, int n) void gen_whitenoise(void *data, soundbyte *out, int n)
{ {
for (int i = 0; i < n; i++) out[i] = sample_whitenoise(); for (int i = 0; i < n; i++)
out[i] = sample_whitenoise();
mono_expand(out, CHANNELS, n); mono_expand(out, CHANNELS, n);
} }
@ -295,7 +300,7 @@ dsp_node *dsp_pinknoise()
return make_node(pink, gen_pinknoise, iir_free); return make_node(pink, gen_pinknoise, iir_free);
} }
void filter_rednoise(soundbyte *last, soundbyte *out, int frames) void filter_rednoise(soundbyte *restrict last, soundbyte *out, int frames)
{ {
gen_whitenoise(NULL, out, frames); gen_whitenoise(NULL, out, frames);
for (int i = 0; i < frames*CHANNELS; i++) { for (int i = 0; i < frames*CHANNELS; i++) {
@ -312,7 +317,7 @@ dsp_node *dsp_rednoise()
return make_node(last,filter_rednoise, NULL); return make_node(last,filter_rednoise, NULL);
} }
void filter_pitchshift(float *octaves, soundbyte *buffer, int frames) void filter_pitchshift(float *restrict octaves, soundbyte *buffer, int frames)
{ {
soundbyte ch1[frames]; soundbyte ch1[frames];
for (int i = 0; i < frames; i++) for (int i = 0; i < frames; i++)
@ -336,6 +341,7 @@ struct timescale
static long *src_cb(struct timescale *ts, float **data) static long *src_cb(struct timescale *ts, float **data)
{ {
return NULL;
} }
void filter_timescale(struct timescale *ts, soundbyte *buffer, int frames) void filter_timescale(struct timescale *ts, soundbyte *buffer, int frames)
@ -419,7 +425,7 @@ dsp_node *dsp_delay(double sec, double decay)
return make_node(d, filter_delay, delay_free); return make_node(d, filter_delay, delay_free);
} }
void filter_fwd_delay(delay *d, soundbyte *buf, int frames) void filter_fwd_delay(delay *restrict d, soundbyte *restrict buf, int frames)
{ {
for (int i = 0; i < frames*CHANNELS; i++) { for (int i = 0; i < frames*CHANNELS; i++) {
ringpush(d->ring, buf[i]); ringpush(d->ring, buf[i]);
@ -505,7 +511,7 @@ dsp_node *dsp_adsr(unsigned int atk, unsigned int dec, unsigned int sus, unsigne
return make_node(adsr, dsp_adsr_fillbuf, NULL); return make_node(adsr, dsp_adsr_fillbuf, NULL);
} }
void filter_noise_gate(float *floor, soundbyte *out, int frames) void filter_noise_gate(float *restrict floor, soundbyte *restrict out, int frames)
{ {
for (int i = 0; i < frames*CHANNELS; i++) out[i] = fabsf(out[i]) < *floor ? 0.0 : out[i]; for (int i = 0; i < frames*CHANNELS; i++) out[i] = fabsf(out[i]) < *floor ? 0.0 : out[i];
} }
@ -517,7 +523,7 @@ dsp_node *dsp_noise_gate(float floor)
return make_node(v, filter_noise_gate, NULL); return make_node(v, filter_noise_gate, NULL);
} }
void filter_limiter(float *ceil, soundbyte *out, int n) void filter_limiter(float *restrict ceil, soundbyte *restrict out, int n)
{ {
for (int i = 0; i < n*CHANNELS; i++) out[i] = fabsf(out[i]) > *ceil ? *ceil : out[i]; for (int i = 0; i < n*CHANNELS; i++) out[i] = fabsf(out[i]) > *ceil ? *ceil : out[i];
} }
@ -598,7 +604,7 @@ void pan_frames(soundbyte *out, float deg, int frames)
} }
} }
void dsp_mono(void *p, soundbyte *out, int n) void dsp_mono(void *p, soundbyte *restrict out, int n)
{ {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
soundbyte val = (out[i*CHANNELS] + out[i*CHANNELS+1]) / 2; soundbyte val = (out[i*CHANNELS] + out[i*CHANNELS+1]) / 2;
@ -614,7 +620,7 @@ struct bitcrush {
}; };
#define ROUND(f) ((float)((f>0.0)?floor(f+0.5):ceil(f-0.5))) #define ROUND(f) ((float)((f>0.0)?floor(f+0.5):ceil(f-0.5)))
void filter_bitcrush(struct bitcrush *b, soundbyte *out, int frames) void filter_bitcrush(struct bitcrush *restrict b, soundbyte *restrict out, int frames)
{ {
int max = pow(2,b->depth) - 1; int max = pow(2,b->depth) - 1;
int step = SAMPLERATE/b->sr; int step = SAMPLERATE/b->sr;

View file

@ -13,10 +13,10 @@
static struct { static struct {
char *key; char *key;
tsf **value; tsf *value;
} *sf_hash = NULL; } *sf_hash = NULL;
void dsp_midi_fillbuf(struct dsp_midi_song *song, void *out, int n) void dsp_midi_fillbuf(struct dsp_midi_song *restrict song, void *restrict out, int n)
{ {
soundbyte *o = out; soundbyte *o = out;
tml_message *midi = song->midi; tml_message *midi = song->midi;
@ -60,7 +60,7 @@ tsf *make_soundfont(const char *path)
int idx = shgeti(sf_hash, path); int idx = shgeti(sf_hash, path);
if (idx != -1) return sf_hash[idx].value; if (idx != -1) return sf_hash[idx].value;
long rawlen; size_t rawlen;
void *raw = slurp_file(path, &rawlen); void *raw = slurp_file(path, &rawlen);
tsf *sf = tsf_load_memory(raw,rawlen); tsf *sf = tsf_load_memory(raw,rawlen);
free(raw); free(raw);
@ -83,7 +83,7 @@ void dsp_midi_free(struct dsp_midi_song *ms)
dsp_node *dsp_midi(const char *midi, tsf *sf) dsp_node *dsp_midi(const char *midi, tsf *sf)
{ {
long rawlen; size_t rawlen;
void *raw = slurp_file(midi, &rawlen); void *raw = slurp_file(midi, &rawlen);
struct dsp_midi_song *ms = malloc(sizeof(*ms)); struct dsp_midi_song *ms = malloc(sizeof(*ms));
ms->time = 0.0; ms->time = 0.0;

View file

@ -9,6 +9,7 @@
#include "time.h" #include "time.h"
#include <stdlib.h> #include <stdlib.h>
#include "pthread.h" #include "pthread.h"
#include "debug.h"
pthread_mutex_t soundrun = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t soundrun = PTHREAD_MUTEX_INITIALIZER;
@ -121,7 +122,7 @@ void filter_mod(pocketmod_context *mod, soundbyte *buffer, int frames)
dsp_node *dsp_mod(const char *path) dsp_node *dsp_mod(const char *path)
{ {
long modsize; size_t modsize;
void *data = slurp_file(path, &modsize); void *data = slurp_file(path, &modsize);
pocketmod_context *mod = malloc(sizeof(*mod)); pocketmod_context *mod = malloc(sizeof(*mod));
pocketmod_init(mod, data, modsize, SAMPLERATE); pocketmod_init(mod, data, modsize, SAMPLERATE);
@ -171,7 +172,7 @@ struct wav *make_sound(const char *wav) {
} }
struct wav *mwav = malloc(sizeof(*mwav)); struct wav *mwav = malloc(sizeof(*mwav));
long rawlen; size_t rawlen;
void *raw = slurp_file(wav, &rawlen); void *raw = slurp_file(wav, &rawlen);
if (!raw) { if (!raw) {
YughError("Could not find file %s.", wav); YughError("Could not find file %s.", wav);
@ -282,7 +283,7 @@ static long src_cb(struct sound *s, float **data)
return needed; return needed;
} }
struct dsp_node *dsp_source(char *path) struct dsp_node *dsp_source(const char *path)
{ {
struct sound *self = malloc(sizeof(*self)); struct sound *self = malloc(sizeof(*self));
self->frame = 0; self->frame = 0;

View file

@ -44,7 +44,7 @@ void audio_close();
struct wav *make_sound(const char *wav); struct wav *make_sound(const char *wav);
void free_sound(const char *wav); void free_sound(const char *wav);
void wav_norm_gain(struct wav *w, double lv); void wav_norm_gain(struct wav *w, double lv);
struct dsp_node *dsp_source(char *path); struct dsp_node *dsp_source(const char *path);
struct dsp_node *dsp_mod(const char *path); struct dsp_node *dsp_mod(const char *path);
int sound_finished(const struct sound *s); int sound_finished(const struct sound *s);

View file

@ -138,7 +138,7 @@ HMM_Vec4 spline_CT(HMM_Mat4 *C, float t)
return HMM_MulM4V4(*C, T); return HMM_MulM4V4(*C, T);
} }
HMM_Mat4 make_C(HMM_Vec2 *p, HMM_Mat4 *B) HMM_Mat4 make_C(const HMM_Vec2 *p, const HMM_Mat4 *B)
{ {
HMM_Mat4 G; HMM_Mat4 G;
G.Columns[0].xy = p[0]; G.Columns[0].xy = p[0];
@ -179,6 +179,8 @@ HMM_Vec2 *spline2d_min_seg(float u0, float u1, float min_seg, HMM_Mat4 *C, HMM_V
} }
else else
arrput(ret, b); arrput(ret, b);
return ret;
} }
HMM_Vec2 *catmull_rom_min_seg(HMM_Vec2 *a, HMM_Vec2 *b, HMM_Vec2 *c, HMM_Vec2 *d, float min_seg) HMM_Vec2 *catmull_rom_min_seg(HMM_Vec2 *a, HMM_Vec2 *b, HMM_Vec2 *c, HMM_Vec2 *d, float min_seg)
@ -216,7 +218,7 @@ HMM_Vec2 *spline2d_min_angle_2(float u0, float u1, float max_angle, HMM_Mat4 *C,
return arr; return arr;
} }
HMM_Vec2 *spline_min_angle(HMM_Vec2 *p, HMM_Mat4 *B, float min_angle, HMM_Vec2 *arr) HMM_Vec2 *spline_min_angle(HMM_Vec2 *p, const HMM_Mat4 *B, float min_angle, HMM_Vec2 *arr)
{ {
HMM_Mat4 C = make_C(p, B); HMM_Mat4 C = make_C(p, B);
arr = spline2d_min_angle_2(0,1,min_angle, &C, arr); arr = spline2d_min_angle_2(0,1,min_angle, &C, arr);
@ -250,7 +252,7 @@ HMM_Vec2 *bezier_cb_ma_v2(HMM_Vec2 *cp, float ma)
return ret; return ret;
} }
HMM_Vec2 catmull_rom_query(HMM_Vec2 *cp, float d, HMM_Mat4 *G) HMM_Vec2 catmull_rom_query(HMM_Vec2 *cp, float d, const HMM_Mat4 *G)
{ {
if (arrlen(cp) < 4 || d < 0 || d > 1) return HMM_V2(0,0); if (arrlen(cp) < 4 || d < 0 || d > 1) return HMM_V2(0,0);
@ -315,5 +317,5 @@ HMM_Vec2 catmull_rom_wig(HMM_Vec2 *cp, float d) { return catmull_rom_query(cp,d,
HMM_Vec2 catmull_rom_closest(HMM_Vec2 *cp, HMM_Vec2 p) HMM_Vec2 catmull_rom_closest(HMM_Vec2 *cp, HMM_Vec2 p)
{ {
return p;
} }

View file

@ -79,12 +79,13 @@ int gif_nframes(const char *path)
/* If an empty string or null is put for path, loads default texture */ /* If an empty string or null is put for path, loads default texture */
struct Texture *texture_pullfromfile(const char *path) { struct Texture *texture_pullfromfile(const char *path) {
if (!path) return texture_notex(); if (!path) return texture_notex();
if (shlen(texhash) == 0) sh_new_arena(texhash);
int index = shgeti(texhash, path); int index = shgeti(texhash, path);
if (index != -1) if (index != -1)
return texhash[index].value; return texhash[index].value;
long rawlen; size_t rawlen;
unsigned char *raw = slurp_file(path, &rawlen); unsigned char *raw = slurp_file(path, &rawlen);
if (!raw) return texture_notex(); if (!raw) return texture_notex();
@ -109,8 +110,7 @@ struct Texture *texture_pullfromfile(const char *path) {
tex->height = qoi.height; tex->height = qoi.height;
n = qoi.channels; n = qoi.channels;
} else if (!strcmp(ext, ".gif")) { } else if (!strcmp(ext, ".gif")) {
int *delays; data = stbi_load_gif_from_memory(raw, rawlen, NULL, &tex->width, &tex->height, &tex->frames, &n, 4);
data = stbi_load_gif_from_memory(raw, rawlen, &delays, &tex->width, &tex->height, &tex->frames, &n, 4);
tex->height *= tex->frames; tex->height *= tex->frames;
} else if (!strcmp(ext, ".svg")) { } else if (!strcmp(ext, ".svg")) {
#ifndef NSVG #ifndef NSVG
@ -187,9 +187,6 @@ struct Texture *texture_pullfromfile(const char *path) {
.data = sg_img_data .data = sg_img_data
}); });
if (shlen(texhash) == 0)
sh_new_arena(texhash);
shput(texhash, path, tex); shput(texhash, path, tex);
for (int i = 1; i < mips; i++) for (int i = 1; i < mips; i++)
@ -282,9 +279,7 @@ struct Texture *texture_fromdata(void *raw, long size)
return tex; return tex;
} }
struct Texture *texture_loadfromfile(const char *path) { struct Texture *texture_loadfromfile(const char *path) { return texture_pullfromfile(path); }
struct Texture *new = texture_pullfromfile(path);
}
struct glrect tex_get_rect(struct Texture *tex) { return ST_UNIT; } struct glrect tex_get_rect(struct Texture *tex) { return ST_UNIT; }

View file

@ -44,8 +44,8 @@ struct TextureOptions {
/* Represents an actual texture on the GPU */ /* Represents an actual texture on the GPU */
struct Texture { struct Texture {
sg_image id; /* ID reference for the GPU memory location of the texture */ sg_image id; /* ID reference for the GPU memory location of the texture */
uint16_t width; int width;
uint16_t height; int height;
unsigned char *data; unsigned char *data;
struct TextureOptions opts; struct TextureOptions opts;
int frames; int frames;

View file

@ -32,7 +32,7 @@ HMM_Vec3 mat3_t_pos(HMM_Mat4 m, HMM_Vec3 pos) { return HMM_MulM4V4(m, (HMM_Vec4)
HMM_Vec3 mat3_t_dir(HMM_Mat4 m, HMM_Vec3 dir) HMM_Vec3 mat3_t_dir(HMM_Mat4 m, HMM_Vec3 dir)
{ {
m.Columns[4] = (HMM_Vec4){0,0,0,1}; m.Columns[3] = (HMM_Vec4){0,0,0,1};
return mat3_t_pos(m, dir); return mat3_t_pos(m, dir);
} }
@ -60,4 +60,5 @@ transform3d mat2transform3d(HMM_Mat4 m)
// for (int i = 0; i < 2; i++) // for (int i = 0; i < 2; i++)
// m.Columns[i].xyz = HMM_MulV3(m.Columns[i].xyz, t.scale.Elements[i]); // m.Columns[i].xyz = HMM_MulV3(m.Columns[i].xyz, t.scale.Elements[i]);
t.rotation = HMM_M4ToQ_RH(m); t.rotation = HMM_M4ToQ_RH(m);
return t;
} }

View file

@ -119,10 +119,10 @@ static void process_frame()
if (stm_sec(stm_diff(frame_t, updatelast)) > updateMS) { if (stm_sec(stm_diff(frame_t, updatelast)) > updateMS) {
double dt = stm_sec(stm_diff(frame_t, updatelast)); double dt = stm_sec(stm_diff(frame_t, updatelast));
updatelast = frame_t; updatelast = frame_t;
prof_start(&prof_update); // prof_start(&prof_update);
call_updates(dt * timescale); call_updates(dt * timescale);
prof(&prof_update); // prof_lap(&prof_update);
if (sim_play == SIM_STEP) if (sim_play == SIM_STEP)
sim_pause(); sim_pause();
@ -131,18 +131,18 @@ static void process_frame()
physlag += elapsed; physlag += elapsed;
while (physlag > physMS) { while (physlag > physMS) {
physlag -= physMS; physlag -= physMS;
prof_start(&prof_physics); // prof_start(&prof_physics);
phys_step = 1; phys_step = 1;
phys2d_update(physMS * timescale); phys2d_update(physMS * timescale);
call_physics(physMS * timescale); call_physics(physMS * timescale);
phys_step = 0; phys_step = 0;
prof(&prof_physics); // prof_lap(&prof_physics);
} }
} }
prof_start(&prof_draw); // prof_start(&prof_draw);
window_render(&mainwin); window_render(&mainwin);
prof(&prof_draw); // prof_lap(&prof_draw);
gameobjects_cleanup(); gameobjects_cleanup();
} }
@ -224,6 +224,8 @@ void c_event(const sapp_event *e)
input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy, e->modifiers); input_mouse_move(e->mouse_x, e->mouse_y, e->mouse_dx, e->mouse_dy, e->modifiers);
input_dropped_files(sapp_get_num_dropped_files()); input_dropped_files(sapp_get_num_dropped_files());
break; break;
default:
break;
} }
if (editor_mode) if (editor_mode)
@ -258,7 +260,7 @@ static sapp_desc start_desc = {
.logger.func = sg_logging, .logger.func = sg_logging,
}; };
void app_name(char *name) { start_desc.window_title = strdup(name); } void app_name(const char *name) { start_desc.window_title = strdup(name); }
int main(int argc, char **argv) { int main(int argc, char **argv) {
#ifndef NDEBUG #ifndef NDEBUG
@ -267,7 +269,7 @@ int main(int argc, char **argv) {
if (logout) { if (logout) {
time_t now = time(NULL); time_t now = time(NULL);
char fname[100]; char fname[100];
snprintf(fname, 100, "yugine-%d.log", now); snprintf(fname, 100, "yugine-%ld.log", now);
log_setfile(fname); log_setfile(fname);
} }
#endif #endif

View file

@ -13,7 +13,7 @@ void print_stacktrace();
void yugine_init(); void yugine_init();
const char *engine_info(); const char *engine_info();
void app_name(char *name); void app_name(const char *name);
int frame_fps(); int frame_fps();
double get_timescale(); double get_timescale();