From: Eunki, Hong Date: Mon, 24 Apr 2023 08:34:04 +0000 (+0900) Subject: Bind bvh loader with use root translate offset or not X-Git-Tag: dali_2.2.25~4^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6bef2a785a3434fbfc1176238bc600fb1c5ac81b;p=platform%2Fcore%2Fuifw%2Fdali-csharp-binder.git Bind bvh loader with use root translate offset or not Let we apply the original root node's position into bvh animation data or not. Since we don't have AnimateBetweenBy, we should change each KeyFrames's value with rootNode's position. If AnimateBetweenBy feature prepared, we can remove this logic Change-Id: I846b4714b52af13b533ae00cc75bbe2310234993 Signed-off-by: Eunki, Hong --- diff --git a/dali-csharp-binder/src/model-wrap.cpp b/dali-csharp-binder/src/model-wrap.cpp index 1b4992c..28adbf6 100644 --- a/dali-csharp-binder/src/model-wrap.cpp +++ b/dali-csharp-binder/src/model-wrap.cpp @@ -19,6 +19,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include "common.h" @@ -483,7 +484,7 @@ SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_FindChildModelNodeByName(void* cs return new Dali::Scene3D::ModelNode((const Dali::Scene3D::ModelNode&)result); } -SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_1(void* csModel, char* csFileName, void* csScale) +SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_1(void* csModel, char* csFileName, void* csScale, bool csUseRootNodeTranslate) { Dali::Scene3D::Model* model = (Dali::Scene3D::Model*)csModel; Dali::Animation result; @@ -505,12 +506,47 @@ SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_1(void* csModel, { scale = Dali::Vector3(*static_cast(csScale)); } + std::string filename(csFileName); { try { - Dali::Scene3D::Loader::AnimationDefinition animationDefinition = Dali::Scene3D::Loader::LoadBvh(filename, "LoadedBvhAnimation", scale); - Dali::Scene3D::Loader::AnimatedProperty::GetActor getActor = [&model](const Dali::Scene3D::Loader::AnimatedProperty& property) -> Dali::Actor { + Dali::Scene3D::Loader::AnimationDefinition animationDefinition = Dali::Scene3D::Loader::LoadBvh(filename, "LoadedBvhAnimation", scale); + + if(csUseRootNodeTranslate && animationDefinition.GetPropertyCount() > 0u) + { + // We can assume that 0's property is for root translate + auto& property = animationDefinition.GetPropertyAt(0u); + auto& keyFrames = property.mKeyFrames; + + // Let we check that we can change animatable property + // TODO : If AnimateBetweenBy feature prepared, we can remove below logic. + if(keyFrames) + { + auto rootNode = model->FindChildByName(property.mNodeName); + if(rootNode) + { + // Get root node's current position and apply it into property animation. + auto rootNodePosition = rootNode.GetProperty(Dali::Actor::Property::POSITION); + + auto frameCount = Dali::DevelKeyFrames::GetKeyFrameCount(keyFrames); + for(auto i = 0u; i < frameCount; ++i) + { + float keyFrameProgress; + Dali::Property::Value keyFrameValue; + Dali::Vector3 valuePosition; + + Dali::DevelKeyFrames::GetKeyFrame(keyFrames, i, keyFrameProgress, keyFrameValue); + if(DALI_LIKELY(keyFrameValue.Get(valuePosition))) + { + Dali::DevelKeyFrames::SetKeyFrameValue(keyFrames, i, rootNodePosition + valuePosition); + } + } + } + } + } + + Dali::Scene3D::Loader::AnimatedProperty::GetActor getActor = [&model](const Dali::Scene3D::Loader::AnimatedProperty& property) -> Dali::Actor { return model->FindChildByName(property.mNodeName); }; result = animationDefinition.ReAnimate(getActor); @@ -521,7 +557,7 @@ SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_1(void* csModel, return new Dali::Animation((const Dali::Animation&)result); } -SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_2(void* csModel, char* csBuffer, int csBufferLength, void* csScale) +SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_2(void* csModel, char* csBuffer, int csBufferLength, void* csScale, bool csUseRootNodeTranslate) { Dali::Scene3D::Model* model = (Dali::Scene3D::Model*)csModel; Dali::Animation result; @@ -548,8 +584,41 @@ SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Model_LoadBvhAnimation_2(void* csModel, { try { - Dali::Scene3D::Loader::AnimationDefinition animationDefinition = Dali::Scene3D::Loader::LoadBvhFromBuffer(rawBuffer, csBufferLength, "LoadedBvhAnimation", scale); - Dali::Scene3D::Loader::AnimatedProperty::GetActor getActor = [&model](const Dali::Scene3D::Loader::AnimatedProperty& property) -> Dali::Actor { + Dali::Scene3D::Loader::AnimationDefinition animationDefinition = Dali::Scene3D::Loader::LoadBvhFromBuffer(rawBuffer, csBufferLength, "LoadedBvhAnimation", scale); + + if(csUseRootNodeTranslate && animationDefinition.GetPropertyCount() > 0u) + { + // We can assume that 0's property is for root translate + auto& property = animationDefinition.GetPropertyAt(0u); + auto& keyFrames = property.mKeyFrames; + + // Let we check that we can change animatable property + // TODO : If AnimateBetweenBy feature prepared, we can remove below logic. + if(keyFrames) + { + auto rootNode = model->FindChildByName(property.mNodeName); + if(rootNode) + { + // Get root node's current position and apply it into property animation. + auto rootNodePosition = rootNode.GetProperty(Dali::Actor::Property::POSITION); + + auto frameCount = Dali::DevelKeyFrames::GetKeyFrameCount(keyFrames); + for(auto i = 0u; i < frameCount; ++i) + { + float keyFrameProgress; + Dali::Property::Value keyFrameValue; + Dali::Vector3 valuePosition; + Dali::DevelKeyFrames::GetKeyFrame(keyFrames, i, keyFrameProgress, keyFrameValue); + if(DALI_LIKELY(keyFrameValue.Get(valuePosition))) + { + Dali::DevelKeyFrames::SetKeyFrameValue(keyFrames, i, rootNodePosition + valuePosition); + } + } + } + } + } + + Dali::Scene3D::Loader::AnimatedProperty::GetActor getActor = [&model](const Dali::Scene3D::Loader::AnimatedProperty& property) -> Dali::Actor { return model->FindChildByName(property.mNodeName); }; result = animationDefinition.ReAnimate(getActor);