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

@@ -11,7 +11,7 @@ This is an overview of how the rendering surface is constructed, and how the Flu
|iOS|CVPixelBuffer surface (Metal) + Flutter Texture widget|
|MacOS|CVMetalTexture render target (Metal) + Flutter Texture widget|
On most platforms, we create Filament with a headless swapchain, then render into a (hardware accelerated) texture that Flutter imports into its own widget hierarchy via a Texture widget. This allows the Filament viewport to be transformed/composed completely within the Flutter hierarchy (i.e. you could rotate/scale/translate the FilamentWidget in Flutter if you wanted, or insert other widgets above/below).
On most platforms, we create Filament with a headless swapchain, then render into a (hardware accelerated) texture that Flutter imports into its own widget hierarchy via a Texture widget. This allows the Filament viewport to be transformed/composed completely within the Flutter hierarchy (i.e. you could rotate/scale/translate the ThermionWidget in Flutter if you wanted, or insert other widgets above/below).
Due to performance issues on Windows, we choose a different default approach where Filament renders into its own window, which is then composed with the Flutter window via the system compositor. This only works on Windows 10.

View File

@@ -10,7 +10,7 @@
* added support for parenting one entity to another
* added basic collision detection + callbacks
* added keyboard/mouse widgets + controls
* `createViewer` now `awaits` the insertion of `FilamentWidget` so you no longer need to manually defer calling until after FilamentWidget has been rendered
* `createViewer` now `awaits` the insertion of `ThermionWidget` so you no longer need to manually defer calling until after ThermionWidget has been rendered
* `setCameraRotation` now accepts a quaternion instead of an axis/angle
* instancing is now supported.
* `setBoneTransform` has been removed. To set the transform for a bone, just `addBoneAnimation` with a single frame.
@@ -20,7 +20,7 @@
## 0.6.0
* `createViewer` is no longer called by `FilamentWidget` and must be called manually at least one frame after a FilamentWidget has been inserted into the widget hierarchy.
* `createViewer` is no longer called by `ThermionWidget` and must be called manually at least one frame after a ThermionWidget has been inserted into the widget hierarchy.
## 0.5.0

View File

@@ -84,7 +84,7 @@ class MyApp extends StatelessWidget {
This is a relatively lightweight object, however its constructor will load/bind symbols from the native library. This may momentarily block the UI, so you may wish to structure your app so that this is hidden behind a static widget until it is available.
Next, create an instance of `FilamentWidget` in the widget hierarchy where you want the rendering canvas to appear. This can be sized as large or as small as you want. On most platforms, Flutter widgets can be positioned above or below the `FilamentWidget`.
Next, create an instance of `ThermionWidget` in the widget hierarchy where you want the rendering canvas to appear. This can be sized as large or as small as you want. On most platforms, Flutter widgets can be positioned above or below the `ThermionWidget`.
```
class MyApp extends StatelessWidget {
@@ -97,24 +97,24 @@ class MyApp extends StatelessWidget {
color: Colors.white,
home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[
Container(color:Colors.green, height:100, width:100),
Positioned.fill(top:100, left:100child:FilamentWidget(controller:_filamentController)),
Positioned.fill(top:100, left:100child:ThermionWidget(controller:_filamentController)),
Positioned(right:0, bottom:0, child:Container(color:Colors.purple, height:100, width:100))
])));
}
}
```
When a `FilamentWidget` is added to the widget hierarchy:
1) by default a Container will be rendered with solid red. If you want to change this, pass a widget as the `initial` paramer to the `FilamentWidget` constructor.
2) on the second frame, `FilamentWidget` will pass its dimensions/pixel ratio to the `FilamentController`
When a `ThermionWidget` is added to the widget hierarchy:
1) by default a Container will be rendered with solid red. If you want to change this, pass a widget as the `initial` paramer to the `ThermionWidget` constructor.
2) on the second frame, `ThermionWidget` will pass its dimensions/pixel ratio to the `FilamentController`
3) You can then call `createViewer` to create:
* the rendering surface (on most platforms, a backing texture that will be registered with Flutter for use in a `Texture` widget)
* a rendering thread
* a `FilamentViewer` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController`
4) after an indeterminate number of frames, `FilamentController` will notify `FilamentWidget` when a rendering surface is available the viewport
5) `FilamentWidget` will replace the default `initial` Widget with the viewport (which will initially be solid black or white, depending on your platform).
* a `ThermionViewerFFI` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController`
4) after an indeterminate number of frames, `FilamentController` will notify `ThermionWidget` when a rendering surface is available the viewport
5) `ThermionWidget` will replace the default `initial` Widget with the viewport (which will initially be solid black or white, depending on your platform).
IMPORTANT: there *will* be a delay between adding a `FilamentWidget`, calling `createViewer` and the actual rendering viewport becoming available. This is why we fill `FilamentWidget` with red - to make it abundantly clear that you need to handle this asynchronous delay appropriately. Once `createViewer` has completed, the viewport is available for rendering.
IMPORTANT: there *will* be a delay between adding a `ThermionWidget`, calling `createViewer` and the actual rendering viewport becoming available. This is why we fill `ThermionWidget` with red - to make it abundantly clear that you need to handle this asynchronous delay appropriately. Once `createViewer` has completed, the viewport is available for rendering.
> Currently, the `initial` widget will also be displayed whenever the viewport is resized (including changing orientation on mobile and drag-to-resize on desktop). You probably want to change this from the default red.
@@ -172,12 +172,12 @@ You can also pass a URI to indicate that the glTF file should be loaded from the
var entity = await _filamentController.loadGlb("file:///tmp/bob.glb");
```
The return type `FilamentEntity` is simply an integer handle that be used to manipulate the entity in the scene. For example, to remove the asset:
The return type `ThermionEntity` is simply an integer handle that be used to manipulate the entity in the scene. For example, to remove the asset:
```
await _filamentController.removeEntity(entity);
entity = null;
```
> Removing an entity from the scene will invalidate the corresponding `FilamentEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `FilamentEntity` does not invalidate/change any other `FilamentEntity` handles; you can continue to safely manipulate these via the `FilamentController`.
> Removing an entity from the scene will invalidate the corresponding `ThermionEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `ThermionEntity` does not invalidate/change any other `ThermionEntity` handles; you can continue to safely manipulate these via the `FilamentController`.
### Lighting
@@ -202,11 +202,11 @@ To set the world space position of the asset:
_filamentController.setPositon(entity, 1.0, 1.0, 1.0);
```
On desktop, you can also click any renderable object in the viewport to retrieve its associated FilamentEntity (see below).
On desktop, you can also click any renderable object in the viewport to retrieve its associated ThermionEntity (see below).
### Camera movement
To enable mouse/swipe navigation through the scene, wrap the `FilamentWidget` inside a `FilamentGestureDetector`:
To enable mouse/swipe navigation through the scene, wrap the `ThermionWidget` inside a `FilamentGestureDetector`:
```
class MyApp extends StatelessWidget {
@@ -220,7 +220,7 @@ class MyApp extends StatelessWidget {
home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[
Positioned.fill(child:FilamentGestureDetector(
controller: _filamentController,
child:FilamentWidget(
child:ThermionWidget(
controller:_filamentController
))),
Positioned(right:0, bottom:0, child:Container(color:Colors.purple, height:100, width:100))
@@ -253,7 +253,7 @@ await _filamentController.setCamera(asset, null); // pass null to load the first
### Picking entities
On desktop, left-clicking an object in the viewport will retrieve the FilamentEntity for the top-most renderable instance at that cursor position (if any).
On desktop, left-clicking an object in the viewport will retrieve the ThermionEntity for the top-most renderable instance at that cursor position (if any).
Note this is an asynchronous operation, so you will need to subscribe to the [pickResult] stream on your [FilamentController] to do something with the result.
@@ -269,7 +269,7 @@ class _MyAppState extends State<MyApp> {
@override
void initState() {
_filamentController.pickResult.listen((FilamentEntity filamentEntity) async {
_filamentController.pickResult.listen((ThermionEntity filamentEntity) async {
var entityName = _filamentController.getNameForEntity(filamentEntity);
await showDialog(builder:(ctx) {
return Container(child:Text("You clicked $entityName"));
@@ -284,7 +284,7 @@ class _MyAppState extends State<MyApp> {
home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[
Positioned.fill(child:FilamentGestureDetector(
controller: _filamentController,
child:FilamentWidget(
child:ThermionWidget(
controller:_filamentController
))),
])));

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);
}
}

View File

@@ -36,7 +36,7 @@
#include "SceneManager.hpp"
#include "ThreadPool.hpp"
namespace thermion_flutter
namespace thermion_filament
{
typedef std::chrono::time_point<std::chrono::high_resolution_clock> time_point_t;
@@ -167,7 +167,7 @@ namespace thermion_flutter
Scene *_scene = nullptr;
View *_view = nullptr;
Engine *_engine = nullptr;
thermion_flutter::ThreadPool *_tp = nullptr;
thermion_filament::ThreadPool *_tp = nullptr;
Renderer *_renderer = nullptr;
RenderTarget *_rt = nullptr;
Texture *_rtColor = nullptr;

View File

@@ -9,7 +9,7 @@
using namespace std::chrono_literals;
#endif
namespace thermion_flutter
namespace thermion_filament
{
struct ResourceLoaderWrapperImpl : public ResourceLoaderWrapper

View File

@@ -23,7 +23,7 @@
#include "tsl/robin_map.h"
namespace thermion_flutter
namespace thermion_filament
{
typedef int32_t EntityId;

View File

@@ -5,7 +5,7 @@
#include <cassert>
#include <cstring>
namespace thermion_flutter {
namespace thermion_filament {
//

View File

@@ -15,7 +15,7 @@
#ifndef _THREADPOOL_HPP
#define _THREADPOOL_HPP
namespace thermion_flutter {
namespace thermion_filament {
class ThreadPool {
std::vector<std::thread> pool;

View File

@@ -24,7 +24,7 @@
#include <utils/NameComponentManager.h>
template class std::vector<float>;
namespace thermion_flutter
namespace thermion_filament
{
using namespace filament;
using namespace filament::gltfio;

View File

@@ -8,7 +8,7 @@
#include "gltfio/FilamentInstance.h"
#include "Log.hpp"
namespace thermion_flutter
namespace thermion_filament
{
typedef void(*CollisionCallback)(int32_t entityId1, int32_t entityId2) ;

View File

@@ -11,7 +11,7 @@
#include <math/norm.h>
#include "Log.hpp"
namespace thermion_flutter {
namespace thermion_filament {
class FileMaterialProvider : public filament::gltfio::MaterialProvider {

View File

@@ -103,7 +103,7 @@ namespace filament
class LightManager;
} // namespace filament
namespace thermion_flutter
namespace thermion_filament
{
using namespace filament;
@@ -469,7 +469,7 @@ namespace thermion_flutter
void FilamentViewer::loadPngTexture(string path, ResourceBuffer rb)
{
thermion_flutter::StreamBufferAdapter sb((char *)rb.data, (char *)rb.data + rb.size);
thermion_filament::StreamBufferAdapter sb((char *)rb.data, (char *)rb.data + rb.size);
std::istream inputStream(&sb);
@@ -1204,7 +1204,7 @@ namespace thermion_flutter
// std::lock_guard lock(_recordingMutex);
if (recording)
{
_tp = new thermion_flutter::ThreadPool(16);
_tp = new thermion_filament::ThreadPool(16);
_recordingStartTime = std::chrono::high_resolution_clock::now();
}
else
@@ -1559,4 +1559,4 @@ namespace thermion_flutter
return Entity::smuggle(renderable);
}
} // namespace thermion_flutter
} // namespace thermion_filament

View File

@@ -33,7 +33,7 @@ extern "C"
#include "material/image.h"
}
namespace thermion_flutter
namespace thermion_filament
{
using namespace std::chrono;
@@ -2113,4 +2113,4 @@ namespace thermion_flutter
out[2] = Entity::smuggle(_gizmoZ);
}
} // namespace thermion_flutter
} // namespace thermion_filament

View File

@@ -3,7 +3,7 @@
#include <cassert>
#include <cstring>
namespace thermion_flutter {
namespace thermion_filament {
class StreamBufferAdapter : public std::streambuf
{

View File

@@ -13,7 +13,7 @@
#include <thread>
#include <functional>
using namespace thermion_flutter;
using namespace thermion_filament;
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
@@ -753,7 +753,7 @@ extern "C"
Log("Dummy called");
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr)
EMSCRIPTEN_KEEPALIVE void thermion_filament_free(void *ptr)
{
free(ptr);
}

View File

@@ -19,7 +19,6 @@ extern "C"
#endif
#include "ThermionDartFFIApi.h"
#include "FilamentViewer.hpp"
#include "Log.hpp"
#include "ThreadPool.hpp"
@@ -30,7 +29,7 @@ extern "C"
#include <thread>
#include <stdlib.h>
using namespace thermion_flutter;
using namespace thermion_filament;
using namespace std::chrono_literals;
#include <time.h>

View File

@@ -49,7 +49,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY build/out)
add_executable(${MODULE_NAME}
"${CMAKE_CURRENT_SOURCE_DIR}/../src/SceneManager.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/../src/FilamentViewer.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionViewerFFI.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartApi.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartFFIApi.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/../src/StreamBufferAdapter.cpp"

View File

@@ -60,56 +60,56 @@ extern "C"
// return 0;
// }
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_load_resource_callback(void* data, int32_t length, void* context) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_load_resource_callback(void* data, int32_t length, void* context) {
((PendingCall*)context)->HandleResponse(data, length);
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set(char* ptr, int32_t offset, int32_t val) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set(char* ptr, int32_t offset, int32_t val) {
memset(ptr+offset, val, 1);
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_float(float* ptr, int32_t offset, float val) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_float(float* ptr, int32_t offset, float val) {
ptr[offset] = val;
}
EMSCRIPTEN_KEEPALIVE float thermion_flutter_web_get_float(float* ptr, int32_t offset) {
EMSCRIPTEN_KEEPALIVE float thermion_filament_web_get_float(float* ptr, int32_t offset) {
return ptr[offset];
}
EMSCRIPTEN_KEEPALIVE double thermion_flutter_web_get_double(double* ptr, int32_t offset) {
EMSCRIPTEN_KEEPALIVE double thermion_filament_web_get_double(double* ptr, int32_t offset) {
return ptr[offset];
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_double(double* ptr, int32_t offset, double value) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_double(double* ptr, int32_t offset, double value) {
ptr[offset] = value;
}
EMSCRIPTEN_KEEPALIVE int32_t thermion_flutter_web_get_int32(int32_t* ptr, int32_t offset) {
EMSCRIPTEN_KEEPALIVE int32_t thermion_filament_web_get_int32(int32_t* ptr, int32_t offset) {
return ptr[offset];
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_int32(int32_t* ptr, int32_t offset, int32_t value) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_int32(int32_t* ptr, int32_t offset, int32_t value) {
ptr[offset] = value;
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_pointer(void** ptr, int32_t offset, void* val) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_pointer(void** ptr, int32_t offset, void* val) {
ptr[offset] = val;
}
EMSCRIPTEN_KEEPALIVE void* thermion_flutter_web_get_pointer(void** ptr, int32_t offset) {
EMSCRIPTEN_KEEPALIVE void* thermion_filament_web_get_pointer(void** ptr, int32_t offset) {
return ptr[offset];
}
EMSCRIPTEN_KEEPALIVE char thermion_flutter_web_get(char* ptr, int32_t offset) {
EMSCRIPTEN_KEEPALIVE char thermion_filament_web_get(char* ptr, int32_t offset) {
return ptr[offset];
}
EMSCRIPTEN_KEEPALIVE void* thermion_flutter_web_allocate(int32_t size) {
EMSCRIPTEN_KEEPALIVE void* thermion_filament_web_allocate(int32_t size) {
void* allocated = (void*)calloc(size, 1);
return allocated;
}
EMSCRIPTEN_KEEPALIVE long thermion_flutter_web_get_address(void** out) {
EMSCRIPTEN_KEEPALIVE long thermion_filament_web_get_address(void** out) {
return (long)*out;
}
@@ -149,7 +149,7 @@ extern "C"
int _lastResourceId = 0;
ResourceBuffer thermion_flutter_web_load_resource(const char* path)
ResourceBuffer thermion_filament_web_load_resource(const char* path)
{
// ideally we should bounce the call to Flutter then wait for callback
// this isn't working for large assets though - seems like it's deadlocked
@@ -212,19 +212,19 @@ extern "C"
return ResourceBuffer { data, numBytes, _lastResourceId } ;
}
void thermion_flutter_web_free_resource(ResourceBuffer rb) {
void thermion_filament_web_free_resource(ResourceBuffer rb) {
free((void*)rb.data);
}
EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_free(void* ptr) {
EMSCRIPTEN_KEEPALIVE void thermion_filament_web_free(void* ptr) {
free(ptr);
}
EMSCRIPTEN_KEEPALIVE void* thermion_dart_web_get_resource_loader_wrapper() {
ResourceLoaderWrapper *rlw = (ResourceLoaderWrapper *)malloc(sizeof(ResourceLoaderWrapper));
rlw->loadResource = thermion_flutter_web_load_resource;
rlw->loadResource = thermion_filament_web_load_resource;
rlw->loadFromOwner = nullptr;
rlw->freeResource = thermion_flutter_web_free_resource;
rlw->freeResource = thermion_filament_web_free_resource;
rlw->freeFromOwner = nullptr;
rlw->loadToOut = nullptr;
rlw->owner = nullptr;

View File

@@ -66,7 +66,7 @@ void main() async {
DartResourceLoader.freeResource);
resourceLoader.ref.freeResource = freeResource.nativeFunction;
var viewer = FilamentViewer(resourceLoader: resourceLoader.cast<Void>());
var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast<Void>());
await viewer.initialized;
await viewer.createSwapChain(500, 500);