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);
200 * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
202 const void* GetValueAddress(BufferIndex bufferIndex) const override
204 return &GetVector3(bufferIndex);
208 * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
210 size_t GetValueSize() const override
212 return sizeof(Vector3);
215 const float& GetFloatComponent(uint32_t component) const override
217 return GetTxManagerData()->Manager()->GetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, component);
220 void Set(BufferIndex bufferIndex, const Vector3& value) override
222 GetTxManagerData()->Manager()->SetVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
225 void SetComponent(BufferIndex bufferIndex, float value, uint32_t component)
227 GetTxManagerData()->Manager()->SetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
230 void BakeComponent(BufferIndex bufferIndex, float value, uint32_t component)
232 GetTxManagerData()->Manager()->BakeVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
235 void Bake(BufferIndex bufferIndex, const Vector3& value) override
237 GetTxManagerData()->Manager()->BakeVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
240 void BakeX(BufferIndex bufferIndex, float value) override
242 GetTxManagerData()->Manager()->BakeXVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
245 void BakeY(BufferIndex bufferIndex, float value) override
247 GetTxManagerData()->Manager()->BakeYVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
250 void BakeZ(BufferIndex bufferIndex, float value) override
252 GetTxManagerData()->Manager()->BakeZVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
255 void SetFloatComponent(float value, uint32_t component) override
257 GetTxManagerData()->Manager()->SetVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
260 void BakeFloatComponent(float value, uint32_t component) override
262 GetTxManagerData()->Manager()->BakeVector3PropertyComponentValue(GetTxManagerData()->Id(), PropertyT, value, component);
265 void BakeRelative(BufferIndex bufferIndex, const Vector3& value) override
267 GetTxManagerData()->Manager()->BakeRelativeVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
270 void BakeRelativeMultiply(BufferIndex bufferIndex, const Vector3& value) override
272 GetTxManagerData()->Manager()->BakeMultiplyVector3PropertyValue(GetTxManagerData()->Id(), PropertyT, value);
276 template<size_t TxMgrDataOffset>
277 class TransformManagerPropertyQuaternion final : public TransformManagerPropertyHandler<Quaternion>
282 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
284 TransformManagerData* GetTxManagerData()
286 return reinterpret_cast<TransformManagerData*>(
287 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
289 const TransformManagerData* GetTxManagerData() const
291 return reinterpret_cast<const TransformManagerData*>(
292 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
295 TransformManagerPropertyQuaternion() = default;
297 Dali::Property::Type GetType() const override
299 return Dali::PropertyTypes::Get<Quaternion>();
302 Quaternion& Get(BufferIndex bufferIndex) override
304 return GetTxManagerData()->Manager()->GetQuaternionPropertyValue(GetTxManagerData()->Id());
307 const Quaternion& Get(BufferIndex bufferIndex) const override
309 return GetTxManagerData()->Manager()->GetQuaternionPropertyValue(GetTxManagerData()->Id());
312 void Set(BufferIndex bufferIndex, const Quaternion& value) override
314 return GetTxManagerData()->Manager()->SetQuaternionPropertyValue(GetTxManagerData()->Id(), value);
317 void Bake(BufferIndex bufferIndex, const Quaternion& value) override
319 return GetTxManagerData()->Manager()->BakeQuaternionPropertyValue(GetTxManagerData()->Id(), value);
322 void BakeRelative(BufferIndex bufferIndex, const Quaternion& value) override
324 return GetTxManagerData()->Manager()->BakeRelativeQuaternionPropertyValue(GetTxManagerData()->Id(), value);
327 const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
329 return Get(bufferIndex);
333 * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
335 const void* GetValueAddress(BufferIndex bufferIndex) const override
337 return &Get(bufferIndex);
341 * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
343 size_t GetValueSize() const override
345 return sizeof(Vector4);
350 * A Vector3 property used as input.
352 template<size_t TxMgrDataOffset>
353 class TransformManagerVector3Input : public PropertyInputImpl
358 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
360 TransformManagerData* GetTxManagerData()
362 return reinterpret_cast<TransformManagerData*>(
363 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
365 const TransformManagerData* GetTxManagerData() const
367 return reinterpret_cast<const TransformManagerData*>(
368 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
372 * Create an TransformManagerVector3Input
374 TransformManagerVector3Input(TransformManagerProperty property, const Vector3& initialValue)
375 : mProperty(property),
381 * Virtual destructor.
383 ~TransformManagerVector3Input() override = default;
386 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
388 Dali::Property::Type GetType() const override
390 return Dali::PropertyTypes::Get<Vector3>();
394 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
396 virtual bool IsClean() const
402 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
404 bool InputInitialized() const override
410 * @copydoc Dali::Internal::PropertyInputImpl::InputChanged()
411 * @note A constraint can only receive the inherited property from the previous frame.
413 bool InputChanged() const override
419 * Helper function to get the transform components out of the world matrix.
420 * It stores the value in the mValue member variable
422 void ComputeTransformComponent() const
424 auto transformManagerData = GetTxManagerData();
425 auto id = transformManagerData->Id();
426 if(id != INVALID_TRANSFORM_ID)
428 const Matrix& worldMatrix = transformManagerData->Manager()->GetWorldMatrix(id);
429 if(mProperty == TRANSFORM_PROPERTY_WORLD_POSITION)
431 mValue = worldMatrix.GetTranslation3();
433 else if(mProperty == TRANSFORM_PROPERTY_WORLD_SCALE)
435 mValue = worldMatrix.GetScale();
441 * @copydoc Dali::PropertyInput::GetVector3()
443 const Vector3& GetVector3(BufferIndex bufferIndex) const override
445 ComputeTransformComponent();
450 * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
452 const void* GetValueAddress(BufferIndex bufferIndex) const override
454 return &GetVector3(bufferIndex);
458 * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
460 size_t GetValueSize() const override
462 return sizeof(Vector3);
466 * @copydoc Dali::PropertyInput::GetConstraintInputVector3()
468 const Vector3& GetConstraintInputVector3(BufferIndex bufferIndex) const override
470 ComputeTransformComponent();
475 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
477 Vector3& Get(BufferIndex bufferIndex)
479 ComputeTransformComponent();
484 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
486 const Vector3& Get(BufferIndex bufferIndex) const
488 ComputeTransformComponent();
493 * Retrieve the property value.
494 * @param[in] bufferIndex The buffer to read.
495 * @return The property value.
497 const Vector3& operator[](BufferIndex bufferIndex) const
499 ComputeTransformComponent();
504 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
506 bool IsTransformManagerProperty() const override
512 TransformManagerVector3Input(const TransformManagerVector3Input& property) = delete;
513 TransformManagerVector3Input& operator=(const TransformManagerVector3Input& rhs) = delete;
516 TransformManagerProperty mProperty;
517 mutable Vector3 mValue;
521 * A Quaternion property used as input.
523 template<size_t TxMgrDataOffset>
524 class TransformManagerQuaternionInput final : public PropertyInputImpl
529 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
531 TransformManagerData* GetTxManagerData()
533 return reinterpret_cast<TransformManagerData*>(
534 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
536 const TransformManagerData* GetTxManagerData() const
538 return reinterpret_cast<const TransformManagerData*>(
539 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
545 TransformManagerQuaternionInput() = default;
548 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
550 Dali::Property::Type GetType() const override
552 return Dali::PropertyTypes::Get<Quaternion>();
556 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
558 virtual bool IsClean() const
564 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
566 bool InputInitialized() const override
572 * @copydoc Dali::Internal::PropertyInputImpl::InputChanged()
573 * @note A constraint can only receive the inherited property from the previous frame.
575 bool InputChanged() const override
581 * Helper function to get the orientation out of the world matrix.
582 * It stores the result in the mValue member variable
584 void ComputeTransformComponent() const
586 auto transformManagerData = GetTxManagerData();
587 auto id = transformManagerData->Id();
588 if(id != INVALID_TRANSFORM_ID)
590 const Matrix& worldMatrix = transformManagerData->Manager()->GetWorldMatrix(id);
591 Vector3 position, scale;
592 worldMatrix.GetTransformComponents(position, mValue, scale);
597 * @copydoc Dali::PropertyInput::GetQuaternion()
599 const Quaternion& GetQuaternion(BufferIndex bufferIndex) const override
601 ComputeTransformComponent();
606 * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
608 const void* GetValueAddress(BufferIndex bufferIndex) const override
610 return &GetQuaternion(bufferIndex);
614 * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
616 size_t GetValueSize() const override
618 return sizeof(Vector4);
622 * @copydoc Dali::PropertyInput::GetConstraintInputQuaternion()
624 const Quaternion& GetConstraintInputQuaternion(BufferIndex bufferIndex) const override
626 ComputeTransformComponent();
631 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
633 Quaternion& Get(BufferIndex bufferIndex)
635 ComputeTransformComponent();
640 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
642 const Quaternion& Get(BufferIndex bufferIndex) const
644 ComputeTransformComponent();
649 * Retrieve the property value.
650 * @param[in] bufferIndex The buffer to read.
651 * @return The property value.
653 const Quaternion& operator[](BufferIndex bufferIndex) const
655 ComputeTransformComponent();
660 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
662 bool IsTransformManagerProperty() const override
668 TransformManagerQuaternionInput(const TransformManagerQuaternionInput& property) = delete;
669 TransformManagerQuaternionInput& operator=(const TransformManagerQuaternionInput& rhs) = delete;
672 mutable Quaternion mValue;
676 * A Matrix property used as input.
678 template<size_t TxMgrDataOffset>
679 class TransformManagerMatrixInput final : public PropertyInputImpl
684 TRANSFORM_MANAGER_DATA_OFFSET = TxMgrDataOffset
686 TransformManagerData* GetTxManagerData()
688 return reinterpret_cast<TransformManagerData*>(
689 reinterpret_cast<uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
691 const TransformManagerData* GetTxManagerData() const
693 return reinterpret_cast<const TransformManagerData*>(
694 reinterpret_cast<const uint8_t*>(this) - TRANSFORM_MANAGER_DATA_OFFSET);
700 TransformManagerMatrixInput() = default;
703 * @copydoc Dali::Internal::SceneGraph::PropertyBase::GetType()
705 Dali::Property::Type GetType() const override
707 return Dali::PropertyTypes::Get<Matrix>();
711 * @copydoc Dali::Internal::SceneGraph::PropertyBase::IsClean()
713 virtual bool IsClean() const
719 * @copydoc Dali::Internal::PropertyInputImpl::InputInitialized()
721 bool InputInitialized() const override
727 * @copydoc Dali::Internal::PropertyInputImpl::InputChanged()
728 * @note A constraint can only receive the inherited property from the previous frame.
730 bool InputChanged() const override
736 * @copydoc Dali::PropertyInput::GetMatrix()
738 const Matrix& GetMatrix(BufferIndex bufferIndex) const override
740 auto transformManagerData = GetTxManagerData();
741 auto id = transformManagerData->Id();
742 if(id != INVALID_TRANSFORM_ID)
744 return transformManagerData->Manager()->GetWorldMatrix(id);
746 return Matrix::IDENTITY;
750 * @copydoc Dali::Internal::PropertyInputImpl::GetValueAddress()
752 const void* GetValueAddress(BufferIndex bufferIndex) const override
754 static const Matrix identityMatrix(Matrix::IDENTITY);
755 auto transformManagerData = GetTxManagerData();
756 auto id = transformManagerData->Id();
757 if(id != INVALID_TRANSFORM_ID)
759 return &(transformManagerData->Manager()->GetWorldMatrix(id));
761 return &identityMatrix;
765 * @copydoc Dali::Internal::PropertyInputImpl::GetValueSize()
767 size_t GetValueSize() const override
769 return sizeof(Matrix);
773 * @copydoc Dali::PropertyInput::GetConstraintInputMatrix()
775 const Matrix& GetConstraintInputMatrix(BufferIndex bufferIndex) const override
777 auto transformManagerData = GetTxManagerData();
778 auto id = transformManagerData->Id();
779 if(id != INVALID_TRANSFORM_ID)
781 return transformManagerData->Manager()->GetWorldMatrix(id);
783 return Matrix::IDENTITY;
787 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
789 Matrix& Get(BufferIndex bufferIndex)
791 auto transformManagerData = GetTxManagerData();
792 auto id = transformManagerData->Id();
793 DALI_ASSERT_ALWAYS(id != INVALID_TRANSFORM_ID);
794 return transformManagerData->Manager()->GetWorldMatrix(id);
798 * @copydoc Dali::SceneGraph::PropertyInterface::Get()
800 const Matrix& Get(BufferIndex bufferIndex) const
802 return GetMatrix(bufferIndex);
806 * Retrieve the property value.
807 * @param[in] bufferIndex The buffer to read.
808 * @return The property value.
810 const Matrix& operator[](BufferIndex bufferIndex) const
812 return GetMatrix(bufferIndex);
816 * @copydoc Dali::Internal::PropertyInputImpl::IsTransformManagerProperty()
818 bool IsTransformManagerProperty() const override
824 TransformManagerMatrixInput(const TransformManagerMatrixInput& property) = delete;
825 TransformManagerMatrixInput& operator=(const TransformManagerMatrixInput& rhs) = delete;
828 } // namespace SceneGraph
829 } // namespace Internal
832 #endif // DALI_INTERNAL_UPDATE_TRANSFORM_MANAGER_PROPERTY_H