X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-scene3d%2Fpublic-api%2Floader%2Fbvh-loader.cpp;h=d9bc6f2d8df0bd16b1635ccb8c5885e8b1b10888;hb=HEAD;hp=0c5922b7e2a975cfeed45bd49c24761395c9a18a;hpb=568516457b601a61270801b84267c7a1626aac5e;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-scene3d/public-api/loader/bvh-loader.cpp b/dali-scene3d/public-api/loader/bvh-loader.cpp index 0c5922b..d9bc6f2 100644 --- a/dali-scene3d/public-api/loader/bvh-loader.cpp +++ b/dali-scene3d/public-api/loader/bvh-loader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include #include #include @@ -359,7 +360,7 @@ bool ParseBvh(std::istream& file, uint32_t& frameCount, float& frameTime, std::s return parseHierarchy && parseMotion; } -AnimationDefinition GenerateAnimation(const std::string& animationName, std::shared_ptr& hierarchy, uint32_t frameCount, float frameTime, const Vector3& scale) +AnimationDefinition GenerateAnimation(const std::string& animationName, std::shared_ptr& hierarchy, uint32_t frameCount, float frameTime, bool useRootTranslationOnly, const Vector3& scale) { AnimationDefinition animationDefinition; @@ -372,13 +373,19 @@ AnimationDefinition GenerateAnimation(const std::string& animationName, std::sha if(!jointList.empty()) { - animationDefinition.ReserveSize(jointList.size() * 2u); // translation and rotation + uint32_t animationSize = jointList.size(); + animationSize = (useRootTranslationOnly) ? (animationSize + 1u) : (animationSize * 2u); + animationDefinition.ReserveSize(animationSize); + uint32_t animationIndex = 0u; for(uint32_t i = 0; i < jointList.size(); ++i) { AnimatedProperty translationProperty; - translationProperty.mTimePeriod = Dali::TimePeriod(animationDefinition.GetDuration()); - translationProperty.mNodeName = jointList[i]->name; - translationProperty.mPropertyName = PROPERTY_NAME_POSITION.data(); + if(!useRootTranslationOnly || i == 0) + { + translationProperty.mTimePeriod = Dali::TimePeriod(animationDefinition.GetDuration()); + translationProperty.mNodeName = jointList[i]->name; + translationProperty.mPropertyName = PROPERTY_NAME_POSITION.data(); + } AnimatedProperty rotationProperty; rotationProperty.mTimePeriod = Dali::TimePeriod(animationDefinition.GetDuration()); @@ -389,18 +396,28 @@ AnimationDefinition GenerateAnimation(const std::string& animationName, std::sha rotationProperty.mKeyFrames = Dali::KeyFrames::New(); for(uint32_t j = 0; j < frameCount; ++j) { - translationProperty.mKeyFrames.Add(static_cast(j) * keyFrameInterval, (jointList[i]->translations[j] * scale)); + if(!useRootTranslationOnly || i == 0) + { + translationProperty.mKeyFrames.Add(static_cast(j) * keyFrameInterval, (jointList[i]->translations[j] * scale)); + } rotationProperty.mKeyFrames.Add(static_cast(j) * keyFrameInterval, jointList[i]->rotations[j]); } - animationDefinition.SetProperty(i * 2u, std::move(translationProperty)); - animationDefinition.SetProperty(i * 2u + 1, std::move(rotationProperty)); + if(!useRootTranslationOnly || i == 0) + { + // Optimize keyframes, for heuristic! + DevelKeyFrames::OptimizeKeyFramesLinear(translationProperty.mKeyFrames); + animationDefinition.SetProperty(animationIndex++, std::move(translationProperty)); + } + // Optimize keyframes, for heuristic! + DevelKeyFrames::OptimizeKeyFramesLinear(rotationProperty.mKeyFrames); + animationDefinition.SetProperty(animationIndex++, std::move(rotationProperty)); } } return animationDefinition; } -AnimationDefinition LoadBvhInternal(std::istream& stream, const std::string& animationName, const Vector3& scale) +AnimationDefinition LoadBvhInternal(std::istream& stream, const std::string& animationName, bool useRootTranslationOnly, const Vector3& scale) { uint32_t frameCount = 0; float frameTime = 0.0f; @@ -412,11 +429,11 @@ AnimationDefinition LoadBvhInternal(std::istream& stream, const std::string& ani return animationDefinition; } - return GenerateAnimation(animationName, rootJoint, frameCount, frameTime, scale); + return GenerateAnimation(animationName, rootJoint, frameCount, frameTime, useRootTranslationOnly, scale); } } // namespace -AnimationDefinition LoadBvh(const std::string& path, const std::string& animationName, const Vector3& scale) +AnimationDefinition LoadBvh(const std::string& path, const std::string& animationName, bool useRootTranslationOnly, const Vector3& scale) { Dali::FileStream fileStream(path); std::iostream& stream = fileStream.GetStream(); @@ -428,10 +445,10 @@ AnimationDefinition LoadBvh(const std::string& path, const std::string& animatio return animationDefinition; } - return LoadBvhInternal(stream, animationName, scale); + return LoadBvhInternal(stream, animationName, useRootTranslationOnly, scale); } -AnimationDefinition LoadBvhFromBuffer(const uint8_t* rawBuffer, int rawBufferLength, const std::string& animationName, const Vector3& scale) +AnimationDefinition LoadBvhFromBuffer(const uint8_t* rawBuffer, int rawBufferLength, const std::string& animationName, bool useRootTranslationOnly, const Vector3& scale) { if(rawBuffer == nullptr || rawBufferLength == 0) { @@ -450,6 +467,6 @@ AnimationDefinition LoadBvhFromBuffer(const uint8_t* rawBuffer, int rawBufferLen return animationDefinition; } - return LoadBvhInternal(stream, animationName, scale); + return LoadBvhInternal(stream, animationName, useRootTranslationOnly, scale); } } // namespace Dali::Scene3D::Loader \ No newline at end of file