From 6cfa3e0895e42f702276e97c85ad371f3512c67d Mon Sep 17 00:00:00 2001 From: hgn Date: Sat, 29 Jan 2022 14:02:49 +0000 Subject: [PATCH] better structure --- build.sh | 214 --------- {dr_soft => dep/dr_soft}/miniaudio.h | 0 {gl => dep/glad}/glad.c | 2 +- {gl => dep}/glad/glad.h | 2 +- {glfw => dep/glfw}/glfw3.dll | Bin {gl => dep/glfw}/glfw3.h | 0 {gl => dep/glfw}/glfw3native.h | 0 {lib => dep/glfw}/libglfw3dll.a | Bin {gl/KHR => dep/khr}/khrplatform.h | 0 {phoboslab => dep/phoboslab}/qoi.h | 0 {stb => dep/stb}/stb_ds.h | 0 {stb => dep/stb}/stb_image.h | 0 {stb => dep/stb}/stb_vorbis.h | 0 {steam => dep/steam}/libsteam_api.so | Bin {steam => dep/steam}/steam_api.dll | Bin {steam => dep/steam}/steamworks_thin.h | 0 lib/glfw3.dll | Bin 242176 -> 0 bytes phoboslab/qoi_old.h | 632 ------------------------- fontcomp.c => src/fontcomp.c | 0 {fonts => src/fonts}/vg_font.png | Bin qoiconv.c => src/qoiconv.c | 0 texsheet.c => src/texsheet.c | 0 {vg => src/vg}/config.h | 0 {vg => src/vg}/template_game.c | 0 {vg => src/vg}/vg.h | 4 +- {vg => src/vg}/vg_audio.h | 0 {vg => src/vg}/vg_console.h | 0 {vg => src/vg}/vg_debug.h | 0 {vg => src/vg}/vg_gldiag.h | 0 {vg => src/vg}/vg_input.h | 0 {vg => src/vg}/vg_io.h | 0 {vg => src/vg}/vg_lines.h | 0 {vg => src/vg}/vg_m.h | 0 {vg => src/vg}/vg_platform.h | 0 {vg => src/vg}/vg_pxfont.h | 2 +- {vg => src/vg}/vg_shader.h | 0 {vg => src/vg}/vg_steamworks.h | 0 {vg => src/vg}/vg_tex.h | 0 {vg => src/vg}/vg_ui.h | 0 vg_compiler.sh | 231 +++++---- 40 files changed, 150 insertions(+), 937 deletions(-) delete mode 100755 build.sh rename {dr_soft => dep/dr_soft}/miniaudio.h (100%) rename {gl => dep/glad}/glad.c (99%) rename {gl => dep}/glad/glad.h (99%) rename {glfw => dep/glfw}/glfw3.dll (100%) rename {gl => dep/glfw}/glfw3.h (100%) rename {gl => dep/glfw}/glfw3native.h (100%) rename {lib => dep/glfw}/libglfw3dll.a (100%) rename {gl/KHR => dep/khr}/khrplatform.h (100%) rename {phoboslab => dep/phoboslab}/qoi.h (100%) rename {stb => dep/stb}/stb_ds.h (100%) rename {stb => dep/stb}/stb_image.h (100%) rename {stb => dep/stb}/stb_vorbis.h (100%) rename {steam => dep/steam}/libsteam_api.so (100%) rename {steam => dep/steam}/steam_api.dll (100%) rename {steam => dep/steam}/steamworks_thin.h (100%) delete mode 100755 lib/glfw3.dll delete mode 100644 phoboslab/qoi_old.h rename fontcomp.c => src/fontcomp.c (100%) rename {fonts => src/fonts}/vg_font.png (100%) rename qoiconv.c => src/qoiconv.c (100%) rename texsheet.c => src/texsheet.c (100%) rename {vg => src/vg}/config.h (100%) rename {vg => src/vg}/template_game.c (100%) rename {vg => src/vg}/vg.h (99%) rename {vg => src/vg}/vg_audio.h (100%) rename {vg => src/vg}/vg_console.h (100%) rename {vg => src/vg}/vg_debug.h (100%) rename {vg => src/vg}/vg_gldiag.h (100%) rename {vg => src/vg}/vg_input.h (100%) rename {vg => src/vg}/vg_io.h (100%) rename {vg => src/vg}/vg_lines.h (100%) rename {vg => src/vg}/vg_m.h (100%) rename {vg => src/vg}/vg_platform.h (100%) rename {vg => src/vg}/vg_pxfont.h (99%) rename {vg => src/vg}/vg_shader.h (100%) rename {vg => src/vg}/vg_steamworks.h (100%) rename {vg => src/vg}/vg_tex.h (100%) rename {vg => src/vg}/vg_ui.h (100%) diff --git a/build.sh b/build.sh deleted file mode 100755 index 9eb56fa..0000000 --- a/build.sh +++ /dev/null @@ -1,214 +0,0 @@ -# Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved - -cmd_lib_dir="-I. -L./lib -L./" -cmd_release=false -cmd_defines="" -cmd_target="fishladder" - -# Util -# =========================================== -error(){ - echo -e "\033[1;31mError:\e[0m $@" - exit 1 -} - -warning(){ - echo -e "\033[1;33mWarning:\e[0m $@" -} - -success(){ - echo -e "\033[1;32mSuccess:\e[0m $@" -} - -logit(){ - echo -e "\033[0;37m$@\e[0m" -} - -# Platforms -# =========================================== - -target_os_windows(){ - target_ext=".exe" - target_compiler="i686-w64-mingw32-gcc" - target_libs="-lglfw3 -lopengl32 -lm -mwindows" - target_dir="build.win32" - target_steam_api="steam_api.dll" - if [ $cmd_release = true ]; then - target_opts="-O3" - else - target_opts="-ggdb3" - fi -} - -target_os_linux(){ - target_ext="" - target_compiler="gcc" - target_libs="-lGL -lglfw -lX11 -lXxf86vm -lXrandr -lm -lpthread -lXi -ldl" - target_dir="build.linux" - target_steam_api="libsteam_api.so" - if [ $cmd_release = true ]; then - target_opts="-O3" - else - target_opts="-fsanitize=address -ggdb3" - fi -} - -compile_x(){ - cmd_setup="$target_compiler -Wall -Wstrict-aliasing=3 -Wno-unused-function $cmd_lib_dir" - cmd_targets="$1 gl/glad.c -o $2$target_ext" - cmd_final="$target_libs -Wl,-rpath=./ $cmd_defines" - cmd="$cmd_setup $target_opts $cmd_targets $cmd_final" - - echo "Compile -> $2$target_ext:" - logit " $cmd" - $cmd - - if [ $? -ne 0 ]; then - error "compiler signaled fail" - exit 1 - fi - - success "$2$target_ext built" - echo "" -} - -compile_main(){ - echo "" - echo "compile_main()" - mkdir -p $target_dir - - compile_x fishladder.c $target_dir/$cmd_target - - echo "Setting up build structure" - - # Setup build folder - mkdir $target_dir/cfg -p - mkdir $target_dir/textures -p - mkdir $target_dir/sound -p - mkdir $target_dir/maps -p - mkdir $target_dir/sav -p - - # Copy libraries - cp steam/$target_steam_api $target_dir/$target_steam_api - - # Clear and copy assets - rm -r $target_dir/textures - rm -r $target_dir/sound - rm -r $target_dir/maps - - cp -r .temp_textures $target_dir - mv $target_dir/.temp_textures $target_dir/textures - cp -r sound $target_dir - cp -r maps $target_dir - - success "Build made: $target_dir" -} - -compile_tools(){ - # These should only be compiled for native platform - echo "" - echo "compile_tools()" - mkdir tools -p - - compile_x fontcomp.c tools/fontcomp - compile_x texsheet.c tools/texsheet - compile_x qoiconv.c tools/qoiconv -} - -compile_assets(){ - echo "" - echo "compile_assets()" - [[ -d .temp_textures ]] && rm -r .temp_textures - mkdir .temp_textures - - # Convert all png to qoi - echo "Compile textures:" - for f in textures/*.png; - do logit " qoi: $f"; - ./tools/qoiconv$target_ext $f .temp_textures/"$(basename "$f" .png).qoi" - done - - # Autocombine textures - echo " [combine]:" - - auto_combine="" - cd textures_combine - for f in *.png; - do logit " combine: $f"; - auto_combine="$auto_combine $f" - done - ../tools/texsheet$taget_ext ../.temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine - cd .. - - # Compile font file - echo "" - echo "Compile fonts:" - ./tools/fontcomp$target_ext fonts/vg_font.png vg/vg_pxfont.h -} - -# ============================================================== -# Compile process - -if [[ "$OSTYPE" != "linux-gnu"* ]]; then - echo "Host: Microsoft Windows (implied)" - host_is_linux=false - target_os_windows -else - echo "Host: GNU/Linux" - host_is_linux=true - target_os_linux -fi - -# Main compile loop -while (( "$#" )); do - case $1 in - -r|--release) - cmd_release=true - echo " + Release Mode" - ;; - -s|--no-steam) - cmd_defines="-DVG_NO_STEAM" - echo " + Disable steam" - ;; - -t|--tools) - compile_tools - ;; - -a|-assets) - compile_assets - ;; - --build-linux) - target_os_linux - compile_main - ;; - --build-windows) - target_os_windows - compile_main - - # Extra glfw.dll copy step - cp glfw/glfw3.dll $target_dir/glfw3.dll - ;; - -p|--play) - if [ $host_is_linux ]; then - target_os_linux - else - target_os_windows - fi - - echo "" - logit "======= exec: $target_dir/$cmd_target$target_ext =======" - echo "" - - cd $target_dir - ./$cmd_target - cd ./../ - ;; - *) - echo "Unkown param: $1" - exit 1 - ;; - esac - shift -done - -# Cleanup -logit "cleaning up..." diff --git a/dr_soft/miniaudio.h b/dep/dr_soft/miniaudio.h similarity index 100% rename from dr_soft/miniaudio.h rename to dep/dr_soft/miniaudio.h diff --git a/gl/glad.c b/dep/glad/glad.c similarity index 99% rename from gl/glad.c rename to dep/glad/glad.c index 6495d19..c00f348 100644 --- a/gl/glad.c +++ b/dep/glad/glad.c @@ -22,7 +22,7 @@ #include #include #include -#include "gl/glad/glad.h" +#include "glad/glad.h" void _pre_call_callback_default(const char *name, void *funcptr, int len_args, ...) { (void) name; diff --git a/gl/glad/glad.h b/dep/glad/glad.h similarity index 99% rename from gl/glad/glad.h rename to dep/glad/glad.h index 62b7e70..8da995e 100644 --- a/gl/glad/glad.h +++ b/dep/glad/glad.h @@ -92,7 +92,7 @@ typedef void (* GLADcallback)(const char *name, void *funcptr, int len_args, ... GLAPI void glad_set_pre_callback(GLADcallback cb); GLAPI void glad_set_post_callback(GLADcallback cb); -#include "gl/KHR/khrplatform.h" +#include "khr/khrplatform.h" typedef unsigned int GLenum; typedef unsigned char GLboolean; typedef unsigned int GLbitfield; diff --git a/glfw/glfw3.dll b/dep/glfw/glfw3.dll similarity index 100% rename from glfw/glfw3.dll rename to dep/glfw/glfw3.dll diff --git a/gl/glfw3.h b/dep/glfw/glfw3.h similarity index 100% rename from gl/glfw3.h rename to dep/glfw/glfw3.h diff --git a/gl/glfw3native.h b/dep/glfw/glfw3native.h similarity index 100% rename from gl/glfw3native.h rename to dep/glfw/glfw3native.h diff --git a/lib/libglfw3dll.a b/dep/glfw/libglfw3dll.a similarity index 100% rename from lib/libglfw3dll.a rename to dep/glfw/libglfw3dll.a diff --git a/gl/KHR/khrplatform.h b/dep/khr/khrplatform.h similarity index 100% rename from gl/KHR/khrplatform.h rename to dep/khr/khrplatform.h diff --git a/phoboslab/qoi.h b/dep/phoboslab/qoi.h similarity index 100% rename from phoboslab/qoi.h rename to dep/phoboslab/qoi.h diff --git a/stb/stb_ds.h b/dep/stb/stb_ds.h similarity index 100% rename from stb/stb_ds.h rename to dep/stb/stb_ds.h diff --git a/stb/stb_image.h b/dep/stb/stb_image.h similarity index 100% rename from stb/stb_image.h rename to dep/stb/stb_image.h diff --git a/stb/stb_vorbis.h b/dep/stb/stb_vorbis.h similarity index 100% rename from stb/stb_vorbis.h rename to dep/stb/stb_vorbis.h diff --git a/steam/libsteam_api.so b/dep/steam/libsteam_api.so similarity index 100% rename from steam/libsteam_api.so rename to dep/steam/libsteam_api.so diff --git a/steam/steam_api.dll b/dep/steam/steam_api.dll similarity index 100% rename from steam/steam_api.dll rename to dep/steam/steam_api.dll diff --git a/steam/steamworks_thin.h b/dep/steam/steamworks_thin.h similarity index 100% rename from steam/steamworks_thin.h rename to dep/steam/steamworks_thin.h diff --git a/lib/glfw3.dll b/lib/glfw3.dll deleted file mode 100755 index b7afff54f59c038694ec051729be0e4cc1a78e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242176 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 b{LkM%Q09HZd{0nRi-_Qp|9||?UV(oD!02Z` diff --git a/phoboslab/qoi_old.h b/phoboslab/qoi_old.h deleted file mode 100644 index d70e2e8..0000000 --- a/phoboslab/qoi_old.h +++ /dev/null @@ -1,632 +0,0 @@ -/* - -QOI - The "Quite OK Image" format for fast, lossless image compression - -Dominic Szablewski - https://phoboslab.org - - --- LICENSE: The MIT License(MIT) - -Copyright(c) 2021 Dominic Szablewski - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files(the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions : -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --- About - -QOI encodes and decodes images in a lossless format. An encoded QOI image is -usually around 10--30% larger than a decently optimized PNG image. - -QOI outperforms simpler PNG encoders in compression ratio and performance. QOI -images are typically 20% smaller than PNGs written with stbi_image. Encoding is -25-50x faster and decoding is 3-4x faster than stbi_image or libpng. - - --- Synopsis - -// Define `QOI_IMPLEMENTATION` in *one* C/C++ file before including this -// library to create the implementation. - -#define QOI_IMPLEMENTATION -#include "qoi.h" - -// Encode and store an RGBA buffer to the file system. The qoi_desc describes -// the input pixel data. -qoi_write("image_new.qoi", rgba_pixels, &(qoi_desc){ - .width = 1920, - .height = 1080, - .channels = 4, - .colorspace = QOI_SRGB -}); - -// Load and decode a QOI image from the file system into a 32bbp RGBA buffer. -// The qoi_desc struct will be filled with the width, height, number of channels -// and colorspace read from the file header. -qoi_desc desc; -void *rgba_pixels = qoi_read("image.qoi", &desc, 4); - - - --- Documentation - -This library provides the following functions; -- qoi_read -- read and decode a QOI file -- qoi_decode -- decode the raw bytes of a QOI image from memory -- qoi_write -- encode and write a QOI file -- qoi_encode -- encode an rgba buffer into a QOI image in memory - -See the function declaration below for the signature and more information. - -If you don't want/need the qoi_read and qoi_write functions, you can define -QOI_NO_STDIO before including this library. - -This library uses malloc() and free(). To supply your own malloc implementation -you can define QOI_MALLOC and QOI_FREE before including this library. - - --- Data Format - -A QOI file has a 14 byte header, followed by any number of data "chunks". - -struct qoi_header_t { - char magic[4]; // magic bytes "qoif" - uint32_t width; // image width in pixels (BE) - uint32_t height; // image height in pixels (BE) - uint8_t channels; // must be 3 (RGB) or 4 (RGBA) - uint8_t colorspace; // a bitmap 0000rgba where - // - a zero bit indicates sRGBA, - // - a one bit indicates linear (user interpreted) - // colorspace for each channel -}; - -The decoder and encoder start with {r: 0, g: 0, b: 0, a: 255} as the previous -pixel value. Pixels are either encoded as - - a run of the previous pixel - - an index into a previously seen pixel - - a difference to the previous pixel value in r,g,b,a - - full r,g,b,a values - -A running array[64] of previously seen pixel values is maintained by the encoder -and decoder. Each pixel that is seen by the encoder and decoder is put into this -array at the position (r^g^b^a) % 64. In the encoder, if the pixel value at this -index matches the current pixel, this index position is written to the stream. - -Each chunk starts with a 2, 3 or 4 bit tag, followed by a number of data bits. -The bit length of chunks is divisible by 8 - i.e. all chunks are byte aligned. -All values encoded in these data bits have the most significant bit (MSB) on the -left. - -The possible chunks are: - - - QOI_INDEX ------------- -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----------------| -| 0 0 | index | - -2-bit tag b00 -6-bit index into the color index array: 0..63 - - - - QOI_RUN_8 ------------- -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|----------+--------------| -| 0 1 0 | run | - -3-bit tag b010 -5-bit run-length repeating the previous pixel: 1..32 - - - - QOI_RUN_16 -------------------------------------- -| Byte[0] | Byte[1] | -| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | -|----------+----------------------------------------| -| 0 1 1 | run | - -3-bit tag b011 -13-bit run-length repeating the previous pixel: 33..8224 - - - - QOI_DIFF_8 ------------ -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----+-----+-----| -| 1 0 | dr | db | bg | - -2-bit tag b10 -2-bit red channel difference from the previous pixel between -2..1 -2-bit green channel difference from the previous pixel between -2..1 -2-bit blue channel difference from the previous pixel between -2..1 - -The difference to the current channel values are using a wraparound operation, -so "1 - 2" will result in 255, while "255 + 1" will result in 0. - - - - QOI_DIFF_16 ------------------------------------- -| Byte[0] | Byte[1] | -| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | -|----------+--------------|------------ +-----------| -| 1 1 0 | red diff | green diff | blue diff | - -3-bit tag b110 -5-bit red channel difference from the previous pixel between -16..15 -4-bit green channel difference from the previous pixel between -8..7 -4-bit blue channel difference from the previous pixel between -8..7 - -The difference to the current channel values are using a wraparound operation, -so "10 - 13" will result in 253, while "250 + 7" will result in 1. - - - - QOI_DIFF_24 --------------------------------------------------------------- -| Byte[0] | Byte[1] | Byte[2] | -| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | -|-------------+----------------+--------------+----------------+--------------| -| 1 1 1 0 | red diff | green diff | blue diff | alpha diff | - -4-bit tag b1110 -5-bit red channel difference from the previous pixel between -16..15 -5-bit green channel difference from the previous pixel between -16..15 -5-bit blue channel difference from the previous pixel between -16..15 -5-bit alpha channel difference from the previous pixel between -16..15 - -The difference to the current channel values are using a wraparound operation, -so "10 - 13" will result in 253, while "250 + 7" will result in 1. - - - - QOI_COLOR ------------- -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------------+--+--+--+--| -| 1 1 1 1 |hr|hg|hb|ha| - -4-bit tag b1111 -1-bit red byte follows -1-bit green byte follows -1-bit blue byte follows -1-bit alpha byte follows - -For each set bit hr, hg, hb and ha another byte follows in this order. If such a -byte follows, it will replace the current color channel value with the value of -this byte. - - -The byte stream is padded at the end with 4 zero bytes. Size the longest chunk -we can encounter is 5 bytes (QOI_COLOR with RGBA set), with this padding we just -have to check for an overrun once per decode loop iteration. - -*/ - - -// ----------------------------------------------------------------------------- -// Header - Public functions - -#ifndef QOI_H -#define QOI_H - -#ifdef __cplusplus -extern "C" { -#endif - -// A pointer to qoi_desc struct has to be supplied to all of qoi's functions. It -// describes either the input format (for qoi_write, qoi_encode), or is filled -// with the description read from the file header (for qoi_read, qoi_decode). - -// The colorspace in this qoi_desc is a bitmap with 0000rgba where a 0-bit -// indicates sRGB and a 1-bit indicates linear colorspace for each channel. You -// may use one of the predefined constants: QOI_SRGB, QOI_SRGB_LINEAR_ALPHA or -// QOI_LINEAR. The colorspace is purely informative. It will be saved to the -// file header, but does not affect en-/decoding in any way. - -#define QOI_SRGB 0x00 -#define QOI_SRGB_LINEAR_ALPHA 0x01 -#define QOI_LINEAR 0x0f - -typedef struct { - unsigned int width; - unsigned int height; - unsigned char channels; - unsigned char colorspace; -} qoi_desc; - -#ifndef QOI_NO_STDIO - -// Encode raw RGB or RGBA pixels into a QOI image and write it to the file -// system. The qoi_desc struct must be filled with the image width, height, -// number of channels (3 = RGB, 4 = RGBA) and the colorspace. - -// The function returns 0 on failure (invalid parameters, or fopen or malloc -// failed) or the number of bytes written on success. - -int qoi_write(const char *filename, const void *data, const qoi_desc *desc); - - -// Read and decode a QOI image from the file system. If channels is 0, the -// number of channels from the file header is used. If channels is 3 or 4 the -// output format will be forced into this number of channels. - -// The function either returns NULL on failure (invalid data, or malloc or fopen -// failed) or a pointer to the decoded pixels. On success, the qoi_desc struct -// will be filled with the description from the file header. - -// The returned pixel data should be free()d after use. - -void *qoi_read(const char *filename, qoi_desc *desc, int channels); - -#endif // QOI_NO_STDIO - - -// Encode raw RGB or RGBA pixels into a QOI image in memory. - -// The function either returns NULL on failure (invalid parameters or malloc -// failed) or a pointer to the encoded data on success. On success the out_len -// is set to the size in bytes of the encoded data. - -// The returned qoi data should be free()d after use. - -void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len); - - -// Decode a QOI image from memory. - -// The function either returns NULL on failure (invalid parameters or malloc -// failed) or a pointer to the decoded pixels. On success, the qoi_desc struct -// is filled with the description from the file header. - -// The returned pixel data should be free()d after use. - -void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels); - - -#ifdef __cplusplus -} -#endif -#endif // QOI_H - - -// ----------------------------------------------------------------------------- -// Implementation - -#ifdef QOI_IMPLEMENTATION -#include - -#ifndef QOI_MALLOC - #define QOI_MALLOC(sz) malloc(sz) - #define QOI_FREE(p) free(p) -#endif - -#define QOI_INDEX 0x00 // 00xxxxxx -#define QOI_RUN_8 0x40 // 010xxxxx -#define QOI_RUN_16 0x60 // 011xxxxx -#define QOI_DIFF_8 0x80 // 10xxxxxx -#define QOI_DIFF_16 0xc0 // 110xxxxx -#define QOI_DIFF_24 0xe0 // 1110xxxx -#define QOI_COLOR 0xf0 // 1111xxxx - -#define QOI_MASK_2 0xc0 // 11000000 -#define QOI_MASK_3 0xe0 // 11100000 -#define QOI_MASK_4 0xf0 // 11110000 - -#define QOI_COLOR_HASH(C) (C.rgba.r ^ C.rgba.g ^ C.rgba.b ^ C.rgba.a) -#define QOI_MAGIC \ - (((unsigned int)'q') << 24 | ((unsigned int)'o') << 16 | \ - ((unsigned int)'i') << 8 | ((unsigned int)'f')) -#define QOI_HEADER_SIZE 14 -#define QOI_PADDING 4 - -typedef union { - struct { unsigned char r, g, b, a; } rgba; - unsigned int v; -} qoi_rgba_t; - -void qoi_write_32(unsigned char *bytes, int *p, unsigned int v) { - bytes[(*p)++] = (0xff000000 & v) >> 24; - bytes[(*p)++] = (0x00ff0000 & v) >> 16; - bytes[(*p)++] = (0x0000ff00 & v) >> 8; - bytes[(*p)++] = (0x000000ff & v); -} - -unsigned int qoi_read_32(const unsigned char *bytes, int *p) { - unsigned int a = bytes[(*p)++]; - unsigned int b = bytes[(*p)++]; - unsigned int c = bytes[(*p)++]; - unsigned int d = bytes[(*p)++]; - return (a << 24) | (b << 16) | (c << 8) | d; -} - -void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len) { - if ( - data == NULL || out_len == NULL || desc == NULL || - desc->width == 0 || desc->height == 0 || - desc->channels < 3 || desc->channels > 4 || - (desc->colorspace & 0xf0) != 0 - ) { - return NULL; - } - - int max_size = - desc->width * desc->height * (desc->channels + 1) + - QOI_HEADER_SIZE + QOI_PADDING; - - int p = 0; - unsigned char *bytes = QOI_MALLOC(max_size); - if (!bytes) { - return NULL; - } - - qoi_write_32(bytes, &p, QOI_MAGIC); - qoi_write_32(bytes, &p, desc->width); - qoi_write_32(bytes, &p, desc->height); - bytes[p++] = desc->channels; - bytes[p++] = desc->colorspace; - - - const unsigned char *pixels = (const unsigned char *)data; - - qoi_rgba_t index[64] = {0}; - - int run = 0; - qoi_rgba_t px_prev = {.rgba = {.r = 0, .g = 0, .b = 0, .a = 255}}; - qoi_rgba_t px = px_prev; - - int px_len = desc->width * desc->height * desc->channels; - int px_end = px_len - desc->channels; - int channels = desc->channels; - - for (int px_pos = 0; px_pos < px_len; px_pos += channels) { - if (channels == 4) { - px = *(qoi_rgba_t *)(pixels + px_pos); - } - else { - px.rgba.r = pixels[px_pos]; - px.rgba.g = pixels[px_pos+1]; - px.rgba.b = pixels[px_pos+2]; - } - - if (px.v == px_prev.v) { - run++; - } - - if ( - run > 0 && - (run == 0x2020 || px.v != px_prev.v || px_pos == px_end) - ) { - if (run < 33) { - run -= 1; - bytes[p++] = QOI_RUN_8 | run; - } - else { - run -= 33; - bytes[p++] = QOI_RUN_16 | run >> 8; - bytes[p++] = run; - } - run = 0; - } - - if (px.v != px_prev.v) { - int index_pos = QOI_COLOR_HASH(px) % 64; - - if (index[index_pos].v == px.v) { - bytes[p++] = QOI_INDEX | index_pos; - } - else { - index[index_pos] = px; - - int vr = px.rgba.r - px_prev.rgba.r; - int vg = px.rgba.g - px_prev.rgba.g; - int vb = px.rgba.b - px_prev.rgba.b; - int va = px.rgba.a - px_prev.rgba.a; - - if ( - vr > -17 && vr < 16 && - vg > -17 && vg < 16 && - vb > -17 && vb < 16 && - va > -17 && va < 16 - ) { - if ( - va == 0 && - vr > -3 && vr < 2 && - vg > -3 && vg < 2 && - vb > -3 && vb < 2 - ) { - bytes[p++] = QOI_DIFF_8 | ((vr + 2) << 4) | (vg + 2) << 2 | (vb + 2); - } - else if ( - va == 0 && - vr > -17 && vr < 16 && - vg > -9 && vg < 8 && - vb > -9 && vb < 8 - ) { - bytes[p++] = QOI_DIFF_16 | (vr + 16); - bytes[p++] = (vg + 8) << 4 | (vb + 8); - } - else { - bytes[p++] = QOI_DIFF_24 | (vr + 16) >> 1; - bytes[p++] = (vr + 16) << 7 | (vg + 16) << 2 | (vb + 16) >> 3; - bytes[p++] = (vb + 16) << 5 | (va + 16); - } - } - else { - bytes[p++] = QOI_COLOR | (vr ? 8 : 0) | (vg ? 4 : 0) | (vb ? 2 : 0) | (va ? 1 : 0); - if (vr) { bytes[p++] = px.rgba.r; } - if (vg) { bytes[p++] = px.rgba.g; } - if (vb) { bytes[p++] = px.rgba.b; } - if (va) { bytes[p++] = px.rgba.a; } - } - } - } - px_prev = px; - } - - for (int i = 0; i < QOI_PADDING; i++) { - bytes[p++] = 0; - } - - *out_len = p; - return bytes; -} - -void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels) { - if ( - data == NULL || desc == NULL || - (channels != 0 && channels != 3 && channels != 4) || - size < QOI_HEADER_SIZE + QOI_PADDING - ) { - return NULL; - } - - const unsigned char *bytes = (const unsigned char *)data; - int p = 0; - - unsigned int header_magic = qoi_read_32(bytes, &p); - desc->width = qoi_read_32(bytes, &p); - desc->height = qoi_read_32(bytes, &p); - desc->channels = bytes[p++]; - desc->colorspace = bytes[p++]; - - if ( - desc->width == 0 || desc->height == 0 || - desc->channels < 3 || desc->channels > 4 || - header_magic != QOI_MAGIC - ) { - return NULL; - } - - if (channels == 0) { - channels = desc->channels; - } - - int px_len = desc->width * desc->height * channels; - unsigned char *pixels = QOI_MALLOC(px_len); - if (!pixels) { - return NULL; - } - - qoi_rgba_t px = {.rgba = {.r = 0, .g = 0, .b = 0, .a = 255}}; - qoi_rgba_t index[64] = {0}; - - int run = 0; - int chunks_len = size - QOI_PADDING; - for (int px_pos = 0; px_pos < px_len; px_pos += channels) { - if (run > 0) { - run--; - } - else if (p < chunks_len) { - int b1 = bytes[p++]; - - if ((b1 & QOI_MASK_2) == QOI_INDEX) { - px = index[b1 ^ QOI_INDEX]; - } - else if ((b1 & QOI_MASK_3) == QOI_RUN_8) { - run = (b1 & 0x1f); - } - else if ((b1 & QOI_MASK_3) == QOI_RUN_16) { - int b2 = bytes[p++]; - run = (((b1 & 0x1f) << 8) | (b2)) + 32; - } - else if ((b1 & QOI_MASK_2) == QOI_DIFF_8) { - px.rgba.r += ((b1 >> 4) & 0x03) - 2; - px.rgba.g += ((b1 >> 2) & 0x03) - 2; - px.rgba.b += ( b1 & 0x03) - 2; - } - else if ((b1 & QOI_MASK_3) == QOI_DIFF_16) { - int b2 = bytes[p++]; - px.rgba.r += (b1 & 0x1f) - 16; - px.rgba.g += (b2 >> 4) - 8; - px.rgba.b += (b2 & 0x0f) - 8; - } - else if ((b1 & QOI_MASK_4) == QOI_DIFF_24) { - int b2 = bytes[p++]; - int b3 = bytes[p++]; - px.rgba.r += (((b1 & 0x0f) << 1) | (b2 >> 7)) - 16; - px.rgba.g += ((b2 & 0x7c) >> 2) - 16; - px.rgba.b += (((b2 & 0x03) << 3) | ((b3 & 0xe0) >> 5)) - 16; - px.rgba.a += (b3 & 0x1f) - 16; - } - else if ((b1 & QOI_MASK_4) == QOI_COLOR) { - if (b1 & 8) { px.rgba.r = bytes[p++]; } - if (b1 & 4) { px.rgba.g = bytes[p++]; } - if (b1 & 2) { px.rgba.b = bytes[p++]; } - if (b1 & 1) { px.rgba.a = bytes[p++]; } - } - - index[QOI_COLOR_HASH(px) % 64] = px; - } - - if (channels == 4) { - *(qoi_rgba_t*)(pixels + px_pos) = px; - } - else { - pixels[px_pos] = px.rgba.r; - pixels[px_pos+1] = px.rgba.g; - pixels[px_pos+2] = px.rgba.b; - } - } - - return pixels; -} - -#ifndef QOI_NO_STDIO -#include - -int qoi_write(const char *filename, const void *data, const qoi_desc *desc) { - FILE *f = fopen(filename, "wb"); - if (!f) { - return 0; - } - - int size; - void *encoded = qoi_encode(data, desc, &size); - if (!encoded) { - fclose(f); - return 0; - } - - fwrite(encoded, 1, size, f); - fclose(f); - - QOI_FREE(encoded); - return size; -} - -void *qoi_read(const char *filename, qoi_desc *desc, int channels) { - FILE *f = fopen(filename, "rb"); - if (!f) { - return NULL; - } - - fseek(f, 0, SEEK_END); - int size = ftell(f); - fseek(f, 0, SEEK_SET); - - void *data = QOI_MALLOC(size); - if (!data) { - fclose(f); - return NULL; - } - - int bytes_read = fread(data, 1, size, f); - fclose(f); - - void *pixels = qoi_decode(data, bytes_read, desc, channels); - QOI_FREE(data); - return pixels; -} - -#endif // QOI_NO_STDIO -#endif // QOI_IMPLEMENTATION - diff --git a/fontcomp.c b/src/fontcomp.c similarity index 100% rename from fontcomp.c rename to src/fontcomp.c diff --git a/fonts/vg_font.png b/src/fonts/vg_font.png similarity index 100% rename from fonts/vg_font.png rename to src/fonts/vg_font.png diff --git a/qoiconv.c b/src/qoiconv.c similarity index 100% rename from qoiconv.c rename to src/qoiconv.c diff --git a/texsheet.c b/src/texsheet.c similarity index 100% rename from texsheet.c rename to src/texsheet.c diff --git a/vg/config.h b/src/vg/config.h similarity index 100% rename from vg/config.h rename to src/vg/config.h diff --git a/vg/template_game.c b/src/vg/template_game.c similarity index 100% rename from vg/template_game.c rename to src/vg/template_game.c diff --git a/vg/vg.h b/src/vg/vg.h similarity index 99% rename from vg/vg.h rename to src/vg/vg.h index 575bf03..e210277 100644 --- a/vg/vg.h +++ b/src/vg/vg.h @@ -9,8 +9,8 @@ #include #include -#include "gl/glad/glad.h" -#include "gl/glfw3.h" +#include "glad/glad.h" +#include "glfw/glfw3.h" #define STB_DS_IMPLEMENTATION #include "stb/stb_ds.h" diff --git a/vg/vg_audio.h b/src/vg/vg_audio.h similarity index 100% rename from vg/vg_audio.h rename to src/vg/vg_audio.h diff --git a/vg/vg_console.h b/src/vg/vg_console.h similarity index 100% rename from vg/vg_console.h rename to src/vg/vg_console.h diff --git a/vg/vg_debug.h b/src/vg/vg_debug.h similarity index 100% rename from vg/vg_debug.h rename to src/vg/vg_debug.h diff --git a/vg/vg_gldiag.h b/src/vg/vg_gldiag.h similarity index 100% rename from vg/vg_gldiag.h rename to src/vg/vg_gldiag.h diff --git a/vg/vg_input.h b/src/vg/vg_input.h similarity index 100% rename from vg/vg_input.h rename to src/vg/vg_input.h diff --git a/vg/vg_io.h b/src/vg/vg_io.h similarity index 100% rename from vg/vg_io.h rename to src/vg/vg_io.h diff --git a/vg/vg_lines.h b/src/vg/vg_lines.h similarity index 100% rename from vg/vg_lines.h rename to src/vg/vg_lines.h diff --git a/vg/vg_m.h b/src/vg/vg_m.h similarity index 100% rename from vg/vg_m.h rename to src/vg/vg_m.h diff --git a/vg/vg_platform.h b/src/vg/vg_platform.h similarity index 100% rename from vg/vg_platform.h rename to src/vg/vg_platform.h diff --git a/vg/vg_pxfont.h b/src/vg/vg_pxfont.h similarity index 99% rename from vg/vg_pxfont.h rename to src/vg/vg_pxfont.h index d03c4db..b978235 100644 --- a/vg/vg_pxfont.h +++ b/src/vg/vg_pxfont.h @@ -1,4 +1,4 @@ -/* Font buffer generated from source file: '/home/harry/Documents/vg/fonts/vg_font.png' */ +/* Font buffer generated from source file: '/home/harry/Documents/vg/src/fonts/vg_font.png' */ 0xffff0000,0,0,0,0,0,0,0, 0xffff0000,0,0,0,0,0,0,0, 0xffff0000,0,0,0,0,0,0,0, diff --git a/vg/vg_shader.h b/src/vg/vg_shader.h similarity index 100% rename from vg/vg_shader.h rename to src/vg/vg_shader.h diff --git a/vg/vg_steamworks.h b/src/vg/vg_steamworks.h similarity index 100% rename from vg/vg_steamworks.h rename to src/vg/vg_steamworks.h diff --git a/vg/vg_tex.h b/src/vg/vg_tex.h similarity index 100% rename from vg/vg_tex.h rename to src/vg/vg_tex.h diff --git a/vg/vg_ui.h b/src/vg/vg_ui.h similarity index 100% rename from vg/vg_ui.h rename to src/vg/vg_ui.h diff --git a/vg_compiler.sh b/vg_compiler.sh index 7a78e8f..fec59b9 100755 --- a/vg_compiler.sh +++ b/vg_compiler.sh @@ -3,14 +3,16 @@ vg_root=`readlink $0` vg_root=`dirname $vg_root` +vg_version="0.1" -#echo "VG Root: $vg_root" -#echo "Working dir: `pwd`" - -cmd_lib_dir="-I. -L$vg_root/lib -L./ -I$vg_root" -cmd_release=false -cmd_defines="" -cmd_target="fishladder" +opt_assets=false +opt_release=false +opt_play=false +opt_linux=false +opt_windows=false +opt_tools=false +opt_full=false +opt_steam="" # Util # =========================================== @@ -31,6 +33,20 @@ logit(){ echo -e "\033[0;37m$@\e[0m" } +titleit(){ + echo "" + echo -e "\033[1;35m$@\e[0m" + echo "==========================" + echo "" +} + +if [[ -f vg.conf ]]; then + source vg.conf +else + error "Directory is not a VG project" + exit 1 +fi + # Platforms # =========================================== @@ -40,7 +56,7 @@ target_os_windows(){ target_libs="-lglfw3 -lopengl32 -lm -mwindows" target_dir="build.win32" target_steam_api="steam_api.dll" - if [ $cmd_release = true ]; then + if [ $opt_release = true ]; then target_opts="-O3" else target_opts="-ggdb3" @@ -53,7 +69,7 @@ target_os_linux(){ target_libs="-lGL -lglfw -lX11 -lXxf86vm -lXrandr -lm -lpthread -lXi -ldl" target_dir="build.linux" target_steam_api="libsteam_api.so" - if [ $cmd_release = true ]; then + if [ $opt_release = true ]; then target_opts="-O3" else target_opts="-fsanitize=address -ggdb3" @@ -61,12 +77,12 @@ target_os_linux(){ } compile_x(){ - cmd_setup="$target_compiler -Wall -Wstrict-aliasing=3 -Wno-unused-function $cmd_lib_dir" - cmd_targets="$1 ${vg_root}/gl/glad.c -o $2$target_ext" - cmd_final="$target_libs -Wl,-rpath=./ $cmd_defines" - cmd="$cmd_setup $target_opts $cmd_targets $cmd_final" + paths="-I. -L$vg_root/dep/glfw -I$vg_root/dep -I$vg_root/src" + setup="$target_compiler -Wall -Wstrict-aliasing=3 -Wno-unused-function $paths" + targets="$1 $vg_root/dep/glad/glad.c -o $2$target_ext" + final="$target_libs -Wl,-rpath=./ $opt_steam" + cmd="$setup $target_opts $targets $final" - echo "Compile -> $2$target_ext:" logit " $cmd" $cmd @@ -76,17 +92,15 @@ compile_x(){ fi success "$2$target_ext built" - echo "" } compile_main(){ - echo "" - echo "compile_main()" + titleit "Main build: $target_dir" mkdir -p $target_dir - compile_x fishladder.c $target_dir/$cmd_target - - echo "Setting up build structure" + compile_x $vg_src $target_dir/$vg_target + echo "" + logit "Setting up build structure" # Setup build folder mkdir $target_dir/cfg -p @@ -96,7 +110,9 @@ compile_main(){ mkdir $target_dir/sav -p # Copy libraries - cp $vg_root/steam/$target_steam_api $target_dir/$target_steam_api + if [ "$opt_steam" != "" ]; then + cp $vg_root/dep/steam/$target_steam_api $target_dir/$target_steam_api + fi # Clear and copy assets rm -r $target_dir/textures @@ -107,24 +123,21 @@ compile_main(){ mv $target_dir/.temp_textures $target_dir/textures cp -r sound $target_dir cp -r maps $target_dir - - success "Build made: $target_dir" } compile_tools(){ # These should only be compiled for native platform - echo "" - echo "compile_tools()" - mkdir tools -p + titleit "Tools" + + mkdir $vg_root/bin -p - compile_x $vg_root/fontcomp.c tools/fontcomp - compile_x $vg_root/texsheet.c tools/texsheet - compile_x $vg_root/qoiconv.c tools/qoiconv + compile_x $vg_root/src/fontcomp.c $vg_root/bin/fontcomp + compile_x $vg_root/src/texsheet.c $vg_root/bin/texsheet + compile_x $vg_root/src/qoiconv.c $vg_root/bin/qoiconv } compile_assets(){ - echo "" - echo "compile_assets()" + titleit "Assets" [[ -d .temp_textures ]] && rm -r .temp_textures mkdir .temp_textures @@ -132,7 +145,7 @@ compile_assets(){ echo "Compile textures:" for f in textures/*.png; do logit " qoi: $f"; - ./tools/qoiconv$target_ext $f .temp_textures/"$(basename "$f" .png).qoi" + $vg_root/bin/qoiconv$target_ext $f .temp_textures/"$(basename "$f" .png).qoi" done # Autocombine textures @@ -144,76 +157,122 @@ compile_assets(){ do logit " combine: $f"; auto_combine="$auto_combine $f" done - ../tools/texsheet$taget_ext ../.temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine + $vg_root/bin/texsheet$taget_ext ../.temp_textures/autocombine.qoi ../sprites_autocombine.h sprites_auto_combine $auto_combine cd .. # Compile font file echo "" echo "Compile fonts:" - ./tools/fontcomp$target_ext $vg_root/fonts/vg_font.png $vg_root/vg/vg_pxfont.h + $vg_root/bin/fontcomp$target_ext $vg_root/src/fonts/vg_font.png $vg_root/src/vg/vg_pxfont.h } # ============================================================== # Compile process if [[ "$OSTYPE" != "linux-gnu"* ]]; then - echo "Host: Microsoft Windows (implied)" - host_is_linux=false + host_os=win32 target_os_windows else - echo "Host: GNU/Linux" - host_is_linux=true + host_os=linux target_os_linux fi -# Main compile loop -while (( "$#" )); do - case $1 in - -r|--release) - cmd_release=true - ;; - -s|--no-steam) - cmd_defines="-DVG_NO_STEAM" - ;; - -t|--tools) - compile_tools - ;; - -a|-assets) - compile_assets - ;; - --build-linux) - target_os_linux - compile_main - ;; - --build-windows) - target_os_windows - compile_main - - # Extra glfw.dll copy step - cp $vg_root/glfw/glfw3.dll $target_dir/glfw3.dll - ;; +options=rptlwa +longopts=release,build-linux,build-windows,steam,play,build-tools,assets,full +parsed=$(getopt --options=$options --longoptions=$longopts --name "vgc" -- "$@") + +if [ $? -ne 0 ]; then + error "getopt failed" + exit 1 +fi + +eval set -- "$parsed" +while true; do + case "$1" in + -a|--assets) + opt_assets=true + shift; + ;; + -r|--release) + opt_release=true + shift; + ;; -p|--play) - if [ $host_is_linux ]; then - target_os_linux - else - target_os_windows - fi - - echo "" - logit "======= exec: $target_dir/$cmd_target$target_ext =======" - echo "" - - cd $target_dir - ./$cmd_target - cd ./../ - ;; - *) - echo "Unkown param: $1" - exit 1 - ;; - esac - shift + opt_play=true + shift; + ;; + -l|--build-linux) + opt_linux=true + shift; + ;; + -w|--build-windows) + opt_windows=true + shift; + ;; + -t|--build-tools) + opt_tools=true + shift; + ;; + --full) + opt_full=true + opt_assets=true + opt_release=true + opt_play=true + opt_linux=true + opt_windows=true + opt_tools=true + shift; + ;; + --steam) + opt_steam="-DVG_STEAM" + shift; + ;; + --) + shift + break + ;; + *) + error "programming error" + break + ;; + esac done -# Cleanup -logit "cleaning up..." +titleit " vgc ver: $vg_version\n host: $host_os" +logit " assets: $opt_assets" +logit " release: $opt_release" +logit " play: $opt_play" +logit " build-linux: $opt_linux" +logit "build-windows: $opt_windows" +logit " build-tools: $opt_tools" +logit " steam: $opt_steam" + +# Main build steps + +if [ $opt_tools = true ]; then compile_tools; fi +if [ $opt_assets = true ]; then compile_assets; fi +if [ $opt_linux = true ]; then target_os_linux; compile_main; fi +if [ $opt_windows = true ]; then + target_os_windows + compile_main + + cp $vg_root/dep/glfw/glfw3.dll $target_dir/glfw3.dll +fi + +if [ $opt_play = true ]; then + + if [ $host_os = linux ]; then + target_os_linux + else + target_os_windows + fi + + echo "" + logit "======= exec: $target_dir/$vg_target$target_ext =======" + echo "" + + cd $target_dir + ./$vg_target$target_ext + cd ./../ + +fi -- 2.25.1