fixed wasm compatibility

This commit is contained in:
Walter Oggioni
2019-04-27 10:59:39 +01:00
parent 0127bbee0b
commit b0a890a85b
6 changed files with 115 additions and 16 deletions

View File

@@ -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:

35
resources/index.html Normal file
View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<style>
* { margin: 0; padding: 0;}
body, html { height:100%; }
#canvas {
position:absolute;
width:100%;
height:100%;
}
</style>
<body>
<!-- Create the canvas that the C++ code will draw into -->
<canvas id="canvas" oncontextmenu="event.preventDefault()"></canvas>
<!-- Allow the C++ to access the canvas element -->
<script type='text/javascript'>
var Module = {
canvas: (function() { return document.getElementById('canvas'); })()
};
</script>
<!-- Add the javascript glue code (index.js) as generated by Emscripten -->
<script src="sdlife.js"></script>
</body>
</html>

50
src/hello_sdl.nim Normal file
View File

@@ -0,0 +1,50 @@
import sdl2, sdl2/gfx
import geo2d
when defined(wasm):
{.emit: "#include <emscripten.h>".}
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

View File

@@ -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 <emscripten.h>".}
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
@@ -160,11 +165,20 @@ while not quit:
if current_grid[][i, j]:
render.fillRect(newRect2d((i * side).float32, (j * side).float32, side.float32, side.float32) * xform)
render.present
fpsman.delay
let current_time_sec = fpsman.getFramecount() div step
if not freeze and current_time_sec > 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