diff --git a/nim.cfg b/nim.cfg index 45e3e76..bd1efc5 100644 --- a/nim.cfg +++ b/nim.cfg @@ -15,10 +15,10 @@ cpu = "i386" @if wasm: passC = "-s WASM=1 -Iemscripten" - passL = "-s WASM=1 -Lemscripten -s ALLOW_MEMORY_GROWTH=1 " + passL = "-s WASM=1 -Lemscripten -s ALLOW_MEMORY_GROWTH=1" @elif asmjs: - passC = "-s ASM_JS=1 -Iemscripten" #-s USE_PTHREADS=1 - passL = "-s ASM_JS=1 -Lemscripten" #-s ALLOW_MEMORY_GROWTH=1" + passC = "-s ASM_JS=1 -Iemscripten" + passL = "-s ASM_JS=1 -Lemscripten" @end @if release: diff --git a/resources/index.html b/resources/index.html new file mode 100644 index 0000000..19b5093 --- /dev/null +++ b/resources/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geo2d.nim b/src/geo2d.nim similarity index 100% rename from geo2d.nim rename to src/geo2d.nim diff --git a/grid.nim b/src/grid.nim similarity index 100% rename from grid.nim rename to src/grid.nim diff --git a/src/hello_sdl.nim b/src/hello_sdl.nim new file mode 100644 index 0000000..5e9d606 --- /dev/null +++ b/src/hello_sdl.nim @@ -0,0 +1,50 @@ +import sdl2, sdl2/gfx +import geo2d + + +when defined(wasm): + {.emit: "#include ".} + proc emscripten_set_main_loop_arg*(loopFunction: proc(ctx : pointer) {.cdecl.}, ctx : pointer, fps : cint, simulate_infinite_loop : cint) {.importc.} + +discard sdl2.init(INIT_EVERYTHING) + +var + window: WindowPtr + renderer: RendererPtr + +window = createWindow("Game of Life in SDL", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + 640, 480, + SDL_WINDOW_SHOWN or SDL_WINDOW_RESIZABLE) + +renderer = createRenderer(window, -1, Renderer_Accelerated or Renderer_PresentVsync or Renderer_TargetTexture) + +type Context = object + renderer : RendererPtr + +proc mainloop(arg : pointer) {.cdecl.} = + let windowSize = block: + var w, h : cint + window.getSize(w, h) + Rect2d(tl: newP2d(0f32, 0f32), br: newP2d(w.float32, h.float32)) + + let ctx = cast[ptr[Context]](arg) + let renderer = ctx.renderer + + renderer.setDrawColor(255, 0, 0, 255) + renderer.clear() + let ticks = getTicks() + var r : Rect; + r.x = ((ticks.float64 / 3000 * windowSize.width).cuint mod windowSize.width.cuint).cint + r.y = 50; + r.w = 50; + r.h = 50; + renderer.setDrawColor(0, 255, 255) + renderer.fillRect(r) + renderer.present() + +var ctx = Context(renderer : renderer) +emscripten_set_main_loop_arg(mainloop, addr(ctx), -1, 1) + +destroy renderer +destroy window \ No newline at end of file diff --git a/main.nim b/src/main.nim similarity index 88% rename from main.nim rename to src/main.nim index 651bb18..8c82947 100644 --- a/main.nim +++ b/src/main.nim @@ -1,4 +1,4 @@ -include options +import options import sdl2, sdl2/gfx import grid import geo2d @@ -6,6 +6,10 @@ import mmath/smatrix import mmath/svector from nwo/utils import box +when defined(wasm): + {.emit: "#include ".} + proc emscripten_set_main_loop_arg*(loopFunction: proc(ctx : pointer) {.cdecl.}, ctx : pointer, fps : cint, simulate_infinite_loop : cint) {.importc.} + discard sdl2.init(INIT_EVERYTHING) proc drawLine(renderer : RendererPtr, p0, p1 : P2d) = renderer.drawLine(p0.x.cint, p0.y.cint, p1.x.cint, p1.y.cint) @@ -27,8 +31,8 @@ var evt = sdl2.defaultEvent quit = false freeze = true - fpsman: FpsManager -fpsman.init +# fpsman: FpsManager +# fpsman.init let side = 5 let @@ -44,14 +48,14 @@ block: next_grid = box(grid) let bb = newRect2d(0f32, 0f32, float32(side * pixelx), float32(side * pixely)) -var step = 3 -var elapsed_time_sec = 0 +var step : uint = 3 +var elapsed_time : uint = 0 var xform : X2d = identity[3, float32]() uxform : X2d = identity[3, float32]() pan_start : Option[P2d] = none[P2d]() -while not quit: +proc main_loop(arg : pointer) {.cdecl.} = let windowSize = block: var w, h : cint window.getSize(w, h) @@ -73,7 +77,7 @@ while not quit: of 's'.int: next_step(current_grid[], next_grid[]) of '['.int: - if step > 1: + if step > 0u: step -= 1 of ']'.int: if step < 10: @@ -121,7 +125,8 @@ while not quit: else: discard - let dt = fpsman.getFramerate() / 1000 + # let dt = fpsman.getFramerate() / 1000 + # let dt = 10 render.setDrawColor 0,0,0,255 render.clear @@ -153,18 +158,27 @@ while not quit: while y <= bb.height: render.drawLine(newP2d(bb.left, y) * xform, newP2d(bb.width, y) * xform) y += side.float32 - + render.setDrawColor 255,255,255,255 for i in 0.. elapsed_time_sec: - elapsed_time_sec = current_time_sec + # fpsman.delay + # delay(0) + let current_time = getTicks().uint + if not freeze and current_time - elapsed_time > step * 50: + elapsed_time = current_time next_step(current_grid[], next_grid[]) + +when defined(wasm): + emscripten_set_main_loop_arg(mainloop, nil, -1, 1) +else: + while not quit: + main_loop(nil) + delay(0) + destroy render destroy window \ No newline at end of file