1 #ifndef DALI_INTERNAL_SCENE_GRAPH_CONSTRAINT_H
2 #define DALI_INTERNAL_SCENE_GRAPH_CONSTRAINT_H
5 * Copyright (c) 2019 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.
22 #include <dali/public-api/common/dali-common.h>
23 #include <dali/public-api/signals/callback.h>
24 #include <dali/internal/event/animation/property-constraint-ptr.h>
25 #include <dali/internal/update/common/animatable-property.h>
26 #include <dali/internal/update/common/property-owner.h>
27 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
28 #include <dali/internal/render/common/performance-monitor.h>
40 * Used to constrain a property of a scene-object.
41 * The constraint function takes another scene-object property as an input.
43 template < class PropertyType, typename PropertyAccessorType >
44 class Constraint : public ConstraintBase
48 using ConstraintFunctionPtr = typename PropertyConstraintPtr< PropertyType >::Type;
51 * Create a new scene-graph constraint.
52 * @param[in] targetProperty The target property.
53 * @param[in] ownerSet A set of property owners; func is connected to the properties provided by these objects.
54 * @param[in] func The function to calculate the final constrained value.
55 * @param[in] removeAction Remove action to perform when constraint is removed
56 * @return A smart-pointer to a newly allocated constraint.
58 static ConstraintBase* New( const PropertyBase& targetProperty,
59 PropertyOwnerContainer& ownerContainer,
60 ConstraintFunctionPtr func,
61 RemoveAction removeAction )
63 // Scene-graph thread can edit these objects
64 PropertyBase& property = const_cast< PropertyBase& >( targetProperty );
66 return new Constraint< PropertyType, PropertyAccessorType >( property,
75 ~Constraint() override = default;
78 * @copydoc Dali::Internal::SceneGraph::ConstraintBase::Apply()
80 void Apply( BufferIndex updateBufferIndex ) override
84 if ( mFunc->InputsInitialized() )
86 PropertyType current = mTargetProperty.Get( updateBufferIndex );
87 mFunc->Apply( updateBufferIndex, current );
89 // Optionally bake the final value
90 if ( Dali::Constraint::BAKE == mRemoveAction )
92 mTargetProperty.Bake( updateBufferIndex, current );
96 mTargetProperty.Set( updateBufferIndex, current );
99 INCREASE_COUNTER(PerformanceMonitor::CONSTRAINTS_APPLIED);
103 INCREASE_COUNTER(PerformanceMonitor::CONSTRAINTS_SKIPPED);
111 * @copydoc Dali::Internal::SceneGraph::Constraint::New()
113 Constraint( PropertyBase& targetProperty,
114 PropertyOwnerContainer& ownerContainer,
115 ConstraintFunctionPtr func,
116 RemoveAction removeAction )
117 : ConstraintBase( ownerContainer, removeAction ),
118 mTargetProperty( &targetProperty ),
124 Constraint() = delete;
125 Constraint( const Constraint& constraint ) = delete;
126 Constraint& operator=( const Constraint& rhs ) = delete;
129 * @copydoc Dali::Internal::SceneGraph::ConstraintBase::OnDisconnect()
131 void OnDisconnect() override
133 // Discard target object/property pointers
134 mTargetProperty.Reset();
140 PropertyAccessorType mTargetProperty; ///< Raw-pointer to the target property. Not owned.
142 ConstraintFunctionPtr mFunc;
146 } // namespace SceneGraph
148 } // namespace Internal
152 #endif // DALI_INTERNAL_SCENE_GRAPH_CONSTRAINT_H