many bug fixes; const correctness; restrict; memory leaks fixed
This commit is contained in:
parent
e84d3b60af
commit
2ae45a5bb8
8
Makefile
8
Makefile
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue