First commit.
This commit is contained in:
commit
447896b56e
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
build/*
|
||||||
|
!build/web/
|
||||||
|
build/web/*
|
||||||
|
!build/web/game.html
|
||||||
|
tmp/
|
||||||
|
|
||||||
|
*.blend1
|
85
README.md
Normal file
85
README.md
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
|
||||||
|
# Template project for Myou Engine
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* A `nim.cfg` ready to compile to desktop, Android, iOS, and web through
|
||||||
|
Emscripten.
|
||||||
|
* Helper scripts for using the C files for Android and iOS (in Android Studio
|
||||||
|
and XCode respectively).
|
||||||
|
* A `game.html` file with just a canvas that fills the whole window.
|
||||||
|
* A simple python server that supports CORS (so you can load assets remotely),
|
||||||
|
and COOP/COEP (so multithreaded Emscripten builds can work).
|
||||||
|
* An empty `example.blend` that is just a default cube saved in Blender 4.1.
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
* Have the code of Myou Engine somewhere. In this example it expects it to be in
|
||||||
|
`../myou-engine` (that is, in the parent folder of this project).
|
||||||
|
|
||||||
|
* If you have the engine somewhere other than `../myou-engine`, change the path
|
||||||
|
in `nim.cfg`. For example, if you have it in `./libs/myou_engine`, then change
|
||||||
|
this:
|
||||||
|
|
||||||
|
`path:"../myou-engine/libs/packages"`
|
||||||
|
|
||||||
|
by this:
|
||||||
|
|
||||||
|
`path:"./libs/myou_engine/libs/packages"`
|
||||||
|
|
||||||
|
Note that we add `/libs/packages` so that the engine can use all of its
|
||||||
|
dependencies without relying on a package manager.
|
||||||
|
|
||||||
|
* Have [Nimskull](https://github.com/nim-works/nimskull) installed in your path
|
||||||
|
(here we'll assume it's just `nim`). In the future it will work with Nim (and
|
||||||
|
other languages as well) through a built version of the engine.
|
||||||
|
|
||||||
|
### Desktop version
|
||||||
|
|
||||||
|
* To compile and run for desktop just run
|
||||||
|
|
||||||
|
`nim c -r src/main.nim`
|
||||||
|
|
||||||
|
The output will be in `build/game.exe` or `build/game`.
|
||||||
|
|
||||||
|
* To compile a Windows version from Linux or MacOS, run:
|
||||||
|
|
||||||
|
`nim c -d:mingw src/main.nim`
|
||||||
|
|
||||||
|
You can add `-r` to run it, it will try to use Wine if you have it
|
||||||
|
installed.
|
||||||
|
|
||||||
|
### Web version
|
||||||
|
|
||||||
|
* To compile a web version with Emscripten, run:
|
||||||
|
|
||||||
|
`nim c -d:emscripten src/main.nim`
|
||||||
|
|
||||||
|
Output files will be in `build/web/`
|
||||||
|
|
||||||
|
* Run `python scripts/simple.server.py`
|
||||||
|
|
||||||
|
* Open http://localhost:8003/build/web/game.html
|
||||||
|
|
||||||
|
### Mobile version
|
||||||
|
|
||||||
|
* To compile it for Android:
|
||||||
|
|
||||||
|
`nim c --os:android --cpu:arm64 src/main.nim`
|
||||||
|
|
||||||
|
Output C files will be in `tmp/android/`
|
||||||
|
|
||||||
|
_(TODO: instructions on how to use files in Android Studio)_
|
||||||
|
|
||||||
|
* To compile it for iOS:
|
||||||
|
|
||||||
|
`nim c --os:ios src/main.nim`
|
||||||
|
|
||||||
|
Output C files will be in `tmp/android/`
|
||||||
|
|
||||||
|
_(TODO: instructions on how to use files in XCode)_
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Add your own license and replace this text. Until then you can consider this
|
||||||
|
CC0. You can use the files in this repository for any purpose whatsoever.
|
BIN
assets/example.blend
Normal file
BIN
assets/example.blend
Normal file
Binary file not shown.
30
build/web/game.html
Normal file
30
build/web/game.html
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<!-- CHANGE THIS -->
|
||||||
|
<title>My Game</title>
|
||||||
|
<style>body {
|
||||||
|
font-family: arial;
|
||||||
|
margin: 0;
|
||||||
|
padding: none;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
canvas.emscripten {
|
||||||
|
border: 0px none; background-color: black;
|
||||||
|
width: 100vw; height: 100vh;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
|
||||||
|
<script type='text/javascript'>
|
||||||
|
var Module = {
|
||||||
|
canvas: canvas
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<!-- CHANGE THIS IF YOU CHANGE THE OUTPUT NAME -->
|
||||||
|
<script async type="text/javascript" src="game.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
78
nim.cfg
Normal file
78
nim.cfg
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
|
||||||
|
path:"../myou-engine/libs/packages/"
|
||||||
|
|
||||||
|
out:"build/game"
|
||||||
|
|
||||||
|
@if release:
|
||||||
|
d:lto
|
||||||
|
@else:
|
||||||
|
debugger:native
|
||||||
|
# floatChecks:on
|
||||||
|
@if not myouUseAR and not emscripten:
|
||||||
|
d:myouUseRenderdoc
|
||||||
|
@end
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if android:
|
||||||
|
c # generate c files, don't compile them
|
||||||
|
nimcache:"tmp/android"
|
||||||
|
d:myouUseNativeActivity
|
||||||
|
d:opengl_es
|
||||||
|
d:androidNDK
|
||||||
|
noMain:on
|
||||||
|
@if amd64:
|
||||||
|
nimcache:"tmp/androidx64"
|
||||||
|
@end
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if ios:
|
||||||
|
c # generate c files, don't compile them
|
||||||
|
cpu:arm64
|
||||||
|
nimcache:"tmp/ios"
|
||||||
|
d:opengl_es
|
||||||
|
noMain:on
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if emscripten:
|
||||||
|
passL:"-o build/web/game.js"
|
||||||
|
d:opengl_es
|
||||||
|
noMain:on
|
||||||
|
nimcache:"tmp/emscripten"
|
||||||
|
os:linux
|
||||||
|
cpu:wasm32
|
||||||
|
cc:clang
|
||||||
|
clang.exe:emcc
|
||||||
|
clang.linkerexe:emcc
|
||||||
|
clang.cpp.exe:emcc
|
||||||
|
clang.cpp.linkerexe:emcc
|
||||||
|
# d:noSignalHandler
|
||||||
|
@if release:
|
||||||
|
passC:"-O3 -flto"
|
||||||
|
passL:"-O3 -flto --closure 1"
|
||||||
|
@else:
|
||||||
|
passC:"-gsource-map -O0"
|
||||||
|
passL:"-gsource-map -O0"
|
||||||
|
# embedsrc
|
||||||
|
@end
|
||||||
|
passL:"-sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2"
|
||||||
|
# passL:"-sEXPORTED_FUNCTIONS=_main,_NimMain,_glfmMain"
|
||||||
|
passL:"-sFETCH=1"
|
||||||
|
passL:"-sINITIAL_MEMORY=268435456"
|
||||||
|
passL:"-sSTACK_SIZE=262144"
|
||||||
|
passL:"-sALLOW_MEMORY_GROWTH"
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if sanitize:
|
||||||
|
cc:clang
|
||||||
|
d:useMalloc
|
||||||
|
passC:"-fno-omit-frame-pointer"
|
||||||
|
passC:"-mno-omit-leaf-frame-pointer"
|
||||||
|
passC:"-fsanitize=address"
|
||||||
|
passL:"-fsanitize=address"
|
||||||
|
gc:arc
|
||||||
|
threads:off
|
||||||
|
@end
|
||||||
|
|
||||||
|
@if mingw:
|
||||||
|
passL:"-static"
|
||||||
|
@end
|
16
scripts/simple_server.py
Executable file
16
scripts/simple_server.py
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# encoding: utf-8
|
||||||
|
"""Use instead of `python3 -m http.server` when you need CORS and SharedArrayBuffer"""
|
||||||
|
|
||||||
|
from http.server import HTTPServer, SimpleHTTPRequestHandler
|
||||||
|
|
||||||
|
class CORSRequestHandler(SimpleHTTPRequestHandler):
|
||||||
|
def end_headers(self):
|
||||||
|
self.send_header('Access-Control-Allow-Origin', '*')
|
||||||
|
self.send_header('Cross-Origin-Opener-Policy', 'same-origin')
|
||||||
|
self.send_header('Cross-Origin-Embedder-Policy', 'require-corp')
|
||||||
|
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
|
||||||
|
return super(CORSRequestHandler, self).end_headers()
|
||||||
|
|
||||||
|
httpd = HTTPServer(('', 8003), CORSRequestHandler)
|
||||||
|
httpd.serve_forever()
|
10
scripts/update_android_files.sh
Normal file
10
scripts/update_android_files.sh
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
# TODO: port this to nimscript
|
||||||
|
# TODO: modify the CMake file instead of copying to clipboard
|
||||||
|
|
||||||
|
# Build for android like this:
|
||||||
|
# nim c -c --os:android --cpu:arm64 src/main.nim
|
||||||
|
# and then run this script to update the files in CMakeLists.txt
|
||||||
|
# (the result will be copied to clipboard)
|
||||||
|
OUT_NAME=game
|
||||||
|
cat tmp/android/${OUT_NAME}.json|grep '\.\(c\|cpp\)",' | sed -e 's/,$//' -e 's/@/\\@/g' | xsel -b
|
33
scripts/update_ios_files.sh
Normal file
33
scripts/update_ios_files.sh
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
# TODO: port this to nimscript
|
||||||
|
|
||||||
|
# Build for ios like this:
|
||||||
|
# nim c -c --os:ios --cpu:arm64 src/main.nim
|
||||||
|
# then run this script to copy the missing files
|
||||||
|
# and then remove and add the folder again in xcode
|
||||||
|
|
||||||
|
# If there are old files that are no longer used
|
||||||
|
# you have to delete the cache first:
|
||||||
|
# rm tmp/ios/* -rf
|
||||||
|
# then build and follow the above instructions
|
||||||
|
|
||||||
|
OUT_NAME=game
|
||||||
|
cd tmp/ios
|
||||||
|
DIR="$(pwd)"
|
||||||
|
# copy header files
|
||||||
|
(cat "$OUT_NAME.json" |
|
||||||
|
grep -- -I/|
|
||||||
|
grep -o -- '-I/[^ ]*' |
|
||||||
|
grep -v '^-I/$' |
|
||||||
|
sed 's@^..@@' | sort | uniq |
|
||||||
|
xargs -d'\n' -I {} find {} -iname "*.h" |
|
||||||
|
xargs -d'\n' -I {} cp "{}" .
|
||||||
|
)
|
||||||
|
# copy c files outside cache
|
||||||
|
echo ignore any error below saying "*.h" does not exist
|
||||||
|
(cat "$OUT_NAME.json" |
|
||||||
|
grep '\.\(c\|cpp\|m\)",' |
|
||||||
|
grep -v "\"$DIR" |
|
||||||
|
sed -e 's/",$//' -e 's/^\s*"//' -e 's/\\"/"/g' |
|
||||||
|
xargs -d'\n' -I {} sh -c 'cp "{}" "$(dirname {})/"*.h .'
|
||||||
|
)
|
24
scripts/watch.sh
Normal file
24
scripts/watch.sh
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
# TODO: port this to nimscript
|
||||||
|
|
||||||
|
cd "$(dirname $0)/.."
|
||||||
|
[ $NIM ] || NIM="${HOME}/nimskull/bin/nim"
|
||||||
|
OUT_NAME=game
|
||||||
|
MAIN_FILE=src/main.nim
|
||||||
|
MAIN_FILE_NAME=main
|
||||||
|
JSON="$HOME/.cache/nimskull/$MAIN_FILE_NAME_d/$OUT_NAME.json"
|
||||||
|
function build(){
|
||||||
|
$NIM c "$MAIN_FILE" && (pkill -9 game; build/game &)
|
||||||
|
}
|
||||||
|
function file_list(){
|
||||||
|
if [ -e $JSON ]; then
|
||||||
|
cat $JSON | grep '/@m.*\.nim\.c.o",' | sed -e 's_.*@m\(.*\).c.o",_src/\1_' -e 's_@s_/_g'
|
||||||
|
fi
|
||||||
|
find -iname "*.nim"
|
||||||
|
find -iname "*.blend"
|
||||||
|
}
|
||||||
|
for p in $(file_list);do echo $p;done
|
||||||
|
build
|
||||||
|
while inotifywait -e modify $(file_list) ;do
|
||||||
|
build
|
||||||
|
done
|
12
src/main.nim
Normal file
12
src/main.nim
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
import myou_engine
|
||||||
|
|
||||||
|
var myou = newMyouEngine(1280, 720, "My game")
|
||||||
|
|
||||||
|
# The example file is just Blender's default cube
|
||||||
|
myou.loadScene("assets/example.blend", proc(scene: Scene) =
|
||||||
|
scene.enable_all()
|
||||||
|
)
|
||||||
|
|
||||||
|
myou.run()
|
||||||
|
|
Loading…
Reference in a new issue