1 #ifndef DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H
2 #define DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 #include <dali/internal/update/common/animatable-property.h>
22 #include <dali/internal/update/manager/transform-manager.h>
31 struct TransformManagerPropertyHandler : public AnimatablePropertyBase
36 TransformManagerPropertyHandler() = default;
39 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
41 Dali::Property::Type GetType() const override = 0;
44 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
46 virtual T& Get(BufferIndex bufferIndex) = 0;
49 * @copydoc Dali::SceneGraph::AnimatableProperty::Get()
51 virtual const T& Get(BufferIndex bufferIndex) const = 0;
54 * @copydoc Dali::PropertyInput::GetVector3()
56 const Vector3& GetVector3(BufferIndex bufferIndex) const override
62 * Retrieve a component of property
63 * @param[in] component The component of the property
65 virtual const float& GetFloatComponent(uint32_t component) const
67 DALI_ASSERT_DEBUG(0 && "Invalid call");
69 static const float value = 0.0f;
74 * Set the property value. This will only persist for the current frame; the property
75 * will be reset with the base value, at the beginning of the next frame.
76 * @param[in] bufferIndex Not used
77 * @param[in] value The new property value.
79 virtual void Set(BufferIndex bufferIndex, const T& value) = 0;
82 * Change a component of property
83 * @param[in] value The new value of the component
84 * @param[in] component The component of the property
86 virtual void SetFloatComponent(float value, uint32_t component)
91 * @copydoc Dali::AnimatableProperty::Bake()
93 virtual void Bake(BufferIndex bufferIndex, const T& value) = 0;
96 * Bake a component of a property
97 * @param[in] value The new value of the component
98 * @param[in] component The component of the property
100 virtual void BakeFloatComponent(float value, uint32_t component)
105 * @copydoc Dali::AnimatableProperty::BakeX()
107 virtual void BakeX(BufferIndex bufferIndex, float value)
112 * @copydoc Dali::AnimatableProperty::BakeY()
114 virtual void BakeY(BufferIndex bufferIndex, float value)
119 * @copydoc Dali::AnimatableProperty::BakeZ()
121 virtual void BakeZ(BufferIndex bufferIndex, float value)
126 * @copydoc Dali::AnimatableProperty::BakeRelative()
128 virtual void BakeRelative(BufferIndex bufferIndex, const T& value) = 0;
131 * @copydoc Dali::AnimatableProperty::BakeRelativeMultiply()
133 virtual void BakeRelativeMultiply(BufferIndex bufferIndex, const T& value){};
136 * @copydoc Dali::AnimatableProperty::ResetToBaseValue()
138 void ResetToBaseValue(BufferIndex updateBufferIndex) override
143 * @copydoc Dali::AnimatableProperty::IsClean()
145 bool IsClean() const override
151 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
153 bool IsTransformManagerProperty() const override
159 template<TransformManagerProperty PropertyT, size_t TxMgrDataOffset>
160 struct TransformManagerPropertyVector3 final : public TransformManagerPropertyHandler<Vector3>
164 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
166 TransformManagerData* GetTxManagerData()
168 return reinterpret_cast<TransformManagerData*>(
169 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
171 const TransformManagerData* GetTxManagerData() const
173 return reinterpret_cast<const TransformManagerData*>(
174 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
177 TransformManagerPropertyVector3() = default;
179 Dali::Property::Type GetType() const override
181 return Dali::PropertyTypes::Get<Vector3>();
184 Vector3& Get(BufferIndex bufferIndex) override
186 return GetTxManagerData()->Manager()->GetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT);
189 const Vector3& Get(BufferIndex bufferIndex) const override
191 return GetTxManagerData()->Manager()->GetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT);
194 const Vector3& GetVector3(BufferIndex bufferIndex) const override
196 return Get(bufferIndex);
199 const float& GetFloatComponent(uint32_t component) const override
201 return GetTxManagerData()->Manager()->GetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, component);
204 void Set(BufferIndex bufferIndex, const Vector3& value) override
206 GetTxManagerData()->Manager()->SetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
209 void SetComponent(BufferIndex bufferIndex, float value, uint32_t component)
211 GetTxManagerData()->Manager()->SetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
214 void BakeComponent(BufferIndex bufferIndex, float value, uint32_t component)
216 GetTxManagerData()->Manager()->BakeVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
219 void Bake(BufferIndex bufferIndex, const Vector3& value) override
221 GetTxManagerData()->Manager()->BakeVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
224 void BakeX(BufferIndex bufferIndex, float value) override
226 GetTxManagerData()->Manager()->BakeXVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
229 void BakeY(BufferIndex bufferIndex, float value) override
231 GetTxManagerData()->Manager()->BakeYVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
234 void BakeZ(BufferIndex bufferIndex, float value) override
236 GetTxManagerData()->Manager()->BakeZVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
239 void SetFloatComponent(float value, uint32_t component) override
241 GetTxManagerData()->Manager()->SetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
244 void BakeFloatComponent(float value, uint32_t component) override
246 GetTxManagerData()->Manager()->BakeVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
249 void BakeRelative(BufferIndex bufferIndex, const Vector3& value) override
251 GetTxManagerData()->Manager()->BakeRelativeVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
254 void BakeRelativeMultiply(BufferIndex bufferIndex, const Vector3& value) override
256 GetTxManagerData()->Manager()->BakeMultiplyVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
260 template<size_t TxMgrDataOffset>
261 class TransformManagerPropertyQuaternion final : public TransformManagerPropertyHandler<Quaternion>
266 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
268 TransformManagerData* GetTxManagerData()
270 return reinterpret_cast<TransformManagerData*>(
271 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
273 const TransformManagerData* GetTxManagerData() const
275 return reinterpret_cast<const TransformManagerData*>(
276 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
279 TransformManagerPropertyQuaternion() = default;
281 Dali::Property::Type GetType() const override
283 return Dali::PropertyTypes::Get<Quaternion>();
286 Quaternion& Get(BufferIndex bufferIndex) override
288 return GetTxManagerData()->Manager()->GetQuaternionPropertyValue(GetTxManagerData()->Id());
291 const Quaternion& Get(BufferIndex bufferIndex) const override
293 return GetTxManagerData()->Manager()->GetQuaternionPropertyValue(GetTxManagerData()->Id());
296 void Set(BufferIndex bufferIndex, const Quaternion& value) override
298 return GetTxManagerData()->Manager()->SetQuaternionPropertyValue(GetTxManagerData()->Id(), value);
301 void Bake(BufferIndex bufferIndex, const Quaternion& value) override
303 return GetTxManagerData()->Manager()->BakeQuaternionPropertyValue(GetTxManagerData()->Id(), value);
306 void BakeRelative(BufferIndex bufferIndex, const Quaternion& value) override
308 return GetTxManagerData()->Manager()->BakeRelativeQuaternionPropertyValue(GetTxManagerData()->Id(), value);
311 const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
313 return Get(bufferIndex);
318 * A Vector3 property used as input.
320 template<size_t TxMgrDataOffset>
321 class TransformManagerVector3Input : public PropertyInputImpl
326 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
328 TransformManagerData* GetTxManagerData()
330 return reinterpret_cast<TransformManagerData*>(
331 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
333 const TransformManagerData* GetTxManagerData() const
335 return reinterpret_cast<const TransformManagerData*>(
336 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
340 * Create an TransformManagerVector3Input
342 TransformManagerVector3Input(TransformManagerProperty property, const Vector3& initialValue)
343 : mProperty(property),
349 * Virtual destructor.
351 ~TransformManagerVector3Input() override = default;
354 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
356 Dali::Property::Type GetType() const override
358 return Dali::PropertyTypes::Get<Vector3>();
362 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
364 virtual bool IsClean() const
370 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
372 bool InputInitialized() const override
378 * @copydoc Dali::Internal::PropertyInputImpl::InputChanged()
379 * @note A constraint can only receive the inherited property from the previous frame.
381 bool InputChanged() const override
387 * Helper function to get the transform components out of the world matrix.
388 * It stores the value in the mValue member variable
390 void ComputeTransformComponent() const
392 auto transformManagerData = GetTxManagerData();
393 auto id = transformManagerData->Id();
394 if(id != INVALID_TRANSFORM_ID)
396 const Matrix& worldMatrix = transformManagerData->Manager()->GetWorldMatrix(id);
397 if(mProperty == TRANSFORM_PROPERTY_WORLD_POSITION)
399 mValue = worldMatrix.GetTranslation3();
401 else if(mProperty == TRANSFORM_PROPERTY_WORLD_SCALE)
404 Quaternion orientation;
405 worldMatrix.GetTransformComponents(position, orientation, mValue);
411 * @copydoc Dali::PropertyInput::GetVector3()
413 const Vector3& GetVector3(BufferIndex bufferIndex) const override
415 ComputeTransformComponent();
420 * @copydoc Dali::PropertyInput::GetConstraintInputVector3()
422 const Vector3& GetConstraintInputVector3(BufferIndex bufferIndex) const override
424 ComputeTransformComponent();
429 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
431 Vector3& Get(BufferIndex bufferIndex)
433 ComputeTransformComponent();
438 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
440 const Vector3& Get(BufferIndex bufferIndex) const
442 ComputeTransformComponent();
447 * Retrieve the property value.
448 * @param[in] bufferIndex The buffer to read.
449 * @return The property value.
451 const Vector3& operator[](BufferIndex bufferIndex) const
453 ComputeTransformComponent();
458 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
460 bool IsTransformManagerProperty() const override
466 TransformManagerVector3Input(const TransformManagerVector3Input& property) = delete;
467 TransformManagerVector3Input& operator=(const TransformManagerVector3Input& rhs) = delete;
470 TransformManagerProperty mProperty;
471 mutable Vector3 mValue;
475 * A Quaternion property used as input.
477 template<size_t TxMgrDataOffset>
478 class TransformManagerQuaternionInput final : public PropertyInputImpl
483 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
485 TransformManagerData* GetTxManagerData()
487 return reinterpret_cast<TransformManagerData*>(
488 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
490 const TransformManagerData* GetTxManagerData() const
492 return reinterpret_cast<const TransformManagerData*>(
493 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
499 TransformManagerQuaternionInput() = default;
502 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
504 Dali::Property::Type GetType() const override
506 return Dali::PropertyTypes::Get<Quaternion>();
510 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
512 virtual bool IsClean() const
518 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
520 bool InputInitialized() const override
526 * @copydoc Dali::Internal::PropertyInputImpl::InputChanged()
527 * @note A constraint can only receive the inherited property from the previous frame.
529 bool InputChanged() const override
535 * Helper function to get the orientation out of the world matrix.
536 * It stores the result in the mValue member variable
538 void ComputeTransformComponent() const
540 auto transformManagerData = GetTxManagerData();
541 auto id = transformManagerData->Id();
542 if(id != INVALID_TRANSFORM_ID)
544 const Matrix& worldMatrix = transformManagerData->Manager()->GetWorldMatrix(id);
545 Vector3 position, scale;
546 worldMatrix.GetTransformComponents(position, mValue, scale);
551 * @copydoc Dali::PropertyInput::GetQuaternion()
553 const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
555 ComputeTransformComponent();
560 * @copydoc Dali::PropertyInput::GetConstraintInputQuaternion()
562 const Quaternion& GetConstraintInputQuaternion(BufferIndex bufferIndex) const override
564 ComputeTransformComponent();
569 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
571 Quaternion& Get(BufferIndex bufferIndex)
573 ComputeTransformComponent();
578 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
580 const Quaternion& Get(BufferIndex bufferIndex) const
582 ComputeTransformComponent();
587 * Retrieve the property value.
588 * @param[in] bufferIndex The buffer to read.
589 * @return The property value.
591 const Quaternion& operator[](BufferIndex bufferIndex) const
593 ComputeTransformComponent();
598 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
600 bool IsTransformManagerProperty() const override
606 TransformManagerQuaternionInput(const TransformManagerQuaternionInput& property) = delete;
607 TransformManagerQuaternionInput& operator=(const TransformManagerQuaternionInput& rhs) = delete;
610 mutable Quaternion mValue;
614 * A Matrix property used as input.
616 template<size_t TxMgrDataOffset>
617 class TransformManagerMatrixInput final : public PropertyInputImpl
622 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
624 TransformManagerData* GetTxManagerData()
626 return reinterpret_cast<TransformManagerData*>(
627 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
629 const TransformManagerData* GetTxManagerData() const
631 return reinterpret_cast<const TransformManagerData*>(
632 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
638 TransformManagerMatrixInput() = default;
641 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
643 Dali::Property::Type GetType() const override
645 return Dali::PropertyTypes::Get<Matrix>();
649 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
651 virtual bool IsClean() const
657 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
659 bool InputInitialized() const override
665 * @copydoc Dali::Internal::PropertyInputImpl::InputChanged()
666 * @note A constraint can only receive the inherited property from the previous frame.
668 bool InputChanged() const override
674 * @copydoc Dali::PropertyInput::GetMatrix()
676 const Matrix& GetMatrix(BufferIndex bufferIndex) const override
678 auto transformManagerData = GetTxManagerData();
679 auto id = transformManagerData->Id();
680 if(id != INVALID_TRANSFORM_ID)
682 return transformManagerData->Manager()->GetWorldMatrix(id);
684 return Matrix::IDENTITY;
688 * @copydoc Dali::PropertyInput::GetConstraintInputMatrix()
690 const Matrix& GetConstraintInputMatrix(BufferIndex bufferIndex) const override
692 auto transformManagerData = GetTxManagerData();
693 auto id = transformManagerData->Id();
694 if(id != INVALID_TRANSFORM_ID)
696 return transformManagerData->Manager()->GetWorldMatrix(id);
698 return Matrix::IDENTITY;
702 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
704 Matrix& Get(BufferIndex bufferIndex)
706 auto transformManagerData = GetTxManagerData();
707 auto id = transformManagerData->Id();
708 DALI_ASSERT_ALWAYS(id != INVALID_TRANSFORM_ID);
709 return transformManagerData->Manager()->GetWorldMatrix(id);
713 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
715 const Matrix& Get(BufferIndex bufferIndex) const
717 return GetMatrix(bufferIndex);
721 * Retrieve the property value.
722 * @param[in] bufferIndex The buffer to read.
723 * @return The property value.
725 const Matrix& operator[](BufferIndex bufferIndex) const
727 return GetMatrix(bufferIndex);
731 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
733 bool IsTransformManagerProperty() const override
739 TransformManagerMatrixInput(const TransformManagerMatrixInput& property) = delete;
740 TransformManagerMatrixInput& operator=(const TransformManagerMatrixInput& rhs) = delete;
743 } // namespace SceneGraph
744 } // namespace Internal
747 #endif // DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H