VTK  9.7.1
vtkWebAssemblySessionHelper.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
3 
4 #ifndef vtkWebAssemblySessionHelper_h
5 #define vtkWebAssemblySessionHelper_h
6 
7 #include <emscripten/val.h>
8 
9 #include "vtkABINamespace.h"
10 #include "vtkArrayDispatch.h"
11 #include "vtkBitArray.h"
12 #include "vtkDataArrayMeta.h"
13 #include "vtkObjectManager.h"
14 #include "vtkSession.h"
15 
16 VTK_ABI_NAMESPACE_BEGIN
17 
19 
20 // Implement vtkSessionJsonImpl as a wrapper around emscripten::val
22 {
23  emscripten::val JsonValue;
24 };
25 
26 namespace
27 {
28 
29 using namespace emscripten;
30 
31 // Initialize JavaScript global objects.
32 thread_local const val Uint8Array = val::global("Uint8Array");
33 thread_local const val Uint32Array = val::global("Uint32Array");
34 thread_local const val JSON = val::global("JSON");
35 thread_local const val Array = val::global("Array");
36 
37 // clang-format off
38 std::map<std::string, std::function<bool(const vtkDataArray*)>> IsJSArraySameTypeAsVtkDataArray = {
39  {"Uint8Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_UINT8; }},
40  {"Uint8ClampedArray", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_UINT8; }},
41  {"Uint16Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_UINT16; }},
42  {"Uint32Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_UINT32; }},
43  {"Int8Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_INT8; }},
44  {"Int16Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_INT16; }},
45  {"Float32Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_FLOAT32; }},
46  {"Float64Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_FLOAT64; }},
47  {"Int32Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_INT32; }},
48  {"BigInt64Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_INT64; }},
49  {"BigUint64Array", [](const vtkDataArray* dataArray) -> bool { return dataArray->GetDataType() == VTK_TYPE_UINT64; }},
50 };
51 // clang-format on
61 vtkSession NewVTKInterfaceForJavaScript()
62 {
63  vtkSessionDescriptor descriptor;
64  descriptor.StringifyJson = +[](vtkSessionJson inputJson) -> char*
65  {
66  const auto jsonString = JSON.call<val>("stringify", inputJson->JsonValue).as<std::string>();
67  const auto length = jsonString.length();
68  char* result = new char[length + 1];
69  snprintf(result, length + 1, "%s", jsonString.c_str());
70  return result;
71  };
72  descriptor.ParseJson = +[](const char* inputString) -> vtkSessionJson
73  {
74  vtkSessionJsonImpl* result = new vtkSessionJsonImpl{};
75  result->JsonValue = JSON.call<val>("parse", std::string(inputString));
76  return result;
77  };
78  descriptor.InteractorManagesTheEventLoop = false;
79  return vtkCreateSession(&descriptor);
80 }
81 
82 struct CopyJSArrayToVTKDataArray
83 {
84  template <typename ArrayT>
85  void operator()(ArrayT* dataArray, const emscripten::val& jsArray)
86  {
87  const auto length = jsArray["length"].as<std::size_t>();
88  auto memoryView = emscripten::val{ typed_memory_view(length, dataArray->GetPointer(0)) };
89  memoryView.call<void>("set", jsArray);
90  }
91 };
92 }
93 VTK_ABI_NAMESPACE_END
94 
95 #endif
struct vtkSessionImpl * vtkSession
Definition: vtkSession.h:91
vtkTypeList::Append< vtkArrayDispatch::AOSArrays, vtkBitArray >::Result Arrays
This header file provides the C API for working with standalone/remote visualization applications...
#define vtkCreateSession
Definition: vtkSession.h:123
int InteractorManagesTheEventLoop
Definition: vtkSession.h:116
This file contains a variety of metaprogramming constructs for working with vtkDataArrays.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:44
vtkSessionJsonStringifyFunc StringifyJson
Definition: vtkSession.h:115
Appends types/TypeLists to TypeList TList and stores the result in Result.
Definition: vtkTypeList.h:159
vtkSessionJsonParseFunc ParseJson
Definition: vtkSession.h:114