From c19928850ca64b5d46b18665c9657913b02da816 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 1 Jun 2024 12:35:20 +0800 Subject: [PATCH] expose various methods for getting bones/transforms/etc. --- dart_filament/native/src/DartFilamentApi.cpp | 121 +++++++++++++++++-- 1 file changed, 110 insertions(+), 11 deletions(-) diff --git a/dart_filament/native/src/DartFilamentApi.cpp b/dart_filament/native/src/DartFilamentApi.cpp index 21eeedc8..38111e2f 100644 --- a/dart_filament/native/src/DartFilamentApi.cpp +++ b/dart_filament/native/src/DartFilamentApi.cpp @@ -418,15 +418,13 @@ extern "C" EMSCRIPTEN_KEEPALIVE void add_bone_animation( void *sceneManager, EntityId asset, + int skinIndex, + int boneIndex, const float *const frameData, int numFrames, - const char *const boneName, - const char **const meshNames, - int numMeshTargets, - float frameLengthInMs, - bool isModelSpace) + float frameLengthInMs) { - ((SceneManager *)sceneManager)->addBoneAnimation(asset, frameData, numFrames, boneName, meshNames, numMeshTargets, frameLengthInMs, isModelSpace); + ((SceneManager *)sceneManager)->addBoneAnimation(asset, skinIndex, boneIndex, frameData, numFrames, frameLengthInMs); } EMSCRIPTEN_KEEPALIVE void set_post_processing(void *const viewer, bool enabled) @@ -439,14 +437,82 @@ extern "C" ((FilamentViewer *)viewer)->setAntiAliasing(msaa, fxaa, taa); } + EMSCRIPTEN_KEEPALIVE EntityId get_bone(void *sceneManager, + EntityId entityId, + int skinIndex, + int boneIndex) { + return ((SceneManager*)sceneManager)->getBone(entityId, skinIndex, boneIndex); + } + EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, + EntityId entityId, float* const out) { + auto transform = ((SceneManager*)sceneManager)->getWorldTransform(entityId); + out[0] = transform[0][0]; + out[1] = transform[0][1]; + out[2] = transform[0][2]; + out[3] = transform[0][3]; + out[4] = transform[1][0]; + out[5] = transform[1][1]; + out[6] = transform[1][2]; + out[7] = transform[1][3]; + out[8] = transform[2][0]; + out[9] = transform[2][1]; + out[10] = transform[2][2]; + out[11] = transform[2][3]; + out[12] = transform[3][0]; + out[13] = transform[3][1]; + out[14] = transform[3][2]; + out[15] = transform[3][3]; + } + + EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, + EntityId entityId, float* const out) { + auto transform = ((SceneManager*)sceneManager)->getLocalTransform(entityId); + out[0] = transform[0][0]; + out[1] = transform[0][1]; + out[2] = transform[0][2]; + out[3] = transform[0][3]; + out[4] = transform[1][0]; + out[5] = transform[1][1]; + out[6] = transform[1][2]; + out[7] = transform[1][3]; + out[8] = transform[2][0]; + out[9] = transform[2][1]; + out[10] = transform[2][2]; + out[11] = transform[2][3]; + out[12] = transform[3][0]; + out[13] = transform[3][1]; + out[14] = transform[3][2]; + out[15] = transform[3][3]; + } + + EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, + EntityId entityId, int skinIndex, int boneIndex, float* const out) { + auto transform = ((SceneManager*)sceneManager)->getInverseBindMatrix(entityId, skinIndex, boneIndex); + out[0] = transform[0][0]; + out[1] = transform[0][1]; + out[2] = transform[0][2]; + out[3] = transform[0][3]; + out[4] = transform[1][0]; + out[5] = transform[1][1]; + out[6] = transform[1][2]; + out[7] = transform[1][3]; + out[8] = transform[2][0]; + out[9] = transform[2][1]; + out[10] = transform[2][2]; + out[11] = transform[2][3]; + out[12] = transform[3][0]; + out[13] = transform[3][1]; + out[14] = transform[3][2]; + out[15] = transform[3][3]; + } + EMSCRIPTEN_KEEPALIVE bool set_bone_transform( void *sceneManager, EntityId entityId, - const char *entityName, - const float *const transform, - const char *boneName) + int skinIndex, + int boneIndex, + const float *const transform) { - auto matrix = math::mat4f( transform[0], transform[1], transform[2], transform[3], @@ -462,7 +528,7 @@ extern "C" transform[13], transform[14], transform[15]); - return ((SceneManager *)sceneManager)->setBoneTransform(entityId, entityName, 0, boneName, matrix); + return ((SceneManager *)sceneManager)->setBoneTransform(entityId, skinIndex, boneIndex, matrix); } EMSCRIPTEN_KEEPALIVE void play_animation( @@ -523,6 +589,29 @@ extern "C" } } + EMSCRIPTEN_KEEPALIVE bool set_transform(void* sceneManager, EntityId entityId, const float* const transform) { + auto matrix = math::mat4f( + transform[0], transform[1], transform[2], + transform[3], + transform[4], + transform[5], + transform[6], + transform[7], + transform[8], + transform[9], + transform[10], + transform[11], + transform[12], + transform[13], + transform[14], + transform[15]); + return ((SceneManager*)sceneManager)->setTransform(entityId, matrix); + } + + EMSCRIPTEN_KEEPALIVE bool update_bone_matrices(void* sceneManager, EntityId entityId) { + return ((SceneManager*)sceneManager)->updateBoneMatrices(entityId); + } + EMSCRIPTEN_KEEPALIVE int get_morph_target_name_count(void *sceneManager, EntityId assetEntity, EntityId childEntity) { auto names = ((SceneManager *)sceneManager)->getMorphTargetNames(assetEntity, childEntity); @@ -655,6 +744,11 @@ extern "C" { return ((SceneManager *)sceneManager)->addAnimationComponent(entityId); } + + EMSCRIPTEN_KEEPALIVE void remove_animation_component(void *const sceneManager, EntityId entityId) + { + ((SceneManager *)sceneManager)->removeAnimationComponent(entityId); + } EMSCRIPTEN_KEEPALIVE EntityId create_geometry(void *const viewer, float *vertices, int numVertices, uint16_t *indices, int numIndices, int primitiveType, const char *materialPath) { @@ -667,6 +761,11 @@ extern "C" return utils::Entity::smuggle(entity); } + EMSCRIPTEN_KEEPALIVE EntityId get_parent(void *const sceneManager, EntityId child) + { + return ((SceneManager *)sceneManager)->getParent(child); + } + EMSCRIPTEN_KEEPALIVE void set_parent(void *const sceneManager, EntityId child, EntityId parent) { ((SceneManager *)sceneManager)->setParent(child, parent);