2 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali-scene3d/internal/model-motion/motion-data-impl.h>
22 #include <dali/integration-api/adaptor-framework/adaptor.h>
23 #include <dali/public-api/adaptor-framework/async-task-manager.h>
24 #include <dali/public-api/object/type-registry-helper.h>
25 #include <dali/public-api/object/type-registry.h>
28 #include <dali-scene3d/public-api/model-motion/motion-index/motion-property-index.h>
39 * Creates control through type registry
43 return Scene3D::MotionData::New();
46 // Setup properties, signals and actions using the type-registry.
47 DALI_TYPE_REGISTRATION_BEGIN(Scene3D::MotionData, Dali::BaseHandle, Create);
48 DALI_TYPE_REGISTRATION_END()
50 } // unnamed namespace
52 MotionDataPtr MotionData::New()
54 MotionDataPtr motionData = new MotionData();
56 motionData->Initialize();
61 MotionData::MotionData()
65 MotionData::~MotionData()
67 if(Dali::Adaptor::IsAvailable())
69 CancelMotionDataLoad();
73 void MotionData::Initialize()
77 uint32_t MotionData::GetMotionCount() const
79 return static_cast<uint32_t>(mMotions.size());
82 Scene3D::MotionIndex MotionData::GetIndex(uint32_t index) const
84 if(index < mMotions.size())
86 return mMotions[index].first;
88 return Scene3D::MotionIndex();
91 Scene3D::MotionValue MotionData::GetValue(uint32_t index) const
93 if(index < mMotions.size())
95 return mMotions[index].second;
97 return Scene3D::MotionValue();
100 void MotionData::Add(Scene3D::MotionIndex index, Scene3D::MotionValue value)
102 mMotions.emplace_back(index, value);
105 void MotionData::Clear()
110 void MotionData::SetDuration(float durationSeconds)
112 mDurationSeconds = durationSeconds;
115 float MotionData::GetDuration() const
117 return mDurationSeconds;
120 void MotionData::LoadBvh(const std::string& path, bool useRootTranslationOnly, const Vector3& scale, bool synchronousLoad)
122 CancelMotionDataLoad();
123 mMotionDataLoadTask = new MotionDataLoadTask(path, useRootTranslationOnly, scale, MakeCallback(this, &MotionData::OnLoadCompleted));
124 RequestMotionDataLoad(synchronousLoad);
127 void MotionData::LoadBvhFromBuffer(const uint8_t* rawBuffer, int rawBufferLength, bool useRootTranslationOnly, const Vector3& scale, bool synchronousLoad)
129 CancelMotionDataLoad();
130 mMotionDataLoadTask = new MotionDataLoadTask(rawBuffer, rawBufferLength, useRootTranslationOnly, scale, MakeCallback(this, &MotionData::OnLoadCompleted));
131 RequestMotionDataLoad(synchronousLoad);
134 void MotionData::LoadFacialAnimation(const std::string& url, bool synchronousLoad)
136 CancelMotionDataLoad();
137 mMotionDataLoadTask = new MotionDataLoadTask(url, MakeCallback(this, &MotionData::OnLoadCompleted));
138 RequestMotionDataLoad(synchronousLoad);
141 void MotionData::LoadFacialAnimationFromBuffer(const uint8_t* rawBuffer, int rawBufferLength, bool synchronousLoad)
143 CancelMotionDataLoad();
144 mMotionDataLoadTask = new MotionDataLoadTask(rawBuffer, rawBufferLength, MakeCallback(this, &MotionData::OnLoadCompleted));
145 RequestMotionDataLoad(synchronousLoad);
149 void MotionData::RequestMotionDataLoad(bool synchronousLoad)
151 if(mMotionDataLoadTask)
155 mMotionDataLoadTask->Process();
156 OnLoadCompleted(mMotionDataLoadTask);
160 Dali::AsyncTaskManager::Get().AddTask(mMotionDataLoadTask);
165 void MotionData::CancelMotionDataLoad()
167 if(mMotionDataLoadTask)
169 Dali::AsyncTaskManager::Get().RemoveTask(mMotionDataLoadTask);
170 mMotionDataLoadTask.Reset();
174 // Called from MotionDataLoadTask
175 void MotionData::OnLoadCompleted(MotionDataLoadTaskPtr task)
177 if(mMotionDataLoadTask == task)
179 const Scene3D::Loader::AnimationDefinition& animationDefinition = mMotionDataLoadTask->GetAnimationDefinition();
181 mDurationSeconds = animationDefinition.GetDuration();
183 auto animatedPropertyCount = animationDefinition.GetPropertyCount();
186 mMotions.reserve(animatedPropertyCount);
188 for(uint32_t i = 0u; i < animatedPropertyCount; ++i)
190 const auto& animatedProperty = animationDefinition.GetPropertyAt(i);
192 // TODO : Currently, we only support KeyFrames without alpha function and time period now.
193 if(animatedProperty.mKeyFrames)
195 Add(Scene3D::MotionPropertyIndex::New(animatedProperty.mNodeName, animatedProperty.mPropertyName), Scene3D::MotionValue::New(animatedProperty.mKeyFrames));
199 // Reset task before emit load competed signal.
200 mMotionDataLoadTask.Reset();
202 Scene3D::MotionData handle(this); ///< Keep handle for lifecycle.
203 LoadCompletedSignal().Emit(handle);
208 } // namespace Internal
210 } // namespace Scene3D