From 8f2b80c7a8e57377e9f7ac6ec1875a6179cffb5e Mon Sep 17 00:00:00 2001 From: XProger Date: Wed, 9 May 2018 20:42:52 +0300 Subject: [PATCH] #15 WebAssembly support --- src/cache.h | 5 +++- src/gapi_gl.h | 4 +-- src/level.h | 5 ++-- src/platform/web/.htaccess | 7 ++++- src/platform/web/build_wasm.bat | 8 +++++ src/platform/web/index.html | 52 +++++++++++++++++++-------------- src/shader.h | 4 ++- 7 files changed, 56 insertions(+), 29 deletions(-) create mode 100644 src/platform/web/build_wasm.bat diff --git a/src/cache.h b/src/cache.h index 90803fa..a639207 100644 --- a/src/cache.h +++ b/src/cache.h @@ -208,6 +208,8 @@ struct ShaderCache { Shader *getShader(Core::Pass pass, Shader::Type type, int fx) { Shader *shader = shaders[pass][type][fx]; #ifndef FFP + if (shader == NULL) + LOG("! NULL shader: %d %d %d\n", int(pass), int(type), int(fx)); ASSERT(shader != NULL); #endif return shader; @@ -217,7 +219,8 @@ struct ShaderCache { Core::pass = pass; Shader *shader = getShader(pass, type, fx); - shader->bind(); + if (shader) + shader->bind(); Core::setAlphaTest((fx & FX_ALPHA_TEST) != 0); } diff --git a/src/gapi_gl.h b/src/gapi_gl.h index f18ca03..682d4ff 100644 --- a/src/gapi_gl.h +++ b/src/gapi_gl.h @@ -923,10 +923,12 @@ namespace GAPI { } void setAlphaTest(bool enable) { + #ifdef FFP if (enable) glEnable(GL_ALPHA_TEST); else glDisable(GL_ALPHA_TEST); + #endif } void setCullMode(int rsMask) { @@ -1014,10 +1016,8 @@ namespace GAPI { if (mask & RS_BLEND) setBlendMode(state & RS_BLEND); - #ifdef FFP if (mask & RS_DISCARD) setAlphaTest((state & RS_DISCARD) != 0); - #endif } } diff --git a/src/level.h b/src/level.h index f3b4e69..af8e28d 100644 --- a/src/level.h +++ b/src/level.h @@ -716,6 +716,8 @@ struct Level : IGame { inventory.toggle(0, Inventory::PAGE_OPTION); } + setClipParams(1.0f, NO_CLIP_PLANE); + effect = TR::Effect::NONE; cube360 = NULL; @@ -2403,8 +2405,7 @@ struct Level : IGame { player = players[view]; camera = player->camera; - params->clipHeight = NO_CLIP_PLANE; - params->clipSign = 1.0f; + setClipParams(1.0f, NO_CLIP_PLANE); params->waterHeight = params->clipHeight; if (shadow) { diff --git a/src/platform/web/.htaccess b/src/platform/web/.htaccess index 850df1b..0072e23 100644 --- a/src/platform/web/.htaccess +++ b/src/platform/web/.htaccess @@ -15,7 +15,12 @@ AddEncoding gzip .gz Header set Content-Encoding: gzip + + ForceType application/octet-stream + Header set Content-Encoding: gzip + + RewriteEngine on RewriteCond %{HTTP:Accept-Encoding} gzip RewriteCond %{REQUEST_FILENAME}.gz -f -RewriteRule ^(.+)\.(js|data|mem)$ $1.$2.gz [L] \ No newline at end of file +RewriteRule ^(.+)\.(js|data|mem|wasm)$ $1.$2.gz [L] \ No newline at end of file diff --git a/src/platform/web/build_wasm.bat b/src/platform/web/build_wasm.bat new file mode 100644 index 0000000..e965de8 --- /dev/null +++ b/src/platform/web/build_wasm.bat @@ -0,0 +1,8 @@ +@echo off +cls +set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c +set PROJ=OpenLara_wasm +set FLAGS=-s WASM=1 -O3 -ffast-math -Wno-deprecated-register --llvm-opts 2 -fmax-type-align=2 -std=c++11 -Wall -I../../ +echo. +call em++ %SRC% %FLAGS% -o %PROJ%.js --preload-file ./level/1/TITLE.PSX --preload-file ./audio/1/dummy --preload-file ./audio/2/dummy --preload-file ./audio/3/dummy --preload-file ./level/2/dummy --preload-file ./level/3/dummy +gzip.exe -9 -f %PROJ%.data %PROJ%.js %PROJ%.wasm %PROJ%.js.mem load-wasm-worker.js \ No newline at end of file diff --git a/src/platform/web/index.html b/src/platform/web/index.html index 0a08be7..943aca7 100644 --- a/src/platform/web/index.html +++ b/src/platform/web/index.html @@ -85,7 +85,7 @@ var AudioContext = window.AudioContext || window.webkitAudioContext; if (!AudioContext) return; audioContext = new (window.AudioContext || window.webkitAudioContext)(); - var count = 2048; + var count = 4096; var rate = 44100 / audioContext.sampleRate; var framesCount = Math.ceil(count * rate); var frames = Module._malloc(framesCount * 4); // interleaved short L, R @@ -103,13 +103,14 @@ proc.connect(audioContext.destination); } - // for iOS to unlock audio context after user interaction + // unlock audio context after user interaction var userAction = function() { - if (audioContext) { - audioContext.resume(); - window.removeEventListener('touchstart', userAction, false); - window.removeEventListener('click', userAction, false); - console.log("resume playback"); + if (audioContext && audioContext.state == "suspended") { + audioContext.resume().then(function() { + window.removeEventListener('touchstart', userAction, false); + window.removeEventListener('click', userAction, false); + console.log("resume playback"); + }); } }; window.addEventListener('touchstart', userAction, false); @@ -133,26 +134,33 @@ (.PHD, .PSX, .TR2)

OpenLara on github & facebook
-
last update: 8.05.2018
+
last update: 9.05.2018