MeshLib C++ Docs
Loading...
Searching...
No Matches
MRWasmBindings.h
Go to the documentation of this file.
1#pragma once
2
3#include <emscripten/val.h>
4
5#include <cstddef>
6#include <cstdint>
7#include <functional>
8#include <string>
9#include <type_traits>
10#include <utility>
11
12namespace Wasm
13{
14
15[[noreturn]] void throwJsError( const std::string& msg );
16
17template <typename E>
18auto unwrap( E&& e )
19{
20 if ( !e.has_value() )
21 throwJsError( e.error() );
22 if constexpr ( !std::is_void_v<typename std::remove_reference_t<E>::value_type> )
23 return std::move( *e );
24}
25
26template <typename S> struct TypedArrayName;
27template <> struct TypedArrayName<float> { static constexpr const char* value = "Float32Array"; };
28template <> struct TypedArrayName<uint32_t> { static constexpr const char* value = "Uint32Array"; };
29template <> struct TypedArrayName<uint8_t> { static constexpr const char* value = "Uint8Array"; };
30
31EMSCRIPTEN_DECLARE_VAL_TYPE( Float32ArrayVal )
32EMSCRIPTEN_DECLARE_VAL_TYPE( Uint32ArrayVal )
33EMSCRIPTEN_DECLARE_VAL_TYPE( Uint8ArrayVal )
34EMSCRIPTEN_DECLARE_VAL_TYPE( IndicesInputVal )
35
36template <typename S> struct TypedArrayValType;
37template <> struct TypedArrayValType<float> { using type = Float32ArrayVal; };
38template <> struct TypedArrayValType<uint32_t> { using type = Uint32ArrayVal; };
39template <> struct TypedArrayValType<uint8_t> { using type = Uint8ArrayVal; };
40template <typename S> using TypedArrayVal = typename TypedArrayValType<S>::type;
41
42template <typename S>
43emscripten::val makeTypedArray( const S* data, size_t count )
44{
46 emscripten::val out = emscripten::val::global( TypedArrayName<S>::value ).new_( count );
47 if ( count != 0 )
48 out.call<void>( "set", emscripten::val( emscripten::typed_memory_view( count, data ) ) );
49 return out;
50}
51
52template <typename V, typename S, size_t Arity = 1>
54{
55 using Elem = typename V::value_type;
56 static_assert( std::is_trivially_copyable_v<Elem> && sizeof( Elem ) == Arity * sizeof( S ) );
57 return TypedArrayVal<S>( makeTypedArray<S>( reinterpret_cast<const S*>( v.data() ), v.size() * Arity ) );
58}
59
60template <typename V, typename S, size_t Arity = 1>
62{
63 using Elem = typename V::value_type;
64 static_assert( std::is_trivially_copyable_v<Elem> && sizeof( Elem ) == Arity * sizeof( S ) );
65 const size_t len = arr["length"].template as<size_t>();
66 V v;
67 v.vec_.resize( len / Arity );
68 if ( len != 0 )
69 {
70 emscripten::val view = emscripten::val( emscripten::typed_memory_view(
71 len, reinterpret_cast<S*>( v.data() ) ) );
72 view.call<void>( "set", arr );
73 }
74 return v;
75}
76
77std::function<bool( float )> jsToCppCallback( emscripten::val cb );
78
79}
Definition MRWasmBindings.h:13
V packedFromTypedArray(TypedArrayVal< S > arr)
Definition MRWasmBindings.h:61
typename TypedArrayValType< S >::type TypedArrayVal
Definition MRWasmBindings.h:40
void throwJsError(const std::string &msg)
TypedArrayVal< S > packedToTypedArray(const V &v)
Definition MRWasmBindings.h:53
std::function< bool(float)> jsToCppCallback(emscripten::val cb)
emscripten::val makeTypedArray(const S *data, size_t count)
Definition MRWasmBindings.h:43
auto unwrap(E &&e)
Definition MRWasmBindings.h:18
static constexpr const char * value
Definition MRWasmBindings.h:27
static constexpr const char * value
Definition MRWasmBindings.h:28
static constexpr const char * value
Definition MRWasmBindings.h:29
Definition MRWasmBindings.h:26
Float32ArrayVal type
Definition MRWasmBindings.h:37
Uint32ArrayVal type
Definition MRWasmBindings.h:38
Uint8ArrayVal type
Definition MRWasmBindings.h:39
Definition MRWasmBindings.h:36