Skip to content
Snippets Groups Projects
Commit 7874964e authored by Jaswant Panchumarti (Kitware)'s avatar Jaswant Panchumarti (Kitware)
Browse files

Enable multiple canvases in single wasm module

- this commit renames CanvasId to CanvasSelector
  and forwards it to emscripten calls.
- made it so users can invoke `ProcessEvents` on the wasm
  interactor directly without calling `Start`. This is needed
  because the only way for users to process events on multiple
  wasm interactors is to call `emscripten_set_main_loop` with
  a lambda that invokes `ProcessEvents` on all interactors.
- removed the `canvas` key in the wasm module from
  examples and unit test html files.
- clean up wasm examples because the Module.canvas property is not required.
- simplify cmake setup in wasm examples
parent 476fb11a
Branches
Tags
No related merge requests found
Showing
with 143 additions and 747 deletions
......@@ -12,26 +12,22 @@ endif ()
# -----------------------------------------------------------------------------
# Handle VTK dependency
# -----------------------------------------------------------------------------
find_package(VTK REQUIRED)
find_package(VTK
COMPONENTS
CommonColor
FiltersGeneral
FiltersSources
InteractionStyle
InteractionWidgets
RenderingOpenGL2
RenderingUI)
# -----------------------------------------------------------------------------
# Compile example code
# -----------------------------------------------------------------------------
add_executable(AsyncClipper AsyncClipper.cxx)
set(vtk_libs_used
VTK::CommonColor
VTK::FiltersGeneral
VTK::FiltersSources
VTK::InteractionStyle
VTK::InteractionWidgets
VTK::RenderingOpenGL2
VTK::RenderingUI)
target_link_libraries(AsyncClipper
PRIVATE
${vtk_libs_used}
)
target_link_libraries(AsyncClipper PRIVATE ${VTK_LIBRARIES})
# -----------------------------------------------------------------------------
# Emscripten compile+link options
......@@ -58,67 +54,14 @@ endif ()
list(APPEND emscripten_compile_options
"-pthread")
# -----------------------------------------------------------------------------
# WebAssembly build options
# -----------------------------------------------------------------------------
set(emscripten_optimizations)
set(emscripten_debug_options)
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(_wasm_optimize "BEST")
set(_wasm_debuginfo "PROFILE")
elseif (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
set(_wasm_optimize "SMALLEST_WITH_CLOSURE")
set(_wasm_debuginfo "NONE")
elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
set(_wasm_optimize "MORE")
set(_wasm_debuginfo "PROFILE")
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(_wasm_optimize "NO_OPTIMIZATION")
set(_wasm_debuginfo "DEBUG_NATIVE")
endif ()
set(_wasm_optimize_NO_OPTIMIZATION "-O0")
set(_wasm_optimize_LITTLE "-O1")
set(_wasm_optimize_MORE "-O2")
set(_wasm_optimize_BEST "-O3")
set(_wasm_optimize_SMALLEST "-Os")
set(_wasm_optimize_SMALLEST_WITH_CLOSURE "-Oz")
set(_wasm_optimize_SMALLEST_WITH_CLOSURE_link "--closure=1")
if (DEFINED "_wasm_optimize_${_wasm_optimize}")
list(APPEND emscripten_optimizations
${_wasm_optimize_${_wasm_optimize}})
list(APPEND emscripten_link_options
${_wasm_optimize_${_wasm_optimize}_link})
else ()
message (FATAL_ERROR "Unrecognized value for _wasm_optimize=${_wasm_optimize}")
endif ()
set(_wasm_debuginfo_NONE "-g0")
set(_wasm_debuginfo_READABLE_JS "-g1")
set(_wasm_debuginfo_PROFILE "-g2")
set(_wasm_debuginfo_DEBUG_NATIVE "-g3")
set(_wasm_debuginfo_DEBUG_NATIVE_link "-sASSERTIONS=1")
if (DEFINED "_wasm_debuginfo_${_wasm_debuginfo}")
list(APPEND emscripten_debug_options
${_wasm_debuginfo_${_wasm_debuginfo}})
list(APPEND emscripten_link_options
${_wasm_debuginfo_${_wasm_debuginfo}_link})
else ()
message (FATAL_ERROR "Unrecognized value for _wasm_debuginfo=${_wasm_debuginfo}")
endif ()
target_compile_options(AsyncClipper
PUBLIC
${emscripten_compile_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
target_link_options(AsyncClipper
PUBLIC
${emscripten_link_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
# -----------------------------------------------------------------------------
......@@ -127,7 +70,7 @@ target_link_options(AsyncClipper
vtk_module_autoinit(
TARGETS AsyncClipper
MODULES ${vtk_libs_used}
MODULES ${VTK_LIBRARIES}
)
# -----------------------------------------------------------------------------
......
......@@ -32,125 +32,78 @@ endif ()
# -----------------------------------------------------------------------------
add_executable(Cone Cone.cxx)
target_link_libraries(Cone
PRIVATE
VTK::FiltersSources
VTK::InteractionStyle
VTK::RenderingOpenGL2
VTK::RenderingUI
)
target_link_libraries(Cone PRIVATE ${VTK_LIBRARIES})
# -----------------------------------------------------------------------------
# WebAssembly build options
# Optimizations
# -----------------------------------------------------------------------------
set(emscripten_link_options)
set(emscripten_compile_options)
list(APPEND emscripten_link_options
"SHELL:-s WASM=1"
)
set(emscripten_optimizations)
set(emscripten_debug_options)
set(DEBUGINFO "PROFILE" CACHE STRING "Type of debug info")
set_property(CACHE DEBUGINFO PROPERTY
STRINGS
NONE # -g0
READABLE_JS # -g1
PROFILE # -g2
DEBUG_NATIVE # -g3
)
if(DEBUGINFO STREQUAL "NONE")
list(APPEND emscripten_debug_options
"-g0"
)
elseif(DEBUGINFO STREQUAL "READABLE_JS")
list(APPEND emscripten_debug_options
"-g1"
)
list(APPEND emscripten_link_options
"SHELL:-s DEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "PROFILE")
list(APPEND emscripten_debug_options
"-g2"
)
list(APPEND emscripten_link_options
"SHELL:-s DEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "DEBUG_NATIVE")
list(APPEND emscripten_debug_options
"-g3"
)
list(APPEND emscripten_link_options
"SHELL:-s ASSERTIONS=1"
"SHELL:-s DEMANGLE_SUPPORT=1"
)
# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Debug' as none was specified.")
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"MinSizeRel" "RelWithDebInfo")
endif()
# -----------------------------------------------------------------------------
# Build options
# -----------------------------------------------------------------------------
set(emscripten_optimizations)
set(OPTIMIZE "SMALLEST_WITH_CLOSURE" CACHE STRING "Emscripten optimization")
set_property(CACHE OPTIMIZE PROPERTY
STRINGS
NO_OPTIMIZATION # -O0
LITTLE # -O1
MORE # -O2
BEST # -O3
SMALL # -Os
SMALLEST # -Oz
SMALLEST_WITH_CLOSURE # -Oz --closure 1
)
if(OPTIMIZE STREQUAL "NO_OPTIMIZATION")
list(APPEND emscripten_optimizations
"-O0"
)
elseif(OPTIMIZE STREQUAL "LITTLE")
list(APPEND emscripten_optimizations
"-O1"
)
elseif(OPTIMIZE STREQUAL "MORE")
list(APPEND emscripten_optimizations
"-O2"
)
elseif(OPTIMIZE STREQUAL "BEST")
list(APPEND emscripten_optimizations
"-O3"
)
elseif(OPTIMIZE STREQUAL "SMALL")
list(APPEND emscripten_optimizations
"-Os"
)
elseif(OPTIMIZE STREQUAL "SMALLEST")
list(APPEND emscripten_optimizations
"-Oz"
)
elseif(OPTIMIZE STREQUAL "SMALLEST_WITH_CLOSURE")
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(cone_wasm_optimize "BEST")
set(cone_wasm_debuginfo "NONE")
elseif (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
set(cone_wasm_optimize "SMALLEST_WITH_CLOSURE")
set(cone_wasm_debuginfo "NONE")
elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
set(cone_wasm_optimize "MORE")
set(cone_wasm_debuginfo "PROFILE")
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(cone_wasm_optimize "NO_OPTIMIZATION")
set(cone_wasm_debuginfo "DEBUG_NATIVE")
endif ()
set(cone_wasm_optimize_NO_OPTIMIZATION "-O0")
set(cone_wasm_optimize_LITTLE "-O1")
set(cone_wasm_optimize_MORE "-O2")
set(cone_wasm_optimize_BEST "-O3")
set(cone_wasm_optimize_SMALLEST "-Os")
set(cone_wasm_optimize_SMALLEST_WITH_CLOSURE "-Oz")
set(cone_wasm_optimize_SMALLEST_WITH_CLOSURE_link "--closure=1")
if (DEFINED "cone_wasm_optimize_${cone_wasm_optimize}")
list(APPEND emscripten_optimizations
"-Oz"
)
${cone_wasm_optimize_${cone_wasm_optimize}})
list(APPEND emscripten_link_options
"--closure 1"
)
${cone_wasm_optimize_${cone_wasm_optimize}_link})
else ()
message (FATAL_ERROR "Unrecognized value for cone_wasm_optimize=${cone_wasm_optimize}")
endif ()
set(cone_wasm_debuginfo_NONE "-g0")
set(cone_wasm_debuginfo_READABLE_JS "-g1")
set(cone_wasm_debuginfo_PROFILE "-g2")
set(cone_wasm_debuginfo_DEBUG_NATIVE "-g3")
set(cone_wasm_debuginfo_DEBUG_NATIVE_link "-sASSERTIONS=1")
if (DEFINED "cone_wasm_debuginfo_${cone_wasm_debuginfo}")
list(APPEND emscripten_debug_options
${cone_wasm_debuginfo_${cone_wasm_debuginfo}})
list(APPEND emscripten_link_options
${cone_wasm_debuginfo_${cone_wasm_debuginfo}_link})
else ()
message (FATAL_ERROR "Unrecognized value for cone_wasm_debuginfo=${cone_wasm_debuginfo}")
endif ()
target_compile_options(Cone
PUBLIC
PRIVATE
${emscripten_compile_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
${emscripten_debug_options})
target_link_options(Cone
PUBLIC
PRIVATE
${emscripten_link_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
${emscripten_debug_options})
# -----------------------------------------------------------------------------
# VTK modules initialization
......
......@@ -6,45 +6,8 @@
</head>
<body>
<canvas id="canvas" style="position: absolute; left: 0; top: 0;"></canvas>
<canvas id="canvas" tabindex="-1" onclick="canvas.focus()" style="position: absolute; left: 0; top: 0;"></canvas>
<script type="text/javascript" src="Cone.js"></script>
<script type='text/javascript'>
var Module = {
'canvas': (function () {
var canvas = document.getElementById('canvas');
canvas.addEventListener(
"webglcontextlost",
function (e) {
console.error('WebGL context lost. You will need to reload the page.');
e.preventDefault();
},
false
);
return canvas;
})(),
'print': (function () {
return function (text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.info(text);
};
})(),
'printErr': function (text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.error(text);
},
'onRuntimeInitialized': function () {
console.log('WASM runtime initialized');
// sends a resize event so that the render window fills up browser tab dimensions.
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 0);
// focus on the canvas to grab keyboard inputs.
canvas.setAttribute('tabindex', '0');
// grab focus when the render window region receives mouse clicks.
canvas.addEventListener('click', () => canvas.focus());
}
};
</script>
</body>
</html>
......@@ -33,129 +33,25 @@ endif ()
# -----------------------------------------------------------------------------
add_executable(ConeMultiBackend ConeMultiBackend.cxx)
target_link_libraries(ConeMultiBackend
PRIVATE
VTK::FiltersSources
VTK::InteractionStyle
VTK::RenderingOpenGL2
VTK::RenderingWebGPU
VTK::RenderingUI
)
target_link_libraries(ConeMultiBackend PRIVATE ${VTK_LIBRARIES})
# -----------------------------------------------------------------------------
# WebAssembly build options
# -----------------------------------------------------------------------------
set(emscripten_link_options)
set(emscripten_compile_options)
list(APPEND emscripten_link_options
"-sWASM=1"
"-sMODULARIZE=1"
"-sASYNCIFY=1"
"-sALLOW_MEMORY_GROWTH=1"
"-sEXPORT_NAME=createConeMultiBackendModule"
"-sEXPORTED_RUNTIME_METHODS=['ENV']" # ENV holds the environment variables accessible by C getenv
)
set(emscripten_debug_options)
set(DEBUGINFO "PROFILE" CACHE STRING "Type of debug info")
set_property(CACHE DEBUGINFO PROPERTY
STRINGS
NONE # -g0
READABLE_JS # -g1
PROFILE # -g2
DEBUG_NATIVE # -g3
)
if(DEBUGINFO STREQUAL "NONE")
list(APPEND emscripten_debug_options
"-g0"
)
elseif(DEBUGINFO STREQUAL "READABLE_JS")
list(APPEND emscripten_debug_options
"-g1"
)
list(APPEND emscripten_link_options
"-sDEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "PROFILE")
list(APPEND emscripten_debug_options
"-g2"
)
list(APPEND emscripten_link_options
"-sDEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "DEBUG_NATIVE")
list(APPEND emscripten_debug_options
"-g3"
)
list(APPEND emscripten_link_options
"-sASSERTIONS=1"
"-sDEMANGLE_SUPPORT=1"
)
endif()
# -----------------------------------------------------------------------------
# Build options
# -----------------------------------------------------------------------------
set(emscripten_optimizations)
set(OPTIMIZE "SMALLEST_WITH_CLOSURE" CACHE STRING "Emscripten optimization")
set_property(CACHE OPTIMIZE PROPERTY
STRINGS
NO_OPTIMIZATION # -O0
LITTLE # -O1
MORE # -O2
BEST # -O3
SMALL # -Os
SMALLEST # -Oz
SMALLEST_WITH_CLOSURE # -Oz --closure 1
)
if(OPTIMIZE STREQUAL "NO_OPTIMIZATION")
list(APPEND emscripten_optimizations
"-O0"
)
elseif(OPTIMIZE STREQUAL "LITTLE")
list(APPEND emscripten_optimizations
"-O1"
)
elseif(OPTIMIZE STREQUAL "MORE")
list(APPEND emscripten_optimizations
"-O2"
)
elseif(OPTIMIZE STREQUAL "BEST")
list(APPEND emscripten_optimizations
"-O3"
)
elseif(OPTIMIZE STREQUAL "SMALL")
list(APPEND emscripten_optimizations
"-Os"
)
elseif(OPTIMIZE STREQUAL "SMALLEST")
list(APPEND emscripten_optimizations
"-Oz"
)
elseif(OPTIMIZE STREQUAL "SMALLEST_WITH_CLOSURE")
list(APPEND emscripten_optimizations
"-Oz"
)
list(APPEND emscripten_link_options
"--closure 1"
)
endif()
target_compile_options(ConeMultiBackend
PUBLIC
${emscripten_compile_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
target_link_options(ConeMultiBackend
PUBLIC
${emscripten_link_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
# -----------------------------------------------------------------------------
......
export var options = {
nx: '10',
ny: '10',
nz: '100',
mapperIsStatic: '1'
};
export const BaseConfig = {
'canvas': (function () {
var canvas = document.getElementById('canvas');
return canvas;
})(),
'print': (function () {
return function (text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.info(text);
};
})(),
'printErr': function (text) {
text = Array.prototype.slice.call(arguments).join(' ');
console.error(text);
}
};
export function initCanvas(canvas) {
// sends a resize event so that the render window fills up browser tab dimensions.
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 0);
// focus on the canvas to grab keyboard inputs.
canvas.setAttribute('tabindex', '0');
// grab focus when the render window region receives mouse clicks.
canvas.addEventListener('click', () => canvas.focus());
}
import { BaseConfig, options, initCanvas } from "./config_base.js";
function makeWebGLConfig() {
var cfg = BaseConfig;
cfg.canvas = (function () {
var canvas = document.getElementById('canvas');
canvas.addEventListener(
"webglcontextlost",
function (e) {
console.error('WebGL context lost. You will need to reload the page.');
e.preventDefault();
},
false
);
return canvas;
})()
cfg.arguments = [options.nx, options.ny, options.nz, options.mapperIsStatic];
return cfg;
}
var canvas = document.createElement('canvas');
canvas.setAttribute('id', 'canvas');
canvas.setAttribute('class', 'canvas');
document.body.appendChild(canvas)
let cfg = makeWebGLConfig();
let Runtime = await createConeMultiBackendModule(cfg);
console.log(`WASM runtime initialized with arguments ${Runtime.arguments}`);
initCanvas(canvas);
import { BaseConfig, options, initCanvas } from "./config_base.js";
function makeWebGPUConfig() {
var cfg = BaseConfig;
cfg.canvas = (function () {
var canvas = document.getElementById('canvas');
return canvas;
})()
cfg.preRun = [function (module) {
// select WEBGPU backend
module.ENV.VTK_GRAPHICS_BACKEND = 'WEBGPU';
}];
cfg.arguments = [options.nx, options.ny, options.nz, options.mapperIsStatic];
return cfg;
}
if (navigator.gpu === undefined) {
var webgpuSupportEl = document.createElement('h1');
webgpuSupportEl.innerText = "Your browser does not support webgpu!";
document.body.appendChild(webgpuSupportEl)
var explainEl = document.createElement('p');
explainEl.innerText = "On supported browsers, maybe serve from localhost instead of ip?";
document.body.appendChild(explainEl)
} else {
var canvas = document.createElement('canvas');
canvas.setAttribute('id', 'canvas');
canvas.setAttribute('class', 'canvas');
document.body.appendChild(canvas)
let cfg = makeWebGPUConfig();
let adapter = await navigator.gpu.requestAdapter();
console.log("Found an adapter");
let device = await adapter.requestDevice();
console.log("Obtained a device");
// Set the device from JS. This can be done in C++ as well.
// See https://github.com/kainino0x/webgpu-cross-platform-demo/blob/main/main.cpp#L51
cfg.preinitializedWebGPUDevice = device;
let Runtime = await createConeMultiBackendModule(cfg);
console.log(`WASM runtime initialized with arguments ${Runtime.arguments}`);
initCanvas(canvas);
}
export var options = {
nx: '10',
ny: '10',
nz: '100',
mapperIsStatic: '1'
};
......@@ -2,7 +2,7 @@
left: 0;
top: 0;
position: absolute;
display: block;
display: none;
}
.container {
......
......@@ -7,8 +7,9 @@
</head>
<body>
<canvas id="canvas" tabindex="-1" onclick="canvas.focus()"></canvas>
<script type='text/javascript' src='./ConeMultiBackend.js'></script>
<script type='module' src='./config_webgl.js'></script>
<script type='module' src='./webgl.js'></script>
</body>
</html>
import { options } from "./options.js";
let canvas = document.querySelector('#canvas');
canvas.style.display = 'block';
let runtime = await createConeMultiBackendModule({ 'arguments': [options.nx, options.ny, options.nz, options.mapperIsStatic] });
console.log(`WASM runtime initialized with arguments ${runtime.arguments}`);
......@@ -7,9 +7,9 @@
</head>
<body>
<canvas id="canvas" tabindex="-1" onclick="canvas.focus()"></canvas>
<script type='text/javascript' src='./ConeMultiBackend.js'></script>
<script type='module' src='./config_base.js'></script>
<script type='module' src='./config_webgpu.js'></script>
<script type='module' src='./webgpu.js'></script>
</body>
</html>
import { options } from "./options.js";
if (navigator.gpu === undefined) {
var webgpuSupportEl = document.createElement('h1');
webgpuSupportEl.innerText = "Your browser does not support webgpu!";
document.body.appendChild(webgpuSupportEl)
var explainEl = document.createElement('p');
explainEl.innerText = "On supported browsers, maybe serve from localhost instead of ip?";
document.body.appendChild(explainEl)
} else {
let canvas = document.querySelector('#canvas');
canvas.style.display = 'block';
let cfg = {
arguments: [options.nx, options.ny, options.nz, options.mapperIsStatic],
preRun: [function (module) {
// select WEBGPU backend
module.ENV.VTK_GRAPHICS_BACKEND = 'WEBGPU';
}],
};
let runtime = await createConeMultiBackendModule(cfg);
console.log(`WASM runtime initialized with arguments ${runtime.arguments}`);
}
......@@ -32,20 +32,12 @@ endif ()
# -----------------------------------------------------------------------------
add_executable(MultiCone MultiCone.cxx)
target_link_libraries(MultiCone
PRIVATE
VTK::FiltersSources
VTK::InteractionStyle
VTK::RenderingOpenGL2
VTK::RenderingUI
)
target_link_libraries(MultiCone PRIVATE ${VTK_LIBRARIES})
# -----------------------------------------------------------------------------
# WebAssembly build options
# -----------------------------------------------------------------------------
set(emscripten_link_options)
set(emscripten_compile_options)
list(APPEND emscripten_link_options
"-lembind"
......@@ -58,105 +50,9 @@ list(APPEND emscripten_link_options
"SHELL:-s ALLOW_MEMORY_GROWTH=1"
)
set(emscripten_debug_options)
set(DEBUGINFO "PROFILE" CACHE STRING "Type of debug info")
set_property(CACHE DEBUGINFO PROPERTY
STRINGS
NONE # -g0
READABLE_JS # -g1
PROFILE # -g2
DEBUG_NATIVE # -g3
)
if(DEBUGINFO STREQUAL "NONE")
list(APPEND emscripten_debug_options
"-g0"
)
elseif(DEBUGINFO STREQUAL "READABLE_JS")
list(APPEND emscripten_debug_options
"-g1"
)
list(APPEND emscripten_link_options
"-s DEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "PROFILE")
list(APPEND emscripten_debug_options
"-g2"
)
list(APPEND emscripten_link_options
"-s DEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "DEBUG_NATIVE")
list(APPEND emscripten_debug_options
"-g3"
)
list(APPEND emscripten_link_options
"-s ASSERTIONS=1"
"-s DEMANGLE_SUPPORT=1"
)
endif()
# -----------------------------------------------------------------------------
# Build options
# -----------------------------------------------------------------------------
set(emscripten_optimizations)
set(OPTIMIZE "SMALLEST_WITH_CLOSURE" CACHE STRING "Emscripten optimization")
set_property(CACHE OPTIMIZE PROPERTY
STRINGS
NO_OPTIMIZATION # -O0
LITTLE # -O1
MORE # -O2
BEST # -O3
SMALL # -Os
SMALLEST # -Oz
SMALLEST_WITH_CLOSURE # -Oz --closure 1
)
if(OPTIMIZE STREQUAL "NO_OPTIMIZATION")
list(APPEND emscripten_optimizations
"-Oz"
)
elseif(OPTIMIZE STREQUAL "LITTLE")
list(APPEND emscripten_optimizations
"-O1"
)
elseif(OPTIMIZE STREQUAL "MORE")
list(APPEND emscripten_optimizations
"-O2"
)
elseif(OPTIMIZE STREQUAL "BEST")
list(APPEND emscripten_optimizations
"-O3"
)
elseif(OPTIMIZE STREQUAL "SMALL")
list(APPEND emscripten_optimizations
"-Os"
)
elseif(OPTIMIZE STREQUAL "SMALLEST")
list(APPEND emscripten_optimizations
"-Oz"
)
elseif(OPTIMIZE STREQUAL "SMALLEST_WITH_CLOSURE")
list(APPEND emscripten_optimizations
"-Oz"
)
list(APPEND emscripten_link_options
"--closure 1"
)
endif()
target_compile_options(MultiCone
PUBLIC
${emscripten_compile_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
target_link_options(MultiCone
PUBLIC
${emscripten_link_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
# -----------------------------------------------------------------------------
......
......@@ -114,7 +114,7 @@ int main(int argc, char* argv[])
// Start rendering app
renderer->SetBackground(0.2, 0.3, 0.4);
renderWindow->SetSize(600, 600);
// renderWindow->SetSize(600, 600);
renderWindow->Render();
// Start event loop
......
......@@ -12,27 +12,22 @@ endif ()
# -----------------------------------------------------------------------------
# Handle VTK dependency
# -----------------------------------------------------------------------------
find_package(VTK REQUIRED)
find_package(VTK
COMPONENTS
CommonColor
FiltersGeneral
FiltersSources
InteractionStyle
InteractionWidgets
RenderingOpenGL2
RenderingUI)
# -----------------------------------------------------------------------------
# Compile example code
# -----------------------------------------------------------------------------
add_executable(WrappedAsyncClipper WrappedAsyncClipper.cxx WrappedAsyncClipper.h)
target_compile_features(WrappedAsyncClipper PRIVATE cxx_std_14) # for initialized lambda captures
set(vtk_libs_used
VTK::CommonColor
VTK::FiltersGeneral
VTK::FiltersSources
VTK::InteractionStyle
VTK::InteractionWidgets
VTK::RenderingOpenGL2
VTK::RenderingUI)
target_link_libraries(WrappedAsyncClipper
PRIVATE
${vtk_libs_used}
)
target_link_libraries(WrappedAsyncClipper PRIVATE ${VTK_LIBRARIES})
# -----------------------------------------------------------------------------
# Emscripten compile+link options
......@@ -63,67 +58,14 @@ endif ()
list(APPEND emscripten_compile_options
"-pthread")
# -----------------------------------------------------------------------------
# WebAssembly build options
# -----------------------------------------------------------------------------
set(emscripten_optimizations)
set(emscripten_debug_options)
if (CMAKE_BUILD_TYPE STREQUAL "Release")
set(_wasm_optimize "BEST")
set(_wasm_debuginfo "PROFILE")
elseif (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
set(_wasm_optimize "SMALLEST_WITH_CLOSURE")
set(_wasm_debuginfo "NONE")
elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
set(_wasm_optimize "MORE")
set(_wasm_debuginfo "PROFILE")
elseif (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(_wasm_optimize "NO_OPTIMIZATION")
set(_wasm_debuginfo "DEBUG_NATIVE")
endif ()
set(_wasm_optimize_NO_OPTIMIZATION "-O0")
set(_wasm_optimize_LITTLE "-O1")
set(_wasm_optimize_MORE "-O2")
set(_wasm_optimize_BEST "-O3")
set(_wasm_optimize_SMALLEST "-Os")
set(_wasm_optimize_SMALLEST_WITH_CLOSURE "-Oz")
set(_wasm_optimize_SMALLEST_WITH_CLOSURE_link "--closure=1")
if (DEFINED "_wasm_optimize_${_wasm_optimize}")
list(APPEND emscripten_optimizations
${_wasm_optimize_${_wasm_optimize}})
list(APPEND emscripten_link_options
${_wasm_optimize_${_wasm_optimize}_link})
else ()
message (FATAL_ERROR "Unrecognized value for _wasm_optimize=${_wasm_optimize}")
endif ()
set(_wasm_debuginfo_NONE "-g0")
set(_wasm_debuginfo_READABLE_JS "-g1")
set(_wasm_debuginfo_PROFILE "-g2")
set(_wasm_debuginfo_DEBUG_NATIVE "-g3")
set(_wasm_debuginfo_DEBUG_NATIVE_link "-sASSERTIONS=1")
if (DEFINED "_wasm_debuginfo_${_wasm_debuginfo}")
list(APPEND emscripten_debug_options
${_wasm_debuginfo_${_wasm_debuginfo}})
list(APPEND emscripten_link_options
${_wasm_debuginfo_${_wasm_debuginfo}_link})
else ()
message (FATAL_ERROR "Unrecognized value for _wasm_debuginfo=${_wasm_debuginfo}")
endif ()
target_compile_options(WrappedAsyncClipper
PUBLIC
${emscripten_compile_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
target_link_options(WrappedAsyncClipper
PUBLIC
${emscripten_link_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
# -----------------------------------------------------------------------------
......@@ -132,7 +74,7 @@ target_link_options(WrappedAsyncClipper
vtk_module_autoinit(
TARGETS WrappedAsyncClipper
MODULES ${vtk_libs_used}
MODULES ${VTK_LIBRARIES}
)
# -----------------------------------------------------------------------------
......
......@@ -75,18 +75,6 @@
var mouseDown = false;
var Module = {
'canvas': (function () {
var canvas = document.getElementById('canvas');
canvas.addEventListener(
"webglcontextlost",
function (e) {
console.error('WebGL context lost. You will need to reload the page.');
e.preventDefault();
},
false
);
return canvas;
})(),
'print': (function () {
var logs = document.getElementById('logs');
if (logs) logs.value = ''; // clear browser cache
......
......@@ -32,20 +32,13 @@ endif ()
# -----------------------------------------------------------------------------
add_executable(WrappedMace WrappedMace.cxx)
target_link_libraries(WrappedMace PRIVATE ${VTK_LIBRARIES})
target_link_libraries(WrappedMace
PRIVATE
VTK::FiltersSources
VTK::InteractionStyle
VTK::RenderingOpenGL2
VTK::RenderingUI
)
# -----------------------------------------------------------------------------
# WebAssembly build options
# -----------------------------------------------------------------------------
set(emscripten_link_options)
set(emscripten_compile_options)
list(APPEND emscripten_link_options
"-lembind"
......@@ -56,105 +49,9 @@ list(APPEND emscripten_link_options
"SHELL:-s ALLOW_MEMORY_GROWTH=1"
)
set(emscripten_debug_options)
set(DEBUGINFO "PROFILE" CACHE STRING "Type of debug info")
set_property(CACHE DEBUGINFO PROPERTY
STRINGS
NONE # -g0
READABLE_JS # -g1
PROFILE # -g2
DEBUG_NATIVE # -g3
)
if(DEBUGINFO STREQUAL "NONE")
list(APPEND emscripten_debug_options
"-g0"
)
elseif(DEBUGINFO STREQUAL "READABLE_JS")
list(APPEND emscripten_debug_options
"-g1"
)
list(APPEND emscripten_link_options
"-s DEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "PROFILE")
list(APPEND emscripten_debug_options
"-g2"
)
list(APPEND emscripten_link_options
"-s DEMANGLE_SUPPORT=1"
)
elseif(DEBUGINFO STREQUAL "DEBUG_NATIVE")
list(APPEND emscripten_debug_options
"-g3"
)
list(APPEND emscripten_link_options
"-s ASSERTIONS=1"
"-s DEMANGLE_SUPPORT=1"
)
endif()
# -----------------------------------------------------------------------------
# Build options
# -----------------------------------------------------------------------------
set(emscripten_optimizations)
set(OPTIMIZE "SMALLEST_WITH_CLOSURE" CACHE STRING "Emscripten optimization")
set_property(CACHE OPTIMIZE PROPERTY
STRINGS
NO_OPTIMIZATION # -O0
LITTLE # -O1
MORE # -O2
BEST # -O3
SMALL # -Os
SMALLEST # -Oz
SMALLEST_WITH_CLOSURE # -Oz --closure 1
)
if(OPTIMIZE STREQUAL "NO_OPTIMIZATION")
list(APPEND emscripten_optimizations
"-Oz"
)
elseif(OPTIMIZE STREQUAL "LITTLE")
list(APPEND emscripten_optimizations
"-O1"
)
elseif(OPTIMIZE STREQUAL "MORE")
list(APPEND emscripten_optimizations
"-O2"
)
elseif(OPTIMIZE STREQUAL "BEST")
list(APPEND emscripten_optimizations
"-O3"
)
elseif(OPTIMIZE STREQUAL "SMALL")
list(APPEND emscripten_optimizations
"-Os"
)
elseif(OPTIMIZE STREQUAL "SMALLEST")
list(APPEND emscripten_optimizations
"-Oz"
)
elseif(OPTIMIZE STREQUAL "SMALLEST_WITH_CLOSURE")
list(APPEND emscripten_optimizations
"-Oz"
)
list(APPEND emscripten_link_options
"--closure 1"
)
endif()
target_compile_options(WrappedMace
PUBLIC
${emscripten_compile_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
target_link_options(WrappedMace
PUBLIC
${emscripten_link_options}
${emscripten_optimizations}
${emscripten_debug_options}
)
# -----------------------------------------------------------------------------
......
......@@ -110,6 +110,10 @@ EMSCRIPTEN_BINDINGS(webtest)
// vtkRenderWindowInteractor ----------------------------------------
emscripten::class_<vtkRenderWindowInteractor>("vtkRenderWindowInteractor")
.constructor(&vtkRenderWindowInteractor::New, emscripten::allow_raw_pointers())
.class_function("configure", emscripten::select_overload<void()>([]() {
vtkRenderWindowInteractor::InteractorManagesTheEventLoop = false;
}))
.function("Start", &vtkRenderWindowInteractor::Start)
.function("SetRenderWindow", &vtkRenderWindowInteractor::SetRenderWindow,
emscripten::allow_raw_pointers());
......
......@@ -11,59 +11,43 @@
}
guard = true;
const eventClone = new e.constructor(e.type, e);
Module.canvas.dispatchEvent(eventClone);
let canvas = document.querySelector("#canvas");
canvas.dispatchEvent(eventClone);
guard = false;
}
var Module = {
canvas: (function () {
var canvas = document.getElementById("canvas");
// As a default initial behavior, pop up an alert when webgl context is lost. To make your
// application robust, you may want to override this behavior before shipping!
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
canvas.addEventListener(
"webglcontextlost",
function (e) {
alert("WebGL context lost. You will need to reload the page.");
e.preventDefault();
},
false
);
return canvas;
})(),
onRuntimeInitialized: function () {},
};
document.addEventListener("keypress", eventForward, false);
document.addEventListener("keydown", eventForward, false);
document.addEventListener("keyup", eventForward, false);
var vtk = createWrappedMaceModule(Module).then((runtime) => {
var renderer = new Module.vtkRenderer();
var renWin = new Module.vtkRenderWindow();
var vtk = createWrappedMaceModule({}).then((runtime) => {
var renderer = new runtime.vtkRenderer();
var renWin = new runtime.vtkRenderWindow();
renWin.AddRenderer(renderer);
var iren = new Module.vtkRenderWindowInteractor();
runtime.vtkRenderWindowInteractor.configure();
var iren = new runtime.vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
var sphere = new Module.vtkSphereSource();
var sphere = new runtime.vtkSphereSource();
sphere.SetThetaResolution(8);
sphere.SetPhiResolution(8);
var sphereMapper = new Module.vtkPolyDataMapper();
var sphereMapper = new runtime.vtkPolyDataMapper();
sphereMapper.SetInputConnection(sphere.GetOutputPort());
var sphereActor = new Module.vtkActor();
var sphereActor = new runtime.vtkActor();
sphereActor.SetMapper(sphereMapper);
var cone = new Module.vtkConeSource();
var cone = new runtime.vtkConeSource();
cone.SetResolution(6);
var glyph = new Module.vtkGlyph3D();
var glyph = new runtime.vtkGlyph3D();
glyph.SetInputConnection(sphere.GetOutputPort());
glyph.SetSourceConnection(cone.GetOutputPort());
glyph.SetVectorModeToUseNormal();
glyph.SetScaleModeToScaleByVector();
glyph.SetScaleFactor(0.25);
var spikeMapper = new Module.vtkPolyDataMapper();
var spikeMapper = new runtime.vtkPolyDataMapper();
spikeMapper.SetInputConnection(glyph.GetOutputPort());
var spikeActor = new Module.vtkActor();
var spikeActor = new runtime.vtkActor();
spikeActor.SetMapper(spikeMapper);
renderer.AddActor(sphereActor);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment