VTK  9.6.20260228
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
16VTK_ABI_NAMESPACE_BEGIN
17
19
20// Implement vtkSessionJsonImpl as a wrapper around emscripten::val
22{
23 emscripten::val JsonValue;
24};
25
26namespace
27{
28
29using namespace emscripten;
30
31// Initialize JavaScript global objects.
32thread_local const val Uint8Array = val::global("Uint8Array");
33thread_local const val Uint32Array = val::global("Uint32Array");
34thread_local const val JSON = val::global("JSON");
35thread_local const val Array = val::global("Array");
36
37// clang-format off
38std::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
61vtkSession 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 {
75 result->JsonValue = JSON.call<val>("parse", std::string(inputString));
76 return result;
77 };
78 descriptor.InteractorManagesTheEventLoop = false;
79 return vtkCreateSession(&descriptor);
80}
81
82struct 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}
93VTK_ABI_NAMESPACE_END
94
95#endif
@ length
Definition vtkX3D.h:394
vtkSessionJsonParseFunc ParseJson
Definition vtkSession.h:114
vtkSessionJsonStringifyFunc StringifyJson
Definition vtkSession.h:115
Appends types/TypeLists to TypeList TList and stores the result in Result.
#define vtkDataArray
This file contains a variety of metaprogramming constructs for working with vtkDataArrays.
This header file provides the C API for working with standalone/remote visualization applications.
struct vtkSessionImpl * vtkSession
Definition vtkSession.h:91
#define vtkCreateSession
Definition vtkSession.h:123
struct vtkSessionJsonImpl * vtkSessionJson
Definition vtkSession.h:96
vtkTypeList::Append< vtkArrayDispatch::AOSArrays, vtkBitArray >::Result Arrays