From 7d9bc9e5cc4f1fa9304245477a56f7c0017d7c5c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 3 Jun 2024 22:29:23 +0800 Subject: [PATCH] add method to retrieve rest local transforms --- dart_filament/native/include/DartFilamentApi.h | 2 ++ dart_filament/native/src/DartFilamentApi.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/dart_filament/native/include/DartFilamentApi.h b/dart_filament/native/include/DartFilamentApi.h index 2e168098..45ce2c5e 100644 --- a/dart_filament/native/include/DartFilamentApi.h +++ b/dart_filament/native/include/DartFilamentApi.h @@ -150,6 +150,8 @@ extern "C" float frameLengthInMs); EMSCRIPTEN_KEEPALIVE void get_local_transform(void *sceneManager, EntityId entityId, float* const); + EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, + EntityId entityId, int skinIndex, float* const out, int numBones); EMSCRIPTEN_KEEPALIVE void get_world_transform(void *sceneManager, EntityId entityId, float* const); EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, diff --git a/dart_filament/native/src/DartFilamentApi.cpp b/dart_filament/native/src/DartFilamentApi.cpp index 38111e2f..d3291551 100644 --- a/dart_filament/native/src/DartFilamentApi.cpp +++ b/dart_filament/native/src/DartFilamentApi.cpp @@ -484,6 +484,24 @@ extern "C" out[14] = transform[3][2]; out[15] = transform[3][3]; } + + EMSCRIPTEN_KEEPALIVE void get_rest_local_transforms(void *sceneManager, + EntityId entityId, int skinIndex, float* const out, int numBones) { + const auto transforms = ((SceneManager*)sceneManager)->getBoneRestTranforms(entityId, skinIndex); + auto numTransforms = transforms->size(); + if(numTransforms != numBones) { + Log("Error - %d bone transforms available but you only specified %d.", numTransforms, numBones); + return; + } + for(int boneIndex = 0; boneIndex < numTransforms; boneIndex++) { + const auto transform = transforms->at(boneIndex); + for(int colNum = 0; colNum < 4; colNum++) { + for(int rowNum = 0; rowNum < 4; rowNum++) { + out[(boneIndex * 16) + (colNum * 4) + rowNum] = transform[colNum][rowNum]; + } + } + } + } EMSCRIPTEN_KEEPALIVE void get_inverse_bind_matrix(void *sceneManager, EntityId entityId, int skinIndex, int boneIndex, float* const out) {