Embed resource files for native build, break out config.
This commit is contained in:
parent
1450302e06
commit
e01dc377a7
7 changed files with 138 additions and 23 deletions
0
.SRCINFO
Normal file
0
.SRCINFO
Normal file
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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/"
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
BIN
resources.tgz
Normal file
BIN
resources.tgz
Normal file
Binary file not shown.
23
src/lib/configuration.nim
Normal file
23
src/lib/configuration.nim
Normal file
|
|
@ -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
|
||||
|
||||
70
src/lib/embeddedfs.nim
Normal file
70
src/lib/embeddedfs.nim
Normal file
|
|
@ -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 )
|
||||
|
||||
|
|
@ -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()
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue