diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 3c9ba4ea..33218f60 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -196,7 +196,10 @@ extern "C" EntityId entityId, int skinIndex, int boneIndex); - EMSCRIPTEN_KEEPALIVE bool set_transform(TSceneManager *sceneManager, EntityId entityId, const float *const transform); + + EMSCRIPTEN_KEEPALIVE bool SceneManager_setTransform(TSceneManager *sceneManager, EntityId entityId, const double *const transform); + EMSCRIPTEN_KEEPALIVE void SceneManager_queueTransformUpdates(TSceneManager *sceneManager, EntityId* entities, const double* const transforms, int numEntities); + 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); @@ -204,10 +207,10 @@ extern "C" EMSCRIPTEN_KEEPALIVE void clear_entities(TViewer *viewer); 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); @@ -317,6 +320,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance* materialInstance, const char* name, double x, double y); #ifdef __cplusplus diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 298db338..71100c2a 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -696,9 +696,9 @@ extern "C" } } - EMSCRIPTEN_KEEPALIVE bool set_transform(TSceneManager *sceneManager, EntityId entityId, const float *const transform) + EMSCRIPTEN_KEEPALIVE bool SceneManager_setTransform(TSceneManager *sceneManager, EntityId entityId, const double *const transform) { - auto matrix = math::mat4f( + auto matrix = math::mat4( transform[0], transform[1], transform[2], transform[3], transform[4], @@ -716,6 +716,29 @@ extern "C" return ((SceneManager *)sceneManager)->setTransform(entityId, matrix); } + EMSCRIPTEN_KEEPALIVE void SceneManager_queueTransformUpdates(TSceneManager *tSceneManager, EntityId* entities, const double* const transforms, int numEntities) { + auto * sceneManager = reinterpret_cast(tSceneManager); + math::mat4 matrices[numEntities]; + for(int i = 0; i < numEntities; i++) { + matrices[i] = math::mat4( + transforms[i * 16], transforms[i*16+1], transforms[i*16+2], + transforms[i*16+3], + transforms[i*16+4], + transforms[i*16+5], + transforms[i*16+6], + transforms[i*16+7], + transforms[i*16+8], + transforms[i*16+9], + transforms[i*16+10], + transforms[i*16+11], + transforms[i*16+12], + transforms[i*16+13], + transforms[i*16+14], + transforms[i*16+15]); + } + sceneManager->queueTransformUpdates(entities, matrices, numEntities); + } + EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(TSceneManager *sceneManager, EntityId entityId) { return ((SceneManager *)sceneManager)->updateBoneMatrices(entityId); @@ -769,21 +792,6 @@ extern "C" ((SceneManager *)sceneManager)->setScale(asset, scale); } - 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(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(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(TSceneManager *sceneManager, EntityId entity, float viewportX, float viewportY) { ((SceneManager *)sceneManager)->queueRelativePositionUpdateFromViewportVector(entity, viewportX, viewportY); @@ -1067,10 +1075,16 @@ EMSCRIPTEN_KEEPALIVE void destroy_material_instance(TSceneManager *sceneManager, EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance* materialInstance, bool enabled) { reinterpret_cast(materialInstance)->setDepthWrite(enabled); } + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance* materialInstance, bool enabled) { reinterpret_cast(materialInstance)->setDepthCulling(enabled); } +EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance* materialInstance, const char* propertyName, double x, double y) { + filament::math::float2 data { static_cast(x), static_cast(y) }; + reinterpret_cast(materialInstance)->setParameter(propertyName, data); +} + EMSCRIPTEN_KEEPALIVE void Camera_setCustomProjectionWithCulling(TCamera* tCamera, double4x4 projectionMatrix, double near, double far) { auto * camera = reinterpret_cast(tCamera); camera->setCustomProjection(convert_double4x4_to_mat4(projectionMatrix), near, far);