diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart index 9e4d81b8..5bfefb72 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart @@ -33,10 +33,16 @@ class FFIAsset extends ThermionAsset { /// late final ThermionEntity entity; + /// + /// + /// FFIAsset(this.asset, this.app, {this.isInstance = false}) { entity = SceneAsset_getEntity(asset); } + /// + /// + /// @override Future> getChildEntities() async { var count = SceneAsset_getChildEntityCount(asset); @@ -45,6 +51,22 @@ class FFIAsset extends ThermionAsset { return children; } + /// + /// + /// + @override + Future getChildEntity( + FFIAsset asset, String childName) async { + final childEntities = await getChildEntities(); + for (final entity in childEntities) { + var name = NameComponentManager_getName(app.nameComponentManager, entity); + if (name == childName) { + return entity; + } + } + return null; + } + @override Future getInstance(int index) async { if (isInstance) { @@ -141,7 +163,8 @@ class FFIAsset extends ThermionAsset { } var sourceMaterialInstance = FFIMaterialInstance( RenderableManager_getMaterialInstanceAt( - app.renderableManager, targetEntity, 0), app); + app.renderableManager, targetEntity, 0), + app); await sourceMaterialInstance.setStencilWriteEnabled(true); await sourceMaterialInstance.setDepthWriteEnabled(true); @@ -173,7 +196,7 @@ class FFIAsset extends ThermionAsset { await highlightMaterialInstance.setStencilReferenceValue(1); RenderableManager_setPriority(app.renderableManager, targetEntity, 0); - + TransformManager_setParent( app.transformManager, _highlight!.entity, entity, false); } @@ -328,6 +351,9 @@ class FFIAsset extends ThermionAsset { } } + /// + /// + /// Future setCastShadows(bool castShadows) async { RenderableManager_setCastShadows( app.renderableManager, this.entity, castShadows); @@ -337,6 +363,9 @@ class FFIAsset extends ThermionAsset { } } + /// + /// + /// Future setReceiveShadows(bool receiveShadows) async { RenderableManager_setReceiveShadows( app.renderableManager, this.entity, receiveShadows); @@ -345,4 +374,22 @@ class FFIAsset extends ThermionAsset { app.renderableManager, entity, receiveShadows); } } + + /// + /// + /// + Future isCastShadowsEnabled(ThermionEntity entity) async { + return RenderableManager_isShadowCaster(app.renderableManager, entity); + } + + /// + /// + /// + Future isReceiveShadowsEnabled(ThermionEntity entity) async { + return RenderableManager_isShadowReceiver(app.renderableManager, entity); + } + + Future transformToUnitCube() async { + SceneAsset_transformToUnitCube(asset); + } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart index a93f4eea..e1fb9ac4 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_camera.dart @@ -1,37 +1,61 @@ import 'dart:ffi'; +import 'dart:typed_data'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_filament_app.dart'; +import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart'; import 'package:thermion_dart/src/viewer/src/shared_types/layers.dart'; import 'package:vector_math/vector_math_64.dart'; - import '../../../../utils/src/matrix.dart'; import '../../thermion_viewer_base.dart'; -import 'thermion_dart.g.dart' as g; class FFICamera extends Camera { - final Pointer camera; + final Pointer camera; final FFIFilamentApp app; late ThermionEntity _entity; FFICamera(this.camera, this.app) { - _entity = g.Camera_getEntity(camera); + _entity = Camera_getEntity(camera); } + /// + /// + /// @override Future setProjectionMatrixWithCulling( Matrix4 projectionMatrix, double near, double far) async { - g.Camera_setCustomProjectionWithCulling( + Camera_setCustomProjectionWithCulling( camera, matrix4ToDouble4x4(projectionMatrix), near, far); } + /// + /// + /// Future getModelMatrix() async { - return double4x4ToMatrix4(g.Camera_getModelMatrix(camera)); + return double4x4ToMatrix4(Camera_getModelMatrix(camera)); + } + + /// + /// + /// + @override + Future getProjectionMatrix() async { + var matrixStruct = Camera_getProjectionMatrix(camera); + return double4x4ToMatrix4(matrixStruct); + } + + /// + /// + /// + @override + Future getCullingProjectionMatrix() async { + var matrixStruct = Camera_getCullingProjectionMatrix(camera); + return double4x4ToMatrix4(matrixStruct); } @override Future setTransform(Matrix4 transform) async { - var entity = g.Camera_getEntity(camera); - g.TransformManager_setTransform( + var entity = Camera_getEntity(camera); + TransformManager_setTransform( app.transformManager, entity, matrix4ToDouble4x4(transform)); } @@ -41,17 +65,23 @@ class FFICamera extends Camera { double far = kFar, double aspect = 1.0, double focalLength = kFocalLength}) async { - g.Camera_setLensProjection(camera, near, far, aspect, focalLength); + Camera_setLensProjection(camera, near, far, aspect, focalLength); } + /// + /// + /// @override ThermionEntity getEntity() { return _entity; } + /// + /// + /// @override Future setModelMatrix(Matrix4 matrix) async { - g.Camera_setModelMatrix(camera, matrix4ToDouble4x4(matrix)); + Camera_setModelMatrix(camera, matrix4ToDouble4x4(matrix)); } @override @@ -64,30 +94,60 @@ class FFICamera extends Camera { @override int get hashCode => camera.hashCode; + /// + /// + /// @override Future getCullingFar() async { - return g.Camera_getCullingFar(camera); + return Camera_getCullingFar(camera); } + /// + /// + /// @override Future getNear() async { - return g.Camera_getNear(camera); + return Camera_getNear(camera); } + /// + /// + /// @override Future getFocalLength() async { - return g.Camera_getFocalLength(camera); + return Camera_getFocalLength(camera); + } + + /// + /// + /// + Future getFrustum() async { + var out = Float64List(24); + Camera_getFrustum(camera, out.address); + + var frustum = Frustum(); + frustum.plane0.setFromComponents(out[0], out[1], out[2], out[3]); + frustum.plane1.setFromComponents(out[4], out[5], out[6], out[7]); + frustum.plane2.setFromComponents(out[8], out[9], out[10], out[11]); + frustum.plane3.setFromComponents(out[12], out[13], out[14], out[15]); + frustum.plane4.setFromComponents(out[16], out[17], out[18], out[19]); + frustum.plane5.setFromComponents(out[20], out[21], out[22], out[23]); + return frustum; } @override Future getViewMatrix() async { - return double4x4ToMatrix4(g.Camera_getViewMatrix(camera)); + return double4x4ToMatrix4(Camera_getViewMatrix(camera)); } @override Future setProjection(Projection projection, double left, double right, double bottom, double top, double near, double far) async { - var pType = g.Projection.values[projection.index]; - g.Camera_setProjection(camera, pType, left, right, bottom, top, near, far); + Camera_setProjection(camera, TProjection.values[projection.index], left, + right, bottom, top, near, far); + } + + Future destroy() async { + throw UnimplementedError(); } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart index 5a1dfb5d..82d2daf6 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart @@ -152,4 +152,17 @@ class FFIFilamentApp extends FilamentApp { return FFIRenderTarget(renderTarget, this); } + + // /// + // /// + // /// + // Future createRenderTarget(int width, int height, + // {covariant FFITexture? color, covariant FFITexture? depth}) async { + // final renderTarget = await withPointerCallback((cb) { + // RenderTarget_createRenderThread(app.engine, width, height, + // color?.pointer ?? nullptr, depth?.pointer ?? nullptr, cb); + // }); + + // return FFIRenderTarget(renderTarget, app); + // } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart index 11c6da82..27d40b3d 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_gizmo.dart @@ -21,7 +21,8 @@ class FFIGizmo extends FFIAsset implements GizmoAsset { } bool isNonPickable(ThermionEntity entity) { - return SceneManager_isGridEntity(sceneManager, entity); + throw UnimplementedError(); + // return SceneManager_isGridEntity(sceneManager, entity); } bool isGizmoEntity(ThermionEntity entity) => gizmoEntities.contains(entity); @@ -29,10 +30,7 @@ class FFIGizmo extends FFIAsset implements GizmoAsset { FFIGizmo( this._view, super.pointer, - super.sceneManager, - super.renderableManager, - super.unlitMaterialProvider, - super.viewer, + super.app, this.gizmoEntities) { _nativeCallback = NativeCallable.listener(_onPickResult); @@ -60,17 +58,17 @@ class FFIGizmo extends FFIAsset implements GizmoAsset { final viewport = await _view.getViewport(); y = viewport.height - y; - Gizmo_pick(pointer.cast(), x, y, _nativeCallback.nativeFunction); + Gizmo_pick(asset.cast(), x, y, _nativeCallback.nativeFunction); } @override Future highlight(Axis axis) async { - Gizmo_unhighlight(pointer.cast()); - Gizmo_highlight(pointer.cast(), TGizmoAxis.values[axis.index]); + Gizmo_unhighlight(asset.cast()); + Gizmo_highlight(asset.cast(), TGizmoAxis.values[axis.index]); } @override Future unhighlight() async { - Gizmo_unhighlight(pointer.cast()); + Gizmo_unhighlight(asset.cast()); } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart index 20aabdac..f406283f 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart @@ -2,7 +2,7 @@ import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_filament_app.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_render_target.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_scene.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_swapchain.dart'; -import 'package:thermion_dart/src/viewer/src/shared_types/scene.dart'; +import 'package:thermion_dart/src/viewer/src/shared_types/layers.dart'; import 'package:thermion_dart/src/viewer/src/shared_types/shared_types.dart'; import 'callbacks.dart'; import 'ffi_camera.dart'; @@ -52,9 +52,8 @@ class FFIView extends View { @override Future getCamera() async { - final transformManager = Engine_getTransformManager(app.engine); final cameraPtr = View_getCamera(view); - return FFICamera(cameraPtr, app.engine, transformManager); + return FFICamera(cameraPtr, app); } @override @@ -85,7 +84,7 @@ class FFIView extends View { @override Future setToneMapper(ToneMapper mapper) async { - View_setToneMappingRenderThread(view, app.engine, mapper.index); + View_setToneMappingRenderThread(view, app.engine, TToneMapping.values[mapper.index].value); } Future setStencilBufferEnabled(bool enabled) async { @@ -112,4 +111,9 @@ class FFIView extends View { Future setScene(covariant FFIScene scene) async { await withVoidCallback((cb) => View_setScene(view, scene.scene)); } + + @override + Future setLayerVisibility(VisibilityLayers layer, bool visible) async { + View_setLayerEnabled(view, layer.value, visible); + } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart index 3828c8c4..aef545d6 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart @@ -917,7 +917,7 @@ external void _View_setToneMapping( void View_setToneMapping( ffi.Pointer tView, ffi.Pointer tEngine, - ToneMapping toneMapping, + TToneMapping toneMapping, ) => _View_setToneMapping( tView, @@ -1019,6 +1019,26 @@ external void IndirectLight_setRotation( ffi.Pointer rotation, ); +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedInt)>(symbol: "Gizmo_create", isLeaf: true) +external ffi.Pointer _Gizmo_create( + ffi.Pointer tEngine, + ffi.Pointer tView, + int tGizmoType, +); + +ffi.Pointer Gizmo_create( + ffi.Pointer tEngine, + ffi.Pointer tView, + TGizmoType tGizmoType, +) => + _Gizmo_create( + tEngine, + tView, + tGizmoType.value, + ); + @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, GizmoPickCallback)>(isLeaf: true) @@ -1113,135 +1133,135 @@ external void Scene_addFilamentAsset( ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) -external int set_camera_exposure( - ffi.Pointer camera, + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) +external void Camera_setExposure( + ffi.Pointer camera, double aperture, double shutterSpeed, double sensitivity, ); -@ffi.Native, ffi.Int)>(isLeaf: true) -external int set_camera_model_matrix( - ffi.Pointer camera, - int matrix, +@ffi.Native, double4x4)>(isLeaf: true) +external void Camera_setModelMatrix( + ffi.Pointer camera, + double4x4 matrix, ); -@ffi.Native(symbol: "double4x4") -external int double4x41; +@ffi.Native)>(isLeaf: true) +external double4x4 Camera_getModelMatrix( + ffi.Pointer camera, +); -@ffi.Native Function(ffi.Pointer)>(isLeaf: true) -external ffi.Pointer get_camera_frustum( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external double4x4 Camera_getViewMatrix( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 Camera_getProjectionMatrix( + ffi.Pointer camera, +); + +@ffi.Native)>(isLeaf: true) +external double4x4 Camera_getCullingProjectionMatrix( + ffi.Pointer camera, +); + +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void Camera_getFrustum( + ffi.Pointer camera, + ffi.Pointer out, ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, ffi.Int, ffi.Double, ffi.Double)>(isLeaf: true) -external int set_camera_projection_matrix( - ffi.Pointer camera, - int matrix, + ffi.Void Function( + ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) +external void Camera_setProjectionMatrix( + ffi.Pointer camera, + double4x4 matrix, double near, double far, ); @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, - ffi.Double, ffi.Int)>(isLeaf: true) -external int set_camera_projection_from_fov( - ffi.Pointer camera, + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, + ffi.Double, ffi.Bool)>(isLeaf: true) +external void Camera_setProjectionFromFov( + ffi.Pointer camera, double fovInDegrees, double aspect, double near, double far, - int horizontal, + bool horizontal, ); -@ffi.Native)>(isLeaf: true) -external int get_camera_focal_length( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external double Camera_getFocalLength( + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) -external int Camera_getFocalLength( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external int Camera_getNear( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external int Camera_getCullingFar( - ffi.Pointer camera, -); - -@ffi.Native, ffi.Int, ffi.Int, ffi.Int)>( +@ffi.Native, double3, double3, double3)>( isLeaf: true) -external int Camera_lookAt( - ffi.Pointer camera, - int eye, - int focus, - int up, +external void Camera_lookAt( + ffi.Pointer camera, + double3 eye, + double3 focus, + double3 up, ); -@ffi.Native)>(isLeaf: true) -external int get_camera_near( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external double Camera_getNear( + ffi.Pointer camera, ); -@ffi.Native)>(isLeaf: true) -external int get_camera_culling_far( - ffi.Pointer camera, +@ffi.Native)>(isLeaf: true) +external double Camera_getCullingFar( + ffi.Pointer camera, ); -@ffi.Native, ffi.Int)>(isLeaf: true) -external int get_camera_fov( - ffi.Pointer camera, - int horizontal, +@ffi.Native, ffi.Bool)>(isLeaf: true) +external double Camera_getFov( + ffi.Pointer camera, + bool horizontal, ); -@ffi.Native, ffi.Float)>(isLeaf: true) -external int set_camera_focus_distance( - ffi.Pointer camera, +@ffi.Native, ffi.Float)>(isLeaf: true) +external void Camera_setFocusDistance( + ffi.Pointer camera, double focusDistance, ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, ffi.Int, ffi.Double, ffi.Double)>(isLeaf: true) -external int Camera_setCustomProjectionWithCulling( - ffi.Pointer camera, - int projectionMatrix, + ffi.Void Function( + ffi.Pointer, double4x4, ffi.Double, ffi.Double)>(isLeaf: true) +external void Camera_setCustomProjectionWithCulling( + ffi.Pointer camera, + double4x4 projectionMatrix, double near, double far, ); -@ffi.Native, ffi.Int)>(isLeaf: true) -external int Camera_setModelMatrix( - ffi.Pointer camera, - int modelMatrix, -); - @ffi.Native< - ffi.Int Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true) -external int Camera_setLensProjection( - ffi.Pointer camera, +external void Camera_setLensProjection( + ffi.Pointer camera, double near, double far, double aspect, double focalLength, ); -@ffi.Native(symbol: "EntityId") -external int EntityId1; +@ffi.Native)>(isLeaf: true) +external int Camera_getEntity( + ffi.Pointer camera, +); @ffi.Native< - ffi.Int Function( - ffi.Pointer, + ffi.Void Function( + ffi.Pointer, ffi.UnsignedInt, ffi.Double, ffi.Double, @@ -1249,8 +1269,8 @@ external int EntityId1; ffi.Double, ffi.Double, ffi.Double)>(symbol: "Camera_setProjection", isLeaf: true) -external int _Camera_setProjection( - ffi.Pointer tCamera, +external void _Camera_setProjection( + ffi.Pointer tCamera, int projection, double left, double right, @@ -1260,9 +1280,9 @@ external int _Camera_setProjection( double far, ); -int Camera_setProjection( - ffi.Pointer tCamera, - Projection projection, +void Camera_setProjection( + ffi.Pointer tCamera, + TProjection projection, double left, double right, double bottom, @@ -1450,6 +1470,11 @@ external void RenderLoop_create(); @ffi.Native(isLeaf: true) external void RenderLoop_destroy(); +@ffi.Native)>(isLeaf: true) +external void RenderLoop_requestAnimationFrame( + ffi.Pointer onComplete, +); + @ffi.Native, ffi.Uint64)>( isLeaf: true) external void RenderTicker_renderRenderThread( @@ -1859,7 +1884,7 @@ external void Material_createInstanceRenderThread( external void View_setToneMappingRenderThread( ffi.Pointer tView, ffi.Pointer tEngine, - int thermion, + int toneMapping, ); @ffi.Native, ffi.Bool, ffi.Double)>( @@ -2692,16 +2717,6 @@ external void TextureSampler_destroyRenderThread( ffi.Pointer> onComplete, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - isLeaf: true) -external void update_bone_matrices_render_thread( - ffi.Pointer sceneManager, - int asset, - ffi.Pointer> callback, -); - @ffi.Native< ffi.Void Function( ffi.Pointer, @@ -2790,364 +2805,6 @@ external void Scene_addFilamentAssetRenderThread( ffi.Pointer> callback, ); -@ffi.Native)>(isLeaf: true) -external double4x4 get_camera_model_matrix( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external double4x4 get_camera_view_matrix( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external double4x4 get_camera_projection_matrix( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external double4x4 get_camera_culling_projection_matrix( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external double4x4 Camera_getViewMatrix( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external double4x4 Camera_getModelMatrix( - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external int Camera_getEntity( - ffi.Pointer camera, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.UnsignedInt)>(symbol: "SceneManager_createGizmo", isLeaf: true) -external ffi.Pointer _SceneManager_createGizmo( - ffi.Pointer tSceneManager, - ffi.Pointer tView, - ffi.Pointer tScene, - int tGizmoType, -); - -ffi.Pointer SceneManager_createGizmo( - ffi.Pointer tSceneManager, - ffi.Pointer tView, - ffi.Pointer tScene, - TGizmoType tGizmoType, -) => - _SceneManager_createGizmo( - tSceneManager, - tView, - tScene, - tGizmoType.value, - ); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Pointer, - ffi.Int, - ffi.Int, - ffi.Pointer>, - ffi.Int, - ffi.Bool)>(isLeaf: true) -external ffi.Pointer SceneManager_createGeometry( - ffi.Pointer sceneManager, - ffi.Pointer vertices, - int numVertices, - ffi.Pointer normals, - int numNormals, - ffi.Pointer uvs, - int numUvs, - ffi.Pointer indices, - int numIndices, - int primitiveType, - ffi.Pointer> materialInstances, - int materialInstanceCount, - bool keepData, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer - SceneManager_getUbershaderMaterialProvider( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer SceneManager_getUnlitMaterialProvider( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer - SceneManager_createUnlitMaterialInstance( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer - SceneManager_createUnlitFixedSizeMaterialInstance( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer, ffi.Int)>(isLeaf: true) -external void SceneManager_queueTransformUpdates( - ffi.Pointer sceneManager, - ffi.Pointer entities, - ffi.Pointer transforms, - int numEntities, -); - -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, EntityId, - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer SceneManager_findCameraByName( - ffi.Pointer tSceneManager, - int entity, - ffi.Pointer name, -); - -@ffi.Native, EntityId, ffi.Int)>( - isLeaf: true) -external void SceneManager_setVisibilityLayer( - ffi.Pointer tSceneManager, - int entity, - int layer, -); - -@ffi.Native Function(ffi.Pointer)>( - isLeaf: true) -external ffi.Pointer SceneManager_getScene( - ffi.Pointer tSceneManager, -); - -@ffi.Native Function(ffi.Pointer)>( - isLeaf: true) -external ffi.Pointer SceneManager_createCamera( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>(isLeaf: true) -external void SceneManager_destroyCamera( - ffi.Pointer sceneManager, - ffi.Pointer camera, -); - -@ffi.Native)>(isLeaf: true) -external int SceneManager_getCameraCount( - ffi.Pointer sceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, ffi.Size)>(isLeaf: true) -external ffi.Pointer SceneManager_getCameraAt( - ffi.Pointer sceneManager, - int index, -); - -@ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer)>(isLeaf: true) -external void SceneManager_destroyMaterialInstance( - ffi.Pointer sceneManager, - ffi.Pointer instance, -); - -@ffi.Native, EntityId)>(isLeaf: true) -external Aabb3 SceneManager_getRenderableBoundingBox( - ffi.Pointer tSceneManager, - int entity, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external int SceneManager_addToScene( - ffi.Pointer tSceneManager, - int entity, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external int SceneManager_removeFromScene( - ffi.Pointer tSceneManager, - int entity, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external void SceneManager_transformToUnitCube( - ffi.Pointer sceneManager, - int asset, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Size, - ffi.Int, - ffi.Bool, - ffi.Int, - ffi.Int, - ffi.Bool)>(isLeaf: true) -external ffi.Pointer SceneManager_loadGlbFromBuffer( - ffi.Pointer tSceneManager, - ffi.Pointer arg1, - int length, - int numInstances, - bool keepData, - int priority, - int layer, - bool loadResourcesAsync, -); - -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Int, ffi.Bool)>(isLeaf: true) -external ffi.Pointer SceneManager_loadGlb( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - int numInstances, - bool keepData, -); - -@ffi.Native< - ffi.Pointer Function(ffi.Pointer, - ffi.Pointer, ffi.Pointer, ffi.Bool)>(isLeaf: true) -external ffi.Pointer SceneManager_loadGltf( - ffi.Pointer sceneManager, - ffi.Pointer assetPath, - ffi.Pointer relativePath, - bool keepData, -); - -@ffi.Native< - EntityId Function( - ffi.Pointer, - ffi.Uint8, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Float, - ffi.Bool)>(isLeaf: true) -external int SceneManager_addLight( - ffi.Pointer tSceneManager, - int type, - double colour, - double intensity, - double posX, - double posY, - double posZ, - double dirX, - double dirY, - double dirZ, - double falloffRadius, - double spotLightConeInner, - double spotLightConeOuter, - double sunAngularRadius, - double sunHaloSize, - double sunHaloFallof, - bool shadows, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external void SceneManager_removeLight( - ffi.Pointer tSceneManager, - int entityId, -); - -@ffi.Native)>(isLeaf: true) -external void SceneManager_destroyLights( - ffi.Pointer tSceneManager, -); - -@ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>(isLeaf: true) -external void SceneManager_destroyAsset( - ffi.Pointer tSceneManager, - ffi.Pointer sceneAsset, -); - -@ffi.Native)>(isLeaf: true) -external void SceneManager_destroyAssets( - ffi.Pointer tSceneManager, -); - -@ffi.Native)>(isLeaf: true) -external void SceneManager_destroyAll( - ffi.Pointer tSceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer SceneManager_getAnimationManager( - ffi.Pointer tSceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer)>(isLeaf: true) -external ffi.Pointer - SceneManager_getNameComponentManager( - ffi.Pointer tSceneManager, -); - -@ffi.Native< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer)>(isLeaf: true) -external ffi.Pointer SceneManager_createGrid( - ffi.Pointer tSceneManager, - ffi.Pointer tMaterial, -); - -@ffi.Native, EntityId)>( - isLeaf: true) -external bool SceneManager_isGridEntity( - ffi.Pointer tSceneManager, - int entityId, -); - @ffi.Native< ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer)>(isLeaf: true) @@ -3158,15 +2815,6 @@ external void RenderableManager_setMaterialInstanceAt( ffi.Pointer tMaterialInstance, ); -@ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) -external void RenderableManager_setPriority( - ffi.Pointer tRenderableManager, - int entityId, - int priority, -); - @ffi.Native< ffi.Pointer Function( ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) @@ -3250,6 +2898,24 @@ external Aabb3 RenderableManager_getAabb( int entityId, ); +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Uint8)>(isLeaf: true) +external void RenderableManager_setVisibilityLayer( + ffi.Pointer tRenderableManager, + int entityId, + int layer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Uint8)>(isLeaf: true) +external void RenderableManager_setPriority( + ffi.Pointer tRenderableManager, + int entityId, + int priority, +); + @ffi.Native< ffi.Pointer Function( ffi.UnsignedInt, @@ -3515,6 +3181,11 @@ external ffi.Pointer SceneAsset_loadGltf( int numInstances, ); +@ffi.Native)>(isLeaf: true) +external void SceneAsset_destroy( + ffi.Pointer tSceneAsset, +); + @ffi.Native, ffi.Pointer)>( isLeaf: true) external void SceneAsset_addToScene( @@ -3546,14 +3217,23 @@ external void SceneAsset_getChildEntities( ffi.Pointer out, ); -@ffi.Native() -external final int utils; +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer SceneAsset_getCameraEntities( + ffi.Pointer tSceneAsset, +); @ffi.Native)>(isLeaf: true) external int SceneAsset_getCameraEntityCount( ffi.Pointer tSceneAsset, ); +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer SceneAsset_getLightEntities( + ffi.Pointer tSceneAsset, +); + @ffi.Native)>(isLeaf: true) external int SceneAsset_getLightEntityCount( ffi.Pointer tSceneAsset, @@ -3821,15 +3501,6 @@ external void AnimationManager_setGltfAnimationFrame( int frame, ); -@ffi.Native< - ffi.Pointer Function(LoadFilamentResourceFromOwner, - FreeFilamentResourceFromOwner, ffi.Pointer)>(isLeaf: true) -external ffi.Pointer make_resource_loader( - LoadFilamentResourceFromOwner loadFn, - FreeFilamentResourceFromOwner freeFn, - ffi.Pointer owner, -); - final class TCamera extends ffi.Opaque {} final class TEngine extends ffi.Opaque {} @@ -3844,6 +3515,8 @@ final class TLightManager extends ffi.Opaque {} final class TRenderer extends ffi.Opaque {} +final class TRenderTicker extends ffi.Opaque {} + final class TFence extends ffi.Opaque {} final class TRenderTarget extends ffi.Opaque {} @@ -4115,7 +3788,7 @@ enum TGizmoType { }; } -abstract class TPrimitiveType { +sealed class TPrimitiveType { /// !< points static const PRIMITIVETYPE_POINTS = 0; @@ -4533,7 +4206,7 @@ enum TTextureFormat { } /// ! Pixel Data Format -abstract class TPixelDataFormat { +sealed class TPixelDataFormat { /// !< One Red channel, float static const PIXELDATAFORMAT_R = 0; @@ -4567,7 +4240,7 @@ abstract class TPixelDataFormat { static const PIXELDATAFORMAT_ALPHA = 11; } -abstract class TPixelDataType { +sealed class TPixelDataType { /// !< unsigned byte static const PIXELDATATYPE_UBYTE = 0; @@ -4738,19 +4411,19 @@ final class TViewport extends ffi.Struct { external int height; } -enum ToneMapping { +enum TToneMapping { ACES(0), FILMIC(1), LINEAR(2); final int value; - const ToneMapping(this.value); + const TToneMapping(this.value); - static ToneMapping fromValue(int value) => switch (value) { + static TToneMapping fromValue(int value) => switch (value) { 0 => ACES, 1 => FILMIC, 2 => LINEAR, - _ => throw ArgumentError("Unknown value for ToneMapping: $value"), + _ => throw ArgumentError("Unknown value for TToneMapping: $value"), }; } @@ -4832,22 +4505,20 @@ typedef GizmoPickCallbackFunction = ffi.Void Function( typedef DartGizmoPickCallbackFunction = void Function( TGizmoPickResultType resultType, double x, double y, double z); -enum Projection { +enum TProjection { Perspective(0), Orthographic(1); final int value; - const Projection(this.value); + const TProjection(this.value); - static Projection fromValue(int value) => switch (value) { + static TProjection fromValue(int value) => switch (value) { 0 => Perspective, 1 => Orthographic, - _ => throw ArgumentError("Unknown value for Projection: $value"), + _ => throw ArgumentError("Unknown value for TProjection: $value"), }; } -typedef TRenderTicker = ffi.Int; -typedef DartTRenderTicker = int; typedef FilamentRenderCallback = ffi.Pointer>; typedef FilamentRenderCallbackFunction = ffi.Void Function( @@ -4884,55 +4555,6 @@ enum TBackend { }; } -final class ResourceBuffer extends ffi.Struct { - external ffi.Pointer data; - - @ffi.Int32() - external int size; - - @ffi.Int32() - external int id; -} - -final class ResourceLoaderWrapper extends ffi.Struct { - external LoadFilamentResource loadResource; - - external FreeFilamentResource freeResource; - - external LoadFilamentResourceFromOwner loadFromOwner; - - external FreeFilamentResourceFromOwner freeFromOwner; - - external ffi.Pointer owner; - - external LoadFilamentResourceIntoOutPointer loadToOut; -} - -typedef LoadFilamentResource - = ffi.Pointer>; -typedef LoadFilamentResourceFunction = ResourceBuffer Function( - ffi.Pointer uri); -typedef FreeFilamentResource - = ffi.Pointer>; -typedef FreeFilamentResourceFunction = ffi.Void Function(ResourceBuffer); -typedef DartFreeFilamentResourceFunction = void Function(ResourceBuffer); -typedef LoadFilamentResourceFromOwner - = ffi.Pointer>; -typedef LoadFilamentResourceFromOwnerFunction = ResourceBuffer Function( - ffi.Pointer, ffi.Pointer); -typedef FreeFilamentResourceFromOwner - = ffi.Pointer>; -typedef FreeFilamentResourceFromOwnerFunction = ffi.Void Function( - ResourceBuffer, ffi.Pointer); -typedef DartFreeFilamentResourceFromOwnerFunction = void Function( - ResourceBuffer, ffi.Pointer); -typedef LoadFilamentResourceIntoOutPointer = ffi - .Pointer>; -typedef LoadFilamentResourceIntoOutPointerFunction = ffi.Void Function( - ffi.Pointer uri, ffi.Pointer out); -typedef DartLoadFilamentResourceIntoOutPointerFunction = void Function( - ffi.Pointer uri, ffi.Pointer out); - const int __bool_true_false_are_defined = 1; const int true1 = 1; diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart index 1b43a3d3..e37c1e43 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart @@ -13,6 +13,7 @@ import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_swapchain.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_texture.dart'; import 'package:thermion_dart/src/viewer/src/filament/filament.dart'; import 'package:thermion_dart/src/viewer/src/shared_types/config.dart'; +import 'package:thermion_dart/src/viewer/src/shared_types/entity.dart'; import 'package:thermion_dart/src/viewer/src/shared_types/layers.dart'; import 'package:vector_math/vector_math_64.dart'; import 'package:vector_math/vector_math_64.dart' as v64; @@ -51,31 +52,13 @@ class ThermionViewerFFI extends ThermionViewer { _initialize(); } - // /// - // /// - // /// - // Future createRenderTarget(int width, int height, - // {covariant FFITexture? color, covariant FFITexture? depth}) async { - // final renderTarget = await withPointerCallback((cb) { - // RenderTarget_createRenderThread(app.engine, width, height, - // color?.pointer ?? nullptr, depth?.pointer ?? nullptr, cb); - // }); - - // return FFIRenderTarget(renderTarget, app); - // } - /// /// /// - Future setViewportAndCameraProjection(double width, double height) async { - var mainView = - FFIView(Viewer_getViewAt(_viewer!, 0), _viewer!, app.engine!); - mainView.setViewport(width.toInt(), height.toInt()); + Future setViewport(double width, double height) async { + await view.setViewport(width.toInt(), height.toInt()); - final cameraCount = await getCameraCount(); - - for (int i = 0; i < cameraCount; i++) { - var camera = await getCameraAt(i); + for (final camera in _cameras) { var near = await camera.getNear(); if (near.abs() < 0.000001) { near = kNear; @@ -97,7 +80,6 @@ class ThermionViewerFFI extends ThermionViewer { late final FFIView view; late final FFIScene scene; - late final FFICamera camera; late final Pointer animationManager; Future _initialize() async { @@ -108,10 +90,11 @@ class ThermionViewerFFI extends ThermionViewer { app); scene = FFIScene(Engine_createScene(app.engine), app); await view.setScene(scene); - camera = FFICamera( + final camera = FFICamera( await withPointerCallback( (cb) => Engine_createCameraRenderThread(app.engine, cb)), app); + _cameras.add(camera); if (renderTarget != null) { await view.setRenderTarget(renderTarget); } @@ -146,77 +129,6 @@ class ThermionViewerFFI extends ThermionViewer { RenderTicker_renderRenderThread(app.renderTicker, 0); } - // /// - // /// - // /// - // @override - // Future capture() async { - // final fence = await withPointerCallback((cb) { - // Engine_createFenceRenderThread(app.engine!, cb); - // }); - - // var pixelBuffers = []; - - // for (final entry in targets) { - // final view = entry.view as FFIView; - // var swapChain = entry.swapChain as FFISwapChain?; - // final renderTarget = entry.renderTarget as FFIRenderTarget?; - // final vp = await view.getViewport(); - // final length = vp.width * vp.height * 4; - - // await withBoolCallback((cb) { - // Renderer_beginFrameRenderThread(renderer, - // swapChain?.swapChain ?? Viewer_getSwapChainAt(_viewer!, 0), 0, cb); - // }); - - // await withVoidCallback((cb) { - // Renderer_renderRenderThread(renderer, view.view, cb); - // }); - // final out = Uint8List(length); - // await withVoidCallback((cb) { - // Renderer_readPixelsRenderThread( - // renderer, - // view.view, - // renderTarget!.renderTarget, - // TPixelDataFormat.PIXELDATAFORMAT_RGBA, - // TPixelDataType.PIXELDATATYPE_UBYTE, - // out.address, - // cb); - // }); - - // pixelBuffers.add(out); - // } - - // await withVoidCallback((cb) { - // Renderer_endFrameRenderThread(renderer, cb); - // }); - - // await withVoidCallback((cb) { - // Engine_flushAndWaitRenderThead(app.engine!, cb); - // }); - - // await withVoidCallback((cb) { - // Engine_destroyFenceRenderThread(app.engine!, fence, cb); - // }); - - // // await withVoidCallback((cb) { - // // if (renderTarget != null) { - // // Viewer_captureRenderTargetRenderThread( - // // _viewer!, - // // view!.view, - // // swapChain!.swapChain, - // // renderTarget.renderTarget, - // // out.address, - // // useFence, - // // cb); - // // } else { - // // Viewer_captureRenderThread(_viewer!, view!.view, swapChain!.swapChain, - // // out.address, useFence, cb); - // // } - // // }); - // return pixelBuffers; - // } - double _msPerFrame = 1000.0 / 60.0; /// @@ -470,7 +382,8 @@ class ThermionViewerFFI extends ThermionViewer { } } - final _assets = {}; + final _assets = {}; + final _cameras = {}; /// /// @@ -520,20 +433,21 @@ class ThermionViewerFFI extends ThermionViewer { @override Future loadGltf(String path, String relativeResourcePath, {bool keepData = false}) async { - final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); - final relativeResourcePathPtr = - relativeResourcePath.toNativeUtf8(allocator: allocator).cast(); - var assetPtr = await withPointerCallback((callback) => - SceneManager_loadGltfRenderThread(_sceneManager!, pathPtr, - relativeResourcePathPtr, keepData, callback)); - allocator.free(pathPtr); - allocator.free(relativeResourcePathPtr); - if (assetPtr == nullptr) { - throw Exception("An error occurred loading the asset at $path"); - } + throw UnimplementedError(); + // final pathPtr = path.toNativeUtf8(allocator: allocator).cast(); + // final relativeResourcePathPtr = + // relativeResourcePath.toNativeUtf8(allocator: allocator).cast(); + // var assetPtr = await withPointerCallback((callback) => + // SceneManager_loadGltfRenderThread(_sceneManager!, pathPtr, + // relativeResourcePathPtr, keepData, callback)); + // allocator.free(pathPtr); + // allocator.free(relativeResourcePathPtr); + // if (assetPtr == nullptr) { + // throw Exception("An error occurred loading the asset at $path"); + // } - return FFIAsset( - assetPtr, _sceneManager!, app.engine!, _unlitMaterialProvider!, this); + // return FFIAsset( + // assetPtr, _sceneManager!, app.engine!, _unlitMaterialProvider!, this); } /// @@ -552,7 +466,7 @@ class ThermionViewerFFI extends ThermionViewer { } var success = await withBoolCallback((cb) { AnimationManager_setMorphTargetWeightsRenderThread( - _animationManager!, entity, weightsPtr, weights.length, cb); + animationManager, entity, weightsPtr, weights.length, cb); }); allocator.free(weightsPtr); @@ -571,11 +485,11 @@ class ThermionViewerFFI extends ThermionViewer { var names = []; var count = AnimationManager_getMorphTargetNameCount( - _animationManager!, asset.pointer, childEntity); + animationManager, asset.asset, childEntity); var outPtr = allocator(255); for (int i = 0; i < count; i++) { AnimationManager_getMorphTargetName( - _animationManager!, asset.pointer, childEntity, outPtr, i); + animationManager, asset.asset, childEntity, outPtr, i); names.add(outPtr.cast().toDartString()); } allocator.free(outPtr); @@ -584,15 +498,15 @@ class ThermionViewerFFI extends ThermionViewer { Future> getBoneNames(covariant FFIAsset asset, {int skinIndex = 0}) async { - var count = AnimationManager_getBoneCount( - _animationManager!, asset.pointer, skinIndex); + var count = + AnimationManager_getBoneCount(animationManager, asset.asset, skinIndex); var out = allocator>(count); for (int i = 0; i < count; i++) { out[i] = allocator(255); } AnimationManager_getBoneNames( - _animationManager!, asset.pointer, out, skinIndex); + animationManager, asset.asset, out, skinIndex); var names = []; for (int i = 0; i < count; i++) { var namePtr = out[i]; @@ -607,12 +521,12 @@ class ThermionViewerFFI extends ThermionViewer { @override Future> getAnimationNames(covariant FFIAsset asset) async { var animationCount = - AnimationManager_getAnimationCount(_animationManager!, asset.pointer); + AnimationManager_getAnimationCount(animationManager, asset.asset); var names = []; var outPtr = allocator(255); for (int i = 0; i < animationCount; i++) { AnimationManager_getAnimationName( - _animationManager!, asset.pointer, outPtr, i); + animationManager, asset.asset, outPtr, i); names.add(outPtr.cast().toDartString()); } allocator.free(outPtr); @@ -627,7 +541,7 @@ class ThermionViewerFFI extends ThermionViewer { Future getAnimationDuration( FFIAsset asset, int animationIndex) async { return AnimationManager_getAnimationDuration( - _animationManager!, asset.pointer, animationIndex); + animationManager, asset.asset, animationIndex); } /// @@ -643,7 +557,7 @@ class ThermionViewerFFI extends ThermionViewer { } Future clearMorphAnimationData(ThermionEntity entity) async { - if (!AnimationManager_clearMorphAnimation(_animationManager!, entity)) { + if (!AnimationManager_clearMorphAnimation(animationManager, entity)) { throw Exception("Failed to clear morph animation"); } } @@ -707,7 +621,7 @@ class ThermionViewerFFI extends ThermionViewer { frameData.data.length == animation.numFrames * intersection.length); var result = AnimationManager_setMorphAnimation( - _animationManager!, + animationManager, meshEntity, frameData.data.address, indices.address, @@ -739,7 +653,7 @@ class ThermionViewerFFI extends ThermionViewer { } var boneNames = await getBoneNames(asset); var restLocalTransformsRaw = allocator(boneNames.length * 16); - AnimationManager_getRestLocalTransforms(_animationManager!, asset.pointer, + AnimationManager_getRestLocalTransforms(animationManager, asset.asset, skinIndex, restLocalTransformsRaw, boneNames.length); var restLocalTransforms = []; @@ -803,8 +717,8 @@ class ThermionViewerFFI extends ThermionViewer { } AnimationManager_addBoneAnimation( - _animationManager!, - asset.pointer, + animationManager, + asset.asset, skinIndex, entityBoneIndex, data, @@ -822,7 +736,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future getLocalTransform(ThermionEntity entity) async { return double4x4ToMatrix4( - TransformManager_getLocalTransform(_transformManager!, entity)); + TransformManager_getLocalTransform(app.transformManager, entity)); } /// @@ -830,7 +744,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future getWorldTransform(ThermionEntity entity) async { return double4x4ToMatrix4( - TransformManager_getWorldTransform(_transformManager!, entity)); + TransformManager_getWorldTransform(app.transformManager, entity)); } /// @@ -838,7 +752,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future setTransform(ThermionEntity entity, Matrix4 transform) async { TransformManager_setTransform( - _transformManager!, entity, matrix4ToDouble4x4(transform)); + app.transformManager, entity, matrix4ToDouble4x4(transform)); } /// @@ -846,24 +760,27 @@ class ThermionViewerFFI extends ThermionViewer { /// Future queueTransformUpdates( List entities, List transforms) async { - var tEntities = Int32List.fromList(entities); - var tTransforms = - Float64List.fromList(transforms.expand((t) => t.storage).toList()); + throw UnimplementedError(); + // var tEntities = Int32List.fromList(entities); + // var tTransforms = + // Float64List.fromList(transforms.expand((t) => t.storage).toList()); - SceneManager_queueTransformUpdates(_sceneManager!, tEntities.address, - tTransforms.address, tEntities.length); + // SceneManager_queueTransformUpdates(_sceneManager!, tEntities.address, + // tTransforms.address, tEntities.length); } /// /// /// Future updateBoneMatrices(ThermionEntity entity) async { - var result = await withBoolCallback((cb) { - update_bone_matrices_render_thread(_sceneManager!, entity, cb); - }); - if (!result) { - throw Exception("Failed to update bone matrices"); - } + throw UnimplementedError(); + + // var result = await withBoolCallback((cb) { + // update_bone_matrices_render_thread(_sceneManager!, entity, cb); + // }); + // if (!result) { + // throw Exception("Failed to update bone matrices"); + // } } /// @@ -872,8 +789,8 @@ class ThermionViewerFFI extends ThermionViewer { Future getInverseBindMatrix(FFIAsset asset, int boneIndex, {int skinIndex = 0}) async { var matrix = Float32List(16); - AnimationManager_getInverseBindMatrix(_animationManager!, asset.pointer, - skinIndex, boneIndex, matrix.address); + AnimationManager_getInverseBindMatrix( + animationManager, asset.asset, skinIndex, boneIndex, matrix.address); return Matrix4.fromList(matrix); } @@ -886,7 +803,7 @@ class ThermionViewerFFI extends ThermionViewer { throw UnimplementedError("TOOD"); } return AnimationManager_getBone( - _animationManager!, asset.pointer, skinIndex, boneIndex); + animationManager, asset.asset, skinIndex, boneIndex); } /// @@ -922,7 +839,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future resetBones(covariant FFIAsset asset) async { - AnimationManager_resetToRestPose(_animationManager!, asset.pointer); + AnimationManager_resetToRestPose(animationManager, asset.asset); } /// @@ -933,14 +850,16 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future destroyAsset(covariant FFIAsset asset) async { - if (asset.boundingBoxAsset != null) { - await asset.setBoundingBoxVisibility(false); - await withVoidCallback((callback) => - SceneManager_destroyAssetRenderThread( - _sceneManager!, asset.boundingBoxAsset!.pointer, callback)); - } - await withVoidCallback((callback) => SceneManager_destroyAssetRenderThread( - _sceneManager!, asset.pointer, callback)); + await scene.remove(asset); + SceneAsset_destroy(asset.asset); + // if (asset.boundingBoxAsset != null) { + // await asset.setBoundingBoxVisibility(false); + // await withVoidCallback((callback) => + // SceneManager_destroyAssetRenderThread( + // _sceneManager!, asset.boundingBoxAsset!.pointer, callback)); + // } + // await withVoidCallback((callback) => SceneManager_destroyAssetRenderThread( + // _sceneManager!, asset.asset, callback)); } /// @@ -948,9 +867,9 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future destroyAssets() async { - await withVoidCallback((callback) { - SceneManager_destroyAssetsRenderThread(_sceneManager!, callback); - }); + for (final asset in _assets) { + await destroyAsset(asset); + } } /// @@ -963,8 +882,8 @@ class ThermionViewerFFI extends ThermionViewer { bool replaceActive = true, double crossfade = 0.0, double startOffset = 0.0}) async { - AnimationManager_playAnimation(_animationManager!, asset.pointer, index, - loop, reverse, replaceActive, crossfade, startOffset); + AnimationManager_playAnimation(animationManager, asset.asset, index, loop, + reverse, replaceActive, crossfade, startOffset); } /// @@ -973,7 +892,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future stopAnimation(FFIAsset asset, int animationIndex) async { AnimationManager_stopAnimation( - _animationManager!, asset.pointer, animationIndex); + animationManager, asset.asset, animationIndex); } /// @@ -1015,23 +934,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setGltfAnimationFrame( FFIAsset asset, int index, int animationFrame) async { AnimationManager_setGltfAnimationFrame( - _animationManager!, asset.pointer, index, animationFrame); - } - - /// - /// - /// - @override - Future setMainCamera() async { - final view = (await getViewAt(0)) as FFIView; - Viewer_setMainCamera(_viewer!, view.view); - } - - /// - /// - /// - Future getMainCameraEntity() async { - return Viewer_getMainCamera(_viewer!); + animationManager, asset.asset, index, animationFrame); } /// @@ -1047,13 +950,12 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future getCameraComponent(ThermionEntity cameraEntity) async { - var engine = Viewer_getEngine(_viewer!); - var camera = Engine_getCameraComponent(engine, cameraEntity); + var camera = Engine_getCameraComponent(app.engine, cameraEntity); if (camera == nullptr) { throw Exception( "Failed to get camera component for entity $cameraEntity"); } - return FFICamera(camera, engine, _transformManager!); + return FFICamera(camera, app); } /// @@ -1087,7 +989,6 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setPostProcessing(bool enabled) async { - final view = await getViewAt(0) as FFIView; View_setPostProcessing(view.view, enabled); } @@ -1096,7 +997,6 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setShadowsEnabled(bool enabled) async { - final view = await getViewAt(0) as FFIView; View_setShadowsEnabled(view.view, enabled); } @@ -1104,7 +1004,6 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future setShadowType(ShadowType shadowType) async { - final view = await getViewAt(0) as FFIView; View_setShadowType(view.view, shadowType.index); } @@ -1113,7 +1012,6 @@ class ThermionViewerFFI extends ThermionViewer { /// Future setSoftShadowOptions( double penumbraScale, double penumbraRatioScale) async { - final view = await getViewAt(0) as FFIView; View_setSoftShadowOptions(view.view, penumbraScale, penumbraRatioScale); } @@ -1125,7 +1023,7 @@ class ThermionViewerFFI extends ThermionViewer { if (Platform.isWindows && msaa) { throw Exception("MSAA is not currently supported on Windows"); } - final view = await getViewAt(0) as FFIView; + View_setAntiAliasing(view.view, msaa, fxaa, taa); } @@ -1134,7 +1032,6 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future setBloom(bool enabled, double strength) async { - final view = await getViewAt(0) as FFIView; View_setBloom(view.view, enabled, strength); } @@ -1151,7 +1048,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future getCameraFov(bool horizontal) async { var mainCamera = await getMainCamera() as FFICamera; - return get_camera_fov(mainCamera.camera, horizontal); + return Camera_getFov(mainCamera.camera, horizontal); } /// @@ -1180,7 +1077,7 @@ class ThermionViewerFFI extends ThermionViewer { Future getCameraNear() async { var mainCamera = await getMainCamera() as FFICamera; - return get_camera_near(mainCamera.camera); + return Camera_getNear(mainCamera.camera); } /// @@ -1189,7 +1086,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future getCameraCullingFar() async { var mainCamera = await getMainCamera() as FFICamera; - return get_camera_culling_far(mainCamera.camera); + return Camera_getCullingFar(mainCamera.camera); } /// @@ -1198,7 +1095,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraFocusDistance(double focusDistance) async { var mainCamera = await getMainCamera() as FFICamera; - set_camera_focus_distance(mainCamera.camera, focusDistance); + Camera_setFocusDistance(mainCamera.camera, focusDistance); } /// @@ -1235,7 +1132,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setCameraExposure( double aperture, double shutterSpeed, double sensitivity) async { var mainCamera = await getMainCamera() as FFICamera; - set_camera_exposure(mainCamera.camera, aperture, shutterSpeed, sensitivity); + Camera_setExposure(mainCamera.camera, aperture, shutterSpeed, sensitivity); } /// @@ -1265,15 +1162,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setCameraModelMatrix4(Matrix4 modelMatrix) async { var mainCamera = await getMainCamera() as FFICamera; final out = matrix4ToDouble4x4(modelMatrix); - set_camera_model_matrix(mainCamera.camera, out); - } - - /// - /// - /// - @override - Future transformToUnitCube(ThermionEntity entity) async { - SceneManager_transformToUnitCube(_sceneManager!, entity); + Camera_setModelMatrix(mainCamera.camera, out); } /// @@ -1282,7 +1171,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setLightPosition( ThermionEntity lightEntity, double x, double y, double z) async { - LightManager_setPosition(_lightManager!, lightEntity, x, y, z); + LightManager_setPosition(app.lightManager, lightEntity, x, y, z); } /// @@ -1293,55 +1182,16 @@ class ThermionViewerFFI extends ThermionViewer { ThermionEntity lightEntity, Vector3 direction) async { direction.normalize(); LightManager_setPosition( - _lightManager!, lightEntity, direction.x, direction.y, direction.z); + app.lightManager, lightEntity, direction.x, direction.y, direction.z); } - /// - /// Queues an update to the worldspace position for [entity] to the viewport coordinates {x,y}. - /// The actual update will occur on the next frame, and will be subject to collision detection. - /// - Future queuePositionUpdateFromViewportCoords( - ThermionEntity entity, double x, double y) async { - final view = (await getViewAt(0)) as FFIView; - queue_position_update_from_viewport_coords( - _sceneManager!, view.view, entity, x, y); - } - - /// - /// - /// - Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, - double viewportX, double viewportY, double x, double y, double z) async { - queue_relative_position_update_world_axis( - _sceneManager!, entity, viewportX, viewportY, x, y, z); - } - - /// - /// - /// - @override - Future removeAssetFromScene(ThermionEntity entity) async { - if (SceneManager_removeFromScene(_sceneManager!, entity) != 1) { - throw Exception("Failed to remove entity from scene"); - } - } - - /// - /// - /// - @override - Future addEntityToScene(ThermionEntity entity) async { - if (SceneManager_addToScene(_sceneManager!, entity) != 1) { - throw Exception("Failed to add entity to scene"); - } - } /// /// /// @override String? getNameForEntity(ThermionEntity entity) { - final result = NameComponentManager_getName(_nameComponentManager!, entity); + final result = NameComponentManager_getName(app.nameComponentManager, entity); if (result == nullptr) { return null; } @@ -1397,179 +1247,21 @@ class ThermionViewerFFI extends ThermionViewer { }); } - /// - /// - /// - @override - Future getCameraViewMatrix() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var mainCamera = await getMainCamera() as FFICamera; - var matrixStruct = get_camera_view_matrix(mainCamera.camera); - return double4x4ToMatrix4(matrixStruct); - } - /// - /// - /// - @override - Future getCameraModelMatrix() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var mainCamera = await getMainCamera() as FFICamera; - var matrixStruct = get_camera_model_matrix(mainCamera.camera); - return double4x4ToMatrix4(matrixStruct); - } - - /// - /// - /// - @override - Future getCameraProjectionMatrix() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var mainCamera = await getMainCamera() as FFICamera; - var matrixStruct = get_camera_projection_matrix(mainCamera.camera); - return double4x4ToMatrix4(matrixStruct); - } - - /// - /// - /// - @override - Future getCameraCullingProjectionMatrix() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var mainCamera = await getMainCamera() as FFICamera; - var matrixStruct = get_camera_culling_projection_matrix(mainCamera.camera); - return double4x4ToMatrix4(matrixStruct); - } - - /// - /// - /// - @override - Future getCameraPosition() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var modelMatrix = await getCameraModelMatrix(); - return modelMatrix.getColumn(3).xyz; - } - - /// - /// - /// - @override - Future getCameraRotation() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var modelMatrix = await getCameraModelMatrix(); - var rotationMatrix = Matrix3.identity(); - modelMatrix.copyRotation(rotationMatrix); - return rotationMatrix; - } - - /// - /// - /// - @override - Future getCameraFrustum() async { - if (_viewer == null) { - throw Exception("No viewer available"); - } - var mainCamera = await getMainCamera() as FFICamera; - var arrayPtr = get_camera_frustum(mainCamera.camera); - var doubleList = arrayPtr.asTypedList(24); - - var frustum = Frustum(); - frustum.plane0.setFromComponents( - doubleList[0], doubleList[1], doubleList[2], doubleList[3]); - frustum.plane1.setFromComponents( - doubleList[4], doubleList[5], doubleList[6], doubleList[7]); - frustum.plane2.setFromComponents( - doubleList[8], doubleList[9], doubleList[10], doubleList[11]); - frustum.plane3.setFromComponents( - doubleList[12], doubleList[13], doubleList[14], doubleList[15]); - frustum.plane4.setFromComponents( - doubleList[16], doubleList[17], doubleList[18], doubleList[19]); - frustum.plane5.setFromComponents( - doubleList[20], doubleList[21], doubleList[22], doubleList[23]); - thermion_flutter_free(arrayPtr.cast()); - return frustum; - } - - /// - /// - /// - @override - Future getChildEntity( - FFIAsset asset, String childName) async { - final childEntities = await getChildEntities(asset); - for (final entity in childEntities) { - var name = await getNameForEntity(entity); - if (name == childName) { - return entity; - } - } - return null; - } - - Future> getChildEntities(FFIAsset asset) async { - var count = SceneAsset_getChildEntityCount(asset.pointer); - var out = Int32List(count); - SceneAsset_getChildEntities(asset.pointer, out.address); - return out; - } - - final _collisions = {}; - - /// - /// - /// - @override - Future addCollisionComponent(ThermionEntity entity, - {void Function(int entityId1, int entityId2)? callback, - bool affectsTransform = false}) async { - if (callback != null) { - var ptr = NativeCallable< - Void Function( - EntityId entityId1, EntityId entityId2)>.listener(callback); - add_collision_component( - _sceneManager!, entity, ptr.nativeFunction, affectsTransform); - _collisions[entity] = ptr; - } else { - add_collision_component( - _sceneManager!, entity, nullptr, affectsTransform); - } - } - - /// - /// - /// - @override - Future removeCollisionComponent(ThermionEntity entity) async { - remove_collision_component(_sceneManager!, entity); - } /// /// /// @override Future addAnimationComponent(ThermionEntity entity) async { - AnimationManager_addAnimationComponent(_animationManager!, entity); + AnimationManager_addAnimationComponent(animationManager, entity); } /// /// /// Future removeAnimationComponent(ThermionEntity entity) async { - AnimationManager_removeAnimationComponent(_animationManager!, entity); + AnimationManager_removeAnimationComponent(animationManager, entity); } /// @@ -1579,10 +1271,6 @@ class ThermionViewerFFI extends ThermionViewer { Future createGeometry(Geometry geometry, {List? materialInstances, bool keepData = false}) async { - if (_viewer == null) { - throw Exception("Viewer must not be null"); - } - var assetPtr = await withPointerCallback((callback) { var ptrList = Int64List(materialInstances?.length ?? 0); if (materialInstances != null && materialInstances.isNotEmpty) { @@ -1595,8 +1283,8 @@ class ThermionViewerFFI extends ThermionViewer { .toList()); } - return SceneManager_createGeometryRenderThread( - _sceneManager!, + return SceneAsset_createGeometryRenderThread( + app.engine, geometry.vertices.address, geometry.vertices.length, geometry.normals.address, @@ -1608,15 +1296,15 @@ class ThermionViewerFFI extends ThermionViewer { geometry.primitiveType.index, ptrList.address.cast>(), ptrList.length, - keepData, callback); }); if (assetPtr == nullptr) { throw Exception("Failed to create geometry"); } - var asset = FFIAsset( - assetPtr, _sceneManager!, app.engine!, _unlitMaterialProvider!, this); + var asset = FFIAsset(assetPtr, app); + + _assets.add(asset); return asset; } @@ -1627,10 +1315,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setParent(ThermionEntity child, ThermionEntity? parent, {bool preserveScaling = false}) async { - if (_sceneManager == null) { - throw Exception("Asset manager must be non-null"); - } - TransformManager_setParent(_transformManager!, child, + TransformManager_setParent(app.transformManager, child, parent ?? FILAMENT_ENTITY_NULL, preserveScaling); } @@ -1639,10 +1324,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future getParent(ThermionEntity child) async { - if (_sceneManager == null) { - throw Exception("Asset manager must be non-null"); - } - var parent = TransformManager_getParent(_transformManager!, child); + var parent = TransformManager_getParent(app.transformManager, child); if (parent == FILAMENT_ASSET_ERROR) { return null; } @@ -1654,24 +1336,13 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future getAncestor(ThermionEntity child) async { - if (_sceneManager == null) { - throw Exception("Asset manager must be non-null"); - } - var parent = TransformManager_getAncestor(_transformManager!, child); + var parent = TransformManager_getAncestor(app.transformManager, child); if (parent == FILAMENT_ASSET_ERROR) { return null; } return parent; } - /// - /// - /// - @override - Future testCollisions(ThermionEntity entity) async { - test_collisions(_sceneManager!, entity); - } - /// /// /// @@ -1703,20 +1374,13 @@ class ThermionViewerFFI extends ThermionViewer { // v64.Vector2(result.maxX, result.maxY)); } - /// - /// - /// - Future setLayerVisibility(VisibilityLayers layer, bool visible) async { - final view = (await getViewAt(0)) as FFIView; - View_setLayerEnabled(view.view, layer.value, visible); - } - /// /// /// Future setVisibilityLayer( ThermionEntity entity, VisibilityLayers layer) async { - SceneManager_setVisibilityLayer(_sceneManager!, entity, layer.value); + RenderableManager_setVisibilityLayer( + app.renderableManager, entity, layer.value); } FFIAsset? _grid; @@ -1849,7 +1513,7 @@ class ThermionViewerFFI extends ThermionViewer { Engine_buildMaterialRenderThread( app.engine!, data.address, data.length, cb); }); - return FFIMaterial(ptr, app.engine!, _sceneManager!); + return FFIMaterial(ptr, app); } /// @@ -1940,7 +1604,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Failed to create material instance"); } - var instance = FFIMaterialInstance(materialInstance, _sceneManager!); + var instance = FFIMaterialInstance(materialInstance, app); _materialInstances.add(instance); return instance; } @@ -1949,7 +1613,7 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future destroyMaterialInstance(FFIMaterialInstance materialInstance) async { - await materialInstance.dispose(); + await materialInstance.destroy(); _materialInstances.remove(materialInstance); } @@ -1957,25 +1621,8 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future createUnlitMaterialInstance() async { - var instancePtr = await withPointerCallback((cb) { - SceneManager_createUnlitMaterialInstanceRenderThread(_sceneManager!, cb); - }); - final instance = FFIMaterialInstance(instancePtr, _sceneManager!); - _materialInstances.add(instance); - return instance; - } - - /// - /// - /// - Future createUnlitFixedSizeMaterialInstance() async { - var instancePtr = await withPointerCallback((cb) { - SceneManager_createUnlitFixedSizeMaterialInstanceRenderThread( - _sceneManager!, cb); - }); - final instance = FFIMaterialInstance(instancePtr, _sceneManager!); - _materialInstances.add(instance); - return instance; + final instance = await createUbershaderMaterialInstance(unlit: true); + return instance as FFIMaterialInstance; } /// @@ -2004,7 +1651,7 @@ class ThermionViewerFFI extends ThermionViewer { completer.complete(true); }); - Viewer_requestFrameRenderThread(_viewer!, callback.nativeFunction); + RenderLoop_requestAnimationFrame(callback.nativeFunction.cast()); try { await completer.future.timeout(Duration(seconds: 1)); @@ -2013,13 +1660,18 @@ class ThermionViewerFFI extends ThermionViewer { } } + /// + /// + /// Future createCamera() async { var cameraPtr = await withPointerCallback((cb) { - SceneManager_createCameraRenderThread(_sceneManager!, cb); + Engine_createCameraRenderThread(app.engine, cb); }); - var engine = Viewer_getEngine(_viewer!); - var camera = FFICamera(cameraPtr, engine, _transformManager!); - await camera.setLensProjection(); + var camera = FFICamera(cameraPtr, app); + final viewport = await view.getViewport(); + + await camera.setLensProjection(aspect: viewport.width / viewport.height); + _cameras.add(camera); return camera; } @@ -2027,26 +1679,22 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future destroyCamera(FFICamera camera) async { - SceneManager_destroyCamera(_sceneManager!, camera.camera); + await camera.destroy(); + _cameras.remove(camera); } /// /// /// Future setActiveCamera(FFICamera camera) async { - final view = (await getViewAt(0)) as FFIView; - await withVoidCallback((cb) { - View_setCameraRenderThread(view.view, camera.camera, cb); - }); + await view.setCamera(camera); } /// /// /// Future getActiveCamera() async { - final view = (await getViewAt(0)) as FFIView; - var camera = view.getCamera(); - return camera; + return view.getCamera(); } final _hooks = []; @@ -2069,94 +1717,148 @@ class ThermionViewerFFI extends ThermionViewer { /// /// int getCameraCount() { - return SceneManager_getCameraCount(_sceneManager!); + return _cameras.length; } /// - /// Returns the camera specified by the given index. Note that the camera at - /// index 0 is always the main camera; this cannot be destroyed. /// - Camera getCameraAt(int index) { - final camera = SceneManager_getCameraAt(_sceneManager!, index); - if (camera == nullptr) { - throw Exception("No camera at index $index"); + /// + Iterable getCameras() sync* { + for (final camera in _cameras) { + yield camera; } - return FFICamera(camera, Viewer_getEngine(_viewer!), _transformManager!); - } - - @override - Future getViewAt(int index) async { - var view = Viewer_getViewAt(_viewer!, index); - if (view == nullptr) { - throw Exception("Failed to get view"); - } - return FFIView(view, _viewer!, app.engine!); } @override Future createGizmo(FFIView view, GizmoType gizmoType) async { - var scene = View_getScene(view.view); - final gizmo = await withPointerCallback((cb) { - SceneManager_createGizmoRenderThread(_sceneManager!, view.view, scene, - TGizmoType.values[gizmoType.index], cb); - }); - if (gizmo == nullptr) { - throw Exception("Failed to create gizmo"); - } + throw UnimplementedError(); + // var scene = View_getScene(view.view); + // final gizmo = await withPointerCallback((cb) { + // SceneManager_createGizmoRenderThread(_sceneManager!, view.view, scene, + // TGizmoType.values[gizmoType.index], cb); + // }); + // if (gizmo == nullptr) { + // throw Exception("Failed to create gizmo"); + // } - final gizmoEntityCount = - SceneAsset_getChildEntityCount(gizmo.cast()); - final gizmoEntities = Int32List(gizmoEntityCount); - SceneAsset_getChildEntities( - gizmo.cast(), gizmoEntities.address); + // final gizmoEntityCount = + // SceneAsset_getChildEntityCount(gizmo.cast()); + // final gizmoEntities = Int32List(gizmoEntityCount); + // SceneAsset_getChildEntities( + // gizmo.cast(), gizmoEntities.address); - return FFIGizmo( - view, - gizmo.cast(), - _sceneManager!, - app.engine!, - nullptr, - this, - gizmoEntities.toSet() - ..add(SceneAsset_getEntity(gizmo.cast()))); - } - - /// - /// - /// - Future setCastShadows(ThermionEntity entity, bool castShadows) async { - RenderableManager_setCastShadows( - app.renderableManager, entity, castShadows); - } - - /// - /// - /// - Future isCastShadowsEnabled(ThermionEntity entity) async { - return RenderableManager_isShadowCaster(app.renderableManager, entity); - } - - /// - /// - /// - Future setReceiveShadows(ThermionEntity entity, bool receiveShadows) async { - RenderableManager_setReceiveShadows( - app.renderableManager, entity, receiveShadows); - } - - /// - /// - /// - Future isReceiveShadowsEnabled(ThermionEntity entity) async { - return RenderableManager_isShadowReceiver(app.renderableManager, entity); - } - - /// - /// - /// - Future setClearOptions( - Vector4 clearColor, int clearStencil, bool clear, bool discard) async { - Renderer_setClearOptions(app.renderer, clearColor.r, clearColor.g, - clearColor.b, clearColor.a, clearStencil, clear, discard); + // return FFIGizmo( + // view, + // gizmo.cast(), + // _sceneManager!, + // app.engine!, + // nullptr, + // this, + // gizmoEntities.toSet() + // ..add(SceneAsset_getEntity(gizmo.cast()))); } } + + + + + + // /// + // /// + // /// + // Future setClearOptions( + // Vector4 clearColor, int clearStencil, bool clear, bool discard) async { + // Renderer_setClearOptions(app.renderer, clearColor.r, clearColor.g, + // clearColor.b, clearColor.a, clearStencil, clear, discard); + // } + + // /// + // /// + // /// + // @override + // Future capture() async { + // final fence = await withPointerCallback((cb) { + // Engine_createFenceRenderThread(app.engine!, cb); + // }); + + // var pixelBuffers = []; + + // for (final entry in targets) { + // final view = entry.view as FFIView; + // var swapChain = entry.swapChain as FFISwapChain?; + // final renderTarget = entry.renderTarget as FFIRenderTarget?; + // final vp = await view.getViewport(); + // final length = vp.width * vp.height * 4; + + // await withBoolCallback((cb) { + // Renderer_beginFrameRenderThread(renderer, + // swapChain?.swapChain ?? Viewer_getSwapChainAt(_viewer!, 0), 0, cb); + // }); + + // await withVoidCallback((cb) { + // Renderer_renderRenderThread(renderer, view.view, cb); + // }); + // final out = Uint8List(length); + // await withVoidCallback((cb) { + // Renderer_readPixelsRenderThread( + // renderer, + // view.view, + // renderTarget!.renderTarget, + // TPixelDataFormat.PIXELDATAFORMAT_RGBA, + // TPixelDataType.PIXELDATATYPE_UBYTE, + // out.address, + // cb); + // }); + + // pixelBuffers.add(out); + // } + + // await withVoidCallback((cb) { + // Renderer_endFrameRenderThread(renderer, cb); + // }); + + // await withVoidCallback((cb) { + // Engine_flushAndWaitRenderThead(app.engine!, cb); + // }); + + // await withVoidCallback((cb) { + // Engine_destroyFenceRenderThread(app.engine!, fence, cb); + // }); + + // // await withVoidCallback((cb) { + // // if (renderTarget != null) { + // // Viewer_captureRenderTargetRenderThread( + // // _viewer!, + // // view!.view, + // // swapChain!.swapChain, + // // renderTarget.renderTarget, + // // out.address, + // // useFence, + // // cb); + // // } else { + // // Viewer_captureRenderThread(_viewer!, view!.view, swapChain!.swapChain, + // // out.address, useFence, cb); + // // } + // // }); + // return pixelBuffers; + // } + + // /// + // /// Queues an update to the worldspace position for [entity] to the viewport coordinates {x,y}. + // /// The actual update will occur on the next frame, and will be subject to collision detection. + // /// + // Future queuePositionUpdateFromViewportCoords( + // ThermionEntity entity, double x, double y) async { + // final view = (await getViewAt(0)) as FFIView; + // queue_position_update_from_viewport_coords( + // _sceneManager!, view.view, entity, x, y); + // } + + // /// + // /// + // /// + // Future queueRelativePositionUpdateWorldAxis(ThermionEntity entity, + // double viewportX, double viewportY, double x, double y, double z) async { + // queue_relative_position_update_world_axis( + // _sceneManager!, entity, viewportX, viewportY, x, y, z); + // } \ No newline at end of file diff --git a/thermion_dart/lib/src/viewer/src/shared_types/camera.dart b/thermion_dart/lib/src/viewer/src/shared_types/camera.dart index 6702a236..ff0a834e 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/camera.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/camera.dart @@ -1,5 +1,5 @@ +import 'package:thermion_dart/src/viewer/src/shared_types/layers.dart'; import 'package:vector_math/vector_math_64.dart'; - import '../thermion_viewer_base.dart'; enum Projection { Perspective, Orthographic } @@ -26,6 +26,8 @@ abstract class Camera { Future getViewMatrix(); Future getModelMatrix(); + Future getProjectionMatrix(); + Future getCullingProjectionMatrix(); Future setModelMatrix(Matrix4 matrix); ThermionEntity getEntity(); @@ -35,4 +37,6 @@ abstract class Camera { Future getNear(); Future getCullingFar(); Future getFocalLength(); + + Future destroy(); } diff --git a/thermion_dart/lib/src/viewer/src/shared_types/view.dart b/thermion_dart/lib/src/viewer/src/shared_types/view.dart index 4bb2bdb6..7b37e475 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/view.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/view.dart @@ -1,3 +1,4 @@ +import 'package:thermion_dart/src/viewer/src/shared_types/layers.dart'; import 'package:thermion_dart/thermion_dart.dart'; /// @@ -14,12 +15,7 @@ class Viewport { Viewport(this.left, this.bottom, this.width, this.height); } -enum QualityLevel { - LOW, - MEDIUM, - HIGH, - ULTRA -} +enum QualityLevel { LOW, MEDIUM, HIGH, ULTRA } abstract class View { Future getViewport(); @@ -33,10 +29,11 @@ abstract class View { Future setRenderable(bool renderable, covariant SwapChain swapChain); Future setFrustumCullingEnabled(bool enabled); Future setToneMapper(ToneMapper mapper); - Future setStencilBufferEnabled(bool enabled); + Future setStencilBufferEnabled(bool enabled); Future isStencilBufferEnabled(); Future setDithering(bool enabled); Future isDitheringEnabled(); Future setBloom(bool enabled, double strength); Future setRenderQuality(QualityLevel quality); + Future setLayerVisibility(VisibilityLayers layer, bool visible); } diff --git a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart index 6937af72..13fb7e07 100644 --- a/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart +++ b/thermion_dart/lib/src/viewer/src/thermion_viewer_base.dart @@ -622,20 +622,6 @@ abstract class ThermionViewer { /// 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(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(ThermionEntity entity); - /// /// Creates a (renderable) entity with the specified geometry and adds to the scene. /// If [keepData] is true, the source data will not be released. @@ -660,12 +646,6 @@ abstract class ThermionViewer { Future setParent(ThermionEntity child, ThermionEntity? parent, {bool preserveScaling}); - /// - /// 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(ThermionEntity entity); - /// /// Sets the draw priority for the given entity. See RenderableManager.h for more details. /// @@ -811,11 +791,6 @@ abstract class ThermionViewer { /// Future createUnlitMaterialInstance(); - /// - /// - /// - Future createUnlitFixedSizeMaterialInstance(); - /// /// /// diff --git a/thermion_dart/lib/src/viewer/src/web_wasm/src/thermion_viewer_wasm.dart b/thermion_dart/lib/src/viewer/src/web_wasm/src/thermion_viewer_wasm.dart index 0329028c..a0b92415 100644 --- a/thermion_dart/lib/src/viewer/src/web_wasm/src/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/src/viewer/src/web_wasm/src/thermion_viewer_wasm.dart @@ -1244,7 +1244,7 @@ // @override // Future getCameraCullingFar() async { -// final result = _module!.ccall("get_camera_culling_far", "double", +// final result = _module!.ccall("Camera_getCullingFar", "double", // ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; // return result.toDartDouble; // } @@ -1259,7 +1259,7 @@ // @override // Future getCameraCullingProjectionMatrix() async { // final ptr = _module!._malloc(16 * 8); -// _module!.ccall("get_camera_culling_projection_matrix", "void", +// _module!.ccall("Camera_getCullingProjectionMatrix", "void", // ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); // final matrix = Matrix4.zero(); // for (int i = 0; i < 16; i++) { @@ -1303,7 +1303,7 @@ // @override // Future getCameraModelMatrix() async { -// final ptr = _module!.ccall("get_camera_model_matrix", "void*", +// final ptr = _module!.ccall("Camera_getModelMatrix", "void*", // ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; // final matrix = _matrixFromPtr(ptr); // _module!.ccall( @@ -1331,7 +1331,7 @@ // @override // Future getCameraProjectionMatrix() async { // final ptr = _module!._malloc(16 * 8); -// _module!.ccall("get_camera_projection_matrix", "void", +// _module!.ccall("Camera_getProjectionMatrix", "void", // ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); // final matrix = _matrixFromPtr(ptr); // _module!._free(ptr); @@ -1348,7 +1348,7 @@ // @override // Future getCameraViewMatrix() async { // final ptr = _module!._malloc(16 * 8); -// _module!.ccall("get_camera_view_matrix", "void", +// _module!.ccall("Camera_getViewMatrix", "void", // ["void*".toJS, "double*".toJS].toJS, [_viewer!, ptr].toJS, null); // final matrix = Matrix4.zero(); // for (int i = 0; i < 16; i++) { @@ -1761,7 +1761,7 @@ // Future setCameraExposure( // double aperture, double shutterSpeed, double sensitivity) async { // _module!.ccall( -// "set_camera_exposure", +// "Camera_setExposure", // "void", // ["void*".toJS, "float".toJS, "float".toJS, "float".toJS].toJS, // [ @@ -1786,7 +1786,7 @@ // @override // Future setCameraFocusDistance(double focusDistance) async { // _module!.ccall( -// "set_camera_focus_distance", +// "Camera_setFocusDistance", // "void", // ["void*".toJS, "float".toJS].toJS, // [_viewer!, focusDistance.toJS].toJS, @@ -1812,7 +1812,7 @@ // _module! // .setValue((ptr.toDartInt + (i * 8)).toJS, matrix[i].toJS, "double"); // } -// _module!.ccall("set_camera_model_matrix", "void", +// _module!.ccall("Camera_setModelMatrix", "void", // ["void*".toJS, "float*".toJS].toJS, [_viewer!, ptr].toJS, null); // _module!._free(ptr); // } @@ -2125,7 +2125,7 @@ // @override // Future getCameraFov(bool horizontal) async { // var fov = _module!.ccall( -// "get_camera_fov", +// "Camera_getFov", // "float", // ["void*".toJS, "bool".toJS].toJS, // [_viewer!, horizontal.toJS].toJS, diff --git a/thermion_dart/native/include/c_api/APIBoundaryTypes.h b/thermion_dart/native/include/c_api/APIBoundaryTypes.h index d2e818ca..ef118bb9 100644 --- a/thermion_dart/native/include/c_api/APIBoundaryTypes.h +++ b/thermion_dart/native/include/c_api/APIBoundaryTypes.h @@ -8,7 +8,7 @@ extern "C" #include #include "APIExport.h" - typedef TRenderTicker TRenderTicker; + typedef int32_t EntityId; typedef struct TCamera TCamera; typedef struct TEngine TEngine; @@ -17,6 +17,7 @@ extern "C" typedef struct TSceneManager TSceneManager; typedef struct TLightManager TLightManager; typedef struct TRenderer TRenderer; + typedef struct TRenderTicker TRenderTicker; typedef struct TFence TFence; typedef struct TRenderTarget TRenderTarget; typedef struct TSwapChain TSwapChain; diff --git a/thermion_dart/native/include/c_api/TCamera.h b/thermion_dart/native/include/c_api/TCamera.h index 62e370a7..a112daa9 100644 --- a/thermion_dart/native/include/c_api/TCamera.h +++ b/thermion_dart/native/include/c_api/TCamera.h @@ -6,41 +6,44 @@ extern "C" { #endif -#include "ThermionDartApi.h" +#include "APIExport.h" +#include "APIBoundaryTypes.h" -enum Projection { +enum TProjection { Perspective, Orthographic }; // Camera methods -EMSCRIPTEN_KEEPALIVE void set_camera_exposure(TCamera *camera, float aperture, float shutterSpeed, float sensitivity); -EMSCRIPTEN_KEEPALIVE void set_camera_model_matrix(TCamera *camera, double4x4 matrix); -EMSCRIPTEN_KEEPALIVE double4x4 get_camera_model_matrix(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE double4x4 get_camera_view_matrix(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE double4x4 get_camera_projection_matrix(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE double4x4 get_camera_culling_projection_matrix(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE const double *const get_camera_frustum(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE void set_camera_projection_matrix(TCamera *camera, double4x4 matrix, double near, double far); -EMSCRIPTEN_KEEPALIVE void set_camera_projection_from_fov(TCamera *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); -EMSCRIPTEN_KEEPALIVE double get_camera_focal_length(TCamera *const camera); +EMSCRIPTEN_KEEPALIVE void Camera_setExposure(TCamera *camera, float aperture, float shutterSpeed, float sensitivity); +EMSCRIPTEN_KEEPALIVE void Camera_setModelMatrix(TCamera *camera, double4x4 matrix); +EMSCRIPTEN_KEEPALIVE double4x4 Camera_getModelMatrix(TCamera *const camera); +EMSCRIPTEN_KEEPALIVE double4x4 Camera_getViewMatrix(TCamera *const camera); +EMSCRIPTEN_KEEPALIVE double4x4 Camera_getProjectionMatrix(TCamera *const camera); +EMSCRIPTEN_KEEPALIVE double4x4 Camera_getCullingProjectionMatrix(TCamera *const camera); +EMSCRIPTEN_KEEPALIVE void Camera_getFrustum(TCamera *camera, double* out); +EMSCRIPTEN_KEEPALIVE void Camera_setProjectionMatrix(TCamera *camera, double4x4 matrix, double near, double far); +EMSCRIPTEN_KEEPALIVE void Camera_setProjectionFromFov(TCamera *camera, double fovInDegrees, double aspect, double near, double far, bool horizontal); EMSCRIPTEN_KEEPALIVE double Camera_getFocalLength(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE double Camera_getNear(TCamera *const camera); -EMSCRIPTEN_KEEPALIVE double Camera_getCullingFar(TCamera *const camera); EMSCRIPTEN_KEEPALIVE double4x4 Camera_getViewMatrix(TCamera *const camera); EMSCRIPTEN_KEEPALIVE double4x4 Camera_getModelMatrix(TCamera* camera); EMSCRIPTEN_KEEPALIVE void Camera_lookAt(TCamera* camera, double3 eye, double3 focus, double3 up); -EMSCRIPTEN_KEEPALIVE double get_camera_near(TCamera *camera); -EMSCRIPTEN_KEEPALIVE double get_camera_culling_far(TCamera *camera); -EMSCRIPTEN_KEEPALIVE float get_camera_fov(TCamera *camera, bool horizontal); -EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(TCamera *camera, float focusDistance); +EMSCRIPTEN_KEEPALIVE double Camera_getNear(TCamera *camera); +EMSCRIPTEN_KEEPALIVE double Camera_getCullingFar(TCamera *camera); +EMSCRIPTEN_KEEPALIVE float Camera_getFov(TCamera *camera, bool horizontal); +EMSCRIPTEN_KEEPALIVE void Camera_setFocusDistance(TCamera *camera, float focusDistance); -EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double near, double far); +EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling( + TCamera* camera, + double4x4 projectionMatrix, + double near, + double far +); EMSCRIPTEN_KEEPALIVE void Camera_setModelMatrix(TCamera* camera, double4x4 modelMatrix); EMSCRIPTEN_KEEPALIVE void Camera_setLensProjection(TCamera *camera, double near, double far, double aspect, double focalLength); EMSCRIPTEN_KEEPALIVE EntityId Camera_getEntity(TCamera* camera); -EMSCRIPTEN_KEEPALIVE void Camera_setProjection(TCamera *const tCamera, Projection projection, double left, double right, +EMSCRIPTEN_KEEPALIVE void Camera_setProjection(TCamera *const tCamera, TProjection projection, double left, double right, double bottom, double top, double near, double far); diff --git a/thermion_dart/native/include/c_api/TEngine.h b/thermion_dart/native/include/c_api/TEngine.h index 8668812f..0ccd23fc 100644 --- a/thermion_dart/native/include/c_api/TEngine.h +++ b/thermion_dart/native/include/c_api/TEngine.h @@ -5,8 +5,6 @@ #include "APIBoundaryTypes.h" #include "TMaterialInstance.h" #include "TTexture.h" -#include "ResourceBuffer.hpp" -#include "MathUtils.hpp" #ifdef __cplusplus extern "C" @@ -21,7 +19,13 @@ enum TBackend { BACKEND_NOOP = 4, //!< Selects the no-op driver for testing purposes. }; -EMSCRIPTEN_KEEPALIVE TEngine *Engine_create(TBackend backend, void* platform, void* sharedContext, uint8_t stereoscopicEyeCount, bool disableHandleUseAfterFreeCheck); +EMSCRIPTEN_KEEPALIVE TEngine *Engine_create( + TBackend backend, + void* platform, + void* sharedContext, + uint8_t stereoscopicEyeCount, + bool disableHandleUseAfterFreeCheck +); EMSCRIPTEN_KEEPALIVE TRenderer *Engine_createRenderer(TEngine *tEngine); EMSCRIPTEN_KEEPALIVE TSwapChain *Engine_createSwapChain(TEngine *tEngine, void *window, uint64_t flags); EMSCRIPTEN_KEEPALIVE TSwapChain *Engine_createHeadlessSwapChain(TEngine *tEngine, uint32_t width, uint32_t height, uint64_t flags); diff --git a/thermion_dart/native/include/c_api/TFilamentAsset.h b/thermion_dart/native/include/c_api/TFilamentAsset.h index 87db47dc..7cf44c31 100644 --- a/thermion_dart/native/include/c_api/TFilamentAsset.h +++ b/thermion_dart/native/include/c_api/TFilamentAsset.h @@ -1,7 +1,5 @@ #pragma once -#include - #include "APIExport.h" #include "APIBoundaryTypes.h" diff --git a/thermion_dart/native/include/c_api/TGizmo.h b/thermion_dart/native/include/c_api/TGizmo.h index 801b46c2..c1b70fcb 100644 --- a/thermion_dart/native/include/c_api/TGizmo.h +++ b/thermion_dart/native/include/c_api/TGizmo.h @@ -16,6 +16,7 @@ enum TGizmoPickResultType { AxisX, AxisY, AxisZ, Parent, None }; typedef void (*GizmoPickCallback)(TGizmoPickResultType resultType, float x, float y, float z); +EMSCRIPTEN_KEEPALIVE TGizmo *Gizmo_create(TEngine *tEngine, TView *tView, TGizmoType tGizmoType); EMSCRIPTEN_KEEPALIVE void Gizmo_pick(TGizmo *tGizmo, uint32_t x, uint32_t y, GizmoPickCallback callback); EMSCRIPTEN_KEEPALIVE void Gizmo_highlight(TGizmo *tGizmo, TGizmoAxis axis); EMSCRIPTEN_KEEPALIVE void Gizmo_unhighlight(TGizmo *tGizmo); diff --git a/thermion_dart/native/include/c_api/TGltfAssetLoader.h b/thermion_dart/native/include/c_api/TGltfAssetLoader.h index 51881b57..89ee54d5 100644 --- a/thermion_dart/native/include/c_api/TGltfAssetLoader.h +++ b/thermion_dart/native/include/c_api/TGltfAssetLoader.h @@ -5,8 +5,6 @@ #include "APIBoundaryTypes.h" #include "TMaterialInstance.h" #include "TTexture.h" -#include "ResourceBuffer.hpp" -#include "MathUtils.hpp" #ifdef __cplusplus extern "C" diff --git a/thermion_dart/native/include/c_api/TIndirectLight.h b/thermion_dart/native/include/c_api/TIndirectLight.h index 5be5d8cc..4d504b40 100644 --- a/thermion_dart/native/include/c_api/TIndirectLight.h +++ b/thermion_dart/native/include/c_api/TIndirectLight.h @@ -2,10 +2,6 @@ #include "APIExport.h" #include "APIBoundaryTypes.h" -#include "TMaterialInstance.h" -#include "TTexture.h" -#include "ResourceBuffer.hpp" -#include "MathUtils.hpp" #ifdef __cplusplus extern "C" diff --git a/thermion_dart/native/include/c_api/TRenderableManager.h b/thermion_dart/native/include/c_api/TRenderableManager.h index bd4194d4..7773e135 100644 --- a/thermion_dart/native/include/c_api/TRenderableManager.h +++ b/thermion_dart/native/include/c_api/TRenderableManager.h @@ -9,7 +9,6 @@ extern "C" #endif EMSCRIPTEN_KEEPALIVE void RenderableManager_setMaterialInstanceAt(TRenderableManager *tRenderableManager, EntityId entityId, int primitiveIndex, TMaterialInstance *tMaterialInstance); - EMSCRIPTEN_KEEPALIVE void RenderableManager_setPriority(TRenderableManager *tRenderableManager, EntityId entityId, int priority); EMSCRIPTEN_KEEPALIVE TMaterialInstance *RenderableManager_getMaterialInstanceAt(TRenderableManager *tRenderableManager, EntityId entityId, int primitiveIndex); EMSCRIPTEN_KEEPALIVE bool RenderableManager_isRenderable(TRenderableManager *tRenderableManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE bool RenderableManager_hasComponent(TRenderableManager *tRenderableManager, EntityId entityId); @@ -21,6 +20,9 @@ extern "C" EMSCRIPTEN_KEEPALIVE bool RenderableManager_isShadowReceiver(TRenderableManager *tRenderableManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE bool RenderableManager_getFogEnabled(TRenderableManager *tRenderableManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE Aabb3 RenderableManager_getAabb(TRenderableManager *tRenderableManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void RenderableManager_setVisibilityLayer(TRenderableManager *tRenderableManager, EntityId entityId, uint8_t layer); + EMSCRIPTEN_KEEPALIVE void RenderableManager_setPriority(TRenderableManager *tRenderableManager, EntityId entityId, uint8_t priority); + #ifdef __cplusplus } diff --git a/thermion_dart/native/include/c_api/TRenderer.h b/thermion_dart/native/include/c_api/TRenderer.h index a84cd5dc..e6a958ce 100644 --- a/thermion_dart/native/include/c_api/TRenderer.h +++ b/thermion_dart/native/include/c_api/TRenderer.h @@ -1,5 +1,4 @@ -#ifndef _T_RENDERER_H -#define _T_RENDERER_H +#pragma once #include "APIExport.h" #include "APIBoundaryTypes.h" @@ -36,4 +35,3 @@ EMSCRIPTEN_KEEPALIVE void Renderer_setFrameInterval( #ifdef __cplusplus } #endif -#endif diff --git a/thermion_dart/native/include/c_api/TSceneAsset.h b/thermion_dart/native/include/c_api/TSceneAsset.h index 08d47daf..bb21197f 100644 --- a/thermion_dart/native/include/c_api/TSceneAsset.h +++ b/thermion_dart/native/include/c_api/TSceneAsset.h @@ -1,8 +1,6 @@ #pragma once -#include - #include "APIExport.h" #include "APIBoundaryTypes.h" @@ -20,7 +18,7 @@ extern "C" uint32_t numUvs, uint16_t *indices, uint32_t numIndices, - TPrimitiveType tPrimitiveType, + enum TPrimitiveType tPrimitiveType, TMaterialInstance **materialInstances, int materialInstanceCount ); @@ -44,20 +42,22 @@ extern "C" size_t length, size_t numInstances ); - + + EMSCRIPTEN_KEEPALIVE void SceneAsset_destroy(TSceneAsset *tSceneAsset); EMSCRIPTEN_KEEPALIVE void SceneAsset_addToScene(TSceneAsset *tSceneAsset, TScene *tScene); EMSCRIPTEN_KEEPALIVE void SceneAsset_removeFromScene(TSceneAsset *tSceneAsset, TScene *tScene); EMSCRIPTEN_KEEPALIVE EntityId SceneAsset_getEntity(TSceneAsset *tSceneAsset); EMSCRIPTEN_KEEPALIVE int SceneAsset_getChildEntityCount(TSceneAsset* tSceneAsset); EMSCRIPTEN_KEEPALIVE void SceneAsset_getChildEntities(TSceneAsset* tSceneAsset, EntityId *out); - EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getCameraEntities(TSceneAsset* tSceneAsset); + EMSCRIPTEN_KEEPALIVE EntityId *SceneAsset_getCameraEntities(TSceneAsset* tSceneAsset); EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getCameraEntityCount(TSceneAsset *tSceneAsset); - EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getLightEntities(TSceneAsset* tSceneAsset); + EMSCRIPTEN_KEEPALIVE EntityId *SceneAsset_getLightEntities(TSceneAsset* tSceneAsset); EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getLightEntityCount(TSceneAsset *tSceneAsset); EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneAsset_getInstance(TSceneAsset *tSceneAsset, int index); EMSCRIPTEN_KEEPALIVE size_t SceneAsset_getInstanceCount(TSceneAsset *tSceneAsset); EMSCRIPTEN_KEEPALIVE TSceneAsset * SceneAsset_createInstance(TSceneAsset *asset, TMaterialInstance **materialInstances, int materialInstanceCount); EMSCRIPTEN_KEEPALIVE Aabb3 SceneAsset_getBoundingBox(TSceneAsset *asset); + EMSCRIPTEN_KEEPALIVE Aabb3 SceneAsset_getBoundingBox(TSceneAsset *asset); #ifdef __cplusplus } diff --git a/thermion_dart/native/include/c_api/TSceneManager.h b/thermion_dart/native/include/c_api/TSceneManager.h deleted file mode 100644 index 09a1033f..00000000 --- a/thermion_dart/native/include/c_api/TSceneManager.h +++ /dev/null @@ -1,89 +0,0 @@ -#pragma once - -#include "APIBoundaryTypes.h" -#include "ResourceBuffer.hpp" -#include "MathUtils.hpp" -#include "TCamera.h" -#include "TMaterialInstance.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - - EMSCRIPTEN_KEEPALIVE TGizmo *SceneManager_createGizmo(TSceneManager *tSceneManager, TView *tView, TScene *tScene, TGizmoType tGizmoType); - EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_createGeometry( - TSceneManager *sceneManager, - float *vertices, - int numVertices, - float *normals, - int numNormals, - float *uvs, - int numUvs, - uint16_t *indices, - int numIndices, - int primitiveType, - TMaterialInstance **materialInstances, - int materialInstanceCount, - bool keepData); - EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUbershaderMaterialProvider(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUnlitMaterialProvider(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitMaterialInstance(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitFixedSizeMaterialInstance(TSceneManager *sceneManager); - - EMSCRIPTEN_KEEPALIVE void SceneManager_queueTransformUpdates(TSceneManager *sceneManager, EntityId *entities, const double *const transforms, int numEntities); - EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_findCameraByName(TSceneManager *tSceneManager, EntityId entity, const char *name); - EMSCRIPTEN_KEEPALIVE void SceneManager_setVisibilityLayer(TSceneManager *tSceneManager, EntityId entity, int layer); - EMSCRIPTEN_KEEPALIVE TScene *SceneManager_getScene(TSceneManager *tSceneManager); - - - EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_createCamera(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera *camera); - EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager); - EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance); - - EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *tSceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE int SceneManager_addToScene(TSceneManager *tSceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE int SceneManager_removeFromScene(TSceneManager *tSceneManager, EntityId entity); - - EMSCRIPTEN_KEEPALIVE void SceneManager_transformToUnitCube(TSceneManager *sceneManager, EntityId asset); - EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync); - EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData); - EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData); - - - EMSCRIPTEN_KEEPALIVE EntityId SceneManager_addLight( - TSceneManager *tSceneManager, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, - float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, - float sunAngularRadius, - float sunHaloSize, - float sunHaloFallof, - bool shadows); - EMSCRIPTEN_KEEPALIVE void SceneManager_removeLight(TSceneManager *tSceneManager, EntityId entityId); - - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyLights(TSceneManager *tSceneManager); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyAsset(TSceneManager *tSceneManager, TSceneAsset *sceneAsset); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyAssets(TSceneManager *tSceneManager); - EMSCRIPTEN_KEEPALIVE void SceneManager_destroyAll(TSceneManager *tSceneManager); - - EMSCRIPTEN_KEEPALIVE TAnimationManager *SceneManager_getAnimationManager(TSceneManager *tSceneManager); - EMSCRIPTEN_KEEPALIVE TNameComponentManager *SceneManager_getNameComponentManager(TSceneManager *tSceneManager); - EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_createGrid(TSceneManager *tSceneManager, TMaterial *tMaterial); - EMSCRIPTEN_KEEPALIVE bool SceneManager_isGridEntity(TSceneManager *tSceneManager, EntityId entityId); - - -#ifdef __cplusplus -} -#endif diff --git a/thermion_dart/native/include/c_api/TSceneManager_HBAK b/thermion_dart/native/include/c_api/TSceneManager_HBAK new file mode 100644 index 00000000..51f7d83f --- /dev/null +++ b/thermion_dart/native/include/c_api/TSceneManager_HBAK @@ -0,0 +1,88 @@ +// #pragma once + +// #include "APIBoundaryTypes.h" +// #include "MathUtils.hpp" +// #include "TCamera.h" +// #include "TMaterialInstance.h" + +// #ifdef __cplusplus +// extern "C" +// { +// #endif + +// EMSCRIPTEN_KEEPALIVE TGizmo *SceneManager_createGizmo(TSceneManager *tSceneManager, TView *tView, TScene *tScene, TGizmoType tGizmoType); +// EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_createGeometry( +// TSceneManager *sceneManager, +// float *vertices, +// int numVertices, +// float *normals, +// int numNormals, +// float *uvs, +// int numUvs, +// uint16_t *indices, +// int numIndices, +// int primitiveType, +// TMaterialInstance **materialInstances, +// int materialInstanceCount, +// bool keepData); +// EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUbershaderMaterialProvider(TSceneManager *sceneManager); +// EMSCRIPTEN_KEEPALIVE TMaterialProvider *SceneManager_getUnlitMaterialProvider(TSceneManager *sceneManager); +// EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitMaterialInstance(TSceneManager *sceneManager); +// EMSCRIPTEN_KEEPALIVE TMaterialInstance *SceneManager_createUnlitFixedSizeMaterialInstance(TSceneManager *sceneManager); + +// EMSCRIPTEN_KEEPALIVE void SceneManager_queueTransformUpdates(TSceneManager *sceneManager, EntityId *entities, const double *const transforms, int numEntities); +// EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_findCameraByName(TSceneManager *tSceneManager, EntityId entity, const char *name); +// EMSCRIPTEN_KEEPALIVE void SceneManager_setVisibilityLayer(TSceneManager *tSceneManager, EntityId entity, int layer); +// EMSCRIPTEN_KEEPALIVE TScene *SceneManager_getScene(TSceneManager *tSceneManager); + + +// EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_createCamera(TSceneManager *sceneManager); +// EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera *camera); +// EMSCRIPTEN_KEEPALIVE size_t SceneManager_getCameraCount(TSceneManager *sceneManager); +// EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_getCameraAt(TSceneManager *sceneManager, size_t index); +// EMSCRIPTEN_KEEPALIVE void SceneManager_destroyMaterialInstance(TSceneManager *sceneManager, TMaterialInstance *instance); + +// EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *tSceneManager, EntityId entity); +// EMSCRIPTEN_KEEPALIVE int SceneManager_addToScene(TSceneManager *tSceneManager, EntityId entity); +// EMSCRIPTEN_KEEPALIVE int SceneManager_removeFromScene(TSceneManager *tSceneManager, EntityId entity); + +// EMSCRIPTEN_KEEPALIVE void SceneManager_transformToUnitCube(TSceneManager *sceneManager, EntityId asset); +// EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlbFromBuffer(TSceneManager *tSceneManager, const uint8_t *const, size_t length, int numInstances, bool keepData, int priority, int layer, bool loadResourcesAsync); +// EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGlb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData); +// EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_loadGltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData); + + +// EMSCRIPTEN_KEEPALIVE EntityId SceneManager_addLight( +// TSceneManager *tSceneManager, +// uint8_t type, +// float colour, +// float intensity, +// float posX, +// float posY, +// float posZ, +// float dirX, +// float dirY, +// float dirZ, +// float falloffRadius, +// float spotLightConeInner, +// float spotLightConeOuter, +// float sunAngularRadius, +// float sunHaloSize, +// float sunHaloFallof, +// bool shadows); +// EMSCRIPTEN_KEEPALIVE void SceneManager_removeLight(TSceneManager *tSceneManager, EntityId entityId); + +// EMSCRIPTEN_KEEPALIVE void SceneManager_destroyLights(TSceneManager *tSceneManager); +// EMSCRIPTEN_KEEPALIVE void SceneManager_destroyAsset(TSceneManager *tSceneManager, TSceneAsset *sceneAsset); +// EMSCRIPTEN_KEEPALIVE void SceneManager_destroyAssets(TSceneManager *tSceneManager); +// EMSCRIPTEN_KEEPALIVE void SceneManager_destroyAll(TSceneManager *tSceneManager); + +// EMSCRIPTEN_KEEPALIVE TAnimationManager *SceneManager_getAnimationManager(TSceneManager *tSceneManager); +// EMSCRIPTEN_KEEPALIVE TNameComponentManager *SceneManager_getNameComponentManager(TSceneManager *tSceneManager); +// EMSCRIPTEN_KEEPALIVE TSceneAsset *SceneManager_createGrid(TSceneManager *tSceneManager, TMaterial *tMaterial); +// EMSCRIPTEN_KEEPALIVE bool SceneManager_isGridEntity(TSceneManager *tSceneManager, EntityId entityId); + + +// #ifdef __cplusplus +// } +// #endif diff --git a/thermion_dart/native/include/c_api/TTexture.h b/thermion_dart/native/include/c_api/TTexture.h index e9b54f42..cfda3aaa 100644 --- a/thermion_dart/native/include/c_api/TTexture.h +++ b/thermion_dart/native/include/c_api/TTexture.h @@ -5,9 +5,6 @@ #include "APIBoundaryTypes.h" #include "TMaterialInstance.h" -#include "ResourceBuffer.hpp" -#include "MathUtils.hpp" - #ifdef __cplusplus extern "C" { @@ -215,7 +212,13 @@ EMSCRIPTEN_KEEPALIVE TTexture *Texture_build(TEngine *engine, intptr_t import, TTextureSamplerType sampler, TTextureFormat format); -EMSCRIPTEN_KEEPALIVE bool Texture_loadImage(TEngine *tEngine, TTexture *tTexture, TLinearImage *tImage, TPixelDataFormat bufferFormat, TPixelDataType pixelDataType); +EMSCRIPTEN_KEEPALIVE bool Texture_loadImage( + TEngine *tEngine, + TTexture *tTexture, + TLinearImage *tImage, + TPixelDataFormat bufferFormat, + TPixelDataType pixelDataType +); EMSCRIPTEN_KEEPALIVE bool Texture_setImage( TEngine *tEngine, TTexture *tTexture, @@ -250,7 +253,7 @@ EMSCRIPTEN_KEEPALIVE uint32_t Texture_getDepth(TTexture *tTexture, uint32_t leve EMSCRIPTEN_KEEPALIVE TTextureUsage Texture_getUsage(TTexture *tTexture, uint32_t level); EMSCRIPTEN_KEEPALIVE TLinearImage *Image_createEmpty(uint32_t width,uint32_t height,uint32_t channel); -EMSCRIPTEN_KEEPALIVE TLinearImage *Image_decode(uint8_t* data, size_t length, const char* name = "image"); +EMSCRIPTEN_KEEPALIVE TLinearImage *Image_decode(uint8_t* data, size_t length, const char* name); EMSCRIPTEN_KEEPALIVE float *Image_getBytes(TLinearImage *tLinearImage); EMSCRIPTEN_KEEPALIVE void Image_destroy(TLinearImage *tLinearImage); EMSCRIPTEN_KEEPALIVE uint32_t Image_getWidth(TLinearImage *tLinearImage); @@ -287,14 +290,14 @@ enum TSamplerCompareMode { typedef TSamplerCompareFunc TTextureSamplerCompareFunc ; - EMSCRIPTEN_KEEPALIVE TTextureSampler* TextureSampler_create(); EMSCRIPTEN_KEEPALIVE TTextureSampler* TextureSampler_createWithFiltering( TSamplerMinFilter minFilter, TSamplerMagFilter magFilter, TSamplerWrapMode wrapS, TSamplerWrapMode wrapT, - TSamplerWrapMode wrapR); + TSamplerWrapMode wrapR +); EMSCRIPTEN_KEEPALIVE TTextureSampler* TextureSampler_createWithComparison( TSamplerCompareMode compareMode, TSamplerCompareFunc compareFunc); diff --git a/thermion_dart/native/include/c_api/TView.h b/thermion_dart/native/include/c_api/TView.h index 5c1c60ee..4ffb8e39 100644 --- a/thermion_dart/native/include/c_api/TView.h +++ b/thermion_dart/native/include/c_api/TView.h @@ -17,7 +17,7 @@ struct TViewport { }; typedef struct TViewport TViewport; -enum ToneMapping +enum TToneMapping { ACES, FILMIC, @@ -46,7 +46,7 @@ EMSCRIPTEN_KEEPALIVE void View_setShadowType(TView* tView, int shadowType); EMSCRIPTEN_KEEPALIVE void View_setSoftShadowOptions(TView* tView, float penumbraScale, float penumbraRatioScale); EMSCRIPTEN_KEEPALIVE void View_setBloom(TView* tView, bool enabled, float strength); EMSCRIPTEN_KEEPALIVE void View_setRenderQuality(TView* tView, TQualityLevel qualityLevel); -EMSCRIPTEN_KEEPALIVE void View_setToneMapping(TView* tView, TEngine* tEngine, ToneMapping toneMapping); +EMSCRIPTEN_KEEPALIVE void View_setToneMapping(TView* tView, TEngine* tEngine, TToneMapping toneMapping); EMSCRIPTEN_KEEPALIVE void View_setAntiAliasing(TView *tView, bool msaa, bool fxaa, bool taa); EMSCRIPTEN_KEEPALIVE void View_setLayerEnabled(TView *tView, int layer, bool visible); EMSCRIPTEN_KEEPALIVE void View_setCamera(TView *tView, TCamera *tCamera); diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h index 478c19b1..ffa06735 100644 --- a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -16,8 +16,8 @@ namespace thermion EMSCRIPTEN_KEEPALIVE void RenderLoop_create(); EMSCRIPTEN_KEEPALIVE void RenderLoop_destroy(); - - EMSCRIPTEN_KEEPALIVE void RenderTicker_renderRenderThread(TRenderTicker *tRenderTicker, uint64_t frameTimeInNanos,); + EMSCRIPTEN_KEEPALIVE void RenderLoop_requestAnimationFrame(void (*onComplete)); + EMSCRIPTEN_KEEPALIVE void RenderTicker_renderRenderThread(TRenderTicker *tRenderTicker, uint64_t frameTimeInNanos); // EMSCRIPTEN_KEEPALIVE void RenderLoop_addTask(TRenderLoop* tRenderLoop, void (*task)()); EMSCRIPTEN_KEEPALIVE void AnimationManager_createRenderThread(TEngine *tEngine, TScene *tScene, void (*onComplete)(TAnimationManager *)); @@ -75,7 +75,7 @@ namespace thermion EMSCRIPTEN_KEEPALIVE void Material_createInstanceRenderThread(TMaterial *tMaterial, void (*onComplete)(TMaterialInstance *)); - EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping); + EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, ToneMapping toneMapping); EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, bool enabled, double strength); EMSCRIPTEN_KEEPALIVE void View_setCameraRenderThread(TView *tView, TCamera *tCamera, void (*callback)()); @@ -184,7 +184,10 @@ namespace thermion uint16_t tUsage, intptr_t import, TTextureSamplerType sampler, - TTextureFormat format, void (*onComplete)(TTexture *)); + TTextureFormat format, + void (*onComplete)(TTexture *) + ); + EMSCRIPTEN_KEEPALIVE void Texture_loadImageRenderThread( TEngine *tEngine, TTexture *tTexture, @@ -289,7 +292,7 @@ namespace thermion void (*onComplete)() ); - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(TSceneManager *sceneManager, + EMSCRIPTEN_KEEPALIVE void AnimationManager_updateBoneMatricesRenderThread(TSceneManager *sceneManager, EntityId asset, void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( TSceneManager *sceneManager, diff --git a/thermion_dart/native/include/scene/GltfSceneAsset.hpp b/thermion_dart/native/include/scene/GltfSceneAsset.hpp index 17f684e5..c22f61f2 100644 --- a/thermion_dart/native/include/scene/GltfSceneAsset.hpp +++ b/thermion_dart/native/include/scene/GltfSceneAsset.hpp @@ -102,32 +102,6 @@ namespace thermion scene->removeEntities(_asset->getCameraEntities(), _asset->getCameraEntityCount()); } - void setPriority(RenderableManager &rm, int priority) override - { - const Entity *entities = _asset->getEntities(); - for (int i = 0; i < _asset->getEntityCount(); i++) - { - if (rm.hasComponent(entities[i])) - { - auto renderableInstance = rm.getInstance(entities[i]); - rm.setPriority(renderableInstance, priority); - } - } - } - - void setLayer(RenderableManager &rm, int layer) override - { - const Entity *entities = _asset->getEntities(); - for (int i = 0; i < _asset->getEntityCount(); i++) - { - if (rm.hasComponent(entities[i])) - { - auto renderableInstance = rm.getInstance(entities[i]); - rm.setLayerMask(renderableInstance, 0xFF, 1u << (uint8_t)layer); - } - } - } - SceneAsset *getInstanceByEntity(utils::Entity entity) override { for (auto &instance : _instances) diff --git a/thermion_dart/native/include/scene/SceneAsset.hpp b/thermion_dart/native/include/scene/SceneAsset.hpp index 3f8822b5..ff68ad77 100644 --- a/thermion_dart/native/include/scene/SceneAsset.hpp +++ b/thermion_dart/native/include/scene/SceneAsset.hpp @@ -35,7 +35,6 @@ class SceneAsset { virtual SceneAsset* getInstanceOwner() = 0; virtual void destroyInstance(SceneAsset *instance) = 0; - virtual SceneAsset* createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount) = 0; virtual MaterialInstance **getMaterialInstances() = 0; @@ -50,9 +49,6 @@ class SceneAsset { virtual const Entity* getChildEntities() = 0; virtual Entity findEntityByName(const char* name) = 0; - virtual void setPriority(RenderableManager& rm, int mask) = 0; - virtual void setLayer(RenderableManager& rm, int layer) = 0; - virtual const filament::Aabb getBoundingBox() const = 0; diff --git a/thermion_dart/native/src/c_api/TCamera.cpp b/thermion_dart/native/src/c_api/TCamera.cpp index 3b493f28..4dd9cfcf 100644 --- a/thermion_dart/native/src/c_api/TCamera.cpp +++ b/thermion_dart/native/src/c_api/TCamera.cpp @@ -30,6 +30,17 @@ namespace thermion ); } + EMSCRIPTEN_KEEPALIVE void Camera_getFrustum(TCamera *tCamera, double *out) { + auto *camera = reinterpret_cast(tCamera); + auto &frustum = camera->getFrustum(); + auto planes = frustum.getPlanes(); + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 4; j++) { + out[(i*4) + j] = planes[i][j]; + } + } + } + EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera *tCamera, double4x4 projectionMatrix, double near, double far) { auto *camera = reinterpret_cast(tCamera); diff --git a/thermion_dart/native/src/c_api/TRenderableManager.cpp b/thermion_dart/native/src/c_api/TRenderableManager.cpp index 581d2c73..1c839824 100644 --- a/thermion_dart/native/src/c_api/TRenderableManager.cpp +++ b/thermion_dart/native/src/c_api/TRenderableManager.cpp @@ -32,13 +32,6 @@ namespace thermion return reinterpret_cast(materialInstance); } - EMSCRIPTEN_KEEPALIVE void RenderableManager_setPriority(TRenderableManager *tRenderableManager, EntityId entityId, int priority) { - auto *renderableManager = reinterpret_cast(tRenderableManager); - const auto &entity = utils::Entity::import(entityId); - auto renderableInstance = renderableManager->getInstance(entity); - renderableManager->setPriority(renderableInstance, priority); - } - EMSCRIPTEN_KEEPALIVE bool RenderableManager_isRenderable(TRenderableManager *tRenderableManager, EntityId entityId) { auto *renderableManager = reinterpret_cast(tRenderableManager); const auto &entity = utils::Entity::import(entityId); @@ -131,5 +124,29 @@ namespace thermion auto box = rm.getAxisAlignedBoundingBox(instance); return Aabb3{box.center.x, box.center.y, box.center.z, box.halfExtent.x, box.halfExtent.y, box.halfExtent.z}; } + + EMSCRIPTEN_KEEPALIVE void RenderableManager_setVisibilityLayer(TRenderableManager *tRenderableManager, EntityId entityId, uint8_t layer) { + auto *renderableManager = reinterpret_cast(tRenderableManager); + const auto &entity = utils::Entity::import(entityId); + if (!renderableManager.hasComponent(entity)) { + Log("Not renderable"); + return; + } + auto renderableInstance = renderableManager->getInstance(entity); + renderableManager->setLayerMask(renderableInstance, 0xFF, 1u << (uint8_t)layer); + } + + EMSCRIPTEN_KEEPALIVE void RenderableManager_setPriority(TRenderableManager *tRenderableManager, EntityId entityId, uint8_t priority) { + auto *renderableManager = reinterpret_cast(tRenderableManager); + const auto &entity = utils::Entity::import(entityId); + + if (!renderableManager.hasComponent(entity)) { + Log("Not renderable"); + return; + } + auto renderableInstance = renderableManager->getInstance(entity); + renderableManager->setPriority(renderableInstance, layer); + } + } } \ No newline at end of file diff --git a/thermion_dart/native/src/c_api/TSceneAsset.cpp b/thermion_dart/native/src/c_api/TSceneAsset.cpp index 124de135..bda4cb2a 100644 --- a/thermion_dart/native/src/c_api/TSceneAsset.cpp +++ b/thermion_dart/native/src/c_api/TSceneAsset.cpp @@ -89,6 +89,11 @@ extern "C" return reinterpret_cast(sceneAsset); } + + EMSCRIPTEN_KEEPALIVE void SceneAsset_destroy(TSceneAsset *tSceneAsset) { + auto *asset = reinterpret_cast(tSceneAsset); + delete asset; + } EMSCRIPTEN_KEEPALIVE void SceneAsset_addToScene(TSceneAsset *tSceneAsset, TScene *tScene) { auto *asset = reinterpret_cast(tSceneAsset); @@ -121,13 +126,14 @@ extern "C" } } - EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getCameraEntities(TSceneAsset* tSceneAsset) + EMSCRIPTEN_KEEPALIVE EntityId *SceneAsset_getCameraEntities(TSceneAsset* tSceneAsset) { auto *asset = reinterpret_cast(tSceneAsset); if (asset->getType() == SceneAsset::SceneAssetType::Gltf && !asset->isInstance()) { auto gltfSceneAsset = reinterpret_cast(asset); - return gltfSceneAsset->getAsset()->getCameraEntities(); + auto *entities = gltfSceneAsset->getAsset()->getCameraEntities(); + return reinterpret_cast(const_cast(entities)); } else { @@ -148,13 +154,14 @@ extern "C" } - EMSCRIPTEN_KEEPALIVE const utils::Entity *SceneAsset_getLightEntities(TSceneAsset* tSceneAsset) + EMSCRIPTEN_KEEPALIVE EntityId *SceneAsset_getLightEntities(TSceneAsset* tSceneAsset) { auto *asset = reinterpret_cast(tSceneAsset); if (asset->getType() == SceneAsset::SceneAssetType::Gltf && !asset->isInstance()) { auto gltfSceneAsset = reinterpret_cast(asset); - return gltfSceneAsset->getAsset()->getLightEntities(); + auto *entities = gltfSceneAsset->getAsset()->getLightEntities(); + return reinterpret_cast(const_cast(entities)); } return std::nullptr_t(); diff --git a/thermion_dart/native/src/c_api/TTransformManager.cpp b/thermion_dart/native/src/c_api/TTransformManager.cpp index 5116a20e..50d58ddd 100644 --- a/thermion_dart/native/src/c_api/TTransformManager.cpp +++ b/thermion_dart/native/src/c_api/TTransformManager.cpp @@ -57,23 +57,23 @@ extern "C" transformManager->setTransform(transformInstance, convert_double4x4_to_mat4(transform)); } - // EMSCRIPTEN_KEEPALIVE void TransformManager_transformToUnitCube(TTransformManager *tTransformManager, EntityId entityId) { - // auto *transformManager = reinterpret_cast(tTransformManager); - // const auto &entity = utils::Entity::import(entityId); - // auto transformInstance = transformManager->getInstance(entity); - // if (!transformInstance) - // { - // return; - // } + EMSCRIPTEN_KEEPALIVE void TransformManager_transformToUnitCube(TTransformManager *tTransformManager, EntityId entityId, Aabb3 boundingBox) { + + auto *transformManager = reinterpret_cast(tTransformManager); + const auto &entity = utils::Entity::import(entityId); + auto transformInstance = transformManager->getInstance(entity); + if (!transformInstance || !transformInstance.isValid()) + { + return; + } - // auto aabb = instance->getBoundingBox(); - // auto center = aabb.center(); - // auto halfExtent = aabb.extent(); - // auto maxExtent = max(halfExtent) * 2; - // auto scaleFactor = 2.0f / maxExtent; - // auto transform = math::mat4f::scaling(scaleFactor) * math::mat4f::translation(-center); - // tm.setTransform(tm.getInstance(instance->getRoot()), transform); - // } + auto center = aabb.center(); + auto halfExtent = aabb.extent(); + auto maxExtent = max(halfExtent) * 2; + auto scaleFactor = 2.0f / maxExtent; + auto transform = math::mat4f::scaling(scaleFactor) * math::mat4f::translation(-center); + transformManager->setTransform(transformInstance, transform); + } EMSCRIPTEN_KEEPALIVE void TransformManager_setParent(TTransformManager *tTransformManager, EntityId childId, EntityId parentId, bool preserveScaling) { diff --git a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index bf4b19a5..723701d5 100644 --- a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -50,6 +50,10 @@ extern "C" } } + EMSCRIPTEN_KEEPALIVE void RenderLoop_requestAnimationFrame(void (*onComplete)) { + _rl->requestFrame(onComplete); + } + EMSCRIPTEN_KEEPALIVE void RenderTicker_renderRenderThread(TRenderTicker *tRenderTicker, , uint64_t frameTimeInNanos, void (*onComplete)()) { std::packaged_task lambda( diff --git a/thermion_dart/native/src/scene/SceneManager.cpp b/thermion_dart/native/src/scene/SceneManager.cpp index 0b463878..6e4637e0 100644 --- a/thermion_dart/native/src/scene/SceneManager.cpp +++ b/thermion_dart/native/src/scene/SceneManager.cpp @@ -966,32 +966,5 @@ namespace thermion return _cameras[index - 1]; } - void SceneManager::transformToUnitCube(EntityId entityId) - { - auto entity = utils::Entity::import(entityId); - for (auto &asset : _sceneAssets) - { - auto *instance = reinterpret_cast(asset->getInstanceByEntity(entity)); - if (instance) - { - auto &transformManager = _engine->getTransformManager(); - const auto &entity = utils::Entity::import(entityId); - auto transformInstance = transformManager.getInstance(entity); - if (!transformInstance) - { - return; - } - - auto aabb = instance->getInstance()->getBoundingBox(); - auto center = aabb.center(); - auto halfExtent = aabb.extent(); - auto maxExtent = max(halfExtent) * 2; - auto scaleFactor = 2.0f / maxExtent; - auto transform = math::mat4f::scaling(scaleFactor) * math::mat4f::translation(-center); - transformManager.setTransform(transformManager.getInstance(entity), transform); - return; - } - } - } } // namespace thermion