From 87fe10dba083570ec6db8558fcf44842dba8b511 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Jul 28 2020 05:32:23 +0000 Subject: windows build --- diff --git a/demo/src/main.c b/demo/src/main.c index 7d623f6..f83d315 100644 --- a/demo/src/main.c +++ b/demo/src/main.c @@ -24,7 +24,11 @@ void draw() { fontDraw(); drawSprites(); + pushDrawingState(); + stroke("red"); + strokeWeight(20); point(mouseX(), mouseY()); + popDrawingState(); } int main() { diff --git a/src/array.c b/src/array.c index 26b7dac..f5a8b0c 100644 --- a/src/array.c +++ b/src/array.c @@ -76,7 +76,7 @@ void heliArrayRemove(HeliArray *a, int i) { void heliArrayClear(HeliArray *a) { while(a->count > 0) - heliArrayRemove(a, a->count-1); + heliArrayRemove(a, 0); } diff --git a/src/common.c b/src/common.c index bcd3200..ed13547 100644 --- a/src/common.c +++ b/src/common.c @@ -46,11 +46,13 @@ Directory openDirectory(const char *path) { DIR *dir = opendir(path); if (!dir) return NULL; - Directory d = calloc(1, sizeof(Directory)); + Directory d = calloc(1, sizeof(*d)); struct dirent *ent; while((ent = readdir(dir)) != NULL) { - if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) continue; + if ( !ent->d_name[0] + || strcmp(ent->d_name, ".") == 0 + || strcmp(ent->d_name, "..") == 0 ) continue; heliStringmapAdd(&d->files, ent->d_name, NULL, NULL); } closedir(dir); diff --git a/src/drawing.c b/src/drawing.c index e994fc6..7c46833 100644 --- a/src/drawing.c +++ b/src/drawing.c @@ -209,12 +209,32 @@ static void drawFill() { glVertex2d(l, b); glEnd(); - glStencilOpSeparate(GL_FRONT, GL_INCR_WRAP, GL_INCR_WRAP, GL_INCR_WRAP); - glStencilOpSeparate(GL_BACK, GL_DECR_WRAP, GL_DECR_WRAP, GL_DECR_WRAP); - glBegin(GL_TRIANGLE_FAN); - for(int i = 0; i < pathSize; i += 2) - glVertex2dv(&path[i]); - glEnd(); + if (heliGlStencilOpSeparatePtr) { + heliGlStencilOpSeparatePtr(GL_FRONT, GL_INCR_WRAP, GL_INCR_WRAP, GL_INCR_WRAP); + heliGlStencilOpSeparatePtr(GL_BACK, GL_DECR_WRAP, GL_DECR_WRAP, GL_DECR_WRAP); + glBegin(GL_TRIANGLE_FAN); + for(int i = 0; i < pathSize; i += 2) + glVertex2dv(&path[i]); + glEnd(); + } else { + glEnable(GL_CULL_FACE); + + glStencilOp(GL_DECR_WRAP, GL_DECR_WRAP, GL_DECR_WRAP); + glCullFace(GL_FRONT); + glBegin(GL_TRIANGLE_FAN); + for(int i = 0; i < pathSize; i += 2) + glVertex2dv(&path[i]); + glEnd(); + + glStencilOp(GL_INCR_WRAP, GL_INCR_WRAP, GL_INCR_WRAP); + glCullFace(GL_BACK); + glBegin(GL_TRIANGLE_FAN); + for(int i = 0; i < pathSize; i += 2) + glVertex2dv(&path[i]); + glEnd(); + + glDisable(GL_CULL_FACE); + } glStencilFunc(GL_NOTEQUAL, 0, -1u); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); diff --git a/src/group.c b/src/group.c index fb94a7b..ca811be 100644 --- a/src/group.c +++ b/src/group.c @@ -40,8 +40,9 @@ Group createEdgesGroup() void groupDestroy(Group group) { - heliObjectUnregister(group); + groupClear(group); heliArrayDestroy(&group->sprites); + heliObjectUnregister(group); free(group); } diff --git a/src/private.h b/src/private.h index 4892eb8..31a8459 100644 --- a/src/private.h +++ b/src/private.h @@ -10,6 +10,7 @@ #define GL_GLEXT_PROTOTYPES #include +#include #include "common.h" #include "sprite.h" @@ -24,8 +25,8 @@ // blobs -extern char heliBlobDefaultFont[]; -extern int heliBlobDefaultFontSize; +extern char heliBlobDefaultFont[] asm("heliBlobDefaultFont"); +extern int heliBlobDefaultFontSize asm("heliBlobDefaultFontSize"); // string @@ -171,6 +172,9 @@ typedef struct _HeliDrawingState { HeliGLState glState; } HeliDrawingState; +typedef void (APIENTRY *HeliGlStencilOpSeparatePtr)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +extern HeliGlStencilOpSeparatePtr heliGlStencilOpSeparatePtr; + HeliDrawingState *heliDrawingGetState(); HeliDrawingState *heliDrawingGetStateStack(); void heliDrawingClearFrame(); diff --git a/src/sprite.c b/src/sprite.c index b703c65..ecb437f 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -123,7 +123,6 @@ Sprite createSprite(double x, double y) { return createSpriteEx(x, y, 100, 100); } void spriteDestroy(Sprite sprite) { - heliObjectUnregister(sprite); spriteSetNoAnimation(sprite); while(sprite->groups.count > 0) groupRemove((Group)sprite->groups.items[0].value, sprite); @@ -133,6 +132,7 @@ void spriteDestroy(Sprite sprite) { for(int i = 0; i < spritesSorted.count; ++i) if (spritesSorted.items[i].value == sprite) { heliArrayRemove(&spritesSorted, i); break; } + heliObjectUnregister(sprite); free(sprite); } diff --git a/src/world.c b/src/world.c index 7a9d50a..84f1f81 100644 --- a/src/world.c +++ b/src/world.c @@ -9,8 +9,8 @@ static int sdlInitialized = 0; -SDL_Window *window; -SDL_GLContext context; +static SDL_Window *window; +static SDL_GLContext context; static int started; static int stopped; @@ -21,6 +21,7 @@ static unsigned long long elapsedTimeSinceLastFrameUs; static unsigned int prevFrameTimeMs; HeliDialog dialog; +HeliGlStencilOpSeparatePtr heliGlStencilOpSeparatePtr = NULL; static Callback initCallback; static Callback drawCallback; @@ -276,6 +277,8 @@ static void draw() { static void deinit() { + heliGlStencilOpSeparatePtr = NULL; + if (context) SDL_GL_DeleteContext(context); context = NULL; @@ -331,6 +334,8 @@ static int init() { return FALSE; } + heliGlStencilOpSeparatePtr = SDL_GL_GetProcAddress("glStencilOpSeparate"); + return TRUE; } diff --git a/win/.gitignore b/win/.gitignore new file mode 100644 index 0000000..618f786 --- /dev/null +++ b/win/.gitignore @@ -0,0 +1,3 @@ +* +!/.gitignore +!/*.sh diff --git a/win/build-win.sh b/win/build-win.sh new file mode 100755 index 0000000..350e12a --- /dev/null +++ b/win/build-win.sh @@ -0,0 +1,262 @@ +#!/bin/bash + +set -e + +ROOT="$(cd `dirname "$0"`; pwd)" +cd "$ROOT" + +source function.sh +source toolchain.sh + + +#OPTIONS="-O3 -DNDEBUG" +OPTIONS="-g -O0" + + +packages="zlib png freetype ogg vorbis flac mpg123 sdl2 sdl2image sdl2mixer" +newpackages="helianthus demo" + +dir_zlib=zlib-1.2.11 +dir_png=libpng-1.6.37 +dir_freetype=freetype-2.8.1 +dir_ogg=libogg-1.3.4 +dir_vorbis=libvorbis-1.3.7 +dir_flac=flac-1.3.2 +dir_mpg123=mpg123-1.26.3 +dir_sdl2=SDL2-2.0.12 +dir_sdl2image=SDL2_image-2.0.5 +dir_sdl2mixer=SDL2_mixer-2.0.4 + +tar_zlib=$dir_zlib.tar.gz +tar_png=$dir_png.tar.gz +tar_freetype=$dir_freetype.tar.gz +tar_ogg=$dir_ogg.tar.gz +tar_vorbis=$dir_vorbis.tar.gz +tar_flac=$dir_flac.tar.xz +tar_mpg123=$dir_mpg123.tar.bz2 +tar_sdl2=$dir_sdl2.tar.gz +tar_sdl2image=$dir_sdl2image.tar.gz +tar_sdl2mixer=$dir_sdl2mixer.tar.gz + +url_zlib="http://zlib.net/$tar_zlib" +url_png="https://prdownloads.sourceforge.net/libpng/$tar_png" +url_freetype="https://download.savannah.gnu.org/releases/freetype/$tar_freetype" +url_ogg="https://downloads.xiph.org/releases/ogg/$tar_ogg" +url_vorbis="https://downloads.xiph.org/releases/vorbis/$tar_vorbis" +url_flac="https://downloads.xiph.org/releases/flac/$tar_flac" +url_mpg123="https://sourceforge.net/projects/mpg123/files/mpg123/1.26.3/$tar_mpg123" +url_sdl2="https://www.libsdl.org/release/$tar_sdl2" +url_sdl2image="https://www.libsdl.org/projects/SDL_image/release/$tar_sdl2image" +url_sdl2mixer="https://www.libsdl.org/projects/SDL_mixer/release/$tar_sdl2mixer" + +sha_zlib=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 +sha_png=daeb2620d829575513e35fecc83f0d3791a620b9b93d800b763542ece9390fb4 +sha_freetype=876711d064a6a1bd74beb18dd37f219af26100f72daaebd2d86cb493d7cd7ec6 +sha_ogg=fe5670640bd49e828d64d2879c31cb4dde9758681bb664f9bdbf159a01b0c76e +sha_vorbis=0e982409a9c3fc82ee06e08205b1355e5c6aa4c36bca58146ef399621b0ce5ab +sha_flac=91cfc3ed61dc40f47f050a109b08610667d73477af6ef36dcad31c31a4a8d53f +sha_mpg123=30c998785a898f2846deefc4d17d6e4683a5a550b7eacf6ea506e30a7a736c6e +sha_sdl2=349268f695c02efbc9b9148a70b85e58cefbbf704abd3e91be654db7f1e2c863 +sha_sdl2image=bdd5f6e026682f7d7e1be0b6051b209da2f402a2dd8bd1c4bd9c25ad263108d0 +sha_sdl2mixer=b4cf5a382c061cd75081cf246c2aa2f9df8db04bdda8dcdc6b6cca55bede2419 + + +####################################################################### + + +function build_zlib() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --static + make -j4 + make install +} + + +function build_png() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install +} + + +function build_freetype() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install + mkdir -p build-shared + cd build-shared + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --disable-static \ + --enable-shared + make -j4 + make install + cd .. +} + + +function build_ogg() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install +} + + +function build_vorbis() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install +} + + +function build_flac() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install +} + + +function build_mpg123() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install +} + + +function build_sdl2() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared + make -j4 + make install +} + + +function build_sdl2image() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared \ + --enable-png \ + --disable-png-shared \ + --disable-pnm \ + --disable-webp \ + --disable-webp-shared + make -j4 + make install +} + + +function build_sdl2mixer() { + "$srcdir"/configure \ + --prefix="$prefix" \ + --host="$host" \ + --enable-static \ + --enable-shared \ + --enable-music-wave \ + --enable-music-ogg \ + --disable-music-ogg-shared \ + --enable-music-flac \ + --disable-music-flac-shared \ + --enable-music-mp3-mpg123 \ + --disable-music-mp3-mpg123-shared + make -j4 + make install +} + + +function build_helianthus() { + mkdir -p src + cp -r ../../../src/data src/ + + local file= + for file in ../../../src/*.c ../../../src/*.S; do + local filename=$(basename $file) + echocall $CC \ + $file \ + -Wall $OPTIONS \ + -I"$prefix/include/SDL2" \ + -I"$prefix/include/freetype2" \ + -c -o $filename.o + done + + local libs="z png16 freetype ogg vorbis vorbisfile FLAC mpg123 SDL2 SDL2_image SDL2_mixer" + local lib= + local file= + rm -f libhelianthus.a + for lib in $libs; do + mkdir -p $lib + cd $lib + echocall $AR -x "$prefix/lib/lib$lib.a" + for file in *.o; do + cp $file ../thirdparty_${lib}_$file + done + cd .. + done + echocall $AR rcs libhelianthus.a *.o + + mkdir -p ../../release/include/helianthus/helianthus + mkdir -p ../../release/lib$bits + cp libhelianthus.a ../../release/lib$bits/ + cp -r ../../../src/*.h ../../release/include/helianthus/helianthus/ + rm -f ../../release/include/helianthus/helianthus/private.h + mv ../../release/include/helianthus/helianthus/helianthus.h ../../release/include/helianthus/ +} + + +function build_demo() { + echocall $CC \ + ../../../demo/src/*.c \ + -Wall $OPTIONS \ + -I"$ROOT/release/include/helianthus" \ + "$ROOT/release/lib$bits/libhelianthus.a" \ + -lmingw32 -mconsole \ + -lm -static-libgcc \ + -lopengl32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lshlwapi \ + -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lsetupapi -lversion -luuid \ + -o demo.exe + mkdir -p ../../release/demo + cp demo.exe ../../release/demo/demo$bits.exe + cp -r ../../../demo/data ../../release/demo/ +} + + +####################################################################### + + +download +unpack +build 32 i686-w64-mingw32 +build 64 x86_64-w64-mingw32 + +print_section done + diff --git a/win/function.sh b/win/function.sh new file mode 100644 index 0000000..97bda57 --- /dev/null +++ b/win/function.sh @@ -0,0 +1,89 @@ +#!/bin/bash + + +function print_section() { + echo "-----------------------" + echo " $1" + echo "-----------------------" +} + + +function echocall() { + echo "$@" + "$@" +} + + +function unpacklib() { + local lib=$1 + mkdir -p $lib + cd $lib + echocall $AR -x "$prefix/lib/lib$lib.a" + cd .. +} + + +function download() { + mkdir -p download + cd download + for package in $packages; do + if [ ! -f "$package.done" ]; then + print_section "download $package" + local vu=url_$package + local vt=tar_$package + local vs=sha_$package + wget -c "${!vu}" + echo "${!vs} ${!vt}" | sha256sum -c + touch "$package.done" + fi + done + cd .. +} + + +function unpack() { + mkdir -p unpack + cd unpack + for package in $packages; do + if [ ! -f "$package.done" ]; then + print_section "unpack $package" + local v=tar_$package + tar -xf ../download/${!v} + touch "$package.done" + fi + done + cd .. +} + + +function build() { + bits=$1 + host=$2 + + toolchain $host + prefix="$ROOT/usr$bits" + export CFLAGS="-I$prefix/include" + export CPPFLAGS="-I$prefix/include" + export LDFLAGS="-L$prefix/lib" + export PKG_CONFIG_PATH="$prefix/lib/pkgconfig" + export PKG_CONFIG_LIBDIR="$prefix/lib/pkgconfig" + + mkdir -p build$bits + cd build$bits + for package in $packages $newpackages; do + if [ ! -f "$package.done" ]; then + print_section "build$bits $package" + local v=dir_$package + srcdir="$ROOT/unpack/${!v}" + + mkdir -p $package + cd $package + build_$package + cd .. + + touch "$package.done" + fi + done + cd .. +} + diff --git a/win/toolchain.sh b/win/toolchain.sh new file mode 100644 index 0000000..8f024b4 --- /dev/null +++ b/win/toolchain.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +function toolchain() { + if [ -z "$INITIAL_PATH" ]; then + export INITIAL_PATH="$PATH" + export INITIAL_LD_LIBRARY_PATH="$LD_LIBRARY_PATH" + export INITIAL_LDFLAGS="$INITIAL_LDFLAGS" + fi + + export HOST="$1" + local PREFIX="/usr/$HOST" + local BINPREFIX="/usr/bin/$HOST" + + #export PATH="$PREFIX/bin:$INITIAL_PATH" + #export LD_LIBRARY_PATH="$PREFIX/lib:$INITIAL_LD_LIBRARY_PATH" + + export TC_PREFIX="$PREFIX" + + export ADDR2LINE=$BINPREFIX-addr2line + export AS=$BINPREFIX-as + export AR=$BINPREFIX-ar + export CC=$BINPREFIX-gcc + export CXXFILT=$BINPREFIX-c++filt + export CXX=$BINPREFIX-c++ + export CPP=$BINPREFIX-cpp + export DLLTOOL=$BINPREFIX-dlltool + export DLLWRAP=$BINPREFIX-dllwrap + export ELFEDIT=$BINPREFIX-elfedit + export FORTRAN=$BINPREFIX-gfortran + export GXX=$BINPREFIX-g++ + export GCC=$BINPREFIX-gcc + export GCOV=$BINPREFIX-gcov + export GCOV_TOOL=$BINPREFIX-gcov-tool + export GFORTRAN=$BINPREFIX-gfortran + export GPROF=$BINPREFIX-gprof + export LD=$BINPREFIX-ld + export LD_BFD=$BINPREFIX-ld.bfd + export NM=$BINPREFIX-nm + export OBJCOPY=$BINPREFIX-objcopy + export OBJDUMP=$BINPREFIX-objdump + export RANLIB=$BINPREFIX-ranlib + export READELF=$BINPREFIX-readelf + export SIZE=$BINPREFIX-size + export STRINGS=$BINPREFIX-strings + export STRIP=$BINPREFIX-strip + export WINDMC=$BINPREFIX-windmc + export RC=$BINPREFIX-windres + export WINDRES=$BINPREFIX-windres + + #export LDFLAGS=" -L$PREFIX/lib $INITIAL_LDFLAGS" +}