diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/src/camera_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/src/camera_ffi.dart index 1f9f1397..b6704476 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/src/camera_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/src/camera_ffi.dart @@ -5,19 +5,33 @@ import 'package:thermion_dart/thermion_dart/viewer/ffi/src/thermion_dart.g.dart' import 'package:thermion_dart/thermion_dart/viewer/shared_types/camera.dart'; import 'package:vector_math/vector_math_64.dart'; -class ThermionFFICamera extends Camera { - final Pointer pointer; +import '../../thermion_viewer_base.dart'; - ThermionFFICamera(this.pointer); +class ThermionFFICamera extends Camera { + final Pointer camera; + final Pointer engine; + + ThermionFFICamera(this.camera, this.engine); @override Future setProjectionMatrixWithCulling( Matrix4 projectionMatrix, double near, double far) async { Camera_setCustomProjectionWithCulling( - pointer, matrix4ToDouble4x4(projectionMatrix), near, far); + camera, matrix4ToDouble4x4(projectionMatrix), near, far); } Future getModelMatrix() async { - return double4x4ToMatrix4(Camera_getModelMatrix(pointer)); + return double4x4ToMatrix4(Camera_getModelMatrix(camera)); + } + + @override + Future setTransform(Matrix4 transform) async { + var entity = Camera_getEntity(camera); + Engine_setTransform(engine, entity, matrix4ToDouble4x4(transform)); + } + + @override + Future setLensProjection({double near = kNear, double far = kFar, double aspect = 1.0, double focalLength = kFocalLength}) async { + Camera_setLensProjection(camera, near, far, aspect, focalLength); } } diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_dart.g.dart index 43cd6ea3..d9b665d4 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_dart.g.dart @@ -21,8 +21,9 @@ external void destroy_filament_viewer( ffi.Pointer viewer, ); -@ffi.Native Function(ffi.Pointer)>(isLeaf: true) -external ffi.Pointer get_scene_manager( +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer Viewer_getSceneManager( ffi.Pointer viewer, ); @@ -38,6 +39,14 @@ external ffi.Pointer Engine_getCameraComponent( int entityId, ); +@ffi.Native, EntityId, double4x4)>( + isLeaf: true) +external void Engine_setTransform( + ffi.Pointer tEngine, + int entity, + double4x4 transform, +); + @ffi.Native< ffi.Void Function( ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>(isLeaf: true) @@ -212,20 +221,20 @@ external void set_light_direction( ); @ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int, - ffi.Bool)>(isLeaf: true) + EntityId Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Bool)>(isLeaf: true) external int load_glb( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer assetPath, int numInstances, bool keepData, ); @ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size, - ffi.Bool, ffi.Int, ffi.Int)>(isLeaf: true) + EntityId Function(ffi.Pointer, ffi.Pointer, + ffi.Size, ffi.Bool, ffi.Int, ffi.Int)>(isLeaf: true) external int load_glb_from_buffer( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer data, int length, bool keepData, @@ -234,32 +243,34 @@ external int load_glb_from_buffer( ); @ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Bool)>(isLeaf: true) external int load_gltf( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer assetPath, ffi.Pointer relativePath, bool keepData, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external int create_instance( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int id, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external int get_instance_count( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external void get_instances( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer out, ); @@ -393,10 +404,10 @@ external void grab_end( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Pointer, ffi.Int)>(isLeaf: true) external void apply_weights( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer entityName, ffi.Pointer weights, @@ -404,20 +415,26 @@ external void apply_weights( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int)>(isLeaf: true) + ffi.Bool Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Int)>(isLeaf: true) external bool set_morph_target_weights( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer morphData, int numWeights, ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int, ffi.Int, ffi.Float)>(isLeaf: true) + ffi.Bool Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Float)>(isLeaf: true) external bool set_morph_animation( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer morphData, ffi.Pointer morphIndices, @@ -428,41 +445,44 @@ external bool set_morph_animation( @ffi.Native< ffi.Pointer Function( - ffi.Pointer, TMaterialKey)>(isLeaf: true) + ffi.Pointer, TMaterialKey)>(isLeaf: true) external ffi.Pointer create_material_instance( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, TMaterialKey materialConfig, ); -@ffi.Native Function(ffi.Pointer)>( - isLeaf: true) +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer)>(isLeaf: true) external ffi.Pointer create_unlit_material_instance( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, + ffi.Pointer)>(isLeaf: true) external void destroy_material_instance( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer instance, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void clear_morph_animation( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void reset_to_rest_pose( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Int, ffi.Int, @@ -473,7 +493,7 @@ external void reset_to_rest_pose( ffi.Float, ffi.Float)>(isLeaf: true) external void add_bone_animation( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int skinIndex, int boneIndex, @@ -486,19 +506,19 @@ external void add_bone_animation( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external void get_local_transform( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer arg2, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, ffi.Int)>(isLeaf: true) external void get_rest_local_transforms( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, int skinIndex, ffi.Pointer out, @@ -506,19 +526,19 @@ external void get_rest_local_transforms( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external void get_world_transform( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer arg2, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, ffi.Pointer)>(isLeaf: true) external void get_inverse_bind_matrix( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, int skinIndex, int boneIndex, @@ -526,10 +546,10 @@ external void get_inverse_bind_matrix( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, ffi.Pointer)>(isLeaf: true) external bool set_bone_transform( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int skinIndex, int boneIndex, @@ -537,10 +557,10 @@ external bool set_bone_transform( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, ffi.Bool, ffi.Bool, ffi.Float, ffi.Float)>(isLeaf: true) external void play_animation( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int index, bool loop, @@ -552,59 +572,60 @@ external void play_animation( @ffi.Native< ffi.Void Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) external void set_animation_frame( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int animationIndex, int animationFrame, ); -@ffi.Native, EntityId, ffi.Int)>( +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) external void stop_animation( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int index, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external int get_animation_count( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Int)>(isLeaf: true) external void get_animation_name( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer outPtr, int index, ); -@ffi.Native, EntityId, ffi.Int)>( +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) external double get_animation_duration( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int index, ); -@ffi.Native, EntityId, ffi.Int)>( +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) external int get_bone_count( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int assetEntity, int skinIndex, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>, ffi.Int)>(isLeaf: true) external void get_bone_names( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int assetEntity, ffi.Pointer> outPtr, int skinIndex, @@ -612,44 +633,45 @@ external void get_bone_names( @ffi.Native< EntityId Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) external int get_bone( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, int skinIndex, int boneIndex, ); @ffi.Native< - ffi.Bool Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Bool Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external bool set_transform( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer transform, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external bool update_bone_matrices( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Pointer, ffi.Int)>(isLeaf: true) external void get_morph_target_name( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int assetEntity, int childEntity, ffi.Pointer outPtr, int index, ); -@ffi.Native, EntityId, EntityId)>( +@ffi.Native, EntityId, EntityId)>( isLeaf: true) external int get_morph_target_name_count( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int assetEntity, int childEntity, ); @@ -666,10 +688,17 @@ external void clear_entities( ); @ffi.Native< - ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Int, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) + ffi.Bool Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float)>(isLeaf: true) external bool set_material_color( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer meshName, int materialIndex, @@ -679,17 +708,18 @@ external bool set_material_color( double a, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void transform_to_unit_cube( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Bool)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void queue_position_update( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double x, double y, @@ -698,10 +728,10 @@ external void queue_position_update( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void queue_relative_position_update_world_axis( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double viewportX, double viewportY, @@ -711,20 +741,20 @@ external void queue_relative_position_update_world_axis( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Float, ffi.Float)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float)>(isLeaf: true) external void queue_position_update_from_viewport_coords( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double viewportX, double viewportY, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float, ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>(isLeaf: true) external void queue_rotation_update( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double rads, double x, @@ -735,10 +765,10 @@ external void queue_rotation_update( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float, ffi.Float)>(isLeaf: true) external void set_position( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double x, double y, @@ -746,10 +776,10 @@ external void set_position( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(isLeaf: true) external void set_rotation( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double rads, double x, @@ -758,10 +788,10 @@ external void set_rotation( double w, ); -@ffi.Native, EntityId, ffi.Float)>( +@ffi.Native, EntityId, ffi.Float)>( isLeaf: true) external void set_scale( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double scale, ); @@ -858,17 +888,6 @@ external double get_camera_fov( bool horizontal, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, - ffi.Double)>(isLeaf: true) -external void set_camera_lens_projection( - ffi.Pointer camera, - double near, - double far, - double aspect, - double focalLength, -); - @ffi.Native, ffi.Float)>(isLeaf: true) external void set_camera_focus_distance( ffi.Pointer camera, @@ -896,25 +915,69 @@ external void Camera_setCustomProjectionWithCulling( double far, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Double, ffi.Double, ffi.Double, + ffi.Double)>(isLeaf: true) +external void Camera_setLensProjection( + ffi.Pointer camera, + double near, + double far, + double aspect, + double focalLength, +); + @ffi.Native)>(isLeaf: true) external double4x4 Camera_getModelMatrix( ffi.Pointer camera, ); +@ffi.Native)>(isLeaf: true) +external int Camera_getEntity( + ffi.Pointer camera, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer Engine_getEntityManager( + ffi.Pointer engine, +); + +@ffi.Native Function(ffi.Pointer)>( + isLeaf: true) +external ffi.Pointer SceneManager_createCamera( + ffi.Pointer sceneManager, +); + @ffi.Native< - ffi.Int Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external void SceneManager_destroyCamera( + ffi.Pointer sceneManager, + ffi.Pointer camera, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external void SceneManager_setCamera( + ffi.Pointer sceneManager, + ffi.Pointer camera, +); + +@ffi.Native< + ffi.Int Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external int hide_mesh( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer meshName, ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + ffi.Int Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external int reveal_mesh( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer meshName, ); @@ -974,35 +1037,36 @@ external void filament_pick( callback, ); -@ffi.Native Function(ffi.Pointer, EntityId)>( - isLeaf: true) +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, EntityId)>(isLeaf: true) external ffi.Pointer get_name_for_entity( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ); @ffi.Native< - EntityId Function( - ffi.Pointer, EntityId, ffi.Pointer)>(isLeaf: true) + EntityId Function(ffi.Pointer, EntityId, + ffi.Pointer)>(isLeaf: true) external int find_child_entity_by_name( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int parent, ffi.Pointer name, ); -@ffi.Native, EntityId, ffi.Bool)>( +@ffi.Native, EntityId, ffi.Bool)>( isLeaf: true) external int get_entity_count( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int target, bool renderableOnly, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Bool, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>(isLeaf: true) external void get_entities( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int target, bool renderableOnly, ffi.Pointer out, @@ -1010,9 +1074,9 @@ external void get_entities( @ffi.Native< ffi.Pointer Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>(isLeaf: true) external ffi.Pointer get_entity_name_at( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int target, int index, bool renderableOnly, @@ -1041,14 +1105,14 @@ external void thermion_flutter_free( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Pointer< ffi.NativeFunction< ffi.Void Function(EntityId entityId1, EntityId entityId2)>>, ffi.Bool)>(isLeaf: true) external void add_collision_component( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer< ffi.NativeFunction< @@ -1057,27 +1121,30 @@ external void add_collision_component( bool affectsCollidingTransform, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void remove_collision_component( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external bool add_animation_component( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void remove_animation_component( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ); @ffi.Native< EntityId Function( - ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Pointer, @@ -1090,7 +1157,7 @@ external void remove_animation_component( ffi.Pointer, ffi.Bool)>(isLeaf: true) external int create_geometry( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, ffi.Pointer normals, @@ -1104,65 +1171,69 @@ external int create_geometry( bool keepData, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external int get_parent( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int child, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external int get_ancestor( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int child, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, EntityId, EntityId, ffi.Bool)>(isLeaf: true) + ffi.Pointer, EntityId, EntityId, ffi.Bool)>(isLeaf: true) external void set_parent( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int child, int parent, bool preserveScaling, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void test_collisions( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ); -@ffi.Native, EntityId, ffi.Int)>( +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) external void set_priority( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, int priority, ); -@ffi.Native, ffi.Pointer)>( - isLeaf: true) +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) external void get_gizmo( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer out, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>(isLeaf: true) external Aabb2 get_bounding_box( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer)>(isLeaf: true) external void get_bounding_box_to_out( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer minX, ffi.Pointer minY, @@ -1170,25 +1241,25 @@ external void get_bounding_box_to_out( ffi.Pointer maxY, ); -@ffi.Native, ffi.Int, ffi.Bool)>( +@ffi.Native, ffi.Int, ffi.Bool)>( isLeaf: true) external void set_layer_visibility( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int layer, bool visible, ); -@ffi.Native, EntityId, ffi.Int)>( +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) external void set_visibility_layer( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int layer, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer< @@ -1196,7 +1267,7 @@ external void set_visibility_layer( ffi.Void Function( EntityId entityId, ffi.Int x, ffi.Int y)>>)>(isLeaf: true) external void pick_gizmo( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int x, int y, ffi.Pointer< @@ -1205,34 +1276,36 @@ external void pick_gizmo( callback, ); -@ffi.Native, ffi.Bool)>(isLeaf: true) +@ffi.Native, ffi.Bool)>( + isLeaf: true) external void set_gizmo_visibility( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, bool visible, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, - ffi.Float)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, + ffi.Float, ffi.Float)>(isLeaf: true) external void set_stencil_highlight( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, double r, double g, double b, ); -@ffi.Native, EntityId)>(isLeaf: true) +@ffi.Native, EntityId)>( + isLeaf: true) external void remove_stencil_highlight( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, ffi.Float)>(isLeaf: true) external void set_material_property_float( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int materialIndex, ffi.Pointer property, @@ -1240,10 +1313,10 @@ external void set_material_property_float( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, ffi.Int)>(isLeaf: true) external void set_material_property_int( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int materialIndex, ffi.Pointer property, @@ -1251,10 +1324,10 @@ external void set_material_property_int( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Pointer, double4)>(isLeaf: true) external void set_material_property_float4( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int materialIndex, ffi.Pointer property, @@ -1263,9 +1336,9 @@ external void set_material_property_float4( @ffi.Native< ffi.Void Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>(isLeaf: true) external void set_material_depth_write( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int materialIndex, bool enabled, @@ -1293,26 +1366,27 @@ external void unproject_texture( ); @ffi.Native< - ffi.Pointer Function( - ffi.Pointer, ffi.Pointer, ffi.Size)>(isLeaf: true) + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Size)>(isLeaf: true) external ffi.Pointer create_texture( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer data, int length, ); -@ffi.Native, ffi.Pointer)>( - isLeaf: true) +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) external void destroy_texture( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer texture, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Pointer, ffi.Int)>(isLeaf: true) external void apply_texture_to_material( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, ffi.Pointer texture, ffi.Pointer parameterName, @@ -1321,9 +1395,9 @@ external void apply_texture_to_material( @ffi.Native< ffi.Pointer Function( - ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Int)>(isLeaf: true) external ffi.Pointer get_material_instance_at( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entity, int materialIndex, ); @@ -1580,14 +1654,14 @@ external void clear_lights_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Bool, ffi.Pointer>)>( isLeaf: true) external void load_glb_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer assetPath, int numInstances, bool keepData, @@ -1596,7 +1670,7 @@ external void load_glb_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Size, ffi.Int, @@ -1606,7 +1680,7 @@ external void load_glb_render_thread( ffi.Pointer>)>( isLeaf: true) external void load_glb_from_buffer_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer data, int length, int numInstances, @@ -1618,14 +1692,14 @@ external void load_glb_from_buffer_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Bool, ffi.Pointer>)>( isLeaf: true) external void load_gltf_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer assetPath, ffi.Pointer relativePath, bool keepData, @@ -1633,11 +1707,11 @@ external void load_gltf_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>( isLeaf: true) external void create_instance_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer> callback, ); @@ -1671,10 +1745,10 @@ external void set_camera_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, - ffi.Pointer, ffi.Int)>(isLeaf: true) + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Pointer, ffi.Int)>(isLeaf: true) external void apply_weights_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ffi.Pointer entityName, ffi.Pointer weights, @@ -1683,41 +1757,41 @@ external void apply_weights_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) + ffi.Pointer, EntityId, ffi.Int, ffi.Int)>(isLeaf: true) external void set_animation_frame_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, int animationIndex, int animationFrame, ); -@ffi.Native, EntityId, ffi.Int)>( +@ffi.Native, EntityId, ffi.Int)>( isLeaf: true) external void stop_animation_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, int index, ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>( isLeaf: true) external void get_animation_count_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ffi.Pointer> callback, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int, ffi.Pointer>)>(isLeaf: true) external void get_animation_name_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ffi.Pointer outPtr, int index, @@ -1726,14 +1800,14 @@ external void get_animation_name_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, EntityId, ffi.Pointer, ffi.Int, ffi.Pointer>)>(isLeaf: true) external void get_morph_target_name_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int assetEntity, int childEntity, ffi.Pointer outPtr, @@ -1742,11 +1816,11 @@ external void get_morph_target_name_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, EntityId, ffi.Pointer>)>( isLeaf: true) external void get_morph_target_name_count_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, int childEntity, ffi.Pointer> callback, @@ -1754,14 +1828,14 @@ external void get_morph_target_name_count_render_thread( @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int, ffi.Pointer>)>( isLeaf: true) external void set_morph_target_weights_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ffi.Pointer morphData, int numWeights, @@ -1769,18 +1843,18 @@ external void set_morph_target_weights_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>( isLeaf: true) external void update_bone_matrices_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, ffi.Pointer> callback, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, EntityId, ffi.Int, ffi.Int, @@ -1788,7 +1862,7 @@ external void update_bone_matrices_render_thread( ffi.Pointer>)>( isLeaf: true) external void set_bone_transform_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int asset, int skinIndex, int boneIndex, @@ -1803,17 +1877,17 @@ external void set_post_processing_render_thread( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer>)>(isLeaf: true) external void reset_to_rest_pose_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, int entityId, ffi.Pointer> callback, ); @ffi.Native< ffi.Void Function( - ffi.Pointer, + ffi.Pointer, ffi.Pointer, ffi.Int, ffi.Pointer, @@ -1828,7 +1902,7 @@ external void reset_to_rest_pose_render_thread( ffi.Pointer>)>( isLeaf: true) external void create_geometry_render_thread( - ffi.Pointer sceneManager, + ffi.Pointer sceneManager, ffi.Pointer vertices, int numVertices, ffi.Pointer normals, @@ -1872,8 +1946,12 @@ final class TMaterialInstance extends ffi.Opaque {} final class TEngine extends ffi.Opaque {} +final class TEntityManager extends ffi.Opaque {} + final class TViewer extends ffi.Opaque {} +final class TSceneManager extends ffi.Opaque {} + final class TMaterialKey extends ffi.Struct { @ffi.Bool() external bool doubleSided; diff --git a/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_viewer_ffi.dart index e45edc64..70d97e32 100644 --- a/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/viewer/ffi/src/thermion_viewer_ffi.dart @@ -25,7 +25,7 @@ class ThermionViewerFFI extends ThermionViewer { double pixelRatio = 1.0; - Pointer? _sceneManager; + Pointer? _sceneManager; Pointer? _viewer; @@ -115,12 +115,12 @@ class ThermionViewerFFI extends ThermionViewer { } var aspect = viewportDimensions.$1 / viewportDimensions.$2; - var focalLength = get_camera_focal_length(mainCamera.pointer); + var focalLength = get_camera_focal_length(mainCamera.camera); if (focalLength.abs() < 0.1) { focalLength = kFocalLength; } - set_camera_lens_projection( - mainCamera.pointer, near, far, aspect, focalLength); + Camera_setLensProjection( + mainCamera.camera, near, far, aspect, focalLength); } Future createSwapChain(double width, double height, @@ -161,7 +161,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("Failed to create viewer. Check logs for details"); } - _sceneManager = get_scene_manager(_viewer!); + _sceneManager = Viewer_getSceneManager(_viewer!); await setCameraManipulatorOptions(zoomSpeed: 1.0); @@ -1165,7 +1165,7 @@ class ThermionViewerFFI extends ThermionViewer { Future getCameraComponent(ThermionEntity cameraEntity) async { var engine = Viewer_getEngine(_viewer!); var camera = Engine_getCameraComponent(engine, cameraEntity); - return ThermionFFICamera(camera); + return ThermionFFICamera(camera, engine); } /// @@ -1250,7 +1250,7 @@ class ThermionViewerFFI extends ThermionViewer { /// Future getCameraFov(bool horizontal) async { var mainCamera = await getMainCamera() as ThermionFFICamera; - return get_camera_fov(mainCamera.pointer, horizontal); + return get_camera_fov(mainCamera.camera, horizontal); } /// @@ -1279,7 +1279,7 @@ class ThermionViewerFFI extends ThermionViewer { Future getCameraNear() async { var mainCamera = await getMainCamera() as ThermionFFICamera; - return get_camera_near(mainCamera.pointer); + return get_camera_near(mainCamera.camera); } /// @@ -1288,7 +1288,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future getCameraCullingFar() async { var mainCamera = await getMainCamera() as ThermionFFICamera; - return get_camera_culling_far(mainCamera.pointer); + return get_camera_culling_far(mainCamera.camera); } /// @@ -1297,7 +1297,7 @@ class ThermionViewerFFI extends ThermionViewer { @override Future setCameraFocusDistance(double focusDistance) async { var mainCamera = await getMainCamera() as ThermionFFICamera; - set_camera_focus_distance(mainCamera.pointer, focusDistance); + set_camera_focus_distance(mainCamera.camera, focusDistance); } /// @@ -1333,7 +1333,8 @@ class ThermionViewerFFI extends ThermionViewer { Future setCameraExposure( double aperture, double shutterSpeed, double sensitivity) async { var mainCamera = await getMainCamera() as ThermionFFICamera; - set_camera_exposure(mainCamera.pointer, aperture, shutterSpeed, sensitivity); + set_camera_exposure( + mainCamera.camera, aperture, shutterSpeed, sensitivity); } /// @@ -1363,7 +1364,7 @@ class ThermionViewerFFI extends ThermionViewer { Future setCameraModelMatrix4(Matrix4 modelMatrix) async { var mainCamera = await getMainCamera() as ThermionFFICamera; final out = matrix4ToDouble4x4(modelMatrix); - set_camera_model_matrix(mainCamera.pointer, out); + set_camera_model_matrix(mainCamera.camera, out); } /// @@ -1377,7 +1378,7 @@ class ThermionViewerFFI extends ThermionViewer { double focalLength = kFocalLength}) async { aspect ??= viewportDimensions.$1 / viewportDimensions.$2; var mainCamera = get_camera(_viewer!, get_main_camera(_viewer!)); - set_camera_lens_projection(mainCamera, near, far, aspect, focalLength); + Camera_setLensProjection(mainCamera, near, far, aspect, focalLength); } /// @@ -1596,7 +1597,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("No viewer available"); } var mainCamera = await getMainCamera() as ThermionFFICamera; - var matrixStruct = get_camera_view_matrix(mainCamera.pointer); + var matrixStruct = get_camera_view_matrix(mainCamera.camera); return double4x4ToMatrix4(matrixStruct); } @@ -1609,7 +1610,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("No viewer available"); } var mainCamera = await getMainCamera() as ThermionFFICamera; - var matrixStruct = get_camera_model_matrix(mainCamera.pointer); + var matrixStruct = get_camera_model_matrix(mainCamera.camera); return double4x4ToMatrix4(matrixStruct); } @@ -1622,7 +1623,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("No viewer available"); } var mainCamera = await getMainCamera() as ThermionFFICamera; - var matrixStruct = get_camera_projection_matrix(mainCamera.pointer); + var matrixStruct = get_camera_projection_matrix(mainCamera.camera); return double4x4ToMatrix4(matrixStruct); } @@ -1635,7 +1636,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("No viewer available"); } var mainCamera = await getMainCamera() as ThermionFFICamera; - var matrixStruct = get_camera_culling_projection_matrix(mainCamera.pointer); + var matrixStruct = get_camera_culling_projection_matrix(mainCamera.camera); return double4x4ToMatrix4(matrixStruct); } @@ -1695,7 +1696,7 @@ class ThermionViewerFFI extends ThermionViewer { throw Exception("No viewer available"); } var mainCamera = await getMainCamera() as ThermionFFICamera; - var arrayPtr = get_camera_frustum(mainCamera.pointer); + var arrayPtr = get_camera_frustum(mainCamera.camera); var doubleList = arrayPtr.asTypedList(24); var frustum = Frustum(); @@ -2169,6 +2170,23 @@ class ThermionViewerFFI extends ThermionViewer { void requestFrame() { request_frame_render_thread(_viewer!); } + + Future createCamera() async { + var camera = SceneManager_createCamera(_sceneManager!); + var engine = Viewer_getEngine(_viewer!); + return ThermionFFICamera(camera, engine); + } + + Future destroyCamera(ThermionFFICamera camera) async { + SceneManager_destroyCamera(_sceneManager!, camera.camera); + } + + /// + /// + /// + Future setActiveCamera(ThermionFFICamera camera) async { + SceneManager_setCamera(_sceneManager!, camera.camera); + } } class ThermionFFITexture extends ThermionTexture { diff --git a/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart b/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart index 79e7fd20..fe0dad08 100644 --- a/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart +++ b/thermion_dart/lib/thermion_dart/viewer/shared_types/camera.dart @@ -1,8 +1,18 @@ import 'package:vector_math/vector_math_64.dart'; +import '../thermion_viewer_base.dart'; + abstract class Camera { Future setProjectionMatrixWithCulling( Matrix4 projectionMatrix, double near, double far); + Future setLensProjection( + {double near = kNear, + double far = kFar, + double aspect=1.0, + double focalLength = kFocalLength}); + Future getModelMatrix(); + + Future setTransform(Matrix4 transform); } diff --git a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart index 01e6be1e..b7fa875b 100644 --- a/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart +++ b/thermion_dart/lib/thermion_dart/viewer/thermion_viewer_base.dart @@ -960,4 +960,14 @@ abstract class ThermionViewer { /// Future getMaterialInstanceAt( ThermionEntity entity, int index); + + /// + /// + /// + Future createCamera(); + + /// + /// + /// + Future setActiveCamera(covariant Camera camera); } diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/APIBoundaryTypes.h index 61a83cb7..1a8b2195 100644 --- a/thermion_dart/native/include/APIBoundaryTypes.h +++ b/thermion_dart/native/include/APIBoundaryTypes.h @@ -12,7 +12,9 @@ extern "C" typedef struct TCamera TCamera; typedef struct TMaterialInstance TMaterialInstance; typedef struct TEngine TEngine; + typedef struct TEntityManager TEntityManager; typedef struct TViewer TViewer; + typedef struct TSceneManager TSceneManager; struct TMaterialKey { bool doubleSided = 1; diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index c5b58b93..7f4d79ae 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -299,6 +299,12 @@ namespace thermion_filament void setVisibilityLayer(EntityId entityId, int layer); + Camera* createCamera(); + + void destroyCamera(Camera* camera); + + void setCamera(Camera* camera); + private: gltfio::AssetLoader *_assetLoader = nullptr; const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper; @@ -325,6 +331,7 @@ namespace thermion_filament tsl::robin_map> _highlighted; tsl::robin_map> _transformUpdates; std::set _textures; + std::vector _cameras; AnimationComponentManager *_animationComponentManager = nullptr; CollisionComponentManager *_collisionComponentManager = nullptr; diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 92824cae..a6183b05 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -56,11 +56,12 @@ extern "C" EMSCRIPTEN_KEEPALIVE TViewer *create_filament_viewer(const void *const context, const void *const loader, void *const platform, const char *uberArchivePath); EMSCRIPTEN_KEEPALIVE void destroy_filament_viewer(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void *get_scene_manager(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE TSceneManager *Viewer_getSceneManager(TViewer *viewer); // Engine EMSCRIPTEN_KEEPALIVE TEngine *Viewer_getEngine(TViewer* viewer); EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void Engine_setTransform(TEngine* tEngine, EntityId entity, double4x4 transform); EMSCRIPTEN_KEEPALIVE void create_render_target(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height); EMSCRIPTEN_KEEPALIVE void clear_background_image(TViewer *viewer); @@ -97,12 +98,12 @@ extern "C" EMSCRIPTEN_KEEPALIVE void clear_lights(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void set_light_position(TViewer *viewer, EntityId light, float x, float y, float z); EMSCRIPTEN_KEEPALIVE void set_light_direction(TViewer *viewer, EntityId light, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData); - EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer); - EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData); - EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId id); - EMSCRIPTEN_KEEPALIVE int get_instance_count(void *sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void get_instances(void *sceneManager, EntityId entityId, EntityId *out); + EMSCRIPTEN_KEEPALIVE EntityId load_glb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData); + EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(TSceneManager *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer); + EMSCRIPTEN_KEEPALIVE EntityId load_gltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData); + EMSCRIPTEN_KEEPALIVE EntityId create_instance(TSceneManager *sceneManager, EntityId id); + EMSCRIPTEN_KEEPALIVE int get_instance_count(TSceneManager *sceneManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void get_instances(TSceneManager *sceneManager, EntityId entityId, EntityId *out); EMSCRIPTEN_KEEPALIVE void set_main_camera(TViewer *viewer); EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer); EMSCRIPTEN_KEEPALIVE bool set_camera(TViewer *viewer, EntityId entity, const char *nodeName); @@ -128,18 +129,18 @@ extern "C" EMSCRIPTEN_KEEPALIVE void grab_update(TViewer *viewer, float x, float y); EMSCRIPTEN_KEEPALIVE void grab_end(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void apply_weights( - void *sceneManager, + TSceneManager *sceneManager, EntityId entity, const char *const entityName, float *const weights, int count); EMSCRIPTEN_KEEPALIVE bool set_morph_target_weights( - void *sceneManager, + TSceneManager *sceneManager, EntityId entity, const float *const morphData, int numWeights); EMSCRIPTEN_KEEPALIVE bool set_morph_animation( - void *sceneManager, + TSceneManager *sceneManager, EntityId entity, const float *const morphData, const int *const morphIndices, @@ -147,19 +148,19 @@ extern "C" int numFrames, float frameLengthInMs); - EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(void *const sceneManager, TMaterialKey materialConfig); - EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(void *const sceneManager); - EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_material_instance(TSceneManager *sceneManager, TMaterialKey materialConfig); + EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE void destroy_material_instance(TSceneManager *sceneManager, TMaterialInstance *instance); EMSCRIPTEN_KEEPALIVE void clear_morph_animation( - void *sceneManager, + TSceneManager *sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset); EMSCRIPTEN_KEEPALIVE void add_bone_animation( - void *sceneManager, + TSceneManager *sceneManager, EntityId entity, int skinIndex, int boneIndex, @@ -169,47 +170,47 @@ extern "C" float fadeOutInSecs, float fadeInInSecs, float maxDelta); - EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_local_transform(TSceneManager *sceneManager, EntityId entityId, float *const); - EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(TSceneManager *sceneManager, EntityId entityId, int skinIndex, float *const out, int numBones); - EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_world_transform(TSceneManager *sceneManager, EntityId entityId, float *const); - EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(TSceneManager *sceneManager, EntityId entityId, int skinIndex, int boneIndex, float *const); EMSCRIPTEN_KEEPALIVE bool set_bone_transform( - void *sceneManager, + TSceneManager *sceneManager, EntityId entity, int skinIndex, int boneIndex, const float *const transform); - EMSCRIPTEN_KEEPALIVE void play_animation(void *sceneManager, EntityId entity, int index, bool loop, bool reverse, bool replaceActive, float crossfade, float startOffset); - EMSCRIPTEN_KEEPALIVE void set_animation_frame(void *sceneManager, EntityId entity, int animationIndex, int animationFrame); - EMSCRIPTEN_KEEPALIVE void stop_animation(void *sceneManager, EntityId entity, int index); - EMSCRIPTEN_KEEPALIVE int get_animation_count(void *sceneManager, EntityId asset); - EMSCRIPTEN_KEEPALIVE void get_animation_name(void *sceneManager, EntityId entity, char *const outPtr, int index); - EMSCRIPTEN_KEEPALIVE float get_animation_duration(void *sceneManager, EntityId entity, int index); - EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex); - EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char **outPtr, int skinIndex); - EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void play_animation(TSceneManager *sceneManager, EntityId entity, int index, bool loop, bool reverse, bool replaceActive, float crossfade, float startOffset); + EMSCRIPTEN_KEEPALIVE void set_animation_frame(TSceneManager *sceneManager, EntityId entity, int animationIndex, int animationFrame); + EMSCRIPTEN_KEEPALIVE void stop_animation(TSceneManager *sceneManager, EntityId entity, int index); + EMSCRIPTEN_KEEPALIVE int get_animation_count(TSceneManager *sceneManager, EntityId asset); + EMSCRIPTEN_KEEPALIVE void get_animation_name(TSceneManager *sceneManager, EntityId entity, char *const outPtr, int index); + EMSCRIPTEN_KEEPALIVE float get_animation_duration(TSceneManager *sceneManager, EntityId entity, int index); + EMSCRIPTEN_KEEPALIVE int get_bone_count(TSceneManager *sceneManager, EntityId assetEntity, int skinIndex); + EMSCRIPTEN_KEEPALIVE void get_bone_names(TSceneManager *sceneManager, EntityId assetEntity, const char **outPtr, int skinIndex); + EMSCRIPTEN_KEEPALIVE EntityId get_bone(TSceneManager *sceneManager, EntityId entityId, int skinIndex, int boneIndex); - EMSCRIPTEN_KEEPALIVE bool set_transform(void *sceneManager, EntityId entityId, const float *const transform); - EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void *sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name(void *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index); - EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity); + EMSCRIPTEN_KEEPALIVE bool set_transform(TSceneManager *sceneManager, EntityId entityId, const float *const transform); + EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(TSceneManager *sceneManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void get_morph_target_name(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index); + EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity); EMSCRIPTEN_KEEPALIVE void remove_entity(TViewer *viewer, EntityId asset); EMSCRIPTEN_KEEPALIVE void clear_entities(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE bool set_material_color(void *sceneManager, EntityId entity, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a); - EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(void *sceneManager, EntityId asset); - EMSCRIPTEN_KEEPALIVE void queue_position_update(void *sceneManager, EntityId entity, float x, float y, float z, bool relative); - EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY); - EMSCRIPTEN_KEEPALIVE void queue_rotation_update(void *sceneManager, EntityId entity, float rads, float x, float y, float z, float w, bool relative); - EMSCRIPTEN_KEEPALIVE void set_position(void *sceneManager, EntityId entity, float x, float y, float z); - EMSCRIPTEN_KEEPALIVE void set_rotation(void *sceneManager, EntityId entity, float rads, float x, float y, float z, float w); - EMSCRIPTEN_KEEPALIVE void set_scale(void *sceneManager, EntityId entity, float scale); + EMSCRIPTEN_KEEPALIVE bool set_material_color(TSceneManager *sceneManager, EntityId entity, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a); + EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(TSceneManager *sceneManager, EntityId asset); + EMSCRIPTEN_KEEPALIVE void queue_position_update(TSceneManager *sceneManager, EntityId entity, float x, float y, float z, bool relative); + EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY); + EMSCRIPTEN_KEEPALIVE void queue_rotation_update(TSceneManager *sceneManager, EntityId entity, float rads, float x, float y, float z, float w, bool relative); + EMSCRIPTEN_KEEPALIVE void set_position(TSceneManager *sceneManager, EntityId entity, float x, float y, float z); + EMSCRIPTEN_KEEPALIVE void set_rotation(TSceneManager *sceneManager, EntityId entity, float rads, float x, float y, float z, float w); + EMSCRIPTEN_KEEPALIVE void set_scale(TSceneManager *sceneManager, EntityId entity, float scale); // Camera methods EMSCRIPTEN_KEEPALIVE void set_view_frustum_culling(TViewer *viewer, bool enabled); @@ -227,38 +228,46 @@ extern "C" 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_lens_projection(TCamera *camera, double near, double far, double aspect, double focalLength); EMSCRIPTEN_KEEPALIVE void set_camera_focus_distance(TCamera *camera, float focusDistance); EMSCRIPTEN_KEEPALIVE void set_camera_manipulator_options(TViewer *viewer, _ManipulatorMode mode, double orbitSpeedX, double orbitSpeedY, double zoomSpeed); EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* camera, double4x4 projectionMatrix, double near, double far); + EMSCRIPTEN_KEEPALIVE void Camera_setLensProjection(TCamera *camera, double near, double far, double aspect, double focalLength); EMSCRIPTEN_KEEPALIVE double4x4 Camera_getModelMatrix(TCamera* camera); + EMSCRIPTEN_KEEPALIVE EntityId Camera_getEntity(TCamera* camera); EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine *engine, EntityId entity); - EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId entity, const char *meshName); - EMSCRIPTEN_KEEPALIVE int reveal_mesh(void *sceneManager, EntityId entity, const char *meshName); + EMSCRIPTEN_KEEPALIVE TEntityManager *Engine_getEntityManager(TEngine *engine); + + // SceneManager + + EMSCRIPTEN_KEEPALIVE TCamera* SceneManager_createCamera(TSceneManager *sceneManager); + EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager *sceneManager, TCamera* camera); + EMSCRIPTEN_KEEPALIVE void SceneManager_setCamera(TSceneManager *sceneManager, TCamera* camera); + EMSCRIPTEN_KEEPALIVE int hide_mesh(TSceneManager *sceneManager, EntityId entity, const char *meshName); + EMSCRIPTEN_KEEPALIVE int reveal_mesh(TSceneManager *sceneManager, EntityId entity, const char *meshName); EMSCRIPTEN_KEEPALIVE void set_post_processing(TViewer *viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void set_shadows_enabled(TViewer *viewer, bool enabled); EMSCRIPTEN_KEEPALIVE void set_shadow_type(TViewer *viewer, int shadowType); EMSCRIPTEN_KEEPALIVE void set_soft_shadow_options(TViewer *viewer, float penumbraScale, float penumbraRatioScale); EMSCRIPTEN_KEEPALIVE void set_antialiasing(TViewer *viewer, bool msaa, bool fxaa, bool taa); EMSCRIPTEN_KEEPALIVE void filament_pick(TViewer *viewer, int x, int y, void (*callback)(EntityId entityId, int x, int y)); - EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(void *const sceneManager, const EntityId entityId); - EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name); - EMSCRIPTEN_KEEPALIVE int get_entity_count(void *const sceneManager, const EntityId target, bool renderableOnly); - EMSCRIPTEN_KEEPALIVE void get_entities(void *const sceneManager, const EntityId target, bool renderableOnly, EntityId *out); - EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(void *const sceneManager, const EntityId target, int index, bool renderableOnly); + EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(TSceneManager *sceneManager, const EntityId entityId); + EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(TSceneManager *sceneManager, const EntityId parent, const char *name); + EMSCRIPTEN_KEEPALIVE int get_entity_count(TSceneManager *sceneManager, const EntityId target, bool renderableOnly); + EMSCRIPTEN_KEEPALIVE void get_entities(TSceneManager *sceneManager, const EntityId target, bool renderableOnly, EntityId *out); + EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(TSceneManager *sceneManager, const EntityId target, int index, bool renderableOnly); EMSCRIPTEN_KEEPALIVE void set_recording(TViewer *viewer, bool recording); EMSCRIPTEN_KEEPALIVE void set_recording_output_directory(TViewer *viewer, const char *outputDirectory); EMSCRIPTEN_KEEPALIVE void ios_dummy(); EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr); - EMSCRIPTEN_KEEPALIVE void add_collision_component(void *const sceneManager, EntityId entityId, void (*callback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); - EMSCRIPTEN_KEEPALIVE void remove_collision_component(void *const sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE bool add_animation_component(void *const sceneManager, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void add_collision_component(TSceneManager *sceneManager, EntityId entityId, void (*callback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform); + EMSCRIPTEN_KEEPALIVE void remove_collision_component(TSceneManager *sceneManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE bool add_animation_component(TSceneManager *sceneManager, EntityId entityId); + EMSCRIPTEN_KEEPALIVE void remove_animation_component(TSceneManager *sceneManager, EntityId entityId); EMSCRIPTEN_KEEPALIVE EntityId create_geometry( - void *const sceneManager, + TSceneManager *sceneManager, float *vertices, int numVertices, float *normals, @@ -270,30 +279,30 @@ extern "C" int primitiveType, TMaterialInstance *materialInstance, bool keepData); - EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child); - EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child); - EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling); - EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entityId, int priority); - EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out); - EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); - EMSCRIPTEN_KEEPALIVE void set_layer_visibility(void *const sceneManager, int layer, bool visible); - EMSCRIPTEN_KEEPALIVE void set_visibility_layer(void *const sceneManager, EntityId entity, int layer); - EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); - EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible); - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entity, float r, float g, float b); - EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entity); - EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value); - EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int value); - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); - EMSCRIPTEN_KEEPALIVE void set_material_depth_write(void *const sceneManager, EntityId entity, int materialIndex, bool enabled); + EMSCRIPTEN_KEEPALIVE EntityId get_parent(TSceneManager *sceneManager, EntityId child); + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(TSceneManager *sceneManager, EntityId child); + EMSCRIPTEN_KEEPALIVE void set_parent(TSceneManager *sceneManager, EntityId child, EntityId parent, bool preserveScaling); + EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE void set_priority(TSceneManager *sceneManager, EntityId entityId, int priority); + EMSCRIPTEN_KEEPALIVE void get_gizmo(TSceneManager *sceneManager, EntityId *out); + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); + EMSCRIPTEN_KEEPALIVE void set_layer_visibility(TSceneManager *sceneManager, int layer, bool visible); + EMSCRIPTEN_KEEPALIVE void set_visibility_layer(TSceneManager *sceneManager, EntityId entity, int layer); + EMSCRIPTEN_KEEPALIVE void pick_gizmo(TSceneManager *sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)); + EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(TSceneManager *sceneManager, bool visible); + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(TSceneManager *sceneManager, EntityId entity, float r, float g, float b); + EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(TSceneManager *sceneManager, EntityId entity); + EMSCRIPTEN_KEEPALIVE void set_material_property_float(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, float value); + EMSCRIPTEN_KEEPALIVE void set_material_property_int(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, int value); + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, double4 value); + EMSCRIPTEN_KEEPALIVE void set_material_depth_write(TSceneManager *sceneManager, EntityId entity, int materialIndex, bool enabled); EMSCRIPTEN_KEEPALIVE void unproject_texture(TViewer* viewer, EntityId entity,uint8_t* input, uint32_t inputWidth, uint32_t inputHeight, uint8_t *out, uint32_t outWidth, uint32_t outHeight); - EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length); - EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture); - EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); + EMSCRIPTEN_KEEPALIVE void *const create_texture(TSceneManager *sceneManager, uint8_t *data, size_t length); + EMSCRIPTEN_KEEPALIVE void destroy_texture(TSceneManager *sceneManager, void *const texture); + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(TSceneManager *sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex); - EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex); + EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(TSceneManager *sceneManager, EntityId entity, int materialIndex); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled); diff --git a/thermion_dart/native/include/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/ThermionDartRenderThreadApi.h index a11a4b03..8f11c03d 100644 --- a/thermion_dart/native/include/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/ThermionDartRenderThreadApi.h @@ -66,44 +66,44 @@ extern "C" void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer, EntityId entityId); EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(void *const sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(void *const sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(void *const sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void create_instance_render_thread(void *const sceneManager, EntityId entityId, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(TSceneManager *sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); + EMSCRIPTEN_KEEPALIVE void create_instance_render_thread(TSceneManager *sceneManager, EntityId entityId, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(TViewer *viewer, EntityId asset, void (*callback)()); EMSCRIPTEN_KEEPALIVE void clear_entities_render_thread(TViewer *viewer, void (*callback)()); EMSCRIPTEN_KEEPALIVE void set_camera_render_thread(TViewer *viewer, EntityId asset, const char *nodeName, void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void apply_weights_render_thread( - void *const sceneManager, + TSceneManager *sceneManager, EntityId asset, const char *const entityName, float *const weights, int count); - EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(void *const sceneManager, EntityId asset, int animationIndex, int animationFrame); - EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(void *const sceneManager, EntityId asset, int index); - EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(void *const sceneManager, EntityId asset, void (*callback)(int)); - EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(void *const sceneManager, EntityId asset, char *const outPtr, int index, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name_render_thread(void *const sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index, void (*callback)()); - EMSCRIPTEN_KEEPALIVE void get_morph_target_name_count_render_thread(void *const sceneManager, EntityId asset, EntityId childEntity, void (*callback)(int32_t)); - EMSCRIPTEN_KEEPALIVE void set_morph_target_weights_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(TSceneManager *sceneManager, EntityId asset, int animationIndex, int animationFrame); + EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(TSceneManager *sceneManager, EntityId asset, int index); + EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(TSceneManager *sceneManager, EntityId asset, void (*callback)(int)); + EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(TSceneManager *sceneManager, EntityId asset, char *const outPtr, int index, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void get_morph_target_name_render_thread(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void get_morph_target_name_count_render_thread(TSceneManager *sceneManager, EntityId asset, EntityId childEntity, void (*callback)(int32_t)); + EMSCRIPTEN_KEEPALIVE void set_morph_target_weights_render_thread(TSceneManager *sceneManager, EntityId asset, const float *const morphData, int numWeights, void (*callback)(bool)); - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(TSceneManager *sceneManager, EntityId asset, void(*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, int skinIndex, int boneIndex, const float *const transform, void (*callback)(bool)); EMSCRIPTEN_KEEPALIVE void set_post_processing_render_thread(TViewer *viewer, bool enabled); - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(void *const sceneManager, EntityId entityId, void(*callback)()); + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(TSceneManager *sceneManager, EntityId entityId, void(*callback)()); EMSCRIPTEN_KEEPALIVE void create_geometry_render_thread( - void *const sceneManager, + TSceneManager *sceneManager, float *vertices, int numVertices, float *normals, diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index 09ee862e..98d886b8 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -750,7 +750,6 @@ namespace thermion_filament delete _sceneManager; _engine->destroyCameraComponent(_mainCamera->getEntity()); _mainCamera = nullptr; - _view->setScene(nullptr); _engine->destroy(_view); _engine->destroy(_scene); _engine->destroy(_renderer); diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 1b659679..9ccb0f6e 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -110,6 +110,14 @@ namespace thermion_filament SceneManager::~SceneManager() { + _view->setScene(nullptr); + _view->setCamera(nullptr); + for(auto camera : _cameras) { + auto entity = camera->getEntity(); + _engine->destroyCameraComponent(entity); + _engine->getEntityManager().destroy(entity); + } + _cameras.clear(); delete gizmo; _gridOverlay->destroy(); destroyAll(); @@ -2633,6 +2641,27 @@ EntityId SceneManager::createGeometry( auto instance = _unlitMaterialProvider->createMaterialInstance(nullptr, &uvmap); return instance; } + + Camera* SceneManager::createCamera() { + auto entity = EntityManager::get().create(); + auto camera = _engine->createCamera(entity); + _cameras.push_back(camera); + return camera; + } + + void SceneManager::destroyCamera(Camera* camera) { + auto entity = camera->getEntity(); + _engine->destroyCameraComponent(entity); + _engine->getEntityManager().destroy(entity); + auto it = std::find(_cameras.begin(), _cameras.end(), camera); + if(it != _cameras.end()) { + _cameras.erase(it); + } + } + + void SceneManager::setCamera(Camera* camera) { + _view->setCamera(camera); + } } // namespace thermion_filament diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 28d7d607..e1b34ccd 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -177,32 +177,32 @@ extern "C" ((FilamentViewer *)viewer)->clearLights(); } - EMSCRIPTEN_KEEPALIVE EntityId load_glb(void *sceneManager, const char *assetPath, int numInstances, bool keepData) + EMSCRIPTEN_KEEPALIVE EntityId load_glb(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData) { return ((SceneManager *)sceneManager)->loadGlb(assetPath, numInstances, keepData); } - EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(void *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer) + EMSCRIPTEN_KEEPALIVE EntityId load_glb_from_buffer(TSceneManager *sceneManager, const void *const data, size_t length, bool keepData, int priority, int layer) { return ((SceneManager *)sceneManager)->loadGlbFromBuffer((const uint8_t *)data, length, 1, keepData, priority, layer); } - EMSCRIPTEN_KEEPALIVE EntityId create_instance(void *sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE EntityId create_instance(TSceneManager *sceneManager, EntityId entityId) { return ((SceneManager *)sceneManager)->createInstance(entityId); } - EMSCRIPTEN_KEEPALIVE int get_instance_count(void *sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE int get_instance_count(TSceneManager *sceneManager, EntityId entityId) { return ((SceneManager *)sceneManager)->getInstanceCount(entityId); } - EMSCRIPTEN_KEEPALIVE void get_instances(void *sceneManager, EntityId entityId, EntityId *out) + EMSCRIPTEN_KEEPALIVE void get_instances(TSceneManager *sceneManager, EntityId entityId, EntityId *out) { return ((SceneManager *)sceneManager)->getInstances(entityId, out); } - EMSCRIPTEN_KEEPALIVE EntityId load_gltf(void *sceneManager, const char *assetPath, const char *relativePath, bool keepData) + EMSCRIPTEN_KEEPALIVE EntityId load_gltf(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData) { return ((SceneManager *)sceneManager)->loadGltf(assetPath, relativePath, keepData); } @@ -277,7 +277,7 @@ extern "C" cam->setCustomProjection(mat, near, far); } - void set_camera_lens_projection(TCamera *camera, double near, double far, double aspect, double focalLength) + void Camera_setLensProjection(TCamera *camera, double near, double far, double aspect, double focalLength) { auto cam = reinterpret_cast(camera); cam->setLensProjection(focalLength, aspect, near, far); @@ -418,13 +418,15 @@ extern "C" ((FilamentViewer *)viewer)->grabEnd(); } - EMSCRIPTEN_KEEPALIVE void *get_scene_manager(TViewer *viewer) + EMSCRIPTEN_KEEPALIVE TSceneManager* Viewer_getSceneManager(TViewer *tViewer) { - return (void *)((FilamentViewer *)viewer)->getSceneManager(); + auto * viewer = reinterpret_cast(tViewer); + auto * sceneManager = viewer->getSceneManager(); + return reinterpret_cast(sceneManager); } EMSCRIPTEN_KEEPALIVE void apply_weights( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, const char *const entityName, float *const weights, @@ -434,7 +436,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE bool set_morph_target_weights( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, const float *const weights, const int numWeights) @@ -443,7 +445,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE bool set_morph_animation( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, const float *const morphData, const int *const morphIndices, @@ -455,18 +457,18 @@ extern "C" return result; } - EMSCRIPTEN_KEEPALIVE void clear_morph_animation(void *sceneManager, EntityId asset) + EMSCRIPTEN_KEEPALIVE void clear_morph_animation(TSceneManager *sceneManager, EntityId asset) { ((SceneManager *)sceneManager)->clearMorphAnimationBuffer(asset); } - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose(void *sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose(TSceneManager *sceneManager, EntityId entityId) { ((SceneManager *)sceneManager)->resetBones(entityId); } EMSCRIPTEN_KEEPALIVE void add_bone_animation( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, int skinIndex, int boneIndex, @@ -505,14 +507,14 @@ extern "C" ((FilamentViewer *)viewer)->setAntiAliasing(msaa, fxaa, taa); } - EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager, + EMSCRIPTEN_KEEPALIVE EntityId get_bone(TSceneManager *sceneManager, EntityId entityId, int skinIndex, int boneIndex) { return ((SceneManager *)sceneManager)->getBone(entityId, skinIndex, boneIndex); } - EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_world_transform(TSceneManager *sceneManager, EntityId entityId, float *const out) { auto transform = ((SceneManager *)sceneManager)->getWorldTransform(entityId); @@ -534,7 +536,7 @@ extern "C" out[15] = transform[3][3]; } - EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_local_transform(TSceneManager *sceneManager, EntityId entityId, float *const out) { auto transform = ((SceneManager *)sceneManager)->getLocalTransform(entityId); @@ -556,7 +558,7 @@ extern "C" out[15] = transform[3][3]; } - EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(TSceneManager *sceneManager, EntityId entityId, int skinIndex, float *const out, int numBones) { const auto transforms = ((SceneManager *)sceneManager)->getBoneRestTranforms(entityId, skinIndex); @@ -579,7 +581,7 @@ extern "C" } } - EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(TSceneManager *sceneManager, EntityId entityId, int skinIndex, int boneIndex, float *const out) { auto transform = ((SceneManager *)sceneManager)->getInverseBindMatrix(entityId, skinIndex, boneIndex); @@ -602,7 +604,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE bool set_bone_transform( - void *sceneManager, + TSceneManager *sceneManager, EntityId entityId, int skinIndex, int boneIndex, @@ -627,7 +629,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void play_animation( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, int index, bool loop, @@ -640,7 +642,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void set_animation_frame( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, int animationIndex, int animationFrame) @@ -648,13 +650,13 @@ extern "C" // ((SceneManager*)sceneManager)->setAnimationFrame(asset, animationIndex, animationFrame); } - float get_animation_duration(void *sceneManager, EntityId asset, int animationIndex) + float get_animation_duration(TSceneManager *sceneManager, EntityId asset, int animationIndex) { return ((SceneManager *)sceneManager)->getAnimationDuration(asset, animationIndex); } int get_animation_count( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset) { auto names = ((SceneManager *)sceneManager)->getAnimationNames(asset); @@ -662,7 +664,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void get_animation_name( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, char *const outPtr, int index) @@ -672,13 +674,13 @@ extern "C" strcpy(outPtr, name.c_str()); } - EMSCRIPTEN_KEEPALIVE int get_bone_count(void *sceneManager, EntityId assetEntity, int skinIndex) + EMSCRIPTEN_KEEPALIVE int get_bone_count(TSceneManager *sceneManager, EntityId assetEntity, int skinIndex) { auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); return names->size(); } - EMSCRIPTEN_KEEPALIVE void get_bone_names(void *sceneManager, EntityId assetEntity, const char **out, int skinIndex) + EMSCRIPTEN_KEEPALIVE void get_bone_names(TSceneManager *sceneManager, EntityId assetEntity, const char **out, int skinIndex) { auto names = ((SceneManager *)sceneManager)->getBoneNames(assetEntity, skinIndex); for (int i = 0; i < names->size(); i++) @@ -688,7 +690,7 @@ extern "C" } } - EMSCRIPTEN_KEEPALIVE bool set_transform(void *sceneManager, EntityId entityId, const float *const transform) + EMSCRIPTEN_KEEPALIVE bool set_transform(TSceneManager *sceneManager, EntityId entityId, const float *const transform) { auto matrix = math::mat4f( transform[0], transform[1], transform[2], @@ -708,18 +710,18 @@ extern "C" return ((SceneManager *)sceneManager)->setTransform(entityId, matrix); } - EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void *sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(TSceneManager *sceneManager, EntityId entityId) { return ((SceneManager *)sceneManager)->updateBoneMatrices(entityId); } - EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity) + EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity) { auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity); return (int)names->size(); } - EMSCRIPTEN_KEEPALIVE void get_morph_target_name(void *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index) + EMSCRIPTEN_KEEPALIVE void get_morph_target_name(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index) { auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity); std::string name = names->at(index); @@ -736,62 +738,62 @@ extern "C" ((FilamentViewer *)viewer)->clearEntities(); } - bool set_material_color(void *sceneManager, EntityId asset, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a) + bool set_material_color(TSceneManager *sceneManager, EntityId asset, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a) { return ((SceneManager *)sceneManager)->setMaterialColor(asset, meshName, materialIndex, r, g, b, a); } - EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(void *sceneManager, EntityId asset) + EMSCRIPTEN_KEEPALIVE void transform_to_unit_cube(TSceneManager *sceneManager, EntityId asset) { ((SceneManager *)sceneManager)->transformToUnitCube(asset); } - EMSCRIPTEN_KEEPALIVE void set_position(void *sceneManager, EntityId asset, float x, float y, float z) + EMSCRIPTEN_KEEPALIVE void set_position(TSceneManager *sceneManager, EntityId asset, float x, float y, float z) { ((SceneManager *)sceneManager)->setPosition(asset, x, y, z); } - EMSCRIPTEN_KEEPALIVE void set_rotation(void *sceneManager, EntityId asset, float rads, float x, float y, float z, float w) + EMSCRIPTEN_KEEPALIVE void set_rotation(TSceneManager *sceneManager, EntityId asset, float rads, float x, float y, float z, float w) { ((SceneManager *)sceneManager)->setRotation(asset, rads, x, y, z, w); } - EMSCRIPTEN_KEEPALIVE void set_scale(void *sceneManager, EntityId asset, float scale) + EMSCRIPTEN_KEEPALIVE void set_scale(TSceneManager *sceneManager, EntityId asset, float scale) { ((SceneManager *)sceneManager)->setScale(asset, scale); } - EMSCRIPTEN_KEEPALIVE void queue_position_update(void *sceneManager, EntityId asset, float x, float y, float z, bool relative) + EMSCRIPTEN_KEEPALIVE void queue_position_update(TSceneManager *sceneManager, EntityId asset, float x, float y, float z, bool relative) { ((SceneManager *)sceneManager)->queuePositionUpdate(asset, x, y, z, relative); } - EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(void *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z) + EMSCRIPTEN_KEEPALIVE void queue_relative_position_update_world_axis(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY, float x, float y, float z) { ((SceneManager *)sceneManager)->queueRelativePositionUpdateWorldAxis(entity, viewportX, viewportY, x, y, z); } - EMSCRIPTEN_KEEPALIVE void queue_rotation_update(void *sceneManager, EntityId asset, float rads, float x, float y, float z, float w, bool relative) + EMSCRIPTEN_KEEPALIVE void queue_rotation_update(TSceneManager *sceneManager, EntityId asset, float rads, float x, float y, float z, float w, bool relative) { ((SceneManager *)sceneManager)->queueRotationUpdate(asset, rads, x, y, z, w, relative); } - EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(void *sceneManager, EntityId entity, float viewportX, float viewportY) + EMSCRIPTEN_KEEPALIVE void queue_position_update_from_viewport_coords(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY) { ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(entity, viewportX, viewportY); } - EMSCRIPTEN_KEEPALIVE void stop_animation(void *sceneManager, EntityId asset, int index) + EMSCRIPTEN_KEEPALIVE void stop_animation(TSceneManager *sceneManager, EntityId asset, int index) { ((SceneManager *)sceneManager)->stopAnimation(asset, index); } - EMSCRIPTEN_KEEPALIVE int hide_mesh(void *sceneManager, EntityId asset, const char *meshName) + EMSCRIPTEN_KEEPALIVE int hide_mesh(TSceneManager *sceneManager, EntityId asset, const char *meshName) { return ((SceneManager *)sceneManager)->hide(asset, meshName); } - EMSCRIPTEN_KEEPALIVE int reveal_mesh(void *sceneManager, EntityId asset, const char *meshName) + EMSCRIPTEN_KEEPALIVE int reveal_mesh(TSceneManager *sceneManager, EntityId asset, const char *meshName) { return ((SceneManager *)sceneManager)->reveal(asset, meshName); } @@ -801,22 +803,22 @@ extern "C" ((FilamentViewer *)viewer)->pick(static_cast(x), static_cast(y), callback); } - EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(void *const sceneManager, const EntityId entityId) + EMSCRIPTEN_KEEPALIVE const char *get_name_for_entity(TSceneManager *sceneManager, const EntityId entityId) { return ((SceneManager *)sceneManager)->getNameForEntity(entityId); } - EMSCRIPTEN_KEEPALIVE int get_entity_count(void *const sceneManager, const EntityId target, bool renderableOnly) + EMSCRIPTEN_KEEPALIVE int get_entity_count(TSceneManager *sceneManager, const EntityId target, bool renderableOnly) { return ((SceneManager *)sceneManager)->getEntityCount(target, renderableOnly); } - EMSCRIPTEN_KEEPALIVE void get_entities(void *const sceneManager, const EntityId target, bool renderableOnly, EntityId *out) + EMSCRIPTEN_KEEPALIVE void get_entities(TSceneManager *sceneManager, const EntityId target, bool renderableOnly, EntityId *out) { ((SceneManager *)sceneManager)->getEntities(target, renderableOnly, out); } - EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(void *const sceneManager, const EntityId target, int index, bool renderableOnly) + EMSCRIPTEN_KEEPALIVE const char *get_entity_name_at(TSceneManager *sceneManager, const EntityId target, int index, bool renderableOnly) { return ((SceneManager *)sceneManager)->getEntityNameAt(target, index, renderableOnly); } @@ -841,28 +843,28 @@ extern "C" free(ptr); } - EMSCRIPTEN_KEEPALIVE void add_collision_component(void *const sceneManager, EntityId entityId, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform) + EMSCRIPTEN_KEEPALIVE void add_collision_component(TSceneManager *sceneManager, EntityId entityId, void (*onCollisionCallback)(const EntityId entityId1, const EntityId entityId2), bool affectsCollidingTransform) { ((SceneManager *)sceneManager)->addCollisionComponent(entityId, onCollisionCallback, affectsCollidingTransform); } - EMSCRIPTEN_KEEPALIVE void remove_collision_component(void *const sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE void remove_collision_component(TSceneManager *sceneManager, EntityId entityId) { ((SceneManager *)sceneManager)->removeCollisionComponent(entityId); } - EMSCRIPTEN_KEEPALIVE bool add_animation_component(void *const sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE bool add_animation_component(TSceneManager *sceneManager, EntityId entityId) { return ((SceneManager *)sceneManager)->addAnimationComponent(entityId); } - EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE void remove_animation_component(TSceneManager *sceneManager, EntityId entityId) { ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); } EMSCRIPTEN_KEEPALIVE EntityId create_geometry( - void *const sceneManager, + TSceneManager *sceneManager, float *vertices, int numVertices, float *normals, @@ -878,38 +880,38 @@ extern "C" return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, uvs, numUvs, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast(materialInstance), keepData); } - EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(void *const sceneManager, const EntityId parent, const char *name) + EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(TSceneManager *sceneManager, const EntityId parent, const char *name) { auto entity = ((SceneManager *)sceneManager)->findChildEntityByName(parent, name); return utils::Entity::smuggle(entity); } - EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child) + EMSCRIPTEN_KEEPALIVE EntityId get_parent(TSceneManager *sceneManager, EntityId child) { return ((SceneManager *)sceneManager)->getParent(child); } - EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(void *const sceneManager, EntityId child) + EMSCRIPTEN_KEEPALIVE EntityId get_ancestor(TSceneManager *sceneManager, EntityId child) { return ((SceneManager *)sceneManager)->getAncestor(child); } - EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent, bool preserveScaling) + EMSCRIPTEN_KEEPALIVE void set_parent(TSceneManager *sceneManager, EntityId child, EntityId parent, bool preserveScaling) { ((SceneManager *)sceneManager)->setParent(child, parent, preserveScaling); } - EMSCRIPTEN_KEEPALIVE void test_collisions(void *const sceneManager, EntityId entity) + EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity) { ((SceneManager *)sceneManager)->testCollisions(entity); } - EMSCRIPTEN_KEEPALIVE void set_priority(void *const sceneManager, EntityId entity, int priority) + EMSCRIPTEN_KEEPALIVE void set_priority(TSceneManager *sceneManager, EntityId entity, int priority) { ((SceneManager *)sceneManager)->setPriority(entity, priority); } - EMSCRIPTEN_KEEPALIVE void get_gizmo(void *const sceneManager, EntityId *out) + EMSCRIPTEN_KEEPALIVE void get_gizmo(TSceneManager *sceneManager, EntityId *out) { auto gizmo = ((SceneManager *)sceneManager)->gizmo; out[0] = Entity::smuggle(gizmo->x()); @@ -918,12 +920,12 @@ extern "C" out[3] = Entity::smuggle(gizmo->center()); } - EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(void *const sceneManager, EntityId entity) + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, EntityId entity) { return ((SceneManager *)sceneManager)->getBoundingBox(entity); } - EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(void *const sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY) + EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, EntityId entity, float *minX, float *minY, float *maxX, float *maxY) { auto box = ((SceneManager *)sceneManager)->getBoundingBox(entity); *minX = box.minX; @@ -932,12 +934,12 @@ extern "C" *maxY = box.maxY; } - EMSCRIPTEN_KEEPALIVE void set_visibility_layer(void *const sceneManager, EntityId entity, int layer) { + EMSCRIPTEN_KEEPALIVE void set_visibility_layer(TSceneManager *sceneManager, EntityId entity, int layer) { ((SceneManager*)sceneManager)->setVisibilityLayer(entity, layer); } - EMSCRIPTEN_KEEPALIVE void set_layer_visibility(void *const sceneManager, int layer, bool visible) + EMSCRIPTEN_KEEPALIVE void set_layer_visibility(TSceneManager *sceneManager, int layer, bool visible) { ((SceneManager *)sceneManager)->setLayerVisibility((SceneManager::LAYERS)layer, visible); } @@ -947,42 +949,42 @@ extern "C" free(ptr); } - EMSCRIPTEN_KEEPALIVE void pick_gizmo(void *const sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)) + EMSCRIPTEN_KEEPALIVE void pick_gizmo(TSceneManager *sceneManager, int x, int y, void (*callback)(EntityId entityId, int x, int y)) { ((SceneManager *)sceneManager)->gizmo->pick(x, y, callback); } - EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(void *const sceneManager, bool visible) + EMSCRIPTEN_KEEPALIVE void set_gizmo_visibility(TSceneManager *sceneManager, bool visible) { ((SceneManager *)sceneManager)->gizmo->setVisibility(visible); } - EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(void *const sceneManager, EntityId entityId, float r, float g, float b) + EMSCRIPTEN_KEEPALIVE void set_stencil_highlight(TSceneManager *sceneManager, EntityId entityId, float r, float g, float b) { ((SceneManager *)sceneManager)->setStencilHighlight(entityId, r, g, b); } - EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(void *const sceneManager, EntityId entityId) + EMSCRIPTEN_KEEPALIVE void remove_stencil_highlight(TSceneManager *sceneManager, EntityId entityId) { ((SceneManager *)sceneManager)->removeStencilHighlight(entityId); } - EMSCRIPTEN_KEEPALIVE void set_material_property_float(void *const sceneManager, EntityId entity, int materialIndex, const char *property, float value) + EMSCRIPTEN_KEEPALIVE void set_material_property_float(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, float value) { ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); } - EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(void *const sceneManager, EntityId entity, int materialIndex) { + EMSCRIPTEN_KEEPALIVE TMaterialInstance* get_material_instance_at(TSceneManager *sceneManager, EntityId entity, int materialIndex) { auto instance = ((SceneManager *)sceneManager)->getMaterialInstanceAt(entity, materialIndex); return reinterpret_cast(instance); } - EMSCRIPTEN_KEEPALIVE void set_material_property_int(void *const sceneManager, EntityId entity, int materialIndex, const char *property, int32_t value) + EMSCRIPTEN_KEEPALIVE void set_material_property_int(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, int32_t value) { ((SceneManager *)sceneManager)->setMaterialProperty(entity, materialIndex, property, value); } - EMSCRIPTEN_KEEPALIVE void set_material_property_float4(void *const sceneManager, EntityId entity, int materialIndex, const char *property, double4 value) + EMSCRIPTEN_KEEPALIVE void set_material_property_float4(TSceneManager *sceneManager, EntityId entity, int materialIndex, const char *property, double4 value) { filament::math::float4 filamentValue; filamentValue.x = static_cast(value.x); @@ -997,23 +999,23 @@ extern "C" ((FilamentViewer *)viewer)->unprojectTexture(entity, input, inputWidth, inputHeight, out, outWidth, outHeight); } - EMSCRIPTEN_KEEPALIVE void *const create_texture(void *const sceneManager, uint8_t *data, size_t length) + EMSCRIPTEN_KEEPALIVE void *const create_texture(TSceneManager *sceneManager, uint8_t *data, size_t length) { return (void *const)((SceneManager *)sceneManager)->createTexture(data, length, "SOMETEXTURE"); } - EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(void *const sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex) + EMSCRIPTEN_KEEPALIVE void apply_texture_to_material(TSceneManager *sceneManager, EntityId entity, void *const texture, const char *parameterName, int materialIndex) { ((SceneManager *)sceneManager)->applyTexture(entity, reinterpret_cast(texture), parameterName, materialIndex); } - EMSCRIPTEN_KEEPALIVE void destroy_texture(void *const sceneManager, void *const texture) + EMSCRIPTEN_KEEPALIVE void destroy_texture(TSceneManager *sceneManager, void *const texture) { ((SceneManager *)sceneManager)->destroyTexture(reinterpret_cast(texture)); } - EMSCRIPTEN_KEEPALIVE TMaterialInstance* create_material_instance(void *const sceneManager, TMaterialKey materialConfig) + EMSCRIPTEN_KEEPALIVE TMaterialInstance* create_material_instance(TSceneManager *sceneManager, TMaterialKey materialConfig) { filament::gltfio::MaterialKey config; @@ -1047,12 +1049,12 @@ extern "C" return reinterpret_cast(materialInstance); } -EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(void *const sceneManager) { +EMSCRIPTEN_KEEPALIVE TMaterialInstance *create_unlit_material_instance(TSceneManager *sceneManager) { auto * instance = ((SceneManager*)sceneManager)->createUnlitMaterialInstance(); return reinterpret_cast(instance); } -EMSCRIPTEN_KEEPALIVE void destroy_material_instance(void *const sceneManager, TMaterialInstance *instance) { +EMSCRIPTEN_KEEPALIVE void destroy_material_instance(TSceneManager *sceneManager, TMaterialInstance *instance) { ((SceneManager *)sceneManager)->destroy(reinterpret_cast(instance)); } @@ -1073,9 +1075,42 @@ EMSCRIPTEN_KEEPALIVE double4x4 Camera_getModelMatrix(TCamera* tCamera) { return convert_mat4_to_double4x4(camera->getModelMatrix()); } +EMSCRIPTEN_KEEPALIVE EntityId Camera_getEntity(TCamera* tCamera) { + auto * camera = reinterpret_cast(tCamera); + return Entity::smuggle(camera->getEntity()); +} + EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine* tEngine, EntityId entityId) { auto * engine = reinterpret_cast(tEngine); auto * camera = engine->getCameraComponent(utils::Entity::import(entityId)); return reinterpret_cast(camera); } + +EMSCRIPTEN_KEEPALIVE void Engine_setTransform(TEngine* tEngine, EntityId entity, double4x4 transform) { + auto * engine = reinterpret_cast(tEngine); + auto& transformManager = engine->getTransformManager(); + + auto transformInstance = transformManager.getInstance(utils::Entity::import(entity)); + if(!transformInstance.isValid()) { + Log("Transform instance not valid"); + } + transformManager.setTransform(transformInstance, convert_double4x4_to_mat4(transform)); +} + +EMSCRIPTEN_KEEPALIVE TCamera *SceneManager_createCamera(TSceneManager* tSceneManager) { + auto * sceneManager = reinterpret_cast(tSceneManager); + return reinterpret_cast(sceneManager->createCamera()); +} + +EMSCRIPTEN_KEEPALIVE void SceneManager_destroyCamera(TSceneManager* tSceneManager, TCamera* tCamera) { + auto * sceneManager = reinterpret_cast(tSceneManager); + auto * camera = reinterpret_cast(tCamera); + sceneManager->destroyCamera(camera); +} + +EMSCRIPTEN_KEEPALIVE void SceneManager_setCamera(TSceneManager* tSceneManager, TCamera* tCamera) { + auto * sceneManager = reinterpret_cast(tSceneManager); + auto * camera = reinterpret_cast(tCamera); + sceneManager->setCamera(camera); +} } diff --git a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp index 23a7676a..cf412269 100644 --- a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp @@ -362,7 +362,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(TSceneManager *sceneManager, const char *path, const char *relativeResourcePath, bool keepData, @@ -382,7 +382,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(TSceneManager *sceneManager, const char *path, int numInstances, bool keepData, @@ -402,7 +402,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(TSceneManager *sceneManager, const uint8_t *const data, size_t length, int numInstances, @@ -619,7 +619,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void - get_morph_target_name_render_thread(void *sceneManager, EntityId assetEntity, + get_morph_target_name_render_thread(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, char *const outPtr, int index, void (*callback)()) { std::packaged_task lambda([=] @@ -635,7 +635,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void - get_morph_target_name_count_render_thread(void *sceneManager, EntityId assetEntity, + get_morph_target_name_count_render_thread(TSceneManager *sceneManager, EntityId assetEntity, EntityId childEntity, void (*callback)(int)) { std::packaged_task lambda([=] @@ -652,7 +652,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void set_animation_frame_render_thread(TSceneManager *sceneManager, EntityId asset, int animationIndex, int animationFrame) @@ -662,7 +662,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void stop_animation_render_thread(TSceneManager *sceneManager, EntityId asset, int index) { std::packaged_task lambda( @@ -671,7 +671,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void get_animation_count_render_thread(TSceneManager *sceneManager, EntityId asset, void (*callback)(int)) { @@ -689,7 +689,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(void *const sceneManager, + EMSCRIPTEN_KEEPALIVE void get_animation_name_render_thread(TSceneManager *sceneManager, EntityId asset, char *const outPtr, int index, @@ -718,7 +718,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void - get_name_for_entity_render_thread(void *const sceneManager, const EntityId entityId, void (*callback)(const char *)) + get_name_for_entity_render_thread(TSceneManager *sceneManager, const EntityId entityId, void (*callback)(const char *)) { std::packaged_task lambda( [=] @@ -734,7 +734,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - void set_morph_target_weights_render_thread(void *const sceneManager, + void set_morph_target_weights_render_thread(TSceneManager *sceneManager, EntityId asset, const float *const morphData, int numWeights, @@ -754,7 +754,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void set_bone_transform_render_thread( - void *sceneManager, + TSceneManager *sceneManager, EntityId asset, int skinIndex, int boneIndex, @@ -775,7 +775,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(void *sceneManager, + EMSCRIPTEN_KEEPALIVE void update_bone_matrices_render_thread(TSceneManager *sceneManager, EntityId entity, void (*callback)(bool)) { std::packaged_task lambda( @@ -791,7 +791,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(void *const sceneManager, EntityId entityId, void (*callback)()) + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose_render_thread(TSceneManager *sceneManager, EntityId entityId, void (*callback)()) { std::packaged_task lambda( [=] @@ -807,7 +807,7 @@ extern "C" } EMSCRIPTEN_KEEPALIVE void create_geometry_render_thread( - void *const sceneManager, + TSceneManager *sceneManager, float *vertices, int numVertices, float *normals, diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index 0c597993..d1e6c794 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -139,6 +139,23 @@ void main() async { expect(modelMatrix.getColumn(3).z, 0.0); expect(modelMatrix.getColumn(3).w, 1.0); }); + + test('create camera', () async { + var viewer = await createViewer(); + + await viewer.setCameraPosition(0, 0, 5); + await viewer.setBackgroundColor(1.0, 0.0, 1.0, 1.0); + await viewer.createGeometry(GeometryHelper.cube()); + await _capture(viewer, "create_camera_main_camera"); + var newCamera = await viewer.createCamera(); + await newCamera.setTransform(Matrix4.translation(Vector3(0, 0, 4))); + newCamera.setLensProjection(); + await viewer.setActiveCamera(newCamera); + await _capture(viewer, "create_camera_new_camera"); + final mainCamera = await viewer.getMainCamera(); + await viewer.setActiveCamera(mainCamera); + await _capture(viewer, "create_camera_back_to_main"); + }); }); group('background', () {