Fix web build; make all file searching fns look through slurp/the CDBs first

This commit is contained in:
John Alanbrook 2023-09-18 17:35:40 +00:00
parent 60d078321c
commit 03c9f0c93d
12 changed files with 71 additions and 45 deletions

View file

@ -1,6 +1,6 @@
MAKEFLAGS = --jobs=4 MAKEFLAGS = --jobs=4
UNAME != uname UNAME != uname
MAKEDIR != pwd nMAKEDIR != pwd
# Options # Options
# DBG --- build with debugging symbols and logging # DBG --- build with debugging symbols and logging
@ -78,7 +78,7 @@ ifeq ($(OS), Windows_NT)
ZIP = .zip ZIP = .zip
UNZIP = unzip -o -q $(DISTDIR)/$(DIST) -d $(DESTDIR) UNZIP = unzip -o -q $(DISTDIR)/$(DIST) -d $(DESTDIR)
else ifeq ($(CC), emcc) else ifeq ($(CC), emcc)
LDFLAGS += -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 -pthread -sALLOW_MEMORY_GROWTH -sTOTAL_MEMORY=450MB --embed-file $(BIN)@ LDFLAGS += -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 -pthread -sTOTAL_MEMORY=450MB
CFLAGS += -pthread CFLAGS += -pthread
LDLIBS += pthread quickjs GL openal c m dl LDLIBS += pthread quickjs GL openal c m dl
CC = emcc CC = emcc
@ -166,7 +166,7 @@ $(BIN)/libcdb.a:
$(BIN)/libquickjs.a: $(BIN)/libquickjs.a:
make -C quickjs clean make -C quickjs clean
make -C quickjs OPT=$(OPT) HOST_CC=$(CC) libquickjs.a libquickjs.lto.a CC=$(CC) make -C quickjs OPT=$(OPT) HOST_CC=$(CC) AR=$(AR) libquickjs.a libquickjs.lto.a CC=$(CC)
@mkdir -p $(BIN) @mkdir -p $(BIN)
cp -rf quickjs/libquickjs.* $(BIN) cp -rf quickjs/libquickjs.* $(BIN)
@ -180,7 +180,7 @@ shaders: $(SHADERS)
%.sglsl.h:%.sglsl %.sglsl.h:%.sglsl
@echo Creating shader $^ @echo Creating shader $^
@./sokol-shdc --ifdef -i $^ --slang=glsl330:hlsl5:metal_macos -o $@ @./sokol-shdc --ifdef -i $^ --slang=glsl330:hlsl5:metal_macos:glsl300es -o $@
cdb: tools/cdb.c $(BIN)/libcdb.a cdb: tools/cdb.c $(BIN)/libcdb.a
$(CC) $< -lcdb -L$(BIN) -I$(CDB) -o cdb $(CC) $< -lcdb -L$(BIN) -I$(CDB) -o cdb

View file

@ -51,7 +51,11 @@ static void render_audio(plm_t *mpeg, plm_samples_t *samples, void *user) {
} }
void ds_openvideo(struct datastream *ds, const char *video, const char *adriver) { void ds_openvideo(struct datastream *ds, const char *video, const char *adriver) {
ds->plm = plm_create_with_filename(video); long rawlen;
void *raw;
raw = slurp_file(video, &rawlen);
ds->plm = plm_create_with_memory(raw, rawlen, 0);
free(raw);
if (!ds->plm) { if (!ds->plm) {
YughError("Couldn't open %s", video); YughError("Couldn't open %s", video);

View file

@ -111,8 +111,6 @@ struct sFont *MakeSDFFont(const char *fontfile, int height)
} }
struct sFont *MakeFont(const char *fontfile, int height) { struct sFont *MakeFont(const char *fontfile, int height) {
YughInfo("Making font %s.", fontfile);
int packsize = 1024; int packsize = 1024;
struct sFont *newfont = calloc(1, sizeof(struct sFont)); struct sFont *newfont = calloc(1, sizeof(struct sFont));
@ -134,8 +132,6 @@ struct sFont *MakeFont(const char *fontfile, int height) {
stbtt_PackFontRange(&pc, ttf_buffer, 0, height, 32, 95, glyphs); stbtt_PackFontRange(&pc, ttf_buffer, 0, height, 32, 95, glyphs);
stbtt_PackEnd(&pc); stbtt_PackEnd(&pc);
stbi_write_png("packedfont.png", packsize, packsize, 1, bitmap, sizeof(char) * packsize);
stbtt_fontinfo fontinfo; stbtt_fontinfo fontinfo;
if (!stbtt_InitFont(&fontinfo, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0))) { if (!stbtt_InitFont(&fontinfo, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0))) {
YughError("Failed to make font %s", fontfile); YughError("Failed to make font %s", fontfile);

View file

@ -2,31 +2,18 @@
#ifndef NO_EDITOR #ifndef NO_EDITOR
#define NK_INCLUDE_STANDARD_IO
#define NK_IMPLEMENTATION
#define NK_KEYSTATE_BASED_INPUT
#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_FONT
#define NK_INCLUDE_STANDARD_BOOL
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#define STBTT_STATIC #define STBTT_STATIC
#include "config.h" #include "config.h"
#include "sokol/sokol_gfx.h" #include "sokol/sokol_gfx.h"
#define NK_IMPLEMENTATION
#define SOKOL_NUKLEAR_IMPL #define SOKOL_NUKLEAR_IMPL
#define SOKOL_METAL
#include "nuklear.h" #include "nuklear.h"
#include "sokol/sokol_app.h" #include "sokol/sokol_app.h"
#include "sokol/sokol_nuklear.h" #include "sokol/sokol_nuklear.h"
#include <stdarg.h> #include <stdarg.h>
#include "log.h" #include "log.h"

View file

@ -2,6 +2,22 @@
#define NUKE_H #define NUKE_H
#include "render.h" #include "render.h"
#define NK_INCLUDE_STANDARD_IO
#define NK_KEYSTATE_BASED_INPUT
#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_FONT
#define NK_INCLUDE_STANDARD_BOOL
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#include "nuklear.h"
#include "sokol/sokol_app.h"
#include "sokol/sokol_gfx.h"
#include "sokol/sokol_nuklear.h"
struct window; struct window;
void nuke_init(struct window *win); void nuke_init(struct window *win);

View file

@ -202,7 +202,7 @@ int fexists(char *path)
return 0; return 0;
} }
unsigned char *slurp_file(const char *filename, size_t *size) void *slurp_file(const char *filename, size_t *size)
{ {
if (cdb_find(&game_cdb, filename, strlen(filename))) if (cdb_find(&game_cdb, filename, strlen(filename)))
return cdb_slurp(&game_cdb, filename, size); return cdb_slurp(&game_cdb, filename, size);
@ -296,4 +296,6 @@ void pack_engine(const char *fname)
void pack_engine(const char *fname){ void pack_engine(const char *fname){
YughError("Cannot pack engine on a web build."); YughError("Cannot pack engine on a web build.");
} }
char **ls(char *path) { return NULL; }
#endif #endif

View file

@ -16,7 +16,7 @@ char *make_path(const char *file);
char **ls(char *path); char **ls(char *path);
int fexists(char *path); int fexists(char *path);
unsigned char *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);
int slurp_write(const char *txt, const char *filename); int slurp_write(const char *txt, const char *filename);

View file

@ -18,26 +18,32 @@
#include "sokol/sokol_audio.h" #include "sokol/sokol_audio.h"
#define TSF_NO_STDIO
#define TSF_IMPLEMENTATION #define TSF_IMPLEMENTATION
#include "tsf.h" #include "tsf.h"
#define TML_NO_STDIO
#define TML_IMPLEMENTATION #define TML_IMPLEMENTATION
#include "tml.h" #include "tml.h"
#define DR_WAV_NO_STDIO
#define DR_WAV_IMPLEMENTATION #define DR_WAV_IMPLEMENTATION
#include "dr_wav.h" #include "dr_wav.h"
#ifndef NFLAC #ifndef NFLAC
#define DR_FLAC_IMPLEMENTATION #define DR_FLAC_IMPLEMENTATION
#define DR_FLAC_NO_STDIO
#include "dr_flac.h" #include "dr_flac.h"
#endif #endif
#ifndef NMP3 #ifndef NMP3
#define DR_MP3_NO_STDIO
#define DR_MP3_IMPLEMENTATION #define DR_MP3_IMPLEMENTATION
#include "dr_mp3.h" #include "dr_mp3.h"
#endif #endif
#define QOA_NO_STDIO
#define QOA_IMPLEMENTATION #define QOA_IMPLEMENTATION
#include "qoa.h" #include "qoa.h"
@ -143,43 +149,38 @@ struct wav *make_sound(const char *wav) {
} }
struct wav mwav; struct wav mwav;
long rawlen;
void *raw = slurp_file(wav, &rawlen);
if (!strcmp(ext, "wav")) { if (!strcmp(ext, "wav"))
mwav.data = drwav_open_file_and_read_pcm_frames_f32(wav, &mwav.ch, &mwav.samplerate, &mwav.frames, NULL); mwav.data = drwav_open_memory_and_read_pcm_frames_f32(raw, rawlen, &mwav.ch, &mwav.samplerate, &mwav.frames, NULL);
}
#ifndef NFLAC #ifndef NFLAC
else if (!strcmp(ext, "flac")) { else if (!strcmp(ext, "flac"))
mwav.data = drflac_open_file_and_read_pcm_frames_f32(wav, &mwav.ch, &mwav.samplerate, &mwav.frames, NULL); mwav.data = drflac_open_memory_and_read_pcm_frames_f32(raw, rawlen, &mwav.ch, &mwav.samplerate, &mwav.frames, NULL);
}
#endif #endif
#ifndef NMP3 #ifndef NMP3
else if (!strcmp(ext, "mp3")) { else if (!strcmp(ext, "mp3")) {
drmp3_config cnf; drmp3_config cnf;
mwav.data = drmp3_open_file_and_read_pcm_frames_f32(wav, &cnf, &mwav.frames, NULL); mwav.data = drmp3_open_memory_and_read_pcm_frames_f32(raw, rawlen, &cnf, &mwav.frames, NULL);
mwav.ch = cnf.channels; mwav.ch = cnf.channels;
mwav.samplerate = cnf.sampleRate; mwav.samplerate = cnf.sampleRate;
} }
#endif #endif
else if (!strcmp(ext, "qoa")) { else if (!strcmp(ext, "qoa")) {
unsigned char header[QOA_MIN_FILESIZE];
FILE *f = fopen(wav, "rb");
fread(header, QOA_MIN_FILESIZE, 1, f);
qoa_desc qoa; qoa_desc qoa;
unsigned int ff_pos = qoa_decode_header(header, QOA_MIN_FILESIZE, &qoa); short *qoa_data = qoa_decode(raw, rawlen, &qoa);
mwav.ch = qoa.channels; mwav.ch = qoa.channels;
mwav.samplerate = qoa.samplerate; mwav.samplerate = qoa.samplerate;
mwav.frames = qoa.samples; mwav.frames = qoa.samples;
short *qoa_data = qoa_read(wav, &qoa);
mwav.data = malloc(sizeof(soundbyte) * mwav.frames * mwav.ch); mwav.data = malloc(sizeof(soundbyte) * mwav.frames * mwav.ch);
src_short_to_float_array(qoa_data, mwav.data, mwav.frames*mwav.ch); src_short_to_float_array(qoa_data, mwav.data, mwav.frames*mwav.ch);
fclose(f);
free(qoa_data); free(qoa_data);
} else { } else {
YughWarn("Cannot process file type '%s'.", ext); YughWarn("Cannot process file type '%s'.", ext);
free (raw);
return NULL; return NULL;
} }
free(raw);
if (mwav.samplerate != SAMPLERATE) if (mwav.samplerate != SAMPLERATE)
mwav = change_samplerate(mwav, SAMPLERATE); mwav = change_samplerate(mwav, SAMPLERATE);

View file

@ -6,6 +6,8 @@
#include "mix.h" #include "mix.h"
#include "sound.h" #include "sound.h"
#include "log.h" #include "log.h"
#include "resources.h"
#include <stdlib.h>
#define TSF_BLOCK 32 #define TSF_BLOCK 32
@ -58,18 +60,26 @@ struct bus *musicbus;
void play_song(const char *midi, const char *sf) void play_song(const char *midi, const char *sf)
{ {
gsong.midi = tml_load_filename(midi); long rawlen;
void *raw = slurp_file(midi, &rawlen);
gsong.midi = tml_load_memory(raw, rawlen);
if (gsong.midi == NULL) { if (gsong.midi == NULL) {
YughWarn("Midi %s not found.", midi); YughWarn("Midi %s not found.", midi);
free(raw);
return; return;
} }
free(raw);
gsong.sf = tsf_load_filename(sf); raw = slurp_file(sf, &rawlen);
gsong.sf = tsf_load_memory(raw, rawlen);
if (gsong.sf == NULL) { if (gsong.sf == NULL) {
YughWarn("SF2 %s not found.", sf); YughWarn("SF2 %s not found.", sf);
free(raw);
return; return;
} }
free(raw);
gsong.time = 0.f; gsong.time = 0.f;

View file

@ -7,6 +7,8 @@
#include <stb_ds.h> #include <stb_ds.h>
#include <stb_image.h> #include <stb_image.h>
#include "resources.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION #define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "stb_image_resize.h" #include "stb_image_resize.h"

View file

@ -34,6 +34,10 @@
#include "string.h" #include "string.h"
#ifndef NO_EDITOR
#include "nuke.h"
#endif
#define SOKOL_TRACE_HOOKS #define SOKOL_TRACE_HOOKS
#define SOKOL_IMPL #define SOKOL_IMPL
@ -46,11 +50,15 @@
#include <stb_ds.h> #include <stb_ds.h>
#define STB_TRUETYPE_IMPLEMENTATION #define STB_TRUETYPE_IMPLEMENTATION
#define STB_TRUETYPE_NO_STDIO
#include <stb_truetype.h> #include <stb_truetype.h>
#define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION
#define STBI_FAILURE_USERMSG #define STBI_FAILURE_USERMSG
#define STBI_NO_STDIO
#ifdef __TINYC__
#define STBI_NO_SIMD #define STBI_NO_SIMD
#endif
#include "stb_image.h" #include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION