From 902f67e97d1deec578042759555ce7bb9ffbce77 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 2 Nov 2024 10:13:33 +0800 Subject: [PATCH] expose setParameterInt/setParameterFloat4, rename to getScreenSpaceBoundingBox, and expose method for getting renderable bounding box --- .../viewer/src/ffi/src/thermion_dart.g.dart | 47 +++++++++++++++++++ .../native/include/APIBoundaryTypes.h | 11 +++++ .../native/include/ThermionDartApi.h | 3 ++ thermion_dart/native/src/ThermionDartApi.cpp | 22 +++++++-- 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart index da0e9990..f0afabe2 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart @@ -1052,6 +1052,12 @@ external void set_priority( int priority, ); +@ffi.Native, EntityId)>(isLeaf: true) +external Aabb3 SceneManager_getRenderableBoundingBox( + ffi.Pointer sceneManager, + int entity, +); + @ffi.Native< Aabb2 Function( ffi.Pointer, ffi.Pointer, EntityId)>(isLeaf: true) @@ -1213,6 +1219,18 @@ external void MaterialInstance_setDepthCulling( bool enabled, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true) +external void MaterialInstance_setParameterFloat4( + ffi.Pointer materialInstance, + ffi.Pointer name, + double x, + double y, + double w, + double z, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Double, ffi.Double)>(isLeaf: true) @@ -1232,6 +1250,15 @@ external void MaterialInstance_setParameterFloat( double value, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int)>(isLeaf: true) +external void MaterialInstance_setParameterInt( + ffi.Pointer materialInstance, + ffi.Pointer name, + int value, +); + @ffi.Native)>(isLeaf: true) external TViewport View_getViewport( ffi.Pointer view, @@ -2276,6 +2303,26 @@ final class Aabb2 extends ffi.Struct { external double maxY; } +final class Aabb3 extends ffi.Struct { + @ffi.Float() + external double centerX; + + @ffi.Float() + external double centerY; + + @ffi.Float() + external double centerZ; + + @ffi.Float() + external double halfExtentX; + + @ffi.Float() + external double halfExtentY; + + @ffi.Float() + external double halfExtentZ; +} + final class ResourceBuffer extends ffi.Struct { external ffi.Pointer data; diff --git a/thermion_dart/native/include/APIBoundaryTypes.h b/thermion_dart/native/include/APIBoundaryTypes.h index cf022b63..ee780947 100644 --- a/thermion_dart/native/include/APIBoundaryTypes.h +++ b/thermion_dart/native/include/APIBoundaryTypes.h @@ -105,6 +105,17 @@ extern "C" typedef struct Aabb2 Aabb2; + struct Aabb3 { + float centerX; + float centerY; + float centerZ; + float halfExtentX; + float halfExtentY; + float halfExtentZ; + }; + + typedef struct Aabb3 Aabb3; + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 76861947..6e188f78 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -277,6 +277,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void test_collisions(TSceneManager *sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE void set_priority(TSceneManager *sceneManager, EntityId entityId, int priority); + EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *sceneManager, EntityId entity); EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, TView *view, EntityId entity); EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, TView *view, EntityId entity, float *minX, float *minY, float *maxX, float *maxY); @@ -296,8 +297,10 @@ extern "C" EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance* materialInstance, const char* name, double x, double y, double w, double z); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance* materialInstance, const char* name, double x, double y); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance* materialInstance, const char* name, double value); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance* materialInstance, const char* name, int value); #ifdef __cplusplus diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index dbc4a781..d0fdf1f3 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -876,7 +876,7 @@ extern "C" TMaterialInstance *materialInstance, bool keepData) { - return ((SceneManager *)sceneManager)->createGeometry(vertices, (uint32_t)numVertices, normals, (uint32_t)numNormals, uvs, numUvs, indices, numIndices, (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast(materialInstance), keepData); + return ((SceneManager *)sceneManager)->createGeometry(vertices, static_cast(numVertices), normals, static_cast(numNormals), uvs, static_cast(numUvs), indices, static_cast(numIndices), (filament::RenderableManager::PrimitiveType)primitiveType, reinterpret_cast(materialInstance), keepData); } EMSCRIPTEN_KEEPALIVE EntityId find_child_entity_by_name(TSceneManager *sceneManager, const EntityId parent, const char *name) @@ -910,17 +910,22 @@ extern "C" ((SceneManager *)sceneManager)->setPriority(entity, priority); } + EMSCRIPTEN_KEEPALIVE Aabb3 SceneManager_getRenderableBoundingBox(TSceneManager *tSceneManager, EntityId entity) { + auto sceneManager = reinterpret_cast(tSceneManager); + return sceneManager->getRenderableBoundingBox(entity); + } + EMSCRIPTEN_KEEPALIVE Aabb2 get_bounding_box(TSceneManager *sceneManager, TView *tView, EntityId entity) { auto view = reinterpret_cast(tView); - return ((SceneManager *)sceneManager)->getBoundingBox(view, entity); + return ((SceneManager *)sceneManager)->getScreenSpaceBoundingBox(view, entity); } EMSCRIPTEN_KEEPALIVE void get_bounding_box_to_out(TSceneManager *sceneManager, TView *tView, EntityId entity, float *minX, float *minY, float *maxX, float *maxY) { auto view = reinterpret_cast(tView); - auto box = ((SceneManager *)sceneManager)->getBoundingBox(view, entity); + auto box = ((SceneManager *)sceneManager)->getScreenSpaceBoundingBox(view, entity); *minX = box.minX; *minY = box.minY; *maxX = box.maxX; @@ -1055,6 +1060,12 @@ extern "C" reinterpret_cast(materialInstance)->setDepthCulling(enabled); } + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double w, double z) + { + filament::math::float4 data{static_cast(x), static_cast(y), static_cast(z), static_cast(w)}; + reinterpret_cast(materialInstance)->setParameter(propertyName, data); + } + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *propertyName, double x, double y) { filament::math::float2 data{static_cast(x), static_cast(y)}; @@ -1066,6 +1077,11 @@ extern "C" reinterpret_cast(materialInstance)->setParameter(propertyName, static_cast(value)); } + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *propertyName, int value) + { + reinterpret_cast(materialInstance)->setParameter(propertyName, value); + } + EMSCRIPTEN_KEEPALIVE TCamera *Engine_getCameraComponent(TEngine *tEngine, EntityId entityId) { auto *engine = reinterpret_cast(tEngine);