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
endif
CPPFLAGS += -ffast-math
ifeq ($(DBG),1)
CPPFLAGS += -g #-fsanitize=address
CPPFLAGS += -g -fsanitize=address
INFO += _dbg
else
CPPFLAGS += -DNDEBUG
@ -76,7 +78,7 @@ else
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
# default, fast and medium available in game at runtime; best available in editor
@ -166,7 +168,7 @@ ifdef STEAM
# BIN += /steam
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)
SEM = 0.0.1

View file

@ -523,6 +523,7 @@ function world_start() {
};
Primum.toString = function() { return "Primum"; };
Primum.ur = undefined;
Primum.kill = function() { this.clear(); };
}
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 0;
return 0;
}
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 */
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);
cpTransform T = {0};
T.a = 1;
@ -128,7 +128,7 @@ gameobject *phys2d_query_box(HMM_Vec2 pos, HMM_Vec2 wh) {
return clean_ids(qb.ids);
}
gameobject *phys2d_query_shape(struct phys2d_shape *shape)
gameobject **phys2d_query_shape(struct phys2d_shape *shape)
{
gameobject **ids = NULL;
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->t.scale = (HMM_Vec2){1.0,1.0};
go_shape_apply(go->body, shape->shape, go);
cpShapeSetCollisionType(shape->shape, (int)go);
cpShapeSetCollisionType(shape->shape, (cpCollisionType)go);
cpShapeSetUserData(shape->shape, shape);
}
@ -221,7 +221,7 @@ void phys2d_circledel(struct phys2d_circle *c) {
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));
float radius = cpCircleShapeGetRadius(c);
struct rgba color = shape_color(c);
@ -232,7 +232,7 @@ void phys2d_dbgdrawcpcirc(cpCircleShape *c) {
}
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) {
@ -308,7 +308,7 @@ struct phys2d_poly *Make2DPoly(gameobject *go) {
arrsetlen(new->points, 0);
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.moi = phys2d_poly_moi;
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 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)) {
// YughError("Polygon MOI returned an error. Returning 0.");
return 0;
@ -335,16 +335,14 @@ void phys2d_polyaddvert(struct phys2d_poly *poly) {
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 (poly->points)
arrfree(poly->points);
arrsetlen(poly->points, arrlen(verts));
for (int i = 0; i < arrlen(verts); i++) {
poly->points[i].X = verts[i].x;
poly->points[i].Y = verts[i].y;
}
for (int i = 0; i < arrlen(verts); i++)
poly->points[i] = verts[i];
phys2d_applypoly(poly);
}
@ -354,7 +352,7 @@ void phys2d_applypoly(struct phys2d_poly *poly) {
assert(sizeof(poly->points[0]) == sizeof(cpVect));
struct gameobject *go = poly->shape.go;
// 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);
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) {
cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (int)go);
cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (cpCollisionType)go);
handler->userData = NULL;
handler->beginFunc = NULL;
handler->separateFunc = NULL;
}
void phys2d_setup_handlers(gameobject *go) {
cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (int)go);
cpCollisionHandler *handler = cpSpaceAddWildcardHandler(space, (cpCollisionType)go);
handler->userData = go;
handler->beginFunc = script_phys_cb_begin;
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_dbgdrawpoly(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);
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_update(float deltaT);
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 {
@ -130,7 +130,7 @@ struct rgba shape_color_s(cpShape *shape);
void shape_gui(struct phys2d_shape *shape);
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);
void flush_collide_cbs();

View file

@ -6,7 +6,6 @@
#include "font.h"
#include "window.h"
#include "gameobject.h"
#include "libgen.h"
//#include "diffuse.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;
mesh->bind.fs.images[0] = texture_fromdata(buf->buffer->data, buf->size)->id;
} 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;
free(imp);
}
@ -258,6 +257,9 @@ void mesh_add_primitive(mesh *mesh, cgltf_primitive *prim)
case cgltf_attribute_type_texcoord:
mesh->bind.vertex_buffers[1] = texcoord_floats(vs, verts, comp);
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 t = (time - sampler->times[previous_time])/td;
switch(sampler->type) {
case LINEAR:
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);
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)
{
#ifndef NDEBUG
prof->lap = stm_now();
#endif
arrsetlen(prof->ms, prof->laps);
}
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);
arrput(prof->ms, stm_sec(t));
#endif
}
void resetTriangles()

View file

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

View file

@ -292,7 +292,6 @@ void debugdraw_init()
.cull_mode = SG_CULLMODE_BACK,
.label = "grid pipeline",
.colors[0].blend = blend_trans,
.label = "dbg grid",
});
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));
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);
stbtt_packedchar glyphs[95];
@ -251,7 +251,7 @@ void text_settype(struct sFont *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;
if (!color) color = &d;
@ -278,13 +278,13 @@ unsigned char *esc_color(unsigned char *c, struct rgba *color, struct rgba defc)
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;
HMM_Vec2 cursor = {0,0};
const unsigned char *c = text;
const unsigned char *line, *wordstart, *drawstart;
line = drawstart = (unsigned char *)text;
const char *c = text;
const char *line, *wordstart, *drawstart;
line = drawstart = text;
while (*line != '\0') {
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 */
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);
HMM_Vec2 cursor = pos;
const unsigned char *line, *wordstart, *drawstart;
line = drawstart = (unsigned char *)text;
const char *line, *wordstart, *drawstart;
line = drawstart = text;
struct rgba usecolor = color;
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);
void sdrawCharacter(struct Character c, HMM_Vec2 cursor, float scale, struct rgba color);
void text_settype(struct sFont *font);
struct boundingbox text_bb(const unsigned 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);
struct boundingbox text_bb(const char *text, float scale, float lw, 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_flush(HMM_Mat4 *proj);

View file

@ -13,9 +13,9 @@ struct freelistheader
};
#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->len = n;
list->count = 0;
@ -29,7 +29,7 @@ static inline unsigned int freelist_check(struct freelistheader *h, void *data,
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_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)

View file

@ -77,10 +77,10 @@ unsigned int editor_cat = 1<<31;
void go_shape_apply(cpBody *body, cpShape *shape, gameobject *go) {
cpShapeSetFriction(shape, go->f);
cpShapeSetElasticity(shape, go->e);
cpShapeSetCollisionType(shape, (int)go);
cpShapeSetCollisionType(shape, (cpCollisionType)go);
cpShapeFilter filter;
filter.group = (int)go;
filter.group = (cpCollisionType)go;
filter.categories = 1<<go->layer | editor_cat;
// filter.mask = CP_ALL_CATEGORIES;
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); }
const char *js2str(JSValue v) { return JS_ToCString(js, v); }
JSValue strarr2js(const char **c)
JSValue strarr2js(char **c)
{
JSValue arr = JS_NewArray(js);
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) {
const unsigned char *s = JS_ToCString(js, argv[0]);
const char *s = JS_ToCString(js, argv[0]);
HMM_Vec2 pos = js2vec2(argv[1]);
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]);
const char *str = NULL;
const char *str2 = NULL;
const void *d1 = NULL;
const void *d2 = NULL;
const void *v1 = NULL;
gameobject *ids = NULL;
void *d1 = NULL;
void *d2 = NULL;
void *v1 = NULL;
gameobject **ids = NULL;
int *intids = NULL;
gameobject *go = NULL;
JSValue ret = JS_UNDEFINED;
@ -874,9 +875,9 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
case 86:
v1 = js2cpvec2arr(argv[3]);
ids = phys2d_query_box_points(js2vec2(argv[1]), js2vec2(argv[2]), v1, js2int(argv[4]));
ret = gos2ref(ids);
arrfree(ids);
intids = phys2d_query_box_points(js2vec2(argv[1]), js2vec2(argv[2]), v1, js2int(argv[4]));
ret = ints2js(intids);
arrfree(intids);
break;
case 87:

View file

@ -42,7 +42,7 @@ static struct {
double timer;
double spf;
int rec;
char *buffer;
uint8_t *buffer;
} gif;
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;
@ -109,7 +109,7 @@ void gif_rec_end(char *path)
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;
void *data = malloc(w*h*n);
@ -297,7 +297,7 @@ void render_init() {
model_init();
sg_color c;
rgba2floats(&c, editorClearColor);
rgba2floats((float*)&c, editorClearColor);
pass_action = (sg_pass_action){
.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 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();
@ -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);
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 {
unsigned short u;

View file

@ -72,11 +72,13 @@ char *get_filename_from_path(char *path, int extension) {
return filename;
}
char *get_directory_from_path(char *path) {
char *dirname(const char *path)
{
const char *dirpos = strrchr(path, '/');
char *directory = (char *)malloc(sizeof(char) * (dirpos - path + 1));
strncpy(directory, path, dirpos - path);
return directory;
if (!dirpos) return ".";
char *dir = malloc(dirpos-path+1);
strncpy(dir,path,dirpos-path);
return dir;
}
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;
}
char **ls(char *path)
char **ls(const char *path)
{
if (ls_paths) {
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;
}
int fexists(char *path)
int fexists(const char *path)
{
return !access(path,R_OK);
int len = strlen(path);
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;
return 0;
@ -247,7 +249,7 @@ char *slurp_text(const char *filename, size_t *size)
return retstr;
}
int cp(char *p1, char *p2)
int cp(const char *p1, const char *p2)
{
size_t 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);
}
FILE *fopen_mkdir(char *path, char *mode) {
FILE *fopen_mkdir(const char *path, const char *mode) {
char *sep = strrchr(path, '/');
if(sep) {
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 *path_open(const char *tag, const char *fmt, ...);
char *make_path(const char *file);
char **ls(char *path);
int cp(char *p1, char *p2);
int fexists(char *path);
FILE *fopen_mkdir(char *path, char *mode);
char **ls(const char *path);
int cp(const char *p1, const char *p2);
int fexists(const char *path);
FILE *fopen_mkdir(const char *path, const char *mode);
char *dirname(const char *path);
void *slurp_file(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)
{
size_t len;
const char *script = slurp_text(file, &len);
char *script = slurp_text(file, &len);
if (!script) return JS_UNDEFINED;
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);
}
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++) {
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--;
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);
}
void mono_expand(soundbyte *buffer, int to, int frames)
void mono_expand(soundbyte *restrict buffer, int to, int frames)
{
soundbyte hold[frames];
memcpy(hold, buffer, sizeof(soundbyte)*frames);
@ -86,7 +86,7 @@ soundbyte *dsp_node_out(dsp_node *node)
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);
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 */
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];
}
@ -107,7 +107,7 @@ void norm_soundbytes(soundbyte *a, float lvl, int samples)
{
float tar = lvl;
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;
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;
}
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)
{
@ -152,9 +152,12 @@ void node_free(dsp_node *node)
if (node == masterbus) return; /* Simple check to not delete the masterbus */
pthread_mutex_lock(&soundrun);
unplug_node(node);
if (node->data)
if (node->data_free) node->data_free(node->data);
else free(node->data);
if (node->data) {
if (node->data_free)
node->data_free(node->data);
else
free(node->data);
}
free(node);
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);
}
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()
@ -246,7 +249,9 @@ soundbyte sample_whitenoise()
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);
}
@ -295,7 +300,7 @@ dsp_node *dsp_pinknoise()
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);
for (int i = 0; i < frames*CHANNELS; i++) {
@ -312,7 +317,7 @@ dsp_node *dsp_rednoise()
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];
for (int i = 0; i < frames; i++)
@ -336,6 +341,7 @@ struct timescale
static long *src_cb(struct timescale *ts, float **data)
{
return NULL;
}
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);
}
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++) {
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);
}
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];
}
@ -517,7 +523,7 @@ dsp_node *dsp_noise_gate(float floor)
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];
}
@ -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++) {
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)))
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 step = SAMPLERATE/b->sr;

View file

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

View file

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

View file

@ -44,7 +44,7 @@ void audio_close();
struct wav *make_sound(const char *wav);
void free_sound(const char *wav);
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);
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);
}
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;
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
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)
@ -216,7 +218,7 @@ HMM_Vec2 *spline2d_min_angle_2(float u0, float u1, float max_angle, HMM_Mat4 *C,
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);
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;
}
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);
@ -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)
{
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 */
struct Texture *texture_pullfromfile(const char *path) {
if (!path) return texture_notex();
if (shlen(texhash) == 0) sh_new_arena(texhash);
int index = shgeti(texhash, path);
if (index != -1)
return texhash[index].value;
long rawlen;
size_t rawlen;
unsigned char *raw = slurp_file(path, &rawlen);
if (!raw) return texture_notex();
@ -109,8 +110,7 @@ struct Texture *texture_pullfromfile(const char *path) {
tex->height = qoi.height;
n = qoi.channels;
} else if (!strcmp(ext, ".gif")) {
int *delays;
data = stbi_load_gif_from_memory(raw, rawlen, &delays, &tex->width, &tex->height, &tex->frames, &n, 4);
data = stbi_load_gif_from_memory(raw, rawlen, NULL, &tex->width, &tex->height, &tex->frames, &n, 4);
tex->height *= tex->frames;
} else if (!strcmp(ext, ".svg")) {
#ifndef NSVG
@ -187,9 +187,6 @@ struct Texture *texture_pullfromfile(const char *path) {
.data = sg_img_data
});
if (shlen(texhash) == 0)
sh_new_arena(texhash);
shput(texhash, path, tex);
for (int i = 1; i < mips; i++)
@ -282,9 +279,7 @@ struct Texture *texture_fromdata(void *raw, long size)
return tex;
}
struct Texture *texture_loadfromfile(const char *path) {
struct Texture *new = texture_pullfromfile(path);
}
struct Texture *texture_loadfromfile(const char *path) { return texture_pullfromfile(path); }
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 */
struct Texture {
sg_image id; /* ID reference for the GPU memory location of the texture */
uint16_t width;
uint16_t height;
int width;
int height;
unsigned char *data;
struct TextureOptions opts;
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)
{
m.Columns[4] = (HMM_Vec4){0,0,0,1};
m.Columns[3] = (HMM_Vec4){0,0,0,1};
return mat3_t_pos(m, dir);
}
@ -60,4 +60,5 @@ transform3d mat2transform3d(HMM_Mat4 m)
// for (int i = 0; i < 2; i++)
// m.Columns[i].xyz = HMM_MulV3(m.Columns[i].xyz, t.scale.Elements[i]);
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) {
double dt = stm_sec(stm_diff(frame_t, updatelast));
updatelast = frame_t;
prof_start(&prof_update);
// prof_start(&prof_update);
call_updates(dt * timescale);
prof(&prof_update);
// prof_lap(&prof_update);
if (sim_play == SIM_STEP)
sim_pause();
@ -131,18 +131,18 @@ static void process_frame()
physlag += elapsed;
while (physlag > physMS) {
physlag -= physMS;
prof_start(&prof_physics);
// prof_start(&prof_physics);
phys_step = 1;
phys2d_update(physMS * timescale);
call_physics(physMS * timescale);
phys_step = 0;
prof(&prof_physics);
// prof_lap(&prof_physics);
}
}
prof_start(&prof_draw);
// prof_start(&prof_draw);
window_render(&mainwin);
prof(&prof_draw);
// prof_lap(&prof_draw);
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_dropped_files(sapp_get_num_dropped_files());
break;
default:
break;
}
if (editor_mode)
@ -258,7 +260,7 @@ static sapp_desc start_desc = {
.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) {
#ifndef NDEBUG
@ -267,7 +269,7 @@ int main(int argc, char **argv) {
if (logout) {
time_t now = time(NULL);
char fname[100];
snprintf(fname, 100, "yugine-%d.log", now);
snprintf(fname, 100, "yugine-%ld.log", now);
log_setfile(fname);
}
#endif

View file

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