Add Sqlite packing; merge render and openglrender; remove ftw from web builds
This commit is contained in:
parent
f41f547f63
commit
008458c7f1
22
Makefile
22
Makefile
|
@ -11,23 +11,26 @@ MAKEDIR != pwd
|
|||
CC := $(notdir $(CC))
|
||||
|
||||
DBG ?= 1
|
||||
|
||||
QFLAGS :=
|
||||
OPT ?= 0
|
||||
|
||||
INFO :=
|
||||
|
||||
ifeq ($(DBG),1)
|
||||
QFLAGS += -g
|
||||
INFO = dbg
|
||||
|
||||
ifeq ($(CC),tcc)
|
||||
QFLAGS +=
|
||||
endif
|
||||
else
|
||||
QFLAGS += -DNDEBUG -s
|
||||
INFO = rel
|
||||
endif
|
||||
|
||||
ifeq ($(OPT),1)
|
||||
QFLAGS += -O2 -flto
|
||||
AR = llvm-ar
|
||||
INFO = opt
|
||||
else
|
||||
QFLAGS += -O0
|
||||
endif
|
||||
|
||||
QFLAGS += -DHAVE_CEIL -DHAVE_FLOOR -DHAVE_FMOD -DHAVE_LRINT -DHAVE_LRINTF
|
||||
|
||||
# Uncomment for smallest binary
|
||||
|
@ -47,7 +50,6 @@ ARCH = x64
|
|||
|
||||
COMPILER_FLAGS = $(includeflag) $(QFLAGS) -MD $(WARNING_FLAGS) -I. -DCP_USE_DOUBLES=0 -DTINYSPLINE_FLOAT_PRECISION -DVER=\"$(VER)\" -DINFO=\"$(INFO)\" -c $< -o $@
|
||||
|
||||
|
||||
ifeq ($(OS), Windows_NT)
|
||||
LINKER_FLAGS += -mwin32 -static
|
||||
COMPILER_FLAGS += -mwin32
|
||||
|
@ -58,7 +60,7 @@ ifeq ($(OS), Windows_NT)
|
|||
ZIP = .zip
|
||||
UNZIP = unzip -o -q $(DISTDIR)/$(DIST) -d $(DESTDIR)
|
||||
else ifeq ($(CC), emcc)
|
||||
LINKER_FLAGS += -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 -pthread
|
||||
LINKER_FLAGS += -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 -pthread --preload-file test.db -s ALLOW_MEMORY_GROWTH=1
|
||||
COMPILER_FLAGS += -pthread
|
||||
ELIBS += pthread quickjs GL openal c m dl
|
||||
CC = emcc
|
||||
|
@ -172,11 +174,11 @@ $(BIN)libquickjs.a:
|
|||
|
||||
$(ENGINE): $(eobjects)
|
||||
@echo Making library engine.a
|
||||
@ar r $(ENGINE) $(eobjects)
|
||||
@$(AR) r $(ENGINE) $(eobjects)
|
||||
|
||||
$(objprefix)/%.o:%.c
|
||||
@mkdir -p $(@D)
|
||||
@echo Making C object $@ OS $(OS)
|
||||
@echo Making C object $@
|
||||
@$(CC) $(COMPILER_FLAGS)
|
||||
|
||||
clean:
|
||||
|
|
|
@ -169,7 +169,6 @@ void phys2d_init()
|
|||
}
|
||||
|
||||
void phys2d_set_gravity(cpVect v) {
|
||||
YughInfo("Set gravity to %g %g", v.x, v.y);
|
||||
cpSpaceSetGravity(space, v);
|
||||
}
|
||||
|
||||
|
@ -632,8 +631,8 @@ static cpBool handle_collision(cpArbiter *arb, int type) {
|
|||
cpBody *body1;
|
||||
cpBody *body2;
|
||||
cpArbiterGetBodies(arb, &body1, &body2);
|
||||
int g1 = *(int*)cpBodyGetUserData(body1);
|
||||
int g2 = *(int*)cpBodyGetUserData(body2);
|
||||
int g1 = (int)cpBodyGetUserData(body1);
|
||||
int g2 = (int)cpBodyGetUserData(body2);
|
||||
struct gameobject *go = id2go(g1);
|
||||
struct gameobject *go2 = id2go(g2);
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "font.h"
|
||||
#include "window.h"
|
||||
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
|
||||
// #define HANDMADE_MATH_USE_TURNS
|
||||
#include "HandmadeMath.h"
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
|
||||
static const float skyboxVertices[216] = {
|
||||
-1.0f, 1.0f, -1.0f,
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#include "limits.h"
|
||||
#include "log.h"
|
||||
#include "mix.h"
|
||||
#include "render.h"
|
||||
#include "resources.h"
|
||||
#include "shader.h"
|
||||
#include "sound.h"
|
||||
|
@ -14,7 +13,7 @@
|
|||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include "font.h"
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
|
||||
#define CBUF_IMPLEMENT
|
||||
#include "cbuf.h"
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
#include "debugdraw.h"
|
||||
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
|
||||
#include "yugine.h"
|
||||
|
||||
#include "shader.h"
|
||||
#include "log.h"
|
||||
#include <assert.h>
|
||||
|
@ -461,7 +458,7 @@ void inflatepoints(cpVect *r, cpVect *p, float d, int n)
|
|||
|
||||
void draw_edge(cpVect *points, int n, struct rgba color, int thickness, int closed, int flags, struct rgba line_color, float line_seg)
|
||||
{
|
||||
static_assert(sizeof(cpVect) == 2*sizeof(float), "Size of cpVect is not 2 floats.");
|
||||
static_assert(sizeof(cpVect) == 2*sizeof(float));
|
||||
if (thickness == 0) {
|
||||
thickness = 1;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include "mix.h"
|
||||
#include "music.h"
|
||||
#include "nuke.h"
|
||||
#include "openglrender.h"
|
||||
#include "sound.h"
|
||||
#include "sprite.h"
|
||||
#include "stb_ds.h"
|
||||
|
@ -22,7 +21,7 @@
|
|||
#include "window.h"
|
||||
#include "yugine.h"
|
||||
#include <assert.h>
|
||||
#include <ftw.h>
|
||||
#include "resources.h"
|
||||
|
||||
#include "render.h"
|
||||
|
||||
|
@ -412,7 +411,7 @@ JSValue duk_win_make(JSContext *js, JSValueConst this, int argc, JSValueConst *a
|
|||
}
|
||||
|
||||
JSValue duk_spline_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||
static_assert(sizeof(tsReal) * 2 == sizeof(cpVect), "Size of tsRealx2 is not cpVect");
|
||||
static_assert(sizeof(tsReal) * 2 == sizeof(cpVect));
|
||||
|
||||
tsBSpline spline;
|
||||
|
||||
|
@ -552,10 +551,7 @@ int file_exists(char *path) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static char *dukext;
|
||||
static JSValue dukarr;
|
||||
static int dukidx;
|
||||
|
||||
/*
|
||||
static int duk2path(const char *path, const struct stat *sb, int typeflag) {
|
||||
if (typeflag == FTW_F) {
|
||||
char *ext = strrchr(path, '.');
|
||||
|
@ -565,13 +561,13 @@ static int duk2path(const char *path, const struct stat *sb, int typeflag) {
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
*/
|
||||
JSValue dukext2paths(char *ext) {
|
||||
dukext = ext;
|
||||
dukarr = JS_NewArray(js);
|
||||
dukidx = 0;
|
||||
ftw(".", duk2path, 10);
|
||||
return dukarr;
|
||||
char *paths = NULL;
|
||||
|
||||
fill_extensions(paths, ".", ext);
|
||||
// return dukarr;
|
||||
return JS_NULL;
|
||||
}
|
||||
|
||||
JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||
|
@ -1061,6 +1057,18 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
|||
str = JS_ToCString(js, argv[1]);
|
||||
file_eval_env(str, argv[2]);
|
||||
break;
|
||||
|
||||
case 124:
|
||||
pack_engine();
|
||||
break;
|
||||
|
||||
case 125:
|
||||
mainwin.width = js2int(argv[1]);
|
||||
break;
|
||||
|
||||
case 126:
|
||||
mainwin.height = js2int(argv[2]);
|
||||
break;
|
||||
}
|
||||
|
||||
if (str)
|
||||
|
|
|
@ -11,8 +11,7 @@
|
|||
#include <window.h>
|
||||
#include <chipmunk/chipmunk.h>
|
||||
#include "2dphysics.h"
|
||||
|
||||
#include "openglrender.h"
|
||||
#include "resources.h"
|
||||
|
||||
#include "stb_image_write.h"
|
||||
#include "stb_rect_pack.h"
|
||||
|
@ -24,51 +23,6 @@ struct sFont *font;
|
|||
|
||||
#define max_chars 40000
|
||||
|
||||
unsigned char *slurp_file(const char *filename) {
|
||||
FILE *f = fopen(filename, "rb");
|
||||
|
||||
if (!f) return NULL;
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
long fsize = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
unsigned char *slurp = malloc(fsize + 1);
|
||||
fread(slurp, fsize, 1, f);
|
||||
fclose(f);
|
||||
|
||||
return slurp;
|
||||
}
|
||||
|
||||
char *slurp_text(const char *filename) {
|
||||
FILE *f = fopen(filename, "r");
|
||||
|
||||
if (!f) {
|
||||
YughWarn("File %s doesn't exist.", filename);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *buf;
|
||||
long int fsize;
|
||||
fseek(f, 0, SEEK_END);
|
||||
fsize = ftell(f);
|
||||
buf = malloc(fsize + 1);
|
||||
rewind(f);
|
||||
size_t r = fread(buf, sizeof(char), fsize, f);
|
||||
buf[r] = '\0';
|
||||
|
||||
fclose(f);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
int slurp_write(const char *txt, const char *filename) {
|
||||
FILE *f = fopen(filename, "w");
|
||||
if (!f) return 1;
|
||||
|
||||
fputs(txt, f);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static sg_shader fontshader;
|
||||
static sg_bindings bind_text;
|
||||
|
@ -83,7 +37,7 @@ struct text_vert {
|
|||
|
||||
static struct text_vert text_buffer[max_chars];
|
||||
|
||||
void font_init(struct shader *textshader) {
|
||||
void font_init() {
|
||||
fontshader = sg_compile_shader("shaders/textvert.glsl", "shaders/textfrag.glsl", &(sg_shader_desc){
|
||||
.vs.uniform_blocks[0] = {
|
||||
.size = sizeof(float) * 16,
|
||||
|
@ -129,7 +83,7 @@ void font_init(struct shader *textshader) {
|
|||
.usage = SG_USAGE_STREAM,
|
||||
.label = "text buffer"});
|
||||
|
||||
font = MakeFont("LessPerfectDOSVGA.ttf", 16);
|
||||
font = MakeFont("fonts/LessPerfectDOSVGA.ttf", 16);
|
||||
bind_text.fs_images[0] = font->texID;
|
||||
}
|
||||
|
||||
|
@ -144,7 +98,7 @@ struct sFont *MakeSDFFont(const char *fontfile, int height)
|
|||
char fontpath[256];
|
||||
snprintf(fontpath, 256, "fonts/%s", fontfile);
|
||||
|
||||
unsigned char *ttf_buffer = slurp_file(fontpath);
|
||||
unsigned char *ttf_buffer = slurp_file(fontpath, NULL);
|
||||
unsigned char *bitmap = malloc(packsize * packsize);
|
||||
|
||||
stbtt_fontinfo fontinfo;
|
||||
|
@ -171,7 +125,8 @@ struct sFont *MakeFont(const char *fontfile, int height) {
|
|||
char fontpath[256];
|
||||
snprintf(fontpath, 256, "fonts/%s", fontfile);
|
||||
|
||||
unsigned char *ttf_buffer = slurp_file(fontpath);
|
||||
unsigned char *ttf_buffer = slurp_file(fontfile, NULL);
|
||||
YughWarn("TTF BUFFER P IS %p", ttf_buffer);
|
||||
unsigned char *bitmap = malloc(packsize * packsize);
|
||||
|
||||
stbtt_packedchar glyphs[95];
|
||||
|
|
|
@ -29,7 +29,7 @@ struct sFont {
|
|||
sg_image texID;
|
||||
};
|
||||
|
||||
void font_init(struct shader *s);
|
||||
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);
|
||||
|
@ -39,9 +39,4 @@ int renderText(const char *text, HMM_Vec2 pos, float scale, struct rgba color, f
|
|||
// void text_frame();
|
||||
void text_flush(HMM_Mat4 *proj);
|
||||
|
||||
unsigned char *slurp_file(const char *filename);
|
||||
char *slurp_text(const char *filename);
|
||||
|
||||
int slurp_write(const char *txt, const char *filename);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include "time.h"
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "resources.h"
|
||||
|
||||
#include "stb_ds.h"
|
||||
|
||||
|
@ -201,9 +202,6 @@ static void pawn_call_keydown(int key) {
|
|||
void set_mouse_mode(int mousemode) { sapp_lock_mouse(mousemode); }
|
||||
|
||||
void input_init() {
|
||||
char *paddb = slurp_text("data/gamecontrollerdb.txt");
|
||||
free(paddb);
|
||||
|
||||
jsaxesstr[0] = str2js("ljoy");
|
||||
jsaxesstr[1] = str2js("rjoy");
|
||||
jsaxesstr[2] = str2js("ltrigger");
|
||||
|
|
|
@ -1,67 +0,0 @@
|
|||
#ifndef OPENGL_RENDER_H
|
||||
#define OPENGL_RENDER_H
|
||||
|
||||
#include "sokol/sokol_gfx.h"
|
||||
#include "HandmadeMath.h"
|
||||
|
||||
struct mCamera;
|
||||
struct window;
|
||||
|
||||
extern struct shader *spriteShader;
|
||||
extern struct shader *animSpriteShader;
|
||||
|
||||
extern sg_image ddimg;
|
||||
|
||||
extern struct sprite *tsprite;
|
||||
|
||||
extern int renderMode;
|
||||
|
||||
extern HMM_Vec3 dirl_pos;
|
||||
|
||||
extern HMM_Mat4 projection;
|
||||
extern HMM_Mat4 hudproj;
|
||||
|
||||
extern float gridScale;
|
||||
extern float smallGridUnit;
|
||||
extern float bigGridUnit;
|
||||
extern float gridSmallThickness;
|
||||
extern float gridBigThickness;
|
||||
extern struct rgba gridBigColor;
|
||||
extern struct rgba gridSmallColor;
|
||||
extern float gridOpacity;
|
||||
extern float editorFOV;
|
||||
extern float shadowLookahead;
|
||||
extern char objectName[];
|
||||
extern int debugColorPickBO;
|
||||
|
||||
extern struct gameobject *selectedobject;
|
||||
|
||||
#include <chipmunk/chipmunk.h>
|
||||
|
||||
enum RenderMode {
|
||||
LIT,
|
||||
UNLIT,
|
||||
WIREFRAME,
|
||||
DIRSHADOWMAP,
|
||||
OBJECTPICKER
|
||||
};
|
||||
|
||||
void openglInit();
|
||||
void openglRender(struct window *window);
|
||||
void opengl_rendermode(enum RenderMode r);
|
||||
|
||||
void openglInit3d(struct window *window);
|
||||
void openglRender3d(struct window *window, struct mCamera *camera);
|
||||
|
||||
void render_winsize();
|
||||
|
||||
void debug_draw_phys(int draw);
|
||||
|
||||
void set_cam_body(cpBody *body);
|
||||
cpVect cam_pos();
|
||||
float cam_zoom();
|
||||
void add_zoom(float val);
|
||||
|
||||
sg_shader sg_compile_shader(const char *v, const char *f, sg_shader_desc *d);
|
||||
|
||||
#endif
|
|
@ -1,4 +1,4 @@
|
|||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
|
||||
#include "camera.h"
|
||||
#include "config.h"
|
||||
|
@ -13,6 +13,7 @@
|
|||
#include "window.h"
|
||||
#include "model.h"
|
||||
#include "stb_ds.h"
|
||||
#include "resources.h"
|
||||
|
||||
#include "sokol/sokol_app.h"
|
||||
|
||||
|
@ -93,30 +94,29 @@ static struct {
|
|||
sg_image depth_img;
|
||||
} crt_post;
|
||||
|
||||
void make_shader(sg_shader_desc *d, sg_shader result, void *data)
|
||||
void trace_make_shader(sg_shader_desc *d, sg_shader result, void *data)
|
||||
{
|
||||
if (sg_query_shader_state(result) == SG_RESOURCESTATE_FAILED) {
|
||||
YughWarn("FAILED MAKING A SHADER: %s\n%s\n%s", d->label, d->vs.source, d->fs.source);
|
||||
}
|
||||
if (sg_query_shader_state(result) == SG_RESOURCESTATE_FAILED)
|
||||
YughError("FAILED MAKING A SHADER: %s\n%s\n%s", d->label);
|
||||
}
|
||||
|
||||
void fail_shader(sg_shader id, void *data)
|
||||
void trace_fail_shader(sg_shader id, void *data)
|
||||
{
|
||||
YughWarn("SHADER DID NOT COMPILE");
|
||||
}
|
||||
|
||||
void destroy_shader(sg_shader shd, void *data)
|
||||
void trace_destroy_shader(sg_shader shd, void *data)
|
||||
{
|
||||
YughWarn("DESTROYED SHADER");
|
||||
}
|
||||
|
||||
static sg_trace_hooks hooks = {
|
||||
.fail_shader = fail_shader,
|
||||
.make_shader = make_shader,
|
||||
.destroy_shader = destroy_shader,
|
||||
.fail_shader = trace_fail_shader,
|
||||
.make_shader = trace_make_shader,
|
||||
.destroy_shader = trace_destroy_shader,
|
||||
};
|
||||
|
||||
void openglInit() {
|
||||
void render_init() {
|
||||
mainwin.width = sapp_width();
|
||||
mainwin.height = sapp_height();
|
||||
|
||||
|
@ -132,7 +132,7 @@ void openglInit() {
|
|||
|
||||
sg_trace_hooks hh = sg_install_trace_hooks(&hooks);
|
||||
|
||||
font_init(NULL);
|
||||
font_init();
|
||||
debugdraw_init();
|
||||
sprite_initialize();
|
||||
nuke_init(&mainwin);
|
||||
|
@ -383,8 +383,10 @@ sg_shader sg_compile_shader(const char *v, const char *f, sg_shader_desc *d)
|
|||
|
||||
d->vs.source = vs;
|
||||
d->fs.source = fs;
|
||||
d->label = v;
|
||||
|
||||
sg_shader ret = sg_make_shader(d);
|
||||
|
||||
free(vs);
|
||||
free(fs);
|
||||
return ret;
|
|
@ -1,10 +1,69 @@
|
|||
#ifndef RENDER_H
|
||||
#define RENDER_H
|
||||
#ifndef OPENGL_RENDER_H
|
||||
#define OPENGL_RENDER_H
|
||||
|
||||
#include "sokol/sokol_gfx.h"
|
||||
|
||||
#include "HandmadeMath.h"
|
||||
|
||||
struct mCamera;
|
||||
struct window;
|
||||
|
||||
extern struct shader *spriteShader;
|
||||
extern struct shader *animSpriteShader;
|
||||
|
||||
extern sg_image ddimg;
|
||||
|
||||
extern struct sprite *tsprite;
|
||||
|
||||
extern int renderMode;
|
||||
|
||||
extern HMM_Vec3 dirl_pos;
|
||||
|
||||
extern HMM_Mat4 projection;
|
||||
extern HMM_Mat4 hudproj;
|
||||
|
||||
extern float gridScale;
|
||||
extern float smallGridUnit;
|
||||
extern float bigGridUnit;
|
||||
extern float gridSmallThickness;
|
||||
extern float gridBigThickness;
|
||||
extern struct rgba gridBigColor;
|
||||
extern struct rgba gridSmallColor;
|
||||
extern float gridOpacity;
|
||||
extern float editorFOV;
|
||||
extern float shadowLookahead;
|
||||
extern char objectName[];
|
||||
extern int debugColorPickBO;
|
||||
|
||||
extern struct gameobject *selectedobject;
|
||||
|
||||
#include <chipmunk/chipmunk.h>
|
||||
|
||||
enum RenderMode {
|
||||
LIT,
|
||||
UNLIT,
|
||||
WIREFRAME,
|
||||
DIRSHADOWMAP,
|
||||
OBJECTPICKER
|
||||
};
|
||||
|
||||
void render_init();
|
||||
void openglRender(struct window *window);
|
||||
void opengl_rendermode(enum RenderMode r);
|
||||
|
||||
void openglInit3d(struct window *window);
|
||||
void openglRender3d(struct window *window, struct mCamera *camera);
|
||||
|
||||
void render_winsize();
|
||||
|
||||
void debug_draw_phys(int draw);
|
||||
|
||||
void set_cam_body(cpBody *body);
|
||||
cpVect cam_pos();
|
||||
float cam_zoom();
|
||||
void add_zoom(float val);
|
||||
|
||||
sg_shader sg_compile_shader(const char *v, const char *f, sg_shader_desc *d);
|
||||
|
||||
struct uv_n {
|
||||
unsigned short u;
|
||||
unsigned short v;
|
||||
|
|
|
@ -11,8 +11,13 @@
|
|||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include "font.h"
|
||||
|
||||
#include <sqlite3.h>
|
||||
|
||||
#ifndef __EMSCRIPTEN__
|
||||
#include <ftw.h>
|
||||
#endif
|
||||
|
||||
#include "stb_ds.h"
|
||||
|
||||
|
@ -21,9 +26,6 @@ char *PREF_PATH = NULL;
|
|||
|
||||
char **prefabs;
|
||||
|
||||
const char *EXT_PREFAB = ".prefab";
|
||||
const char *EXT_LEVEL = ".level";
|
||||
const char *EXT_ASSET = ".asset";
|
||||
int stemlen = 0;
|
||||
|
||||
static const char *cur_ext = NULL;
|
||||
|
@ -31,6 +33,12 @@ struct dirent *c_dirent = NULL;
|
|||
|
||||
char pathbuf[MAXPATH + 1];
|
||||
|
||||
const char *DB_NAME = "test.db";
|
||||
static sqlite3 *game_db = NULL;
|
||||
static sqlite3_stmt *fopen_stmt;
|
||||
|
||||
#define sqlite_perr(db) YughError("Database error code %d, %s: %s", sqlite3_errcode(db), sqlite3_errstr(sqlite3_errcode(db)), sqlite3_errmsg(db));
|
||||
|
||||
void resources_init() {
|
||||
DATA_PATH = malloc(MAXPATH);
|
||||
getcwd(DATA_PATH, MAXPATH);
|
||||
|
@ -38,6 +46,18 @@ void resources_init() {
|
|||
|
||||
if (!PREF_PATH)
|
||||
PREF_PATH = strdup("./tmp/");
|
||||
|
||||
if (sqlite3_open_v2("test.db", &game_db, SQLITE_OPEN_READONLY, NULL)) {
|
||||
sqlite_perr(game_db);
|
||||
sqlite3_close(game_db);
|
||||
game_db = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sqlite3_prepare_v2(game_db, "select data from files where path=?1", -1, &fopen_stmt, NULL)) {
|
||||
sqlite_perr(game_db);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
char *get_filename_from_path(char *path, int extension) {
|
||||
|
@ -73,6 +93,10 @@ FILE *res_open(char *path, const char *tag) {
|
|||
return f;
|
||||
}
|
||||
|
||||
static char *ext_paths = NULL;
|
||||
|
||||
#ifndef __EMSCRIPTEN__
|
||||
|
||||
static int ext_check(const char *path, const struct stat *sb, int typeflag) {
|
||||
if (typeflag == FTW_F) {
|
||||
const char *ext = strrchr(path, '.');
|
||||
|
@ -89,12 +113,13 @@ static int ext_check(const char *path, const struct stat *sb, int typeflag) {
|
|||
void fill_extensions(char *paths, const char *path, const char *ext) {
|
||||
cur_ext = ext;
|
||||
arrfree(paths);
|
||||
ext_paths = paths;
|
||||
ftw(".", ext_check, 10);
|
||||
}
|
||||
|
||||
void findPrefabs() {
|
||||
fill_extensions(prefabs, DATA_PATH, EXT_PREFAB);
|
||||
}
|
||||
#else
|
||||
void fill_extensions(char *paths, const char *path, const char *ext)
|
||||
{};
|
||||
#endif
|
||||
|
||||
char *str_replace_ext(const char *s, const char *newext) {
|
||||
static char ret[256];
|
||||
|
@ -127,3 +152,173 @@ char *strdup(const char *s) {
|
|||
strcpy(new, s);
|
||||
return new;
|
||||
}
|
||||
|
||||
unsigned char *slurp_file(const char *filename, long *size)
|
||||
{
|
||||
if (game_db) {
|
||||
sqlite3_reset(fopen_stmt);
|
||||
|
||||
if (sqlite3_bind_text(fopen_stmt, 1, filename, -1, NULL)) {
|
||||
sqlite_perr(game_db);
|
||||
goto jump;
|
||||
}
|
||||
|
||||
if (sqlite3_step(fopen_stmt) == SQLITE_ERROR) {
|
||||
sqlite_perr(game_db);
|
||||
goto jump;
|
||||
}
|
||||
|
||||
char *data = sqlite3_column_blob(fopen_stmt,0);
|
||||
if (!data)
|
||||
goto jump;
|
||||
|
||||
return strdup(data);
|
||||
}
|
||||
FILE *f;
|
||||
|
||||
jump:
|
||||
f = fopen(filename, "rb");
|
||||
|
||||
if (!f) return NULL;
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
long fsize = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
unsigned char *slurp = malloc(fsize + 1);
|
||||
fread(slurp, fsize, 1, f);
|
||||
fclose(f);
|
||||
|
||||
if (size) *size = fsize;
|
||||
|
||||
return slurp;
|
||||
}
|
||||
|
||||
char *slurp_text(const char *filename) {
|
||||
if (game_db) {
|
||||
if (sqlite3_reset(fopen_stmt)) {
|
||||
sqlite_perr(game_db);
|
||||
goto jump;
|
||||
}
|
||||
|
||||
if (sqlite3_bind_text(fopen_stmt, 1, filename, -1, NULL)) {
|
||||
sqlite_perr(game_db);
|
||||
goto jump;
|
||||
}
|
||||
|
||||
if (sqlite3_step(fopen_stmt) == SQLITE_ERROR) {
|
||||
sqlite_perr(game_db);
|
||||
goto jump;
|
||||
}
|
||||
|
||||
char *data = sqlite3_column_text(fopen_stmt,0);
|
||||
if (!data)
|
||||
goto jump;
|
||||
|
||||
return strdup(data);
|
||||
}
|
||||
|
||||
FILE *f;
|
||||
char *buf;
|
||||
|
||||
jump:
|
||||
f = fopen(filename, "r");
|
||||
|
||||
if (!f) {
|
||||
YughWarn("File %s doesn't exist.", filename);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
long int fsize;
|
||||
fseek(f, 0, SEEK_END);
|
||||
fsize = ftell(f);
|
||||
buf = malloc(fsize + 1);
|
||||
rewind(f);
|
||||
size_t r = fread(buf, sizeof(char), fsize, f);
|
||||
buf[r] = '\0';
|
||||
|
||||
fclose(f);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
int slurp_write(const char *txt, const char *filename) {
|
||||
FILE *f = fopen(filename, "w");
|
||||
if (!f) return 1;
|
||||
|
||||
fputs(txt, f);
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef __EMSCRIPTEN__
|
||||
static sqlite3 *pack_db = NULL;
|
||||
static sqlite3_stmt *pack_stmt;
|
||||
|
||||
static const char *pack_ext[] = {".qoi", ".qoa", ".js", ".wav", ".mp3", ".png", ".sf2", ".midi", ".lvl", ".glsl"};
|
||||
|
||||
static int ftw_pack(const char *path, const struct stat *sb, int flag)
|
||||
{
|
||||
if (flag != FTW_F) return 0;
|
||||
|
||||
int pack = 0;
|
||||
|
||||
char *ext = strrchr(path, '.');
|
||||
if (!ext)
|
||||
return 0;
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
if (!strcmp(ext, pack_ext[i])) {
|
||||
pack = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!pack) return 0;
|
||||
|
||||
long len;
|
||||
void *file = slurp_file(path, &len);
|
||||
if (sqlite3_bind_text(pack_stmt, 1, &path[2], -1, NULL))
|
||||
sqlite_perr(pack_db);
|
||||
|
||||
if (sqlite3_bind_blob(pack_stmt, 2, file, len, NULL))
|
||||
sqlite_perr(pack_db);
|
||||
|
||||
if (sqlite3_step(pack_stmt) != SQLITE_DONE)
|
||||
sqlite_perr(pack_db);
|
||||
|
||||
free(file);
|
||||
|
||||
if (sqlite3_reset(pack_stmt))
|
||||
sqlite_perr(pack_db);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pack_engine()
|
||||
{
|
||||
sqlite3 *db;
|
||||
char *zErr = 0;
|
||||
if (sqlite3_open("test.db", &db)) {
|
||||
sqlite_perr(db);
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
|
||||
if(sqlite3_exec(db, "create table files ( path text, data blob);", NULL, NULL, NULL))
|
||||
sqlite_perr(db);
|
||||
|
||||
pack_db = db;
|
||||
if(sqlite3_prepare_v2(db, "insert into files (path, data) values (?1, ?2)", -1, &pack_stmt, NULL)) {
|
||||
sqlite_perr(db);
|
||||
sqlite3_close(db);
|
||||
return;
|
||||
}
|
||||
ftw(".", ftw_pack, 20);
|
||||
|
||||
sqlite3_close(db);
|
||||
}
|
||||
#else
|
||||
void packengine(){
|
||||
YughError("Cannot pack engine on a web build.");
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -3,18 +3,9 @@
|
|||
|
||||
#include <stdio.h>
|
||||
|
||||
extern char *DATA_PATH;
|
||||
extern char *PREF_PATH;
|
||||
|
||||
extern const char *EXT_PREFAB;
|
||||
extern const char *EXT_LEVEL;
|
||||
extern const char *EXT_ASSET;
|
||||
extern int stemlen;
|
||||
|
||||
void resources_init();
|
||||
|
||||
extern char **prefabs;
|
||||
void findPrefabs();
|
||||
void fill_extensions(char *paths, const char *path, const char *ext);
|
||||
char *get_filename_from_path(char *path, int extension);
|
||||
char *get_directory_from_path(char *path);
|
||||
|
@ -25,4 +16,10 @@ char *make_path(const char *file);
|
|||
|
||||
char *strdup(const char *s);
|
||||
|
||||
unsigned char *slurp_file(const char *filename, long *size);
|
||||
char *slurp_text(const char *filename);
|
||||
int slurp_write(const char *txt, const char *filename);
|
||||
|
||||
void pack_engine();
|
||||
|
||||
#endif
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "sys/stat.h"
|
||||
#include "sys/types.h"
|
||||
#include "time.h"
|
||||
#include "resources.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
|
@ -42,6 +43,11 @@ void script_startup() {
|
|||
JS_SetMaxStackSize(rt, 0);
|
||||
js = JS_NewContext(rt);
|
||||
ffi_load();
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
num_cache[i] = int2js(i);
|
||||
|
||||
script_dofile("scripts/engine.js");
|
||||
}
|
||||
|
||||
JSValue num_cache[100] = {0};
|
||||
|
@ -73,17 +79,6 @@ int js_print_exception(JSValue v) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void script_init() {
|
||||
/* Load all prefabs into memory */
|
||||
// if (DBG)
|
||||
// script_dofile("scripts/debug.js");
|
||||
// else
|
||||
script_dofile("scripts/engine.js");
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
num_cache[i] = int2js(i);
|
||||
}
|
||||
|
||||
void script_run(const char *script, const char *file) {
|
||||
JSValue obj = JS_Eval(js, script, strlen(script), file, JS_EVAL_FLAGS);
|
||||
js_print_exception(obj);
|
||||
|
|
|
@ -17,7 +17,6 @@ extern JSValue num_cache[100];
|
|||
|
||||
void js_stacktrace();
|
||||
void script_startup();
|
||||
void script_init();
|
||||
void script_run(const char *script, const char *file);
|
||||
JSValue script_compile(const char *file);
|
||||
void script_evalf(const char *format, ...);
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
#include "font.h"
|
||||
#include "gameobject.h"
|
||||
#include "log.h"
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
#include "shader.h"
|
||||
#include "stb_ds.h"
|
||||
|
|
|
@ -76,7 +76,6 @@ struct Texture *texture_pullfromfile(const char *path) {
|
|||
|
||||
YughInfo("Loading texture %s.", path);
|
||||
|
||||
|
||||
struct Texture *tex = calloc(1, sizeof(*tex));
|
||||
tex->opts.sprite = 1;
|
||||
tex->opts.mips = 0;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include <string.h>
|
||||
#include "ffi.h"
|
||||
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
|
||||
#include "stb_ds.h"
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include "font.h"
|
||||
#include "gameobject.h"
|
||||
#include "input.h"
|
||||
#include "openglrender.h"
|
||||
#include "render.h"
|
||||
#include "window.h"
|
||||
#include "sound.h"
|
||||
#include "resources.h"
|
||||
|
@ -154,55 +154,7 @@ static int argc;
|
|||
static char **args;
|
||||
|
||||
void c_init() {
|
||||
int logout = 0;
|
||||
#if DBG
|
||||
#if __linux
|
||||
if (logout) {
|
||||
time_t now = time(NULL);
|
||||
char fname[100];
|
||||
snprintf(fname, 100, "yugine-%d.log", now);
|
||||
log_setfile(fname);
|
||||
}
|
||||
|
||||
YughInfo("Starting yugine version %s.", VER);
|
||||
|
||||
FILE *sysinfo = NULL;
|
||||
/* sysinfo = popen("uname -a", "r");
|
||||
if (!sysinfo) {
|
||||
YughWarn("Failed to get sys info.");
|
||||
} else {
|
||||
log_cat(sysinfo);
|
||||
pclose(sysinfo);
|
||||
}*/
|
||||
signal(SIGSEGV, seghandle);
|
||||
signal(SIGABRT, seghandle);
|
||||
signal(SIGFPE, seghandle);
|
||||
signal(SIGBUS, seghandle);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
resources_init();
|
||||
phys2d_init();
|
||||
sound_init();
|
||||
script_init();
|
||||
input_init();
|
||||
openglInit();
|
||||
|
||||
int argsize = 0;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
argsize += strlen(args[i]);
|
||||
if (argc > i+1) argsize++;
|
||||
}
|
||||
|
||||
char cmdstr[argsize];
|
||||
cmdstr[0] = '\0';
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
strcat(cmdstr, args[i]);
|
||||
if (argc > i+1) strcat(cmdstr, " ");
|
||||
}
|
||||
|
||||
script_evalf("cmd_args('%s');", cmdstr);
|
||||
render_init();
|
||||
}
|
||||
|
||||
int frame_fps() {
|
||||
|
@ -345,15 +297,62 @@ double get_timescale()
|
|||
}
|
||||
|
||||
sapp_desc sokol_main(int sargc, char **sargs) {
|
||||
argc = sargc;
|
||||
args = sargs;
|
||||
#ifndef NDEBUG
|
||||
#ifdef __linux__
|
||||
int logout = 0;
|
||||
if (logout) {
|
||||
time_t now = time(NULL);
|
||||
char fname[100];
|
||||
snprintf(fname, 100, "yugine-%d.log", now);
|
||||
log_setfile(fname);
|
||||
}
|
||||
|
||||
stm_setup();
|
||||
YughInfo("Starting yugine version %s.", VER);
|
||||
|
||||
FILE *sysinfo = NULL;
|
||||
/* sysinfo = popen("uname -a", "r");
|
||||
if (!sysinfo) {
|
||||
YughWarn("Failed to get sys info.");
|
||||
} else {
|
||||
log_cat(sysinfo);
|
||||
pclose(sysinfo);
|
||||
}*/
|
||||
signal(SIGSEGV, seghandle);
|
||||
signal(SIGABRT, seghandle);
|
||||
signal(SIGFPE, seghandle);
|
||||
signal(SIGBUS, seghandle);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
stm_setup(); /* time */
|
||||
resources_init();
|
||||
|
||||
phys2d_init();
|
||||
|
||||
script_startup();
|
||||
|
||||
mainwin.width = 1200;
|
||||
mainwin.height = 700;
|
||||
int argsize = 0;
|
||||
for (int i = 1; i < argc; i++) {
|
||||
argsize += strlen(args[i]);
|
||||
if (argc > i+1) argsize++;
|
||||
}
|
||||
|
||||
char cmdstr[argsize];
|
||||
cmdstr[0] = '\0';
|
||||
|
||||
for (int i = 0; i < argc; i++) {
|
||||
strcat(cmdstr, args[i]);
|
||||
if (argc > i+1) strcat(cmdstr, " ");
|
||||
}
|
||||
|
||||
script_evalf("cmd_args('%s');", cmdstr);
|
||||
|
||||
YughWarn("Width, height %d %d", mainwin.width, mainwin.height);
|
||||
|
||||
sound_init();
|
||||
input_init();
|
||||
|
||||
|
||||
return (sapp_desc){
|
||||
.width = mainwin.width,
|
||||
|
|
|
@ -58,6 +58,7 @@ Cmdline.register_cmd("h", function() {
|
|||
Game.quit();
|
||||
},
|
||||
"Help.");
|
||||
Cmdline.register_cmd("b", function() { cmd(124); Game.quit(); }, "Pack the game into the given name.");
|
||||
|
||||
Cmdline.register_cmd("e", function(pawn) {
|
||||
run("scripts/editor.js");
|
||||
|
@ -1098,8 +1099,10 @@ var Signal = {
|
|||
};
|
||||
|
||||
var Window = {
|
||||
width: 0,
|
||||
height: 0,
|
||||
set width(w) { cmd(125, w); },
|
||||
set height(h) { cmd(126, h); },
|
||||
get width() { return cmd(48); },
|
||||
get height() { return cmd(49); },
|
||||
dimensions:[0,0],
|
||||
};
|
||||
|
||||
|
@ -2229,6 +2232,7 @@ var locks = ['height', 'width', 'visible', 'body', 'controlled', 'selectable', '
|
|||
locks.forEach(x => gameobject.obscure(x));
|
||||
/* Load configs */
|
||||
function load_configs(file) {
|
||||
Log.info(`Loading config file ${file}.`);
|
||||
var configs = JSON.parse(IO.slurp(file));
|
||||
for (var key in configs) {
|
||||
if (typeof globalThis[key] !== "object") continue;
|
||||
|
@ -2359,8 +2363,8 @@ gameobject.clone("sprite", {
|
|||
});
|
||||
|
||||
|
||||
if (IO.exists("config.js"))
|
||||
load("config.js");
|
||||
//if (IO.exists("config.js"))
|
||||
// load("config.js");
|
||||
|
||||
var prototypes = {};
|
||||
if (IO.exists("proto.json"))
|
||||
|
|
Loading…
Reference in a new issue