chore: (wasm) add missing interop methods
This commit is contained in:
@@ -124,9 +124,12 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber;
|
["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber;
|
||||||
|
|
||||||
_pickCallbackPtr = _module!.addFunction(_onPickCallback.toJS, "viii");
|
_pickCallbackPtr = _module!.addFunction(_onPickCallback.toJS, "viii");
|
||||||
|
_pickGizmoCallbackPtr =
|
||||||
|
_module!.addFunction(_onPickGizmoCallback.toJS, "viii");
|
||||||
// _module!.removeFunction(_pickCallbackPtr);
|
// _module!.removeFunction(_pickCallbackPtr);
|
||||||
|
// _module!.removeFunction(_pickGizmoCallbackPtr);
|
||||||
|
|
||||||
var gizmoOut = _module!._malloc(4 * 4) as JSNumber;
|
var gizmoOut = _module!._malloc(4 * 4);
|
||||||
|
|
||||||
_module!.ccall("get_gizmo", "void", ["void*".toJS, "void*".toJS].toJS,
|
_module!.ccall("get_gizmo", "void", ["void*".toJS, "void*".toJS].toJS,
|
||||||
[_sceneManager!, gizmoOut].toJS, null);
|
[_sceneManager!, gizmoOut].toJS, null);
|
||||||
@@ -167,6 +170,9 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future destroySwapChain() async {
|
Future destroySwapChain() async {
|
||||||
|
if (_viewer == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
_module!.ccall("destroy_swap_chain", "void", ["void*".toJS].toJS,
|
_module!.ccall("destroy_swap_chain", "void", ["void*".toJS].toJS,
|
||||||
[_viewer!].toJS, null);
|
[_viewer!].toJS, null);
|
||||||
}
|
}
|
||||||
@@ -193,6 +199,9 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
return _initialized;
|
return _initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
///
|
||||||
|
///
|
||||||
final _pickResultController =
|
final _pickResultController =
|
||||||
StreamController<FilamentPickResult>.broadcast();
|
StreamController<FilamentPickResult>.broadcast();
|
||||||
|
|
||||||
@@ -201,6 +210,12 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
return _pickResultController.stream;
|
return _pickResultController.stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Stream<FilamentPickResult> get gizmoPickResult =>
|
||||||
|
_gizmoPickResultController.stream;
|
||||||
|
final _gizmoPickResultController =
|
||||||
|
StreamController<FilamentPickResult>.broadcast();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get rendering => _rendering;
|
bool get rendering => _rendering;
|
||||||
|
|
||||||
@@ -270,7 +285,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
[_sceneManager!, entity.toJS, skinIndex.toJS].toJS,
|
[_sceneManager!, entity.toJS, skinIndex.toJS].toJS,
|
||||||
null) as JSNumber;
|
null) as JSNumber;
|
||||||
var boneCount = boneCountJS.toDartInt;
|
var boneCount = boneCountJS.toDartInt;
|
||||||
var buf = _module!._malloc(boneCount * 16 * 4) as JSNumber;
|
var buf = _module!._malloc(boneCount * 16 * 4);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_rest_local_transforms",
|
"get_rest_local_transforms",
|
||||||
"void",
|
"void",
|
||||||
@@ -482,7 +497,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
[_sceneManager!, entity.toJS, skinIndex.toJS].toJS,
|
[_sceneManager!, entity.toJS, skinIndex.toJS].toJS,
|
||||||
null) as JSNumber;
|
null) as JSNumber;
|
||||||
var boneCount = boneCountJS.toDartInt;
|
var boneCount = boneCountJS.toDartInt;
|
||||||
var buf = _module!._malloc(boneCount * 4) as JSNumber;
|
var buf = _module!._malloc(boneCount * 4);
|
||||||
|
|
||||||
var empty = " ".toJS;
|
var empty = " ".toJS;
|
||||||
var ptrs = <JSNumber>[];
|
var ptrs = <JSNumber>[];
|
||||||
@@ -518,7 +533,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
null) as JSNumber;
|
null) as JSNumber;
|
||||||
var entityCount = entityCountJS.toDartInt;
|
var entityCount = entityCountJS.toDartInt;
|
||||||
var entities = <ThermionEntity>[];
|
var entities = <ThermionEntity>[];
|
||||||
var buf = _module!._malloc(entityCount * 4) as JSNumber;
|
var buf = _module!._malloc(entityCount * 4);
|
||||||
|
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_entities",
|
"get_entities",
|
||||||
@@ -596,7 +611,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
var morphTargetCount = morphTargetCountJS.toDartInt;
|
var morphTargetCount = morphTargetCountJS.toDartInt;
|
||||||
var names = <String>[];
|
var names = <String>[];
|
||||||
for (int i = 0; i < morphTargetCount; i++) {
|
for (int i = 0; i < morphTargetCount; i++) {
|
||||||
var buf = _module!._malloc(256) as JSNumber;
|
var buf = _module!._malloc(256);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_morph_target_name",
|
"get_morph_target_name",
|
||||||
"void",
|
"void",
|
||||||
@@ -645,7 +660,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Matrix4> getWorldTransform(ThermionEntity entity) async {
|
Future<Matrix4> getWorldTransform(ThermionEntity entity) async {
|
||||||
final matrixPtr = _module!._malloc(16 * 4) as JSNumber;
|
final matrixPtr = _module!._malloc(16 * 4);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_world_transform",
|
"get_world_transform",
|
||||||
"void",
|
"void",
|
||||||
@@ -815,7 +830,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
Future<Uint8List> capture() async {
|
Future<Uint8List> capture() async {
|
||||||
bool wasRendering = rendering;
|
bool wasRendering = rendering;
|
||||||
await setRendering(false);
|
await setRendering(false);
|
||||||
final pixelBuffer = _module!._malloc(_width * _height * 4) as JSNumber;
|
final pixelBuffer = _module!._malloc(_width * _height * 4);
|
||||||
final completer = Completer();
|
final completer = Completer();
|
||||||
final callback = () {
|
final callback = () {
|
||||||
completer.complete();
|
completer.complete();
|
||||||
@@ -976,7 +991,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
assert(frameData.length == animation.numFrames * intersection.length);
|
assert(frameData.length == animation.numFrames * intersection.length);
|
||||||
|
|
||||||
// Allocate memory in WASM for the morph data
|
// Allocate memory in WASM for the morph data
|
||||||
var dataPtr = _module!._malloc(frameData.length * 4) as JSNumber;
|
var dataPtr = _module!._malloc(frameData.length * 4);
|
||||||
|
|
||||||
// Create a Float32List to copy the morph data to
|
// Create a Float32List to copy the morph data to
|
||||||
var dataList = td.Float32List.fromList(frameData);
|
var dataList = td.Float32List.fromList(frameData);
|
||||||
@@ -986,7 +1001,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
dataList.buffer.asUint8List(dataList.offsetInBytes).toJS, dataPtr);
|
dataList.buffer.asUint8List(dataList.offsetInBytes).toJS, dataPtr);
|
||||||
|
|
||||||
// Allocate memory in WASM for the morph indices
|
// Allocate memory in WASM for the morph indices
|
||||||
var idxPtr = _module!._malloc(indices.length * 4) as JSNumber;
|
var idxPtr = _module!._malloc(indices.length * 4);
|
||||||
|
|
||||||
// Create an Int32List to copy the morph indices to
|
// Create an Int32List to copy the morph indices to
|
||||||
var idxList = td.Int32List.fromList(indices);
|
var idxList = td.Int32List.fromList(indices);
|
||||||
@@ -1219,7 +1234,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
final animationCount = await getAnimationCount(entity);
|
final animationCount = await getAnimationCount(entity);
|
||||||
final names = <String>[];
|
final names = <String>[];
|
||||||
for (int i = 0; i < animationCount; i++) {
|
for (int i = 0; i < animationCount; i++) {
|
||||||
final namePtr = _module!._malloc(256) as JSNumber;
|
final namePtr = _module!._malloc(256);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_animation_name",
|
"get_animation_name",
|
||||||
"void",
|
"void",
|
||||||
@@ -1248,7 +1263,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Matrix4> getCameraCullingProjectionMatrix() async {
|
Future<Matrix4> getCameraCullingProjectionMatrix() async {
|
||||||
final ptr = _module!._malloc(16 * 8) as JSNumber;
|
final ptr = _module!._malloc(16 * 8);
|
||||||
_module!.ccall("get_camera_culling_projection_matrix", "void",
|
_module!.ccall("get_camera_culling_projection_matrix", "void",
|
||||||
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
||||||
final matrix = Matrix4.zero();
|
final matrix = Matrix4.zero();
|
||||||
@@ -1263,7 +1278,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Frustum> getCameraFrustum() async {
|
Future<Frustum> getCameraFrustum() async {
|
||||||
final ptr = _module!._malloc(24 * 8) as JSNumber;
|
final ptr = _module!._malloc(24 * 8);
|
||||||
_module!.ccall("get_camera_frustum", "void",
|
_module!.ccall("get_camera_frustum", "void",
|
||||||
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
||||||
final planes = List.generate(6, (i) {
|
final planes = List.generate(6, (i) {
|
||||||
@@ -1304,7 +1319,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Vector3> getCameraPosition() async {
|
Future<Vector3> getCameraPosition() async {
|
||||||
final ptr = _module!._malloc(3 * 8) as JSNumber;
|
final ptr = _module!._malloc(3 * 8);
|
||||||
_module!.ccall("get_camera_position", "void",
|
_module!.ccall("get_camera_position", "void",
|
||||||
["void*".toJS, "void*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
["void*".toJS, "void*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
||||||
final pos = Vector3(
|
final pos = Vector3(
|
||||||
@@ -1320,7 +1335,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Matrix4> getCameraProjectionMatrix() async {
|
Future<Matrix4> getCameraProjectionMatrix() async {
|
||||||
final ptr = _module!._malloc(16 * 8) as JSNumber;
|
final ptr = _module!._malloc(16 * 8);
|
||||||
_module!.ccall("get_camera_projection_matrix", "void",
|
_module!.ccall("get_camera_projection_matrix", "void",
|
||||||
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
||||||
final matrix = _matrixFromPtr(ptr);
|
final matrix = _matrixFromPtr(ptr);
|
||||||
@@ -1337,7 +1352,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Matrix4> getCameraViewMatrix() async {
|
Future<Matrix4> getCameraViewMatrix() async {
|
||||||
final ptr = _module!._malloc(16 * 8) as JSNumber;
|
final ptr = _module!._malloc(16 * 8);
|
||||||
_module!.ccall("get_camera_view_matrix", "void",
|
_module!.ccall("get_camera_view_matrix", "void",
|
||||||
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null);
|
||||||
final matrix = Matrix4.zero();
|
final matrix = Matrix4.zero();
|
||||||
@@ -1364,7 +1379,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
@override
|
@override
|
||||||
Future<List<ThermionEntity>> getInstances(ThermionEntity entity) async {
|
Future<List<ThermionEntity>> getInstances(ThermionEntity entity) async {
|
||||||
final instanceCount = await getInstanceCount(entity);
|
final instanceCount = await getInstanceCount(entity);
|
||||||
final buf = _module!._malloc(instanceCount * 4) as JSNumber;
|
final buf = _module!._malloc(instanceCount * 4);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_instances",
|
"get_instances",
|
||||||
"void",
|
"void",
|
||||||
@@ -1384,7 +1399,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
@override
|
@override
|
||||||
Future<Matrix4> getInverseBindMatrix(ThermionEntity parent, int boneIndex,
|
Future<Matrix4> getInverseBindMatrix(ThermionEntity parent, int boneIndex,
|
||||||
{int skinIndex = 0}) async {
|
{int skinIndex = 0}) async {
|
||||||
final ptr = _module!._malloc(16 * 4) as JSNumber;
|
final ptr = _module!._malloc(16 * 4);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_inverse_bind_matrix",
|
"get_inverse_bind_matrix",
|
||||||
"void",
|
"void",
|
||||||
@@ -1398,7 +1413,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Matrix4> getLocalTransform(ThermionEntity entity) async {
|
Future<Matrix4> getLocalTransform(ThermionEntity entity) async {
|
||||||
final ptr = _module!._malloc(16 * 4) as JSNumber;
|
final ptr = _module!._malloc(16 * 4);
|
||||||
_module!.ccall(
|
_module!.ccall(
|
||||||
"get_local_transform",
|
"get_local_transform",
|
||||||
"void",
|
"void",
|
||||||
@@ -1624,7 +1639,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future rotateIbl(Matrix3 rotation) async {
|
Future rotateIbl(Matrix3 rotation) async {
|
||||||
final ptr = _module!._malloc(9 * 4) as JSNumber;
|
final ptr = _module!._malloc(9 * 4);
|
||||||
for (int i = 0; i < 9; i++) {
|
for (int i = 0; i < 9; i++) {
|
||||||
_module!.setValue(
|
_module!.setValue(
|
||||||
(ptr.toDartInt + (i * 4)).toJS, rotation.storage[i].toJS, "float");
|
(ptr.toDartInt + (i * 4)).toJS, rotation.storage[i].toJS, "float");
|
||||||
@@ -1707,7 +1722,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
Future setBoneTransform(
|
Future setBoneTransform(
|
||||||
ThermionEntity entity, int boneIndex, Matrix4 transform,
|
ThermionEntity entity, int boneIndex, Matrix4 transform,
|
||||||
{int skinIndex = 0}) async {
|
{int skinIndex = 0}) async {
|
||||||
final ptr = _module!._malloc(16 * 4) as JSNumber;
|
final ptr = _module!._malloc(16 * 4);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
_module!.setValue(
|
_module!.setValue(
|
||||||
(ptr.toDartInt + (i * 4)).toJS, transform.storage[i].toJS, "float");
|
(ptr.toDartInt + (i * 4)).toJS, transform.storage[i].toJS, "float");
|
||||||
@@ -1817,7 +1832,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
@override
|
@override
|
||||||
Future setCameraModelMatrix(List<double> matrix) async {
|
Future setCameraModelMatrix(List<double> matrix) async {
|
||||||
assert(matrix.length == 16, "Matrix must have 16 elements");
|
assert(matrix.length == 16, "Matrix must have 16 elements");
|
||||||
final ptr = _module!._malloc(16 * 8) as JSNumber;
|
final ptr = _module!._malloc(16 * 8);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
_module!
|
_module!
|
||||||
.setValue((ptr.toDartInt + (i * 8)).toJS, matrix[i].toJS, "double");
|
.setValue((ptr.toDartInt + (i * 8)).toJS, matrix[i].toJS, "double");
|
||||||
@@ -1963,7 +1978,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future setTransform(ThermionEntity entity, Matrix4 transform) async {
|
Future setTransform(ThermionEntity entity, Matrix4 transform) async {
|
||||||
final ptr = _module!._malloc(16 * 4) as JSNumber;
|
final ptr = _module!._malloc(16 * 4);
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
_module!.setValue(
|
_module!.setValue(
|
||||||
(ptr.toDartInt + (i * 4)).toJS, transform.storage[i].toJS, "float");
|
(ptr.toDartInt + (i * 4)).toJS, transform.storage[i].toJS, "float");
|
||||||
@@ -2064,7 +2079,7 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
// Helper method to allocate a string in the WASM memory
|
// Helper method to allocate a string in the WASM memory
|
||||||
JSNumber _allocateString(String str) {
|
JSNumber _allocateString(String str) {
|
||||||
final bytes = utf8.encode(str);
|
final bytes = utf8.encode(str);
|
||||||
final ptr = _module!._malloc(bytes.length + 1) as JSNumber;
|
final ptr = _module!._malloc(bytes.length + 1);
|
||||||
for (var i = 0; i < bytes.length; i++) {
|
for (var i = 0; i < bytes.length; i++) {
|
||||||
_module!.setValue((ptr.toDartInt + i).toJS, bytes[i].toJS, "i8");
|
_module!.setValue((ptr.toDartInt + i).toJS, bytes[i].toJS, "i8");
|
||||||
}
|
}
|
||||||
@@ -2187,4 +2202,58 @@ class ThermionViewerWasm implements ThermionViewer {
|
|||||||
].toJS,
|
].toJS,
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future createIbl(double r, double g, double b, double intensity) async {
|
||||||
|
_module!.ccall(
|
||||||
|
"create_ibl",
|
||||||
|
"void",
|
||||||
|
[
|
||||||
|
"void*".toJS,
|
||||||
|
"double".toJS,
|
||||||
|
"double".toJS,
|
||||||
|
"double".toJS,
|
||||||
|
"double".toJS,
|
||||||
|
].toJS,
|
||||||
|
[_sceneManager!, r.toJS, g.toJS, b.toJS, intensity.toJS].toJS,
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
late JSNumber _pickGizmoCallbackPtr;
|
||||||
|
|
||||||
|
void _onPickGizmoCallback(ThermionEntity entity, int x, int y) {
|
||||||
|
_gizmoPickResultController
|
||||||
|
.add((entity: entity, x: x.toDouble(), y: y.toDouble()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void pickGizmo(int x, int y) {
|
||||||
|
x = (x * pixelRatio).ceil();
|
||||||
|
y = (viewportDimensions.$2 - (y * pixelRatio)).ceil();
|
||||||
|
|
||||||
|
_module!.ccall(
|
||||||
|
"pick_gizmo",
|
||||||
|
"void",
|
||||||
|
[
|
||||||
|
"void*".toJS,
|
||||||
|
"int".toJS,
|
||||||
|
"int".toJS,
|
||||||
|
"void*".toJS,
|
||||||
|
].toJS,
|
||||||
|
[_sceneManager!, x.toJS, y.toJS, _pickGizmoCallbackPtr].toJS,
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future setGizmoVisibility(bool visible) async {
|
||||||
|
_module!.ccall(
|
||||||
|
"set_gizmo_visibility",
|
||||||
|
"void",
|
||||||
|
[
|
||||||
|
"void*".toJS,
|
||||||
|
"bool".toJS,
|
||||||
|
].toJS,
|
||||||
|
[_sceneManager!, visible.toJS].toJS,
|
||||||
|
null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user