diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 0000000..e69de29 diff --git a/config.nims b/config.nims index c180457..e1ccc36 100644 --- a/config.nims +++ b/config.nims @@ -32,5 +32,6 @@ when defined( emscripten ): # --passL:"-s JSPI" # async support (new) # --passL:"-s ALLOW_MEMORY_GROWTH=1" --passL:"--preload-file resources" + --passL:"--use-preload-cache" --passL:"-o build/nimtest.js" diff --git a/nim_wasm_test.nimble b/nim_wasm_test.nimble index 989c1a2..e83333a 100644 --- a/nim_wasm_test.nimble +++ b/nim_wasm_test.nimble @@ -9,9 +9,23 @@ srcDir = "src" requires "nim >= 2.2.4" requires "naylib >= 25.33.0" requires "nimhttpd >= 1.5.1" +requires "zippy >= 0.10.16" + +before make: + exec "tar -C resources -cvzf resources.tgz ." +after make: + exec "rm -f resources.tgz" task make, "Native build": - exec "mkdir -p build && nim c --outdir:build -d:release --opt:speed src/nim_wasm_test.nim" + exec """ + mkdir -p build && nim c --outdir:build -d:release --opt:speed src/nim_wasm_test.nim + """ + +task makedebug, "Native debugging build": + exec """ + tar -C resources -cvzf resources.tgz . && + mkdir -p build && nim c --outdir:build -d:debug src/nim_wasm_test.nim + """ task makeweb, "Emscripten build": exec """ @@ -23,3 +37,4 @@ task runweb, "Run a local webserver for the wasm build": exec "nimhttpd -H:'Cross-Origin-Opener-Policy: same-origin' -H:'Cross-Origin-Embedder-Policy: require-corp' build/" + diff --git a/resources.tgz b/resources.tgz new file mode 100644 index 0000000..77a51de Binary files /dev/null and b/resources.tgz differ diff --git a/src/lib/configuration.nim b/src/lib/configuration.nim new file mode 100644 index 0000000..2e396e5 --- /dev/null +++ b/src/lib/configuration.nim @@ -0,0 +1,23 @@ +# vim: set et sta sw=4 ts=4 : +# +# Expose a global configuration INI file. + +import + std/parsecfg, + std/strutils + +import + embeddedfs + +var conf*: Config +try: + conf = loadConfig( embeddedFs.confFile.string ) +except IOError: + echo "No config file, using defaults." + conf = newConfig() + + +func fps*( c: Config ): int32 = + let fps = c.getSectionValue( "Performance", "fps", defaultVal = "60" ) + return fps.parseInt.int32 + diff --git a/src/lib/embeddedfs.nim b/src/lib/embeddedfs.nim new file mode 100644 index 0000000..8149b5d --- /dev/null +++ b/src/lib/embeddedfs.nim @@ -0,0 +1,70 @@ +# vim: set et sta sw=4 ts=4 : +# +# This module exposes an "embeddedFs" object, that can +# return file handles for either native use (extracted on first run) +# or wasm (via preload-files). + +import + std/os, + std/files, + std/paths, + std/strformat, + std/tempfiles + +type + EmbeddedFS* = object + EmbeddedFSError* = object of CatchableError + +let embeddedFs* = EmbeddedFS() + +when not defined( emscripten ): + import zippy/tarballs + const ROOT = Path( currentSourcePath() ).parentDir.parentDir.parentDir + const RESOURCES = staticRead( $(ROOT / Path("resources.tgz")) ) + + let appname = extractFilename( getAppFileName() ) + let dataDir = Path(getDataDir()) / Path( appname ) + let confDir = Path(getConfigDir()) / Path( appname ) + let confFile* = confDir / Path("config.ini") + +else: + let dataDir = Path( "resources" ) + let confDir = Path( "resources" ) + let confFile* = confDir / Path("config.ini") + + +proc path*( data: EmbeddedFS, path: string ): Path = + ## Returns the path of an embedded file. + return dataDir / Path( path ) + + +proc `[]`*( data: EmbeddedFS, path: string ): string = + ## Returns the contents of an embedded file. + if not fileExists( data.path(path) ): + raise newException( EmbeddedFSError, "No such file: {path}".fmt ) + + let f = open( $data.path(path) ) + defer: f.close + return f.readAll + + +# TODO: version check, extract over old stuff +# no-op if versions match +# +proc update*( e: EmbeddedFS ) = + when not defined( emscripten ): + createDir( getDataDir() ) + createDir( $confDir ) + + # check existing path / version + + let ( tarball, path ) = createTempFile( "{appname}_resources_".fmt, ".tgz" ) + tarball.write( RESOURCES ) + tarball.close + + extractAll( path, $dataDir ) + removeFile( path ) + + let source = dataDir / Path( "config.ini" ) + if not fileExists( confFile ): moveFile( source, confFile ) + diff --git a/src/nim_wasm_test.nim b/src/nim_wasm_test.nim index d7c3b9a..74922e8 100644 --- a/src/nim_wasm_test.nim +++ b/src/nim_wasm_test.nim @@ -1,19 +1,15 @@ # vim: set et sta sw=4 ts=4 : import - std/parsecfg, - std/strformat, - std/strutils + std/strformat + +import reasings import raylib -var conf: Config -try: - conf = loadConfig( "resources/config.ini" ) -except IOError: - echo "No config file, using defaults." - conf = newConfig() +import + lib/configuration, + lib/embeddedfs -var fps = conf.getSectionValue( "Performance", "fps", defaultVal = "60").parseInt # Emscripten specific imports proc emscripten_set_main_loop( f: proc() {.cdecl.}, a: cint, b: bool ) {.importc.} @@ -27,6 +23,14 @@ var camera = Camera( projection: Perspective # Defines projection type, see CameraProjection ) + +var count = 0 +let duration = 3000 +let startPositionX: float32 = 45.0 +let finalPositionX: float32 = 120.0 +var currentPositionX = startPositionX + + # This only works with: # --passL:"-s EXPORT_FUNCTIONS=_nativeGreet", but it breaks raylib loading. # hmmmmm. EXPORT_ALL=1 is also a no go. @@ -41,23 +45,26 @@ proc mainLoop() {.cdecl.} = defer: closeWindow() initWindow( 800, 600, "raylib nim playground" ) - setTargetFPS( fps.int32 ); - - var count = 0 + setTargetFPS( conf.fps ) while not windowShouldClose(): - beginDrawing(); - clearBackground( WHITE ); - beginMode3D( camera ); - drawGrid( 10, 1.0f ); - endMode3D(); + beginDrawing() + clearBackground( WHITE ) + beginMode3D( camera ) + + if camera.fovy < finalPositionX: + camera.fovy = bounceInOut( count.float32, startPositionX, + finalPositionX - startPositionX, duration.float32 ) + + drawGrid( 10, 1.0f ) + endMode3D() var col = if isCursorOnScreen(): BLUE else: GRAY - drawText( "OH SNAP IT'S WORKING\n{count}".fmt, 10, 10, 20, col ); - endDrawing(); + drawText( "OH SNAP IT'S WORKING\n{count}".fmt, 10, 10, 20, col ) + endDrawing() - count = count + 1 + count.inc when defined( emscripten ): @@ -65,4 +72,3 @@ when defined( emscripten ): else: mainLoop() -