documentation & further renaming

This commit is contained in:
Nick Fisher
2024-06-15 21:26:08 +08:00
parent 3f88598498
commit dc0c855135
221 changed files with 5923 additions and 691 deletions

View File

@@ -1,6 +1,6 @@
library filament_dart;
export 'thermion_dart/entities/filament_entity.dart';
export 'thermion_dart/abstract_filament_viewer.dart';
export 'thermion_dart/filament_viewer_impl.dart';
export 'thermion_dart/thermion_viewer.dart';
export 'thermion_dart/thermion_viewer_ffi.dart';
export 'thermion_dart/entities/entity_transform_controller.dart';

View File

@@ -3,25 +3,25 @@ import 'dart:js_interop_unsafe';
import 'dart:math';
import 'package:animation_tools_dart/animation_tools_dart.dart';
import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';
import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:thermion_dart/thermion_dart/scene.dart';
import 'package:vector_math/vector_math_64.dart';
import 'shims/abstract_filament_viewer_js_shim.dart';
import 'shims/thermion_viewer_js_shim.dart';
///
/// An [AbstractFilamentViewer] implementation that forwards calls to
/// a corresponding Javascript shim implementation (see [AbstractFilamentViewerJSShim]).
/// An [ThermionViewer] implementation that forwards calls to
/// a corresponding Javascript shim implementation (see [ThermionViewerJSShim]).
///
class FilamentViewerJS implements AbstractFilamentViewer {
late final AbstractFilamentViewerJSShim _shim;
class ThermionViewerFFIJS implements ThermionViewer {
late final ThermionViewerJSShim _shim;
FilamentViewerJS.fromGlobalProperty(String globalPropertyName) {
ThermionViewerFFIJS.fromGlobalProperty(String globalPropertyName) {
this._shim = globalContext.getProperty(globalPropertyName.toJS)
as AbstractFilamentViewerJSShim;
as ThermionViewerJSShim;
}
FilamentViewerJS(this._shim);
ThermionViewerFFIJS(this._shim);
@override
Future<bool> get initialized async {
@@ -109,7 +109,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> addLight(
Future<ThermionEntity> addLight(
LightType type,
double colour,
double intensity,
@@ -149,7 +149,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> removeLight(FilamentEntity light) async {
Future<void> removeLight(ThermionEntity light) async {
await _shim.removeLight(light).toDart;
}
@@ -159,41 +159,41 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> loadGlb(String path, {int numInstances = 1}) async {
Future<ThermionEntity> loadGlb(String path, {int numInstances = 1}) async {
var entity = (await _shim.loadGlb(path, numInstances).toDart).toDartInt;
scene.registerEntity(entity);
return entity;
}
@override
Future<FilamentEntity> createInstance(FilamentEntity entity) async {
Future<ThermionEntity> createInstance(ThermionEntity entity) async {
return (await _shim.createInstance(entity).toDart).toDartInt;
}
@override
Future<int> getInstanceCount(FilamentEntity entity) async {
Future<int> getInstanceCount(ThermionEntity entity) async {
return (await _shim.getInstanceCount(entity).toDart).toDartInt;
}
@override
Future<List<FilamentEntity>> getInstances(FilamentEntity entity) async {
Future<List<ThermionEntity>> getInstances(ThermionEntity entity) async {
throw UnimplementedError();
// final List<JSObject> jsInstances =
// await _shim.getInstances(entity).toDart;
// return jsInstances
// .map((js) => FilamentEntity._fromJSObject(js))
// .map((js) => ThermionEntity._fromJSObject(js))
// .toList()
// .toDart;
}
@override
Future<FilamentEntity> loadGltf(String path, String relativeResourcePath,
Future<ThermionEntity> loadGltf(String path, String relativeResourcePath,
{bool force = false}) async {
throw UnimplementedError();
// final FilamentEntity jsEntity = await _shim
// final ThermionEntity jsEntity = await _shim
// .loadGltf(path, relativeResourcePath, force: force)
// .toDart;
// return FilamentEntity._fromJSObject(jsEntity).toDart;
// return ThermionEntity._fromJSObject(jsEntity).toDart;
}
@override
@@ -228,7 +228,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
@override
Future<void> setMorphTargetWeights(
FilamentEntity entity, List<double> weights) async {
ThermionEntity entity, List<double> weights) async {
var jsWeights = weights.map((x) => x.toJS).cast<JSNumber>().toList().toJS;
var promise = _shim.setMorphTargetWeights(entity, jsWeights);
await promise.toDart;
@@ -236,13 +236,13 @@ class FilamentViewerJS implements AbstractFilamentViewer {
@override
Future<List<String>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity) async {
ThermionEntity entity, ThermionEntity childEntity) async {
var result = await _shim.getMorphTargetNames(entity, childEntity).toDart;
return result.toDart.map((r) => r.toDart).toList();
}
@override
Future<List<String>> getAnimationNames(FilamentEntity entity) async {
Future<List<String>> getAnimationNames(ThermionEntity entity) async {
var names = (await (_shim.getAnimationNames(entity).toDart))
.toDart
.map((x) => x.toDart)
@@ -252,14 +252,14 @@ class FilamentViewerJS implements AbstractFilamentViewer {
@override
Future<double> getAnimationDuration(
FilamentEntity entity, int animationIndex) async {
ThermionEntity entity, int animationIndex) async {
return (await _shim.getAnimationDuration(entity, animationIndex).toDart)
.toDartDouble;
}
@override
Future<void> setMorphAnimationData(
FilamentEntity entity, MorphAnimationData animation,
ThermionEntity entity, MorphAnimationData animation,
{List<String>? targetMeshNames}) async {
try {
var animationDataJs = animation.data
@@ -285,13 +285,13 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> resetBones(FilamentEntity entity) async {
Future<void> resetBones(ThermionEntity entity) async {
await _shim.resetBones(entity).toDart;
}
@override
Future<void> addBoneAnimation(
FilamentEntity entity, BoneAnimationData animation,
ThermionEntity entity, BoneAnimationData animation,
{int skinIndex = 0,
double fadeInInSecs = 0.0,
double fadeOutInSecs = 0.0,
@@ -328,7 +328,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> removeEntity(FilamentEntity entity) async {
Future<void> removeEntity(ThermionEntity entity) async {
await _shim.removeEntity(entity).toDart;
}
@@ -353,7 +353,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> playAnimation(FilamentEntity entity, int index,
Future<void> playAnimation(ThermionEntity entity, int index,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -364,7 +364,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> playAnimationByName(FilamentEntity entity, String name,
Future<void> playAnimationByName(ThermionEntity entity, String name,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -377,22 +377,22 @@ class FilamentViewerJS implements AbstractFilamentViewer {
@override
Future<void> setAnimationFrame(
FilamentEntity entity, int index, int animationFrame) async {
ThermionEntity entity, int index, int animationFrame) async {
await _shim.setAnimationFrame(entity, index, animationFrame).toDart;
}
@override
Future<void> stopAnimation(FilamentEntity entity, int animationIndex) async {
Future<void> stopAnimation(ThermionEntity entity, int animationIndex) async {
await _shim.stopAnimation(entity, animationIndex).toDart;
}
@override
Future<void> stopAnimationByName(FilamentEntity entity, String name) async {
Future<void> stopAnimationByName(ThermionEntity entity, String name) async {
await _shim.stopAnimationByName(entity, name).toDart;
}
@override
Future<void> setCamera(FilamentEntity entity, String? name) async {
Future<void> setCamera(ThermionEntity entity, String? name) async {
await _shim.setCamera(entity, name).toDart;
}
@@ -402,10 +402,10 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> getMainCamera() async {
Future<ThermionEntity> getMainCamera() async {
throw UnimplementedError();
// final FilamentEntity jsEntity = await _shim.getMainCamera().toDart;
// return FilamentEntity._fromJSObject(jsEntity).toDart;
// final ThermionEntity jsEntity = await _shim.getMainCamera().toDart;
// return ThermionEntity._fromJSObject(jsEntity).toDart;
}
@override
@@ -506,7 +506,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> moveCameraToAsset(FilamentEntity entity) async {
Future<void> moveCameraToAsset(ThermionEntity entity) async {
await _shim.moveCameraToAsset(entity).toDart;
}
@@ -541,7 +541,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> setMaterialColor(FilamentEntity entity, String meshName,
Future<void> setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a) async {
await _shim
.setMaterialColor(entity, meshName, materialIndex, r, g, b, a)
@@ -549,43 +549,43 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> transformToUnitCube(FilamentEntity entity) async {
Future<void> transformToUnitCube(ThermionEntity entity) async {
await _shim.transformToUnitCube(entity).toDart;
}
@override
Future<void> setPosition(
FilamentEntity entity, double x, double y, double z) async {
ThermionEntity entity, double x, double y, double z) async {
await _shim.setPosition(entity, x, y, z).toDart;
}
@override
Future<void> setScale(FilamentEntity entity, double scale) async {
Future<void> setScale(ThermionEntity entity, double scale) async {
await _shim.setScale(entity, scale).toDart;
}
@override
Future<void> setRotation(
FilamentEntity entity, double rads, double x, double y, double z) async {
ThermionEntity entity, double rads, double x, double y, double z) async {
await _shim.setRotation(entity, rads, x, y, z).toDart;
}
@override
Future<void> queuePositionUpdate(
FilamentEntity entity, double x, double y, double z,
ThermionEntity entity, double x, double y, double z,
{bool relative = false}) async {
await _shim.queuePositionUpdate(entity, x, y, z, relative).toDart;
}
@override
Future<void> queueRotationUpdate(
FilamentEntity entity, double rads, double x, double y, double z,
ThermionEntity entity, double rads, double x, double y, double z,
{bool relative = false}) async {
await _shim.queueRotationUpdate(entity, rads, x, y, z, relative).toDart;
}
@override
Future<void> queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat,
Future<void> queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat,
{bool relative = false}) async {
throw UnimplementedError();
@@ -607,20 +607,20 @@ class FilamentViewerJS implements AbstractFilamentViewer {
@override
Future<void> setRotationQuat(
FilamentEntity entity, Quaternion rotation) async {
ThermionEntity entity, Quaternion rotation) async {
throw UnimplementedError();
// final JSQuaternion jsRotation = rotation.toJSQuaternion().toDart;
// await _shim.setRotationQuat(entity, jsRotation).toDart;
}
@override
Future<void> reveal(FilamentEntity entity, String? meshName) async {
Future<void> reveal(ThermionEntity entity, String? meshName) async {
throw UnimplementedError();
// await _shim.reveal(entity, meshName).toDart;
}
@override
Future<void> hide(FilamentEntity entity, String? meshName) async {
Future<void> hide(ThermionEntity entity, String? meshName) async {
throw UnimplementedError();
// await _shim.hide(entity, meshName).toDart;
}
@@ -632,7 +632,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
String? getNameForEntity(FilamentEntity entity) {
String? getNameForEntity(ThermionEntity entity) {
return _shim.getNameForEntity(entity);
}
@@ -649,24 +649,24 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<List<FilamentEntity>> getChildEntities(
FilamentEntity parent, bool renderableOnly) async {
Future<List<ThermionEntity>> getChildEntities(
ThermionEntity parent, bool renderableOnly) async {
final children =
await _shim.getChildEntities(parent, renderableOnly).toDart;
return children.toDart
.map((js) => js.toDartInt)
.cast<FilamentEntity>()
.cast<ThermionEntity>()
.toList();
}
@override
Future<FilamentEntity> getChildEntity(
FilamentEntity parent, String childName) async {
Future<ThermionEntity> getChildEntity(
ThermionEntity parent, String childName) async {
return (await _shim.getChildEntity(parent, childName).toDart).toDartInt;
}
@override
Future<List<String>> getChildEntityNames(FilamentEntity entity,
Future<List<String>> getChildEntityNames(ThermionEntity entity,
{bool renderableOnly = true}) async {
var names = await _shim.getChildEntityNames(entity, renderableOnly).toDart;
return names.toDart.map((x) => x.toDart).toList();
@@ -684,12 +684,12 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> addAnimationComponent(FilamentEntity entity) async {
Future<void> addAnimationComponent(ThermionEntity entity) async {
await _shim.addAnimationComponent(entity).toDart;
}
@override
Future<void> addCollisionComponent(FilamentEntity entity,
Future<void> addCollisionComponent(ThermionEntity entity,
{void Function(int entityId1, int entityId2)? callback,
bool affectsTransform = false}) async {
throw UnimplementedError();
@@ -705,35 +705,35 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future<void> removeCollisionComponent(FilamentEntity entity) async {
Future<void> removeCollisionComponent(ThermionEntity entity) async {
await _shim.removeCollisionComponent(entity).toDart;
}
@override
Future<FilamentEntity> createGeometry(
Future<ThermionEntity> createGeometry(
List<double> vertices, List<int> indices,
{String? materialPath,
PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async {
throw UnimplementedError();
// final FilamentEntity jsEntity = await _shim
// final ThermionEntity jsEntity = await _shim
// .createGeometry(vertices, indices,
// materialPath: materialPath, primitiveType: primitiveType.index)
// .toDart;
// return FilamentEntity._fromJSObject(jsEntity).toDart;
// return ThermionEntity._fromJSObject(jsEntity).toDart;
}
@override
Future<void> setParent(FilamentEntity child, FilamentEntity parent) async {
Future<void> setParent(ThermionEntity child, ThermionEntity parent) async {
await _shim.setParent(child, parent).toDart;
}
@override
Future<void> testCollisions(FilamentEntity entity) async {
Future<void> testCollisions(ThermionEntity entity) async {
await _shim.testCollisions(entity).toDart;
}
@override
Future<void> setPriority(FilamentEntity entityId, int priority) async {
Future<void> setPriority(ThermionEntity entityId, int priority) async {
await _shim.setPriority(entityId, priority).toDart;
}
@@ -748,52 +748,52 @@ class FilamentViewerJS implements AbstractFilamentViewer {
AbstractGizmo? get gizmo => null;
@override
Future<List<String>> getBoneNames(FilamentEntity entity,
Future<List<String>> getBoneNames(ThermionEntity entity,
{int skinIndex = 0}) async {
var result = await _shim.getBoneNames(entity, skinIndex).toDart;
return result.toDart.map((n) => n.toDart).toList();
}
@override
Future<FilamentEntity> getBone(FilamentEntity entity, int boneIndex,
Future<ThermionEntity> getBone(ThermionEntity entity, int boneIndex,
{int skinIndex = 0}) async {
var result = await _shim.getBone(entity, boneIndex, skinIndex).toDart;
return result.toDartInt;
}
@override
Future<Matrix4> getInverseBindMatrix(FilamentEntity parent, int boneIndex,
Future<Matrix4> getInverseBindMatrix(ThermionEntity parent, int boneIndex,
{int skinIndex = 0}) {
// TODO: implement getInverseBindMatrix
throw UnimplementedError();
}
@override
Future<Matrix4> getLocalTransform(FilamentEntity entity) async {
Future<Matrix4> getLocalTransform(ThermionEntity entity) async {
var result = await _shim.getLocalTransform(entity).toDart;
return Matrix4.fromList(result.toDart.map((v) => v.toDartDouble).toList());
}
@override
Future<FilamentEntity?> getParent(FilamentEntity child) async {
Future<ThermionEntity?> getParent(ThermionEntity child) async {
var result = await _shim.getParent(child).toDart;
return result.toDartInt;
}
@override
Future<Matrix4> getWorldTransform(FilamentEntity entity) async {
Future<Matrix4> getWorldTransform(ThermionEntity entity) async {
var result = await _shim.getLocalTransform(entity).toDart;
return Matrix4.fromList(result.toDart.map((v) => v.toDartDouble).toList());
}
@override
Future removeAnimationComponent(FilamentEntity entity) {
Future removeAnimationComponent(ThermionEntity entity) {
return _shim.removeAnimationComponent(entity).toDart;
}
@override
Future setBoneTransform(
FilamentEntity entity, int boneIndex, Matrix4 transform,
ThermionEntity entity, int boneIndex, Matrix4 transform,
{int skinIndex = 0}) {
return _shim
.setBoneTransform(entity, boneIndex,
@@ -802,7 +802,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future setTransform(FilamentEntity entity, Matrix4 transform) {
Future setTransform(ThermionEntity entity, Matrix4 transform) {
return _shim
.setTransform(
entity, transform.storage.map((v) => v.toJS).toList().toJS)
@@ -810,7 +810,7 @@ class FilamentViewerJS implements AbstractFilamentViewer {
}
@override
Future updateBoneMatrices(FilamentEntity entity) {
Future updateBoneMatrices(ThermionEntity entity) {
return _shim.updateBoneMatrices(entity).toDart;
}
}

View File

@@ -2,33 +2,33 @@
library thermion_flutter_js;
import 'dart:js_interop';
import 'package:thermion_dart/thermion_dart/compatibility/web/interop/shims/abstract_filament_viewer_js_shim.dart';
import 'package:thermion_dart/thermion_dart/compatibility/web/interop/shims/thermion_viewer_js_shim.dart';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:vector_math/vector_math_64.dart' as v64;
import 'package:animation_tools_dart/animation_tools_dart.dart';
import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';
import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
import 'dart:js_interop_unsafe';
import 'package:vector_math/vector_math_64.dart';
///
/// A (Dart) class that wraps a (Dart) instance of [AbstractFilamentViewer],
/// A (Dart) class that wraps a (Dart) instance of [ThermionViewer],
/// but exported to JS by binding to a global property.
/// This is effectively an implementation of [AbstractFilamentViewerJSShim];
/// allowing users to interact with an instance of [AbstractFilamentViewer]
/// This is effectively an implementation of [ThermionViewerJSShim];
/// allowing users to interact with an instance of [ThermionViewer]
/// (presumably compiled to WASM) from any Javascript context (including
/// the browser console).
///
@JSExport()
class FilamentViewerJSDartBridge {
final AbstractFilamentViewer viewer;
class ThermionViewerFFIJSDartBridge {
final ThermionViewer viewer;
FilamentViewerJSDartBridge(this.viewer);
ThermionViewerFFIJSDartBridge(this.viewer);
void bind(
{String globalPropertyName = "filamentViewer"}) {
var wrapper = createJSInteropWrapper<FilamentViewerJSDartBridge>(this)
as AbstractFilamentViewerJSShim;
var wrapper = createJSInteropWrapper<ThermionViewerFFIJSDartBridge>(this)
as ThermionViewerJSShim;
globalContext.setProperty(globalPropertyName.toJS, wrapper);
}
@@ -124,7 +124,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise removeLight(FilamentEntity light) => viewer.removeLight(light).toJS;
JSPromise removeLight(ThermionEntity light) => viewer.removeLight(light).toJS;
@JSExport()
JSPromise clearLights() => viewer.clearLights().toJS;
@@ -138,16 +138,16 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise<JSNumber> createInstance(FilamentEntity entity) {
JSPromise<JSNumber> createInstance(ThermionEntity entity) {
return viewer.createInstance(entity).then((instance) => instance.toJS).toJS;
}
@JSExport()
JSPromise<JSNumber> getInstanceCount(FilamentEntity entity) =>
JSPromise<JSNumber> getInstanceCount(ThermionEntity entity) =>
viewer.getInstanceCount(entity).then((v) => v.toJS).toJS;
@JSExport()
JSPromise<JSArray<JSNumber>> getInstances(FilamentEntity entity) {
JSPromise<JSArray<JSNumber>> getInstances(ThermionEntity entity) {
return viewer
.getInstances(entity)
.then((instances) =>
@@ -184,14 +184,14 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise setMorphTargetWeights(
FilamentEntity entity, JSArray<JSNumber> weights) {
ThermionEntity entity, JSArray<JSNumber> weights) {
var dartWeights = weights.toDart.map((w) => w.toDartDouble).toList();
return viewer.setMorphTargetWeights(entity, dartWeights).toJS;
}
@JSExport()
JSPromise<JSArray<JSString>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity) {
ThermionEntity entity, ThermionEntity childEntity) {
var morphTargetNames = viewer
.getMorphTargetNames(entity, childEntity)
.then((v) => v.map((s) => s.toJS).toList().toJS);
@@ -200,7 +200,7 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise<JSArray<JSString>> getBoneNames(
FilamentEntity entity, int skinIndex) {
ThermionEntity entity, int skinIndex) {
return viewer
.getBoneNames(entity, skinIndex: skinIndex)
.then((v) => v.map((s) => s.toJS).toList().toJS)
@@ -208,7 +208,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise<JSArray<JSString>> getAnimationNames(FilamentEntity entity) =>
JSPromise<JSArray<JSString>> getAnimationNames(ThermionEntity entity) =>
viewer
.getAnimationNames(entity)
.then((v) => v.map((s) => s.toJS).toList().toJS)
@@ -216,7 +216,7 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise<JSNumber> getAnimationDuration(
FilamentEntity entity, int animationIndex) =>
ThermionEntity entity, int animationIndex) =>
viewer
.getAnimationDuration(entity, animationIndex)
.then((v) => v.toJS)
@@ -224,7 +224,7 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise setMorphAnimationData(
FilamentEntity entity,
ThermionEntity entity,
JSArray<JSArray<JSNumber>> animation,
JSArray<JSString> morphTargets,
JSArray<JSString>? targetMeshNames,
@@ -263,11 +263,11 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise resetBones(FilamentEntity entity) => viewer.resetBones(entity).toJS;
JSPromise resetBones(ThermionEntity entity) => viewer.resetBones(entity).toJS;
@JSExport()
JSPromise addBoneAnimation(
FilamentEntity entity,
ThermionEntity entity,
JSArray<JSString> bones,
JSArray<JSArray<JSArray<JSNumber>>> frameData,
JSNumber frameLengthInMs,
@@ -307,7 +307,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise removeEntity(FilamentEntity entity) =>
JSPromise removeEntity(ThermionEntity entity) =>
viewer.removeEntity(entity).toJS;
@JSExport()
@@ -326,7 +326,7 @@ class FilamentViewerJSDartBridge {
JSPromise zoomEnd() => viewer.zoomEnd().toJS;
@JSExport()
JSPromise playAnimation(FilamentEntity entity, int index,
JSPromise playAnimation(ThermionEntity entity, int index,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -343,7 +343,7 @@ class FilamentViewerJSDartBridge {
.toJS;
@JSExport()
JSPromise playAnimationByName(FilamentEntity entity, String name,
JSPromise playAnimationByName(ThermionEntity entity, String name,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -361,7 +361,7 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise setAnimationFrame(
FilamentEntity entity, int index, int animationFrame) =>
ThermionEntity entity, int index, int animationFrame) =>
viewer
.setAnimationFrame(
entity,
@@ -371,15 +371,15 @@ class FilamentViewerJSDartBridge {
.toJS;
@JSExport()
JSPromise stopAnimation(FilamentEntity entity, int animationIndex) =>
JSPromise stopAnimation(ThermionEntity entity, int animationIndex) =>
viewer.stopAnimation(entity, animationIndex).toJS;
@JSExport()
JSPromise stopAnimationByName(FilamentEntity entity, String name) =>
JSPromise stopAnimationByName(ThermionEntity entity, String name) =>
viewer.stopAnimationByName(entity, name).toJS;
@JSExport()
JSPromise setCamera(FilamentEntity entity, String? name) =>
JSPromise setCamera(ThermionEntity entity, String? name) =>
viewer.setCamera(entity, name).toJS;
@JSExport()
@@ -469,7 +469,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise moveCameraToAsset(FilamentEntity entity) =>
JSPromise moveCameraToAsset(ThermionEntity entity) =>
throw UnimplementedError();
// viewer.moveCameraToAsset(entity)).toJS;
@@ -502,7 +502,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise setMaterialColor(FilamentEntity entity, String meshName,
JSPromise setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a) =>
throw UnimplementedError();
// viewer.setMaterialColor(
@@ -515,21 +515,21 @@ class FilamentViewerJSDartBridge {
// a,
// ).toJS;
@JSExport()
JSPromise transformToUnitCube(FilamentEntity entity) =>
JSPromise transformToUnitCube(ThermionEntity entity) =>
viewer.transformToUnitCube(entity).toJS;
@JSExport()
JSPromise setPosition(FilamentEntity entity, double x, double y, double z) =>
JSPromise setPosition(ThermionEntity entity, double x, double y, double z) =>
viewer.setPosition(entity, x, y, z).toJS;
@JSExport()
JSPromise setScale(FilamentEntity entity, double scale) =>
JSPromise setScale(ThermionEntity entity, double scale) =>
viewer.setScale(entity, scale).toJS;
@JSExport()
JSPromise setRotation(
FilamentEntity entity, double rads, double x, double y, double z) =>
ThermionEntity entity, double rads, double x, double y, double z) =>
viewer.setRotation(entity, rads, x, y, z).toJS;
@JSExport()
JSPromise queuePositionUpdate(
FilamentEntity entity, double x, double y, double z, bool relative) =>
ThermionEntity entity, double x, double y, double z, bool relative) =>
viewer
.queuePositionUpdate(
entity,
@@ -540,7 +540,7 @@ class FilamentViewerJSDartBridge {
)
.toJS;
@JSExport()
JSPromise queueRotationUpdate(FilamentEntity entity, double rads, double x,
JSPromise queueRotationUpdate(ThermionEntity entity, double rads, double x,
double y, double z, bool relative) =>
viewer
.queueRotationUpdate(
@@ -554,7 +554,7 @@ class FilamentViewerJSDartBridge {
.toJS;
@JSExport()
JSPromise queueRotationUpdateQuat(
FilamentEntity entity, JSArray<JSNumber> quat, JSBoolean relative) =>
ThermionEntity entity, JSArray<JSNumber> quat, JSBoolean relative) =>
throw UnimplementedError();
// viewer.queueRotationUpdateQuat(
// entity,
@@ -572,22 +572,22 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise setRotationQuat(
FilamentEntity entity, JSArray<JSNumber> rotation) =>
ThermionEntity entity, JSArray<JSNumber> rotation) =>
throw UnimplementedError();
@JSExport()
JSPromise reveal(FilamentEntity entity, String? meshName) =>
JSPromise reveal(ThermionEntity entity, String? meshName) =>
viewer.reveal(entity, meshName).toJS;
@JSExport()
JSPromise hide(FilamentEntity entity, String? meshName) =>
JSPromise hide(ThermionEntity entity, String? meshName) =>
viewer.hide(entity, meshName).toJS;
@JSExport()
void pick(int x, int y) => viewer.pick(x, y);
@JSExport()
String? getNameForEntity(FilamentEntity entity) =>
String? getNameForEntity(ThermionEntity entity) =>
viewer.getNameForEntity(entity);
@JSExport()
@@ -608,7 +608,7 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise<JSArray<JSNumber>> getChildEntities(
FilamentEntity parent, bool renderableOnly) {
ThermionEntity parent, bool renderableOnly) {
return viewer
.getChildEntities(
parent,
@@ -622,7 +622,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise<JSNumber> getChildEntity(FilamentEntity parent, String childName) {
JSPromise<JSNumber> getChildEntity(ThermionEntity parent, String childName) {
return viewer
.getChildEntity(
parent,
@@ -637,7 +637,7 @@ class FilamentViewerJSDartBridge {
@JSExport()
JSPromise<JSArray<JSString>> getChildEntityNames(
FilamentEntity entity, bool renderableOnly) =>
ThermionEntity entity, bool renderableOnly) =>
viewer
.getChildEntityNames(
entity,
@@ -654,23 +654,23 @@ class FilamentViewerJSDartBridge {
viewer.setRecordingOutputDirectory(outputDirectory).toJS;
@JSExport()
JSPromise addAnimationComponent(FilamentEntity entity) =>
JSPromise addAnimationComponent(ThermionEntity entity) =>
viewer.addAnimationComponent(entity).toJS;
@JSExport()
JSPromise removeAnimationComponent(FilamentEntity entity) =>
JSPromise removeAnimationComponent(ThermionEntity entity) =>
viewer.removeAnimationComponent(entity).toJS;
@JSExport()
JSPromise getParent(FilamentEntity entity) =>
JSPromise getParent(ThermionEntity entity) =>
viewer.removeAnimationComponent(entity).toJS;
@JSExport()
JSPromise getBone(FilamentEntity entity, int boneIndex, int skinIndex) =>
JSPromise getBone(ThermionEntity entity, int boneIndex, int skinIndex) =>
viewer.getBone(entity, boneIndex, skinIndex: skinIndex).toJS;
@JSExport()
JSPromise<JSArray<JSNumber>> getLocalTransform(FilamentEntity entity) {
JSPromise<JSArray<JSNumber>> getLocalTransform(ThermionEntity entity) {
return viewer
.getLocalTransform(entity)
.then((t) => t.storage.map((v) => v.toJS).toList().toJS)
@@ -678,7 +678,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise<JSArray<JSNumber>> getWorldTransform(FilamentEntity entity) {
JSPromise<JSArray<JSNumber>> getWorldTransform(ThermionEntity entity) {
return viewer
.getWorldTransform(entity)
.then((t) => t.storage.map((v) => v.toJS).toList().toJS)
@@ -686,7 +686,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise setTransform(FilamentEntity entity, JSArray<JSNumber> transform) {
JSPromise setTransform(ThermionEntity entity, JSArray<JSNumber> transform) {
return viewer
.setTransform(
entity,
@@ -696,12 +696,12 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise updateBoneMatrices(FilamentEntity entity) {
JSPromise updateBoneMatrices(ThermionEntity entity) {
return viewer.updateBoneMatrices(entity).toJS;
}
@JSExport()
JSPromise setBoneTransform(FilamentEntity entity, int boneIndex,
JSPromise setBoneTransform(ThermionEntity entity, int boneIndex,
JSArray<JSNumber> transform, int skinIndex) {
return viewer
.setBoneTransform(
@@ -714,7 +714,7 @@ class FilamentViewerJSDartBridge {
}
@JSExport()
JSPromise addCollisionComponent(FilamentEntity entity,
JSPromise addCollisionComponent(ThermionEntity entity,
{JSFunction? callback, bool affectsTransform = false}) {
throw UnimplementedError();
}

View File

@@ -5,12 +5,12 @@ import 'dart:typed_data' as td;
import 'dart:typed_data';
import 'package:web/web.dart';
import 'package:animation_tools_dart/animation_tools_dart.dart';
import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';
import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
import 'package:thermion_dart/thermion_dart/compatibility/web/interop/shims/thermion_dart_api_js_shim.dart';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:thermion_dart/thermion_dart/scene.dart';
import 'package:vector_math/vector_math_64.dart';
import 'shims/abstract_filament_viewer_js_shim.dart';
import 'shims/thermion_viewer_js_shim.dart';
extension type _EmscriptenModule(JSObject _) implements JSObject {
external JSAny? ccall(String name, String returnType,
@@ -34,16 +34,16 @@ extension type _EmscriptenModule(JSObject _) implements JSObject {
}
///
/// An [AbstractFilamentViewer] implementation that forwards calls to
/// An [ThermionViewer] implementation that forwards calls to
/// the (Emscripten-generated) ThermionDart JS module.
///
class FilamentViewerWasm implements AbstractFilamentViewer {
class ThermionViewerFFIWasm implements ThermionViewer {
late _EmscriptenModule _module;
bool _initialized = false;
bool _rendering = false;
FilamentViewerWasm() {
ThermionViewerFFIWasm() {
_module = window.getProperty<_EmscriptenModule>("df".toJS);
}
@@ -132,7 +132,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future addAnimationComponent(FilamentEntity entity) async {
Future addAnimationComponent(ThermionEntity entity) async {
_module.ccall(
"add_animation_component",
"bool",
@@ -152,7 +152,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<List<Matrix4>> getRestLocalTransforms(FilamentEntity entity,
Future<List<Matrix4>> getRestLocalTransforms(ThermionEntity entity,
{int skinIndex = 0}) async {
var boneCountJS = _module.ccall(
"get_bone_count",
@@ -178,7 +178,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> getBone(FilamentEntity parent, int boneIndex,
Future<ThermionEntity> getBone(ThermionEntity parent, int boneIndex,
{int skinIndex = 0}) async {
final boneId = _module.ccall(
"get_bone",
@@ -192,7 +192,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
return boneId.toDartInt;
}
Future<List<FilamentEntity>> getBones(FilamentEntity entity,
Future<List<ThermionEntity>> getBones(ThermionEntity entity,
{int skinIndex = 0}) async {
final boneNames = await getBoneNames(entity);
final bones = await Future.wait(List.generate(
@@ -201,7 +201,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation,
Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation,
{int skinIndex = 0,
double fadeInInSecs = 0.0,
double fadeOutInSecs = 0.0,
@@ -289,7 +289,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future addCollisionComponent(FilamentEntity entity,
Future addCollisionComponent(ThermionEntity entity,
{void Function(int entityId1, int entityId2)? callback,
bool affectsTransform = false}) {
// TODO: implement addCollisionComponent
@@ -297,7 +297,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> addLight(
Future<ThermionEntity> addLight(
LightType type,
double colour,
double intensity,
@@ -390,26 +390,26 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> createInstance(FilamentEntity entity) {
Future<ThermionEntity> createInstance(ThermionEntity entity) {
// TODO: implement createInstance
throw UnimplementedError();
}
@override
Future<double> getAnimationDuration(
FilamentEntity entity, int animationIndex) {
ThermionEntity entity, int animationIndex) {
// TODO: implement getAnimationDuration
throw UnimplementedError();
}
@override
Future<List<String>> getAnimationNames(FilamentEntity entity) {
Future<List<String>> getAnimationNames(ThermionEntity entity) {
// TODO: implement getAnimationNames
throw UnimplementedError();
}
@override
Future<List<String>> getBoneNames(FilamentEntity entity,
Future<List<String>> getBoneNames(ThermionEntity entity,
{int skinIndex = 0}) async {
var boneCountJS = _module.ccall(
"get_bone_count",
@@ -498,8 +498,8 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<List<FilamentEntity>> getChildEntities(
FilamentEntity parent, bool renderableOnly) async {
Future<List<ThermionEntity>> getChildEntities(
ThermionEntity parent, bool renderableOnly) async {
var entityCountJS = _module.ccall(
"get_entity_count",
"int",
@@ -507,7 +507,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
[_sceneManager!, parent.toJS, renderableOnly.toJS].toJS,
null) as JSNumber;
var entityCount = entityCountJS.toDartInt;
var entities = <FilamentEntity>[];
var entities = <ThermionEntity>[];
var buf = _module._malloc(entityCount * 4) as JSNumber;
_module.ccall(
@@ -526,8 +526,8 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> getChildEntity(
FilamentEntity parent, String childName) async {
Future<ThermionEntity> getChildEntity(
ThermionEntity parent, String childName) async {
final entityId = _module.ccall(
"find_child_entity_by_name",
"int",
@@ -541,7 +541,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<List<String>> getChildEntityNames(FilamentEntity entity,
Future<List<String>> getChildEntityNames(ThermionEntity entity,
{bool renderableOnly = true}) async {
var entityCountJS = _module.ccall(
"get_entity_count",
@@ -564,32 +564,32 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<int> getInstanceCount(FilamentEntity entity) {
Future<int> getInstanceCount(ThermionEntity entity) {
// TODO: implement getInstanceCount
throw UnimplementedError();
}
@override
Future<List<FilamentEntity>> getInstances(FilamentEntity entity) {
Future<List<ThermionEntity>> getInstances(ThermionEntity entity) {
// TODO: implement getInstances
throw UnimplementedError();
}
@override
Future<Matrix4> getInverseBindMatrix(FilamentEntity parent, int boneIndex,
Future<Matrix4> getInverseBindMatrix(ThermionEntity parent, int boneIndex,
{int skinIndex = 0}) {
// TODO: implement getInverseBindMatrix
throw UnimplementedError();
}
@override
Future<Matrix4> getLocalTransform(FilamentEntity entity) {
Future<Matrix4> getLocalTransform(ThermionEntity entity) {
// TODO: implement getLocalTransform
throw UnimplementedError();
}
@override
Future<FilamentEntity> getMainCamera() async {
Future<ThermionEntity> getMainCamera() async {
final entityId = _module.ccall(
"get_main_camera", "int", ["void*".toJS].toJS, [_viewer].toJS, null)
as JSNumber;
@@ -601,7 +601,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future<List<String>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity) async {
ThermionEntity entity, ThermionEntity childEntity) async {
var morphTargetCountJS = _module.ccall(
"get_morph_target_name_count",
"int",
@@ -631,7 +631,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
String? getNameForEntity(FilamentEntity entity) {
String? getNameForEntity(ThermionEntity entity) {
final namePtr = _module.ccall(
"get_name_for_entity",
"char*",
@@ -645,7 +645,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity?> getParent(FilamentEntity child) async {
Future<ThermionEntity?> getParent(ThermionEntity child) async {
final parentId = _module.ccall(
"get_parent",
"int",
@@ -659,7 +659,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<Matrix4> getWorldTransform(FilamentEntity entity) async {
Future<Matrix4> getWorldTransform(ThermionEntity entity) async {
final matrixPtr = _module._malloc(16 * 4) as JSNumber;
_module.ccall(
"get_world_transform",
@@ -677,7 +677,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
AbstractGizmo? get gizmo => throw UnimplementedError();
@override
Future hide(FilamentEntity entity, String? meshName) async {
Future hide(ThermionEntity entity, String? meshName) async {
if (meshName != null) {
final result = _module.ccall(
"hide_mesh",
@@ -695,7 +695,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
}
Future<FilamentEntity> loadGlbFromBuffer(Uint8List data,
Future<ThermionEntity> loadGlbFromBuffer(Uint8List data,
{int numInstances = 1}) async {
if (numInstances != 1) {
throw Exception("TODO");
@@ -718,7 +718,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> loadGlb(String path, {int numInstances = 1}) async {
Future<ThermionEntity> loadGlb(String path, {int numInstances = 1}) async {
final promise = _module.ccall(
"load_glb",
"int",
@@ -733,7 +733,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future<FilamentEntity> loadGltf(String path, String relativeResourcePath,
Future<ThermionEntity> loadGltf(String path, String relativeResourcePath,
{bool force = false}) async {
final promise = _module.ccall(
"load_gltf",
@@ -771,7 +771,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future moveCameraToAsset(FilamentEntity entity) {
Future moveCameraToAsset(ThermionEntity entity) {
// TODO: implement moveCameraToAsset
throw UnimplementedError();
}
@@ -800,7 +800,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future playAnimation(FilamentEntity entity, int index,
Future playAnimation(ThermionEntity entity, int index,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -830,7 +830,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future playAnimationByName(FilamentEntity entity, String name,
Future playAnimationByName(ThermionEntity entity, String name,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -841,7 +841,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future queuePositionUpdate(
FilamentEntity entity, double x, double y, double z,
ThermionEntity entity, double x, double y, double z,
{bool relative = false}) {
// TODO: implement queuePositionUpdate
throw UnimplementedError();
@@ -849,33 +849,33 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future queueRotationUpdate(
FilamentEntity entity, double rads, double x, double y, double z,
ThermionEntity entity, double rads, double x, double y, double z,
{bool relative = false}) {
// TODO: implement queueRotationUpdate
throw UnimplementedError();
}
@override
Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat,
Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat,
{bool relative = false}) {
// TODO: implement queueRotationUpdateQuat
throw UnimplementedError();
}
@override
Future removeAnimationComponent(FilamentEntity entity) {
Future removeAnimationComponent(ThermionEntity entity) {
// TODO: implement removeAnimationComponent
throw UnimplementedError();
}
@override
Future removeCollisionComponent(FilamentEntity entity) {
Future removeCollisionComponent(ThermionEntity entity) {
// TODO: implement removeCollisionComponent
throw UnimplementedError();
}
@override
Future removeEntity(FilamentEntity entity) {
Future removeEntity(ThermionEntity entity) {
// TODO: implement removeEntity
throw UnimplementedError();
}
@@ -887,7 +887,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future removeLight(FilamentEntity light) {
Future removeLight(ThermionEntity light) {
// TODO: implement removeLight
throw UnimplementedError();
}
@@ -924,13 +924,13 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future resetBones(FilamentEntity entity) {
Future resetBones(ThermionEntity entity) {
// TODO: implement resetBones
throw UnimplementedError();
}
@override
Future reveal(FilamentEntity entity, String? meshName) {
Future reveal(ThermionEntity entity, String? meshName) {
// TODO: implement reveal
throw UnimplementedError();
}
@@ -965,7 +965,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future setAnimationFrame(
FilamentEntity entity, int index, int animationFrame) {
ThermionEntity entity, int index, int animationFrame) {
// TODO: implement setAnimationFrame
throw UnimplementedError();
}
@@ -1000,14 +1000,14 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future setBoneTransform(
FilamentEntity entity, int boneIndex, Matrix4 transform,
ThermionEntity entity, int boneIndex, Matrix4 transform,
{int skinIndex = 0}) {
// TODO: implement setBoneTransform
throw UnimplementedError();
}
@override
Future setCamera(FilamentEntity entity, String? name) {
Future setCamera(ThermionEntity entity, String? name) {
// TODO: implement setCamera
throw UnimplementedError();
}
@@ -1099,7 +1099,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future setMaterialColor(FilamentEntity entity, String meshName,
Future setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a) {
// TODO: implement setMaterialColor
throw UnimplementedError();
@@ -1107,7 +1107,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
// @override
// Future setMorphAnimationData(
// FilamentEntity entity, MorphAnimationData animation,
// ThermionEntity entity, MorphAnimationData animation,
// {List<String>? targetMeshNames}) async {
// final morphTargetNames = await getMorphTargetNames(entity, entity);
@@ -1162,7 +1162,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future setMorphAnimationData(
FilamentEntity entity, MorphAnimationData animation,
ThermionEntity entity, MorphAnimationData animation,
{List<String>? targetMeshNames, bool useNextEntity = false}) async {
var meshNames = await getChildEntityNames(entity, renderableOnly: false);
if (targetMeshNames != null) {
@@ -1272,20 +1272,20 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future setMorphTargetWeights(FilamentEntity entity, List<double> weights) {
Future setMorphTargetWeights(ThermionEntity entity, List<double> weights) {
// TODO: implement setMorphTargetWeights
throw UnimplementedError();
}
@override
Future setParent(FilamentEntity child, FilamentEntity parent) {
Future setParent(ThermionEntity child, ThermionEntity parent) {
// TODO: implement setParent
throw UnimplementedError();
}
@override
Future setPosition(
FilamentEntity entity, double x, double y, double z) async {
ThermionEntity entity, double x, double y, double z) async {
_module.ccall(
"set_position",
"void",
@@ -1302,7 +1302,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future setPriority(FilamentEntity entityId, int priority) {
Future setPriority(ThermionEntity entityId, int priority) {
// TODO: implement setPriority
throw UnimplementedError();
}
@@ -1327,7 +1327,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
@override
Future setRotation(
FilamentEntity entity, double rads, double x, double y, double z) async {
ThermionEntity entity, double rads, double x, double y, double z) async {
var quaternion = Quaternion.axisAngle(Vector3(x, y, z), rads);
_module.ccall(
"set_rotation",
@@ -1353,7 +1353,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future setRotationQuat(FilamentEntity entity, Quaternion rotation) async {
Future setRotationQuat(ThermionEntity entity, Quaternion rotation) async {
_module.ccall(
"set_rotation",
"void",
@@ -1378,7 +1378,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future setScale(FilamentEntity entity, double scale) {
Future setScale(ThermionEntity entity, double scale) {
// TODO: implement setScale
throw UnimplementedError();
}
@@ -1390,7 +1390,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future setTransform(FilamentEntity entity, Matrix4 transform) {
Future setTransform(ThermionEntity entity, Matrix4 transform) {
// TODO: implement setTransform
throw UnimplementedError();
}
@@ -1402,31 +1402,31 @@ class FilamentViewerWasm implements AbstractFilamentViewer {
}
@override
Future stopAnimation(FilamentEntity entity, int animationIndex) {
Future stopAnimation(ThermionEntity entity, int animationIndex) {
// TODO: implement stopAnimation
throw UnimplementedError();
}
@override
Future stopAnimationByName(FilamentEntity entity, String name) {
Future stopAnimationByName(ThermionEntity entity, String name) {
// TODO: implement stopAnimationByName
throw UnimplementedError();
}
@override
Future testCollisions(FilamentEntity entity) {
Future testCollisions(ThermionEntity entity) {
// TODO: implement testCollisions
throw UnimplementedError();
}
@override
Future transformToUnitCube(FilamentEntity entity) {
Future transformToUnitCube(ThermionEntity entity) {
// TODO: implement transformToUnitCube
throw UnimplementedError();
}
@override
Future updateBoneMatrices(FilamentEntity entity) {
Future updateBoneMatrices(ThermionEntity entity) {
// TODO: implement updateBoneMatrices
throw UnimplementedError();
}

View File

@@ -3,13 +3,13 @@ library thermion_flutter_js;
import 'dart:js_interop';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';
import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
///
/// An extension type on [JSObject] that represents a
/// Javascript shim implementation of the [AbstractFilamentViewer] interface.
/// Javascript shim implementation of the [ThermionViewer] interface.
///
extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
extension type ThermionViewerJSShim(JSObject _) implements JSObject {
@JS('initialized')
external JSPromise<JSBoolean> get initialized;
@@ -77,7 +77,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
bool castShadows);
@JS('removeLight')
external JSPromise removeLight(FilamentEntity light);
external JSPromise removeLight(ThermionEntity light);
@JS('clearLights')
external JSPromise clearLights();
@@ -86,13 +86,13 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
external JSPromise<JSNumber> loadGlb(String path, int numInstances);
@JS('createInstance')
external JSPromise<JSNumber> createInstance(FilamentEntity entity);
external JSPromise<JSNumber> createInstance(ThermionEntity entity);
@JS('getInstanceCount')
external JSPromise<JSNumber> getInstanceCount(FilamentEntity entity);
external JSPromise<JSNumber> getInstanceCount(ThermionEntity entity);
@JS('getInstances')
external JSPromise<JSArray<JSNumber>> getInstances(FilamentEntity entity);
external JSPromise<JSArray<JSNumber>> getInstances(ThermionEntity entity);
@JS('loadGltf')
external JSPromise<JSNumber> loadGltf(
@@ -118,38 +118,38 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
@JS('setMorphTargetWeights')
external JSPromise setMorphTargetWeights(
FilamentEntity entity, JSArray<JSNumber> weights);
ThermionEntity entity, JSArray<JSNumber> weights);
@JS('getMorphTargetNames')
external JSPromise<JSArray<JSString>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity);
ThermionEntity entity, ThermionEntity childEntity);
@JS('getBoneNames')
external JSPromise<JSArray<JSString>> getBoneNames(
FilamentEntity entity, int skinIndex);
ThermionEntity entity, int skinIndex);
@JS('getAnimationNames')
external JSPromise<JSArray<JSString>> getAnimationNames(
FilamentEntity entity);
ThermionEntity entity);
@JS('getAnimationDuration')
external JSPromise<JSNumber> getAnimationDuration(
FilamentEntity entity, int animationIndex);
ThermionEntity entity, int animationIndex);
@JS('setMorphAnimationData')
external JSPromise setMorphAnimationData(
FilamentEntity entity,
ThermionEntity entity,
JSArray<JSArray<JSNumber>> animation,
JSArray<JSString> morphTargets,
JSArray<JSString>? targetMeshNames,
double frameLengthInMs);
@JS('resetBones')
external JSPromise resetBones(FilamentEntity entity);
external JSPromise resetBones(ThermionEntity entity);
@JS('addBoneAnimation')
external JSPromise addBoneAnimation(
FilamentEntity entity,
ThermionEntity entity,
JSArray<JSString> bones,
JSArray<JSArray<JSArray<JSNumber>>> frameData,
JSNumber frameLengthInMs,
@@ -160,7 +160,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
JSNumber maxDelta);
@JS('removeEntity')
external JSPromise removeEntity(FilamentEntity entity);
external JSPromise removeEntity(ThermionEntity entity);
@JS('clearEntities')
external JSPromise clearEntities();
@@ -176,7 +176,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
@JS('playAnimation')
external JSPromise playAnimation(
FilamentEntity entity,
ThermionEntity entity,
int index,
bool loop,
bool reverse,
@@ -186,7 +186,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
@JS('playAnimationByName')
external JSPromise playAnimationByName(
FilamentEntity entity,
ThermionEntity entity,
String name,
bool loop,
bool reverse,
@@ -196,16 +196,16 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
@JS('setAnimationFrame')
external JSPromise setAnimationFrame(
FilamentEntity entity, int index, int animationFrame);
ThermionEntity entity, int index, int animationFrame);
@JS('stopAnimation')
external JSPromise stopAnimation(FilamentEntity entity, int animationIndex);
external JSPromise stopAnimation(ThermionEntity entity, int animationIndex);
@JS('stopAnimationByName')
external JSPromise stopAnimationByName(FilamentEntity entity, String name);
external JSPromise stopAnimationByName(ThermionEntity entity, String name);
@JS('setCamera')
external JSPromise setCamera(FilamentEntity entity, String? name);
external JSPromise setCamera(ThermionEntity entity, String? name);
@JS('setMainCamera')
external JSPromise setMainCamera();
@@ -262,7 +262,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
external JSPromise<JSArray<JSNumber>> getCameraRotation();
@JS('moveCameraToAsset')
external JSPromise moveCameraToAsset(FilamentEntity entity);
external JSPromise moveCameraToAsset(ThermionEntity entity);
@JS('setViewFrustumCulling')
external JSPromise setViewFrustumCulling(JSBoolean enabled);
@@ -278,34 +278,34 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
external JSPromise setCameraModelMatrix(JSArray<JSNumber> matrix);
@JS('setMaterialColor')
external JSPromise setMaterialColor(FilamentEntity entity, String meshName,
external JSPromise setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a);
@JS('transformToUnitCube')
external JSPromise transformToUnitCube(FilamentEntity entity);
external JSPromise transformToUnitCube(ThermionEntity entity);
@JS('setPosition')
external JSPromise setPosition(
FilamentEntity entity, double x, double y, double z);
ThermionEntity entity, double x, double y, double z);
@JS('setScale')
external JSPromise setScale(FilamentEntity entity, double scale);
external JSPromise setScale(ThermionEntity entity, double scale);
@JS('setRotation')
external JSPromise setRotation(
FilamentEntity entity, double rads, double x, double y, double z);
ThermionEntity entity, double rads, double x, double y, double z);
@JS('queuePositionUpdate')
external JSPromise queuePositionUpdate(
FilamentEntity entity, double x, double y, double z, bool relative);
ThermionEntity entity, double x, double y, double z, bool relative);
@JS('queueRotationUpdate')
external JSPromise queueRotationUpdate(FilamentEntity entity, double rads,
external JSPromise queueRotationUpdate(ThermionEntity entity, double rads,
double x, double y, double z, bool relative);
@JS('queueRotationUpdateQuat')
external JSPromise queueRotationUpdateQuat(
FilamentEntity entity, JSArray<JSNumber> quat, bool relative);
ThermionEntity entity, JSArray<JSNumber> quat, bool relative);
@JS('setPostProcessing')
external JSPromise setPostProcessing(bool enabled);
@@ -315,19 +315,19 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
@JS('setRotationQuat')
external JSPromise setRotationQuat(
FilamentEntity entity, JSArray<JSNumber> rotation);
ThermionEntity entity, JSArray<JSNumber> rotation);
@JS('reveal')
external JSPromise reveal(FilamentEntity entity, String? meshName);
external JSPromise reveal(ThermionEntity entity, String? meshName);
@JS('hide')
external JSPromise hide(FilamentEntity entity, String? meshName);
external JSPromise hide(ThermionEntity entity, String? meshName);
@JS('pick')
external void pick(int x, int y);
@JS('getNameForEntity')
external String? getNameForEntity(FilamentEntity entity);
external String? getNameForEntity(ThermionEntity entity);
@JS('setCameraManipulatorOptions')
external JSPromise setCameraManipulatorOptions(
@@ -339,15 +339,15 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
@JS('getChildEntities')
external JSPromise<JSArray<JSNumber>> getChildEntities(
FilamentEntity parent, bool renderableOnly);
ThermionEntity parent, bool renderableOnly);
@JS('getChildEntity')
external JSPromise<JSNumber> getChildEntity(
FilamentEntity parent, String childName);
ThermionEntity parent, String childName);
@JS('getChildEntityNames')
external JSPromise<JSArray<JSString>> getChildEntityNames(
FilamentEntity entity, bool renderableOnly);
ThermionEntity entity, bool renderableOnly);
@JS('setRecording')
external JSPromise setRecording(JSBoolean recording);
@@ -356,54 +356,54 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject {
external JSPromise setRecordingOutputDirectory(String outputDirectory);
@JS('addAnimationComponent')
external JSPromise addAnimationComponent(FilamentEntity entity);
external JSPromise addAnimationComponent(ThermionEntity entity);
@JS('removeAnimationComponent')
external JSPromise removeAnimationComponent(FilamentEntity entity);
external JSPromise removeAnimationComponent(ThermionEntity entity);
@JS('addCollisionComponent')
external JSPromise addCollisionComponent(FilamentEntity entity);
external JSPromise addCollisionComponent(ThermionEntity entity);
@JS('removeCollisionComponent')
external JSPromise removeCollisionComponent(FilamentEntity entity);
external JSPromise removeCollisionComponent(ThermionEntity entity);
@JS('createGeometry')
external JSPromise<JSNumber> createGeometry(JSArray<JSNumber> vertices,
JSArray<JSNumber> indices, String? materialPath, int primitiveType);
@JS('setParent')
external JSPromise setParent(FilamentEntity child, FilamentEntity parent);
external JSPromise setParent(ThermionEntity child, ThermionEntity parent);
@JS('getParent')
external JSPromise<JSNumber> getParent(FilamentEntity child);
external JSPromise<JSNumber> getParent(ThermionEntity child);
@JS('getParent')
external JSPromise<JSNumber> getBone(
FilamentEntity child, int boneIndex, int skinIndex);
ThermionEntity child, int boneIndex, int skinIndex);
@JS('testCollisions')
external JSPromise testCollisions(FilamentEntity entity);
external JSPromise testCollisions(ThermionEntity entity);
@JS('setPriority')
external JSPromise setPriority(FilamentEntity entityId, int priority);
external JSPromise setPriority(ThermionEntity entityId, int priority);
@JS('getLocalTransform')
external JSPromise<JSArray<JSNumber>> getLocalTransform(
FilamentEntity entity);
ThermionEntity entity);
@JS('getWorldTransform')
external JSPromise<JSArray<JSNumber>> getWorldTransform(
FilamentEntity entity);
ThermionEntity entity);
@JS('updateBoneMatrices')
external JSPromise updateBoneMatrices(FilamentEntity entity);
external JSPromise updateBoneMatrices(ThermionEntity entity);
@JS('setTransform')
external JSPromise setTransform(
FilamentEntity entity, JSArray<JSNumber> transform);
ThermionEntity entity, JSArray<JSNumber> transform);
@JS('setBoneTransform')
external JSPromise setBoneTransform(
FilamentEntity entity, int boneIndex, JSArray<JSNumber> transform, int skinIndex);
ThermionEntity entity, int boneIndex, JSArray<JSNumber> transform, int skinIndex);
}

View File

@@ -3,11 +3,11 @@ library thermion_flutter_js;
import 'dart:js_interop';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';
import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
///
/// An extension type on [JSObject] that represents a
/// Javascript shim implementation for the [AbstractFilamentViewer] interface.
/// Javascript shim implementation for the [ThermionViewer] interface.
///
extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@@ -71,7 +71,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
bool castShadows);
@JS('removeLight')
external JSPromise removeLight(FilamentEntity light);
external JSPromise removeLight(ThermionEntity light);
@JS('clearLights')
external JSPromise clearLights();
@@ -80,13 +80,13 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
external JSPromise<JSNumber> loadGlb(String path, int numInstances);
@JS('createInstance')
external JSPromise<JSNumber> createInstance(FilamentEntity entity);
external JSPromise<JSNumber> createInstance(ThermionEntity entity);
@JS('getInstanceCount')
external JSPromise<JSNumber> getInstanceCount(FilamentEntity entity);
external JSPromise<JSNumber> getInstanceCount(ThermionEntity entity);
@JS('getInstances')
external JSPromise<JSArray<JSNumber>> getInstances(FilamentEntity entity);
external JSPromise<JSArray<JSNumber>> getInstances(ThermionEntity entity);
@JS('loadGltf')
external JSPromise<JSNumber> loadGltf(
@@ -112,38 +112,38 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@JS('setMorphTargetWeights')
external JSPromise setMorphTargetWeights(
FilamentEntity entity, JSArray<JSNumber> weights);
ThermionEntity entity, JSArray<JSNumber> weights);
@JS('getMorphTargetNames')
external JSPromise<JSArray<JSString>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity);
ThermionEntity entity, ThermionEntity childEntity);
@JS('getBoneNames')
external JSPromise<JSArray<JSString>> getBoneNames(
FilamentEntity entity, int skinIndex);
ThermionEntity entity, int skinIndex);
@JS('getAnimationNames')
external JSPromise<JSArray<JSString>> getAnimationNames(
FilamentEntity entity);
ThermionEntity entity);
@JS('getAnimationDuration')
external JSPromise<JSNumber> getAnimationDuration(
FilamentEntity entity, int animationIndex);
ThermionEntity entity, int animationIndex);
@JS('setMorphAnimationData')
external JSPromise setMorphAnimationData(
FilamentEntity entity,
ThermionEntity entity,
JSArray<JSArray<JSNumber>> animation,
JSArray<JSString> morphTargets,
JSArray<JSString>? targetMeshNames,
double frameLengthInMs);
@JS('resetBones')
external JSPromise resetBones(FilamentEntity entity);
external JSPromise resetBones(ThermionEntity entity);
@JS('addBoneAnimation')
external JSPromise addBoneAnimation(
FilamentEntity entity,
ThermionEntity entity,
JSArray<JSString> bones,
JSArray<JSArray<JSArray<JSNumber>>> frameData,
JSNumber frameLengthInMs,
@@ -154,7 +154,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
JSNumber maxDelta);
@JS('removeEntity')
external JSPromise removeEntity(FilamentEntity entity);
external JSPromise removeEntity(ThermionEntity entity);
@JS('clearEntities')
external JSPromise clearEntities();
@@ -170,7 +170,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@JS('playAnimation')
external JSPromise playAnimation(
FilamentEntity entity,
ThermionEntity entity,
int index,
bool loop,
bool reverse,
@@ -180,7 +180,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@JS('playAnimationByName')
external JSPromise playAnimationByName(
FilamentEntity entity,
ThermionEntity entity,
String name,
bool loop,
bool reverse,
@@ -190,16 +190,16 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@JS('setAnimationFrame')
external JSPromise setAnimationFrame(
FilamentEntity entity, int index, int animationFrame);
ThermionEntity entity, int index, int animationFrame);
@JS('stopAnimation')
external JSPromise stopAnimation(FilamentEntity entity, int animationIndex);
external JSPromise stopAnimation(ThermionEntity entity, int animationIndex);
@JS('stopAnimationByName')
external JSPromise stopAnimationByName(FilamentEntity entity, String name);
external JSPromise stopAnimationByName(ThermionEntity entity, String name);
@JS('setCamera')
external JSPromise setCamera(FilamentEntity entity, String? name);
external JSPromise setCamera(ThermionEntity entity, String? name);
@JS('setMainCamera')
external JSPromise setMainCamera();
@@ -256,7 +256,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
external JSPromise<JSArray<JSNumber>> getCameraRotation();
@JS('moveCameraToAsset')
external JSPromise moveCameraToAsset(FilamentEntity entity);
external JSPromise moveCameraToAsset(ThermionEntity entity);
@JS('setViewFrustumCulling')
external JSPromise setViewFrustumCulling(JSBoolean enabled);
@@ -272,34 +272,34 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
external JSPromise setCameraModelMatrix(JSArray<JSNumber> matrix);
@JS('setMaterialColor')
external JSPromise setMaterialColor(FilamentEntity entity, String meshName,
external JSPromise setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a);
@JS('transformToUnitCube')
external JSPromise transformToUnitCube(FilamentEntity entity);
external JSPromise transformToUnitCube(ThermionEntity entity);
@JS('setPosition')
external JSPromise setPosition(
FilamentEntity entity, double x, double y, double z);
ThermionEntity entity, double x, double y, double z);
@JS('setScale')
external JSPromise setScale(FilamentEntity entity, double scale);
external JSPromise setScale(ThermionEntity entity, double scale);
@JS('setRotation')
external JSPromise setRotation(
FilamentEntity entity, double rads, double x, double y, double z);
ThermionEntity entity, double rads, double x, double y, double z);
@JS('queuePositionUpdate')
external JSPromise queuePositionUpdate(
FilamentEntity entity, double x, double y, double z, bool relative);
ThermionEntity entity, double x, double y, double z, bool relative);
@JS('queueRotationUpdate')
external JSPromise queueRotationUpdate(FilamentEntity entity, double rads,
external JSPromise queueRotationUpdate(ThermionEntity entity, double rads,
double x, double y, double z, bool relative);
@JS('queueRotationUpdateQuat')
external JSPromise queueRotationUpdateQuat(
FilamentEntity entity, JSArray<JSNumber> quat, bool relative);
ThermionEntity entity, JSArray<JSNumber> quat, bool relative);
@JS('setPostProcessing')
external JSPromise setPostProcessing(bool enabled);
@@ -309,19 +309,19 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@JS('setRotationQuat')
external JSPromise setRotationQuat(
FilamentEntity entity, JSArray<JSNumber> rotation);
ThermionEntity entity, JSArray<JSNumber> rotation);
@JS('reveal')
external JSPromise reveal(FilamentEntity entity, String? meshName);
external JSPromise reveal(ThermionEntity entity, String? meshName);
@JS('hide')
external JSPromise hide(FilamentEntity entity, String? meshName);
external JSPromise hide(ThermionEntity entity, String? meshName);
@JS('pick')
external void pick(int x, int y);
@JS('getNameForEntity')
external String? getNameForEntity(FilamentEntity entity);
external String? getNameForEntity(ThermionEntity entity);
@JS('setCameraManipulatorOptions')
external JSPromise setCameraManipulatorOptions(
@@ -333,15 +333,15 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
@JS('getChildEntities')
external JSPromise<JSArray<JSNumber>> getChildEntities(
FilamentEntity parent, bool renderableOnly);
ThermionEntity parent, bool renderableOnly);
@JS('getChildEntity')
external JSPromise<JSNumber> getChildEntity(
FilamentEntity parent, String childName);
ThermionEntity parent, String childName);
@JS('getChildEntityNames')
external JSPromise<JSArray<JSString>> getChildEntityNames(
FilamentEntity entity, bool renderableOnly);
ThermionEntity entity, bool renderableOnly);
@JS('setRecording')
external JSPromise setRecording(JSBoolean recording);
@@ -350,54 +350,54 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject {
external JSPromise setRecordingOutputDirectory(String outputDirectory);
@JS('addAnimationComponent')
external JSPromise addAnimationComponent(FilamentEntity entity);
external JSPromise addAnimationComponent(ThermionEntity entity);
@JS('removeAnimationComponent')
external JSPromise removeAnimationComponent(FilamentEntity entity);
external JSPromise removeAnimationComponent(ThermionEntity entity);
@JS('addCollisionComponent')
external JSPromise addCollisionComponent(FilamentEntity entity);
external JSPromise addCollisionComponent(ThermionEntity entity);
@JS('removeCollisionComponent')
external JSPromise removeCollisionComponent(FilamentEntity entity);
external JSPromise removeCollisionComponent(ThermionEntity entity);
@JS('createGeometry')
external JSPromise<JSNumber> createGeometry(JSArray<JSNumber> vertices,
JSArray<JSNumber> indices, String? materialPath, int primitiveType);
@JS('setParent')
external JSPromise setParent(FilamentEntity child, FilamentEntity parent);
external JSPromise setParent(ThermionEntity child, ThermionEntity parent);
@JS('getParent')
external JSPromise<JSNumber> getParent(FilamentEntity child);
external JSPromise<JSNumber> getParent(ThermionEntity child);
@JS('getParent')
external JSPromise<JSNumber> getBone(
FilamentEntity child, int boneIndex, int skinIndex);
ThermionEntity child, int boneIndex, int skinIndex);
@JS('testCollisions')
external JSPromise testCollisions(FilamentEntity entity);
external JSPromise testCollisions(ThermionEntity entity);
@JS('setPriority')
external JSPromise setPriority(FilamentEntity entityId, int priority);
external JSPromise setPriority(ThermionEntity entityId, int priority);
@JS('getLocalTransform')
external JSPromise<JSArray<JSNumber>> getLocalTransform(
FilamentEntity entity);
ThermionEntity entity);
@JS('getWorldTransform')
external JSPromise<JSArray<JSNumber>> getWorldTransform(
FilamentEntity entity);
ThermionEntity entity);
@JS('updateBoneMatrices')
external JSPromise updateBoneMatrices(FilamentEntity entity);
external JSPromise updateBoneMatrices(ThermionEntity entity);
@JS('setTransform')
external JSPromise setTransform(
FilamentEntity entity, JSArray<JSNumber> transform);
ThermionEntity entity, JSArray<JSNumber> transform);
@JS('setBoneTransform')
external JSPromise setBoneTransform(
FilamentEntity entity, int boneIndex, JSArray<JSNumber> transform, int skinIndex);
ThermionEntity entity, int boneIndex, JSArray<JSNumber> transform, int skinIndex);
}

View File

@@ -2,12 +2,12 @@ import 'dart:async';
import 'dart:math';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';
import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
import 'package:vector_math/vector_math_64.dart' as v;
class EntityTransformController {
final AbstractFilamentViewer controller;
final FilamentEntity _entity;
final ThermionViewer controller;
final ThermionEntity _entity;
late Timer _ticker;

View File

@@ -1,2 +1,2 @@
// a handle that can be safely passed back to the rendering layer to manipulate an Entity
typedef FilamentEntity = int;
typedef ThermionEntity = int;

View File

@@ -1,25 +1,25 @@
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:vector_math/vector_math_64.dart';
import '../abstract_filament_viewer.dart';
import '../thermion_viewer.dart';
class Gizmo extends AbstractGizmo {
final FilamentEntity x;
final ThermionEntity x;
Vector3 _x = Vector3(0.1, 0, 0);
final FilamentEntity y;
final ThermionEntity y;
Vector3 _y = Vector3(0.0, 0.1, 0);
final FilamentEntity z;
final ThermionEntity z;
Vector3 _z = Vector3(0.0, 0.0, 0.1);
final AbstractFilamentViewer controller;
final ThermionViewer controller;
FilamentEntity? _activeAxis;
FilamentEntity? _activeEntity;
ThermionEntity? _activeAxis;
ThermionEntity? _activeEntity;
bool get isActive => _activeAxis != null;
final Set<FilamentEntity> ignore;
final Set<ThermionEntity> ignore;
Gizmo(this.x, this.y, this.z, this.controller,
{this.ignore = const <FilamentEntity>{}}) {
{this.ignore = const <ThermionEntity>{}}) {
controller.pickResult.listen(_onPickResult);
}
@@ -59,7 +59,7 @@ class Gizmo extends AbstractGizmo {
}
}
void attach(FilamentEntity entity) async {
void attach(ThermionEntity entity) async {
_activeAxis = null;
_activeEntity = entity;
await _reveal();

View File

@@ -1,41 +1,41 @@
import 'dart:async';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'abstract_filament_viewer.dart';
import 'thermion_viewer.dart';
///
/// For now, this class just holds the entities that have been loaded (though not necessarily visible in the Filament Scene).
///
class SceneImpl extends Scene {
AbstractFilamentViewer controller;
ThermionViewer controller;
SceneImpl(this.controller);
@override
FilamentEntity? selected;
ThermionEntity? selected;
final _onUpdatedController = StreamController<bool>.broadcast();
@override
Stream<bool> get onUpdated => _onUpdatedController.stream;
final _onLoadController = StreamController<FilamentEntity>.broadcast();
final _onLoadController = StreamController<ThermionEntity>.broadcast();
@override
Stream<FilamentEntity> get onLoad => _onLoadController.stream;
Stream<ThermionEntity> get onLoad => _onLoadController.stream;
final _onUnloadController = StreamController<FilamentEntity>.broadcast();
final _onUnloadController = StreamController<ThermionEntity>.broadcast();
@override
Stream<FilamentEntity> get onUnload => _onUnloadController.stream;
Stream<ThermionEntity> get onUnload => _onUnloadController.stream;
final _lights = <FilamentEntity>{};
final _entities = <FilamentEntity>{};
final _lights = <ThermionEntity>{};
final _entities = <ThermionEntity>{};
void registerLight(FilamentEntity entity) {
void registerLight(ThermionEntity entity) {
_lights.add(entity);
_onLoadController.sink.add(entity);
_onUpdatedController.add(true);
}
void unregisterLight(FilamentEntity entity) async {
void unregisterLight(ThermionEntity entity) async {
var children = await controller.getChildEntities(entity, true);
if (selected == entity || children.contains(selected)) {
selected = null;
@@ -46,7 +46,7 @@ class SceneImpl extends Scene {
_onUpdatedController.add(true);
}
void unregisterEntity(FilamentEntity entity) async {
void unregisterEntity(ThermionEntity entity) async {
var children = await controller.getChildEntities(entity, true);
if (selected == entity || children.contains(selected)) {
selected = null;
@@ -58,7 +58,7 @@ class SceneImpl extends Scene {
_onUpdatedController.add(true);
}
void registerEntity(FilamentEntity entity) {
void registerEntity(ThermionEntity entity) {
_entities.add(entity);
_onLoadController.sink.add(entity);
_onUpdatedController.add(true);
@@ -92,16 +92,16 @@ class SceneImpl extends Scene {
///
/// Lists all entities currently loaded (not necessarily active in the scene).
///
Iterable<FilamentEntity> listLights() {
Iterable<ThermionEntity> listLights() {
return _lights;
}
@override
Iterable<FilamentEntity> listEntities() {
Iterable<ThermionEntity> listEntities() {
return _entities;
}
void registerSelected(FilamentEntity entity) {
void registerSelected(ThermionEntity entity) {
selected = entity;
_onUpdatedController.add(true);
}
@@ -112,7 +112,7 @@ class SceneImpl extends Scene {
}
@override
void select(FilamentEntity entity) {
void select(ThermionEntity entity) {
selected = entity;
controller.gizmo?.attach(entity);
_onUpdatedController.add(true);

View File

@@ -6,7 +6,7 @@ import 'package:animation_tools_dart/animation_tools_dart.dart';
import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
// "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates.
typedef FilamentPickResult = ({FilamentEntity entity, double x, double y});
typedef FilamentPickResult = ({ThermionEntity entity, double x, double y});
enum LightType {
SUN, //!< Directional light that also draws a sun's disk in the sky.
@@ -43,7 +43,7 @@ class TextureDetails {
{required this.textureId, required this.width, required this.height});
}
abstract class AbstractFilamentViewer {
abstract class ThermionViewer {
Future<bool> get initialized;
@@ -135,7 +135,7 @@ abstract class AbstractFilamentViewer {
/// Note that [sunAngularRadius] is in degrees,
/// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians
///
Future<FilamentEntity> addLight(
Future<ThermionEntity> addLight(
LightType type,
double colour,
double intensity,
@@ -153,7 +153,7 @@ abstract class AbstractFilamentViewer {
double sunHaloFallof = 80.0,
bool castShadows = true});
Future removeLight(FilamentEntity light);
Future removeLight(ThermionEntity light);
///
/// Remove all lights (excluding IBL) from the scene.
@@ -163,29 +163,29 @@ abstract class AbstractFilamentViewer {
///
/// Load the .glb asset at the given path and insert into the scene.
///
Future<FilamentEntity> loadGlb(String path, {int numInstances = 1});
Future<ThermionEntity> loadGlb(String path, {int numInstances = 1});
///
/// Create a new instance of [entity].
///
Future<FilamentEntity> createInstance(FilamentEntity entity);
Future<ThermionEntity> createInstance(ThermionEntity entity);
///
/// Returns the number of instances of the asset associated with [entity].
///
Future<int> getInstanceCount(FilamentEntity entity);
Future<int> getInstanceCount(ThermionEntity entity);
///
/// Returns all instances of [entity].
///
Future<List<FilamentEntity>> getInstances(FilamentEntity entity);
Future<List<ThermionEntity>> getInstances(ThermionEntity entity);
///
/// Load the .gltf asset at the given path and insert into the scene.
/// [relativeResourcePath] is the folder path where the glTF resources are stored;
/// this is usually the parent directory of the .gltf file itself.
///
Future<FilamentEntity> loadGltf(String path, String relativeResourcePath,
Future<ThermionEntity> loadGltf(String path, String relativeResourcePath,
{bool force = false});
///
@@ -222,32 +222,32 @@ abstract class AbstractFilamentViewer {
/// Set the weights for all morph targets in [entity] to [weights].
/// Note that [weights] must contain values for ALL morph targets, but no exception will be thrown if you don't do so (you'll just get incorrect results).
/// If you only want to set one value, set all others to zero (check [getMorphTargetNames] if you need the get a list of all morph targets).
/// IMPORTANT - this accepts the actual FilamentEntity with the relevant morph targets (unlike [getMorphTargetNames], which uses the parent entity and the child mesh name).
/// IMPORTANT - this accepts the actual ThermionEntity with the relevant morph targets (unlike [getMorphTargetNames], which uses the parent entity and the child mesh name).
/// Use [getChildEntityByName] if you are setting the weights for a child mesh.
///
Future setMorphTargetWeights(FilamentEntity entity, List<double> weights);
Future setMorphTargetWeights(ThermionEntity entity, List<double> weights);
///
/// Gets the names of all morph targets for the child renderable [childEntity] under [entity].
///
Future<List<String>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity);
ThermionEntity entity, ThermionEntity childEntity);
///
/// Gets the names of all bones for the armature at [skinIndex] under the specified [entity].
///
Future<List<String>> getBoneNames(FilamentEntity entity, {int skinIndex = 0});
Future<List<String>> getBoneNames(ThermionEntity entity, {int skinIndex = 0});
///
/// Gets the names of all glTF animations embedded in the specified entity.
///
Future<List<String>> getAnimationNames(FilamentEntity entity);
Future<List<String>> getAnimationNames(ThermionEntity entity);
///
/// Returns the length (in seconds) of the animation at the given index.
///
Future<double> getAnimationDuration(
FilamentEntity entity, int animationIndex);
ThermionEntity entity, int animationIndex);
///
/// Animate the morph targets in [entity]. See [MorphTargetAnimation] for an explanation as to how to construct the animation frame data.
@@ -256,14 +256,14 @@ abstract class AbstractFilamentViewer {
/// It is permissible for [animation] to omit any targets that do exist under [meshName]; these simply won't be animated.
///
Future setMorphAnimationData(
FilamentEntity entity, MorphAnimationData animation,
ThermionEntity entity, MorphAnimationData animation,
{List<String>? targetMeshNames});
///
/// Resets all bones in the given entity to their rest pose.
/// This should be done before every call to addBoneAnimation.
///
Future resetBones(FilamentEntity entity);
Future resetBones(ThermionEntity entity);
///
/// Enqueues and plays the [animation] for the specified bone(s).
@@ -283,7 +283,7 @@ abstract class AbstractFilamentViewer {
/// This will be applied in reverse after [fadeOutInSecs].
///
///
Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation,
Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation,
{int skinIndex = 0,
double fadeInInSecs = 0.0,
double fadeOutInSecs = 0.0,
@@ -293,58 +293,58 @@ abstract class AbstractFilamentViewer {
/// Gets the entity representing the bone at [boneIndex]/[skinIndex].
/// The returned entity is only intended for use with [getWorldTransform].
///
Future<FilamentEntity> getBone(FilamentEntity parent, int boneIndex,
Future<ThermionEntity> getBone(ThermionEntity parent, int boneIndex,
{int skinIndex = 0});
///
/// Gets the local (relative to parent) transform for [entity].
///
Future<Matrix4> getLocalTransform(FilamentEntity entity);
Future<Matrix4> getLocalTransform(ThermionEntity entity);
///
/// Gets the world transform for [entity].
///
Future<Matrix4> getWorldTransform(FilamentEntity entity);
Future<Matrix4> getWorldTransform(ThermionEntity entity);
///
/// Gets the inverse bind (pose) matrix for the bone.
/// Note that [parent] must be the FilamentEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc).
/// Note that [parent] must be the ThermionEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc).
/// This is because all joint information is internally stored with the parent entity.
///
Future<Matrix4> getInverseBindMatrix(FilamentEntity parent, int boneIndex,
Future<Matrix4> getInverseBindMatrix(ThermionEntity parent, int boneIndex,
{int skinIndex = 0});
///
/// Sets the transform (relative to its parent) for [entity].
///
Future setTransform(FilamentEntity entity, Matrix4 transform);
Future setTransform(ThermionEntity entity, Matrix4 transform);
///
/// Updates the bone matrices for [entity] (which must be the FilamentEntity
/// Updates the bone matrices for [entity] (which must be the ThermionEntity
/// returned by [loadGlb/loadGltf]).
/// Under the hood, this just calls [updateBoneMatrices] on the Animator
/// instance of the relevant FilamentInstance (which uses the local
/// bone transform and the inverse bind matrix to set the bone matrix).
///
Future updateBoneMatrices(FilamentEntity entity);
Future updateBoneMatrices(ThermionEntity entity);
///
/// Directly set the bone matrix for the bone at the given index.
/// Don't call this manually unless you know what you're doing.
///
Future setBoneTransform(
FilamentEntity entity, int boneIndex, Matrix4 transform,
ThermionEntity entity, int boneIndex, Matrix4 transform,
{int skinIndex = 0});
///
/// Removes/destroys the specified entity from the scene.
/// [entity] will no longer be a valid handle after this method is called; ensure you immediately discard all references once this method is complete.
///
Future removeEntity(FilamentEntity entity);
Future removeEntity(ThermionEntity entity);
///
/// Removes/destroys all renderable entities from the scene (including cameras).
/// All [FilamentEntity] handles will no longer be valid after this method is called; ensure you immediately discard all references to all entities once this method is complete.
/// All [ThermionEntity] handles will no longer be valid after this method is called; ensure you immediately discard all references to all entities once this method is complete.
///
Future clearEntities();
@@ -366,7 +366,7 @@ abstract class AbstractFilamentViewer {
///
/// Schedules the glTF animation at [index] in [entity] to start playing on the next frame.
///
Future playAnimation(FilamentEntity entity, int index,
Future playAnimation(ThermionEntity entity, int index,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -375,22 +375,22 @@ abstract class AbstractFilamentViewer {
///
/// Schedules the glTF animation at [index] in [entity] to start playing on the next frame.
///
Future playAnimationByName(FilamentEntity entity, String name,
Future playAnimationByName(ThermionEntity entity, String name,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
double crossfade = 0.0});
Future setAnimationFrame(
FilamentEntity entity, int index, int animationFrame);
ThermionEntity entity, int index, int animationFrame);
Future stopAnimation(FilamentEntity entity, int animationIndex);
Future stopAnimationByName(FilamentEntity entity, String name);
Future stopAnimation(ThermionEntity entity, int animationIndex);
Future stopAnimationByName(ThermionEntity entity, String name);
///
/// Sets the current scene camera to the glTF camera under [name] in [entity].
///
Future setCamera(FilamentEntity entity, String? name);
Future setCamera(ThermionEntity entity, String? name);
///
/// Sets the current scene camera to the main camera (which is always available and added to every scene by default).
@@ -400,7 +400,7 @@ abstract class AbstractFilamentViewer {
///
/// Returns the entity associated with the main camera.
///
Future<FilamentEntity> getMainCamera();
Future<ThermionEntity> getMainCamera();
///
/// Sets the current scene camera to the glTF camera under [name] in [entity].
@@ -486,7 +486,7 @@ abstract class AbstractFilamentViewer {
///
/// Repositions the camera to the last vertex of the bounding box of [entity], looking at the penultimate vertex.
///
Future moveCameraToAsset(FilamentEntity entity);
Future moveCameraToAsset(ThermionEntity entity);
///
/// Enables/disables frustum culling. Currently we don't expose a method for manipulating the camera projection/culling matrices so this is your only option to deal with unwanted near/far clipping.
@@ -512,36 +512,36 @@ abstract class AbstractFilamentViewer {
///
/// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color].
///
Future setMaterialColor(FilamentEntity entity, String meshName,
Future setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a);
///
/// Scale [entity] to fit within the unit cube.
///
Future transformToUnitCube(FilamentEntity entity);
Future transformToUnitCube(ThermionEntity entity);
///
/// Directly sets the world space position for [entity] to the given coordinates, skipping all collision detection.
///
Future setPosition(FilamentEntity entity, double x, double y, double z);
Future setPosition(ThermionEntity entity, double x, double y, double z);
///
/// Directly sets the scale for [entity], skipping all collision detection.
///
Future setScale(FilamentEntity entity, double scale);
Future setScale(ThermionEntity entity, double scale);
///
/// Directly sets the rotation for [entity] to [rads] around the axis {x,y,z}, skipping all collision detection.
///
Future setRotation(
FilamentEntity entity, double rads, double x, double y, double z);
ThermionEntity entity, double rads, double x, double y, double z);
///
/// Queues an update to the worldspace position for [entity] to {x,y,z}.
/// The actual update will occur on the next frame, and will be subject to collision detection.
///
Future queuePositionUpdate(
FilamentEntity entity, double x, double y, double z,
ThermionEntity entity, double x, double y, double z,
{bool relative = false});
///
@@ -549,13 +549,13 @@ abstract class AbstractFilamentViewer {
/// The actual update will occur on the next frame, and will be subject to collision detection.
///
Future queueRotationUpdate(
FilamentEntity entity, double rads, double x, double y, double z,
ThermionEntity entity, double rads, double x, double y, double z,
{bool relative = false});
///
/// Same as [queueRotationUpdate].
///
Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat,
Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat,
{bool relative = false});
///
@@ -571,31 +571,31 @@ abstract class AbstractFilamentViewer {
///
/// Sets the rotation for [entity] to the specified quaternion.
///
Future setRotationQuat(FilamentEntity entity, Quaternion rotation);
Future setRotationQuat(ThermionEntity entity, Quaternion rotation);
///
/// Reveal the node [meshName] under [entity]. Only applicable if [hide] had previously been called; this is a no-op otherwise.
///
Future reveal(FilamentEntity entity, String? meshName);
Future reveal(ThermionEntity entity, String? meshName);
///
/// If [meshName] is provided, hide the node [meshName] under [entity], otherwise hide the root node for [entity].
/// The entity still exists in memory, but is no longer being rendered into the scene. Call [reveal] to re-commence rendering.
///
Future hide(FilamentEntity entity, String? meshName);
Future hide(ThermionEntity entity, String? meshName);
///
/// Used to select the entity in the scene at the given viewport coordinates.
/// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself.
/// This is asynchronous and will require 2-3 frames to complete - subscribe to the [pickResult] stream to receive the results of this method.
/// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the FilamentWidget).
/// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget).
///
void pick(int x, int y);
///
/// Retrieves the name assigned to the given FilamentEntity (usually corresponds to the glTF mesh name).
/// Retrieves the name assigned to the given ThermionEntity (usually corresponds to the glTF mesh name).
///
String? getNameForEntity(FilamentEntity entity);
String? getNameForEntity(ThermionEntity entity);
///
/// Sets the options for manipulating the camera via the viewport.
@@ -610,20 +610,20 @@ abstract class AbstractFilamentViewer {
///
/// Returns all child entities under [parent].
///
Future<List<FilamentEntity>> getChildEntities(
FilamentEntity parent, bool renderableOnly);
Future<List<ThermionEntity>> getChildEntities(
ThermionEntity parent, bool renderableOnly);
///
/// Finds the child entity named [childName] associated with the given parent.
/// Usually, [parent] will be the return value from [loadGlb]/[loadGltf] and [childName] will be the name of a node/mesh.
///
Future<FilamentEntity> getChildEntity(
FilamentEntity parent, String childName);
Future<ThermionEntity> getChildEntity(
ThermionEntity parent, String childName);
///
/// List the name of all child entities under the given entity.
///
Future<List<String>> getChildEntityNames(FilamentEntity entity,
Future<List<String>> getChildEntityNames(ThermionEntity entity,
{bool renderableOnly = true});
///
@@ -641,26 +641,26 @@ abstract class AbstractFilamentViewer {
/// An [entity] will only be animatable after an animation component is attached.
/// Any calls to [playAnimation]/[setBoneAnimation]/[setMorphAnimation] will have no visual effect until [addAnimationComponent] has been called on the instance.
///
Future addAnimationComponent(FilamentEntity entity);
Future addAnimationComponent(ThermionEntity entity);
///
/// Removes an animation component from [entity].
///
Future removeAnimationComponent(FilamentEntity entity);
Future removeAnimationComponent(ThermionEntity entity);
///
/// Makes [entity] collidable.
/// This allows you to call [testCollisions] with any other entity ("entity B") to see if [entity] has collided with entity B. The callback will be invoked if so.
/// Alternatively, if [affectsTransform] is true and this entity collides with another entity, any queued position updates to the latter entity will be ignored.
///
Future addCollisionComponent(FilamentEntity entity,
Future addCollisionComponent(ThermionEntity entity,
{void Function(int entityId1, int entityId2)? callback,
bool affectsTransform = false});
///
/// Removes the collision component from [entity], meaning this will no longer be tested when [testCollisions] or [queuePositionUpdate] is called with another entity.
///
Future removeCollisionComponent(FilamentEntity entity);
Future removeCollisionComponent(ThermionEntity entity);
///
/// Creates a (renderable) entity with the specified geometry and adds to the scene.
@@ -672,23 +672,23 @@ abstract class AbstractFilamentViewer {
///
/// Gets the parent transform of [child].
///
Future<FilamentEntity?> getParent(FilamentEntity child);
Future<ThermionEntity?> getParent(ThermionEntity child);
///
/// Sets the parent transform of [child] to [parent].
///
Future setParent(FilamentEntity child, FilamentEntity parent);
Future setParent(ThermionEntity child, ThermionEntity parent);
///
/// Test all collidable entities against this entity to see if any have collided.
/// This method returns void; the relevant callback passed to [addCollisionComponent] will be fired if a collision is detected.
///
Future testCollisions(FilamentEntity entity);
Future testCollisions(ThermionEntity entity);
///
/// Sets the draw priority for the given entity. See RenderableManager.h for more details.
///
Future setPriority(FilamentEntity entityId, int priority);
Future setPriority(ThermionEntity entityId, int priority);
///
/// The Scene holds all loaded entities/lights.
@@ -707,7 +707,7 @@ abstract class AbstractFilamentViewer {
abstract class Scene {
///
/// The last entity clicked/tapped in the viewport (internally, the result of calling pick);
FilamentEntity? selected;
ThermionEntity? selected;
///
/// A Stream updated whenever an entity is added/removed from the scene.
@@ -715,35 +715,35 @@ abstract class Scene {
Stream<bool> get onUpdated;
///
/// A Stream containing every FilamentEntity added to the scene (i.e. via [loadGlb], [loadGltf] or [addLight]).
/// This is provided for convenience so you can set listeners in front-end widgets that can respond to entity loads without manually passing around the FilamentEntity returned from those methods.
/// A Stream containing every ThermionEntity added to the scene (i.e. via [loadGlb], [loadGltf] or [addLight]).
/// This is provided for convenience so you can set listeners in front-end widgets that can respond to entity loads without manually passing around the ThermionEntity returned from those methods.
///
Stream<FilamentEntity> get onLoad;
Stream<ThermionEntity> get onLoad;
///
/// A Stream containing every FilamentEntity removed from the scene (i.e. via [removeEntity], [clearEntities], [removeLight] or [clearLights]).
/// A Stream containing every ThermionEntity removed from the scene (i.e. via [removeEntity], [clearEntities], [removeLight] or [clearLights]).
Stream<FilamentEntity> get onUnload;
Stream<ThermionEntity> get onUnload;
///
/// Lists all light entities currently loaded (not necessarily active in the scene). Does not account for instances.
///
Iterable<FilamentEntity> listLights();
Iterable<ThermionEntity> listLights();
///
/// Lists all entities currently loaded (not necessarily active in the scene). Does not account for instances.
///
Iterable<FilamentEntity> listEntities();
Iterable<ThermionEntity> listEntities();
///
/// Attach the gizmo to the specified entity.
///
void select(FilamentEntity entity);
void select(ThermionEntity entity);
///
///
///
void registerEntity(FilamentEntity entity);
void registerEntity(ThermionEntity entity);
}
abstract class AbstractGizmo {
@@ -753,7 +753,7 @@ abstract class AbstractGizmo {
void reset();
void attach(FilamentEntity entity);
void attach(ThermionEntity entity);
void detach();
}

View File

@@ -7,16 +7,16 @@ import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart';
import 'package:thermion_dart/thermion_dart/entities/gizmo.dart';
import 'package:vector_math/vector_math_64.dart';
import 'abstract_filament_viewer.dart';
import 'thermion_viewer.dart';
import 'scene.dart';
import 'compatibility/compatibility.dart';
// ignore: constant_identifier_names
const FilamentEntity _FILAMENT_ASSET_ERROR = 0;
const ThermionEntity _FILAMENT_ASSET_ERROR = 0;
typedef RenderCallback = Pointer<NativeFunction<Void Function(Pointer<Void>)>>;
class FilamentViewer extends AbstractFilamentViewer {
class ThermionViewerFFI extends ThermionViewer {
final _compat = Compatibility();
late SceneImpl _scene;
@@ -56,7 +56,7 @@ class FilamentViewer extends AbstractFilamentViewer {
/// This controller uses platform channels to bridge Dart with the C/C++ code for the Filament API.
/// Setting up the context/texture (since this is platform-specific) and the render ticker are platform-specific; all other methods are passed through by the platform channel to the methods specified in ThermionFlutterApi.h.
///
FilamentViewer(
ThermionViewerFFI(
{RenderCallback? renderCallback,
Pointer<Void>? renderCallbackOwner,
required this.resourceLoader,
@@ -277,7 +277,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity> addLight(
Future<ThermionEntity> addLight(
LightType type,
double colour,
double intensity,
@@ -325,7 +325,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future removeLight(FilamentEntity entity) async {
Future removeLight(ThermionEntity entity) async {
_scene.unregisterLight(entity);
remove_light_ffi(_viewer!, entity);
}
@@ -344,7 +344,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity> createInstance(FilamentEntity entity) async {
Future<ThermionEntity> createInstance(ThermionEntity entity) async {
var created = await withIntCallback(
(callback) => create_instance(_sceneManager!, entity));
if (created == _FILAMENT_ASSET_ERROR) {
@@ -357,7 +357,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<int> getInstanceCount(FilamentEntity entity) async {
Future<int> getInstanceCount(ThermionEntity entity) async {
return get_instance_count(_sceneManager!, entity);
}
@@ -365,11 +365,11 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<List<FilamentEntity>> getInstances(FilamentEntity entity) async {
Future<List<ThermionEntity>> getInstances(ThermionEntity entity) async {
var count = await getInstanceCount(entity);
var out = allocator<Int32>(count);
get_instances(_sceneManager!, entity, out);
var instances = <FilamentEntity>[];
var instances = <ThermionEntity>[];
for (int i = 0; i < count; i++) {
instances.add(out[i]);
}
@@ -381,7 +381,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity> loadGlb(String path,
Future<ThermionEntity> loadGlb(String path,
{bool unlit = false, int numInstances = 1}) async {
if (unlit) {
throw Exception("Not yet implemented");
@@ -402,7 +402,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity> loadGltf(String path, String relativeResourcePath,
Future<ThermionEntity> loadGltf(String path, String relativeResourcePath,
{bool force = false}) async {
// if (Platform.isWindows && !force) {
// throw Exception(
@@ -477,7 +477,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future setMorphTargetWeights(
FilamentEntity entity, List<double> weights) async {
ThermionEntity entity, List<double> weights) async {
if (weights.isEmpty) {
throw Exception("Weights must not be empty");
}
@@ -503,7 +503,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future<List<String>> getMorphTargetNames(
FilamentEntity entity, FilamentEntity childEntity) async {
ThermionEntity entity, ThermionEntity childEntity) async {
var names = <String>[];
var count = await withIntCallback((callback) =>
@@ -518,7 +518,7 @@ class FilamentViewer extends AbstractFilamentViewer {
return names.cast<String>();
}
Future<List<String>> getBoneNames(FilamentEntity entity,
Future<List<String>> getBoneNames(ThermionEntity entity,
{int skinIndex = 0}) async {
var count = get_bone_count(_sceneManager!, entity, skinIndex);
var out = allocator<Pointer<Char>>(count);
@@ -539,7 +539,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<List<String>> getAnimationNames(FilamentEntity entity) async {
Future<List<String>> getAnimationNames(ThermionEntity entity) async {
var animationCount = get_animation_count(_sceneManager!, entity);
var names = <String>[];
var outPtr = allocator<Char>(255);
@@ -557,7 +557,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future<double> getAnimationDuration(
FilamentEntity entity, int animationIndex) async {
ThermionEntity entity, int animationIndex) async {
var duration =
get_animation_duration(_sceneManager!, entity, animationIndex);
@@ -569,7 +569,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future<double> getAnimationDurationByName(
FilamentEntity entity, String name) async {
ThermionEntity entity, String name) async {
var animations = await getAnimationNames(entity);
var index = animations.indexOf(name);
if (index == -1) {
@@ -583,7 +583,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future setMorphAnimationData(
FilamentEntity entity, MorphAnimationData animation,
ThermionEntity entity, MorphAnimationData animation,
{List<String>? targetMeshNames}) async {
var meshNames = await getChildEntityNames(entity, renderableOnly: true);
if (targetMeshNames != null) {
@@ -673,7 +673,7 @@ class FilamentViewer extends AbstractFilamentViewer {
/// Currently, scale is not supported.
///
@override
Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation,
Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation,
{int skinIndex = 0,
double fadeOutInSecs = 0.0,
double fadeInInSecs = 0.0,
@@ -703,7 +703,7 @@ class FilamentViewer extends AbstractFilamentViewer {
var data = allocator<Float>(numFrames * 16);
var bones = await Future.wait(List<Future<FilamentEntity>>.generate(
var bones = await Future.wait(List<Future<ThermionEntity>>.generate(
boneNames.length, (i) => getBone(entity, i)));
for (int i = 0; i < animation.bones.length; i++) {
@@ -767,7 +767,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future<Matrix4> getLocalTransform(FilamentEntity entity) async {
Future<Matrix4> getLocalTransform(ThermionEntity entity) async {
final ptr = allocator<Float>(16);
get_local_transform(_sceneManager!, entity, ptr);
@@ -782,7 +782,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future<Matrix4> getWorldTransform(FilamentEntity entity) async {
Future<Matrix4> getWorldTransform(ThermionEntity entity) async {
final ptr = allocator<Float>(16);
get_world_transform(_sceneManager!, entity, ptr);
@@ -797,7 +797,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future setTransform(FilamentEntity entity, Matrix4 transform) async {
Future setTransform(ThermionEntity entity, Matrix4 transform) async {
final ptr = allocator<Float>(16);
for (int i = 0; i < 16; i++) {
ptr[i] = transform[i];
@@ -809,7 +809,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future updateBoneMatrices(FilamentEntity entity) async {
Future updateBoneMatrices(ThermionEntity entity) async {
var result = await withBoolCallback((cb) {
update_bone_matrices_ffi(_sceneManager!, entity, cb);
});
@@ -821,7 +821,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future<Matrix4> getInverseBindMatrix(FilamentEntity parent, int boneIndex,
Future<Matrix4> getInverseBindMatrix(ThermionEntity parent, int boneIndex,
{int skinIndex = 0}) async {
final ptr = allocator<Float>(16);
@@ -837,7 +837,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future<FilamentEntity> getBone(FilamentEntity parent, int boneIndex,
Future<ThermionEntity> getBone(ThermionEntity parent, int boneIndex,
{int skinIndex = 0}) async {
if (skinIndex != 0) {
throw UnimplementedError("TOOD");
@@ -850,7 +850,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future setBoneTransform(
FilamentEntity entity, int boneIndex, Matrix4 transform,
ThermionEntity entity, int boneIndex, Matrix4 transform,
{int skinIndex = 0}) async {
if (skinIndex != 0) {
throw UnimplementedError("TOOD");
@@ -877,7 +877,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future resetBones(FilamentEntity entity) async {
Future resetBones(ThermionEntity entity) async {
if (_viewer == nullptr) {
throw Exception("No viewer available, ignoring");
}
@@ -893,7 +893,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future removeEntity(FilamentEntity entity) async {
Future removeEntity(ThermionEntity entity) async {
_scene.unregisterEntity(entity);
await withVoidCallback(
@@ -945,7 +945,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future playAnimation(FilamentEntity entity, int index,
Future playAnimation(ThermionEntity entity, int index,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -958,7 +958,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future stopAnimation(FilamentEntity entity, int animationIndex) async {
Future stopAnimation(ThermionEntity entity, int animationIndex) async {
stop_animation(_sceneManager!, entity, animationIndex);
}
@@ -966,7 +966,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future stopAnimationByName(FilamentEntity entity, String name) async {
Future stopAnimationByName(ThermionEntity entity, String name) async {
var animations = await getAnimationNames(entity);
await stopAnimation(entity, animations.indexOf(name));
}
@@ -975,7 +975,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future playAnimationByName(FilamentEntity entity, String name,
Future playAnimationByName(ThermionEntity entity, String name,
{bool loop = false,
bool reverse = false,
bool replaceActive = true,
@@ -1000,7 +1000,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future setAnimationFrame(
FilamentEntity entity, int index, int animationFrame) async {
ThermionEntity entity, int index, int animationFrame) async {
set_animation_frame(_sceneManager!, entity, index, animationFrame);
}
@@ -1012,7 +1012,7 @@ class FilamentViewer extends AbstractFilamentViewer {
set_main_camera(_viewer!);
}
Future<FilamentEntity> getMainCamera() async {
Future<ThermionEntity> getMainCamera() async {
return get_main_camera(_viewer!);
}
@@ -1020,7 +1020,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future setCamera(FilamentEntity entity, String? name) async {
Future setCamera(ThermionEntity entity, String? name) async {
var cameraNamePtr =
name?.toNativeUtf8(allocator: allocator).cast<Char>() ?? nullptr;
var result = set_camera(_viewer!, entity, cameraNamePtr);
@@ -1122,7 +1122,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future moveCameraToAsset(FilamentEntity entity) async {
Future moveCameraToAsset(ThermionEntity entity) async {
move_camera_to_asset(_viewer!, entity);
}
@@ -1170,7 +1170,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future setMaterialColor(FilamentEntity entity, String meshName,
Future setMaterialColor(ThermionEntity entity, String meshName,
int materialIndex, double r, double g, double b, double a) async {
var meshNamePtr = meshName.toNativeUtf8(allocator: allocator).cast<Char>();
var result = set_material_color(
@@ -1185,7 +1185,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future transformToUnitCube(FilamentEntity entity) async {
Future transformToUnitCube(ThermionEntity entity) async {
transform_to_unit_cube(_sceneManager!, entity);
}
@@ -1194,7 +1194,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future setPosition(
FilamentEntity entity, double x, double y, double z) async {
ThermionEntity entity, double x, double y, double z) async {
set_position(_sceneManager!, entity, x, y, z);
}
@@ -1202,7 +1202,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future setRotationQuat(FilamentEntity entity, Quaternion rotation,
Future setRotationQuat(ThermionEntity entity, Quaternion rotation,
{bool relative = false}) async {
set_rotation(_sceneManager!, entity, rotation.radians, rotation.x,
rotation.y, rotation.z, rotation.w);
@@ -1213,7 +1213,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future setRotation(
FilamentEntity entity, double rads, double x, double y, double z) async {
ThermionEntity entity, double rads, double x, double y, double z) async {
var quat = Quaternion.axisAngle(Vector3(x, y, z), rads);
await setRotationQuat(entity, quat);
}
@@ -1222,11 +1222,11 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future setScale(FilamentEntity entity, double scale) async {
Future setScale(ThermionEntity entity, double scale) async {
set_scale(_sceneManager!, entity, scale);
}
Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion rotation,
Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion rotation,
{bool relative = false}) async {
queue_rotation_update(_sceneManager!, entity, rotation.radians, rotation.x,
rotation.y, rotation.z, rotation.w, relative);
@@ -1237,7 +1237,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future queueRotationUpdate(
FilamentEntity entity, double rads, double x, double y, double z,
ThermionEntity entity, double rads, double x, double y, double z,
{bool relative = false}) async {
var quat = Quaternion.axisAngle(Vector3(x, y, z), rads);
await queueRotationUpdateQuat(entity, quat, relative: relative);
@@ -1248,7 +1248,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
@override
Future queuePositionUpdate(
FilamentEntity entity, double x, double y, double z,
ThermionEntity entity, double x, double y, double z,
{bool relative = false}) async {
queue_position_update(_sceneManager!, entity, x, y, z, relative);
}
@@ -1257,7 +1257,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future hide(FilamentEntity entity, String? meshName) async {
Future hide(ThermionEntity entity, String? meshName) async {
final meshNamePtr =
meshName?.toNativeUtf8(allocator: allocator).cast<Char>() ?? nullptr;
if (hide_mesh(_sceneManager!, entity, meshNamePtr) != 1) {}
@@ -1268,7 +1268,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future reveal(FilamentEntity entity, String? meshName) async {
Future reveal(ThermionEntity entity, String? meshName) async {
final meshNamePtr =
meshName?.toNativeUtf8(allocator: allocator).cast<Char>() ?? nullptr;
final result = reveal_mesh(_sceneManager!, entity, meshNamePtr) == 1;
@@ -1282,7 +1282,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
String? getNameForEntity(FilamentEntity entity) {
String? getNameForEntity(ThermionEntity entity) {
final result = get_name_for_entity(_sceneManager!, entity);
if (result == nullptr) {
return null;
@@ -1290,7 +1290,7 @@ class FilamentViewer extends AbstractFilamentViewer {
return result.cast<Utf8>().toDartString();
}
void _onPickResult(FilamentEntity entityId, int x, int y) {
void _onPickResult(ThermionEntity entityId, int x, int y) {
_pickResultController.add((
entity: entityId,
x: (x / _pixelRatio).toDouble(),
@@ -1474,8 +1474,8 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity> getChildEntity(
FilamentEntity parent, String childName) async {
Future<ThermionEntity> getChildEntity(
ThermionEntity parent, String childName) async {
var childNamePtr =
childName.toNativeUtf8(allocator: allocator).cast<Char>();
@@ -1489,13 +1489,13 @@ class FilamentViewer extends AbstractFilamentViewer {
return childEntity;
}
Future<List<FilamentEntity>> getChildEntities(
FilamentEntity parent, bool renderableOnly) async {
Future<List<ThermionEntity>> getChildEntities(
ThermionEntity parent, bool renderableOnly) async {
var count = get_entity_count(_sceneManager!, parent, renderableOnly);
var out = allocator<Int32>(count);
get_entities(_sceneManager!, parent, renderableOnly, out);
var outList =
List.generate(count, (index) => out[index]).cast<FilamentEntity>();
List.generate(count, (index) => out[index]).cast<ThermionEntity>();
allocator.free(out);
return outList;
}
@@ -1504,7 +1504,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<List<String>> getChildEntityNames(FilamentEntity entity,
Future<List<String>> getChildEntityNames(ThermionEntity entity,
{bool renderableOnly = false}) async {
var count = get_entity_count(_sceneManager!, entity, renderableOnly);
var names = <String>[];
@@ -1536,13 +1536,13 @@ class FilamentViewer extends AbstractFilamentViewer {
allocator.free(pathPtr);
}
final _collisions = <FilamentEntity, NativeCallable>{};
final _collisions = <ThermionEntity, NativeCallable>{};
///
///
///
@override
Future addCollisionComponent(FilamentEntity entity,
Future addCollisionComponent(ThermionEntity entity,
{void Function(int entityId1, int entityId2)? callback,
bool affectsTransform = false}) async {
if (_sceneManager == null) {
@@ -1566,7 +1566,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future removeCollisionComponent(FilamentEntity entity) async {
Future removeCollisionComponent(ThermionEntity entity) async {
remove_collision_component(_sceneManager!, entity);
}
@@ -1574,7 +1574,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future addAnimationComponent(FilamentEntity entity) async {
Future addAnimationComponent(ThermionEntity entity) async {
if (!add_animation_component(_sceneManager!, entity)) {
throw Exception("Failed to add animation component");
}
@@ -1583,7 +1583,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
///
Future removeAnimationComponent(FilamentEntity entity) async {
Future removeAnimationComponent(ThermionEntity entity) async {
remove_animation_component(_sceneManager!, entity);
}
@@ -1591,7 +1591,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity> createGeometry(
Future<ThermionEntity> createGeometry(
List<double> vertices, List<int> indices,
{String? materialPath,
PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async {
@@ -1637,7 +1637,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future setParent(FilamentEntity child, FilamentEntity parent) async {
Future setParent(ThermionEntity child, ThermionEntity parent) async {
if (_sceneManager == null) {
throw Exception("Asset manager must be non-null");
}
@@ -1648,7 +1648,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future<FilamentEntity?> getParent(FilamentEntity child) async {
Future<ThermionEntity?> getParent(ThermionEntity child) async {
if (_sceneManager == null) {
throw Exception("Asset manager must be non-null");
}
@@ -1663,7 +1663,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future testCollisions(FilamentEntity entity) async {
Future testCollisions(ThermionEntity entity) async {
test_collisions(_sceneManager!, entity);
}
@@ -1671,7 +1671,7 @@ class FilamentViewer extends AbstractFilamentViewer {
///
///
@override
Future setPriority(FilamentEntity entityId, int priority) async {
Future setPriority(ThermionEntity entityId, int priority) async {
set_priority(_sceneManager!, entityId, priority);
}
}