X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fnodes%2Fnode.h;h=be26b7ae3cae614be15af7620507da1f9718b905;hb=3c49a16475d96201db74ebb9a7c8c872857ca6b5;hp=c34b68475d06860a8a0f801a8db59e7f8a0a8e4b;hpb=90511c921064dc8a3823b8426696195cbb0e3646;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/nodes/node.h b/dali/internal/update/nodes/node.h index c34b684..be26b7a 100644 --- a/dali/internal/update/nodes/node.h +++ b/dali/internal/update/nodes/node.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_SCENE_GRAPH_NODE_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include #include #include @@ -57,6 +59,7 @@ class DiscardQueue; class Layer; class RenderTask; class UpdateManager; +class Node; // Flags which require the scene renderable lists to be updated static NodePropertyFlags RenderableUpdateFlags = NodePropertyFlags::TRANSFORM | NodePropertyFlags::CHILD_DELETED; @@ -103,7 +106,7 @@ public: * Query whether the node is a layer. * @return True if the node is a layer. */ - bool IsLayer() + bool IsLayer() const { return mIsLayer; } @@ -117,6 +120,17 @@ public: return nullptr; } + // Camera interface + + /** + * Query whether the node is a camera. + * @return True if the node is a camera. + */ + bool IsCamera() const + { + return mIsCamera; + } + /** * Mark an node and its sub tree according to the updated flag. * @param[in] updated The updated flag @@ -199,6 +213,7 @@ public: void SetClippingMode(const ClippingMode::Type clippingMode) { mClippingMode = clippingMode; + SetDirtyFlag(NodePropertyFlags::TRANSFORM); } /** @@ -651,17 +666,17 @@ public: } /** - * Retrieve the update size hint of the node. - * @return The update size hint. + * Retrieve the update area hint of the node. + * @return The update area hint. */ - const Vector3& GetUpdateSizeHint() const + const Vector4& GetUpdateAreaHint() const { if(mTransformManagerData.Id() != INVALID_TRANSFORM_ID) { - return mUpdateSizeHint.Get(0); + return mUpdateAreaHint.Get(0); } - return Vector3::ZERO; + return Vector4::ZERO; } /** @@ -786,7 +801,12 @@ public: */ void SetDepthIndex(uint32_t depthIndex) { - mDepthIndex = depthIndex; + if(depthIndex != mDepthIndex) + { + SetDirtyFlag(NodePropertyFlags::DEPTH_INDEX); + SetUpdated(true); + mDepthIndex = depthIndex; + } } /** @@ -831,30 +851,30 @@ public: return mCulled[bufferIndex]; } -public: /** - * @copydoc UniformMap::Add + * @brief Get the total capacity of the memory pools + * @return The capacity of the memory pools + * + * @note This is different to the node count. */ - void AddUniformMapping(const UniformPropertyMapping& map) override; + static uint32_t GetMemoryPoolCapacity(); /** - * @copydoc UniformMap::Remove + * @brief Returns partial rendering data associated with the node. + * @return The partial rendering data */ - void RemoveUniformMapping(const ConstString& uniformName) override; + PartialRenderingData& GetPartialRenderingData() + { + return mPartialRenderingData; + } +public: /** * @copydoc Dali::Internal::SceneGraph::PropertyOwner::IsAnimationPossible */ bool IsAnimationPossible() const override; /** - * Prepare the node for rendering. - * This is called by the UpdateManager when an object is due to be rendered in the current frame. - * @param[in] updateBufferIndex The current update buffer index. - */ - void PrepareRender(BufferIndex bufferIndex); - - /** * Called by UpdateManager when the node is added. * Creates a new transform component in the transform manager and initialize all the properties * related to the transformation @@ -867,6 +887,12 @@ public: */ void ResetDirtyFlags(BufferIndex updateBufferIndex); + /** + * Update uniform hash + * @param[in] bufferIndex The buffer to read from. + */ + void UpdateUniformHash(BufferIndex bufferIndex); + protected: /** * Set the parent of a Node. @@ -888,14 +914,6 @@ protected: private: // from NodeDataProvider /** - * @copydoc NodeDataProvider::GetModelMatrix - */ - const Matrix& GetModelMatrix(BufferIndex bufferIndex) const override - { - return GetWorldMatrix(bufferIndex); - } - - /** * @copydoc NodeDataProvider::GetRenderColor */ const Vector4& GetRenderColor(BufferIndex bufferIndex) const override @@ -903,29 +921,20 @@ private: // from NodeDataProvider return GetWorldColor(bufferIndex); } -public: // From UniformMapDataProvider /** - * @copydoc UniformMapDataProvider::GetUniformMapChanged + * @copydoc NodeDataProvider::GetNodeUniformMap */ - bool GetUniformMapChanged(BufferIndex bufferIndex) const override + const UniformMap& GetNodeUniformMap() const override { - return mUniformMapChanged[bufferIndex]; - } - - /** - * @copydoc UniformMapDataProvider::GetUniformMap - */ - const CollectedUniformMap& GetUniformMap(BufferIndex bufferIndex) const override - { - return mCollectedUniformMap[bufferIndex]; + return GetUniformMap(); } private: - // Undefined - Node(const Node&); - - // Undefined - Node& operator=(const Node& rhs); + // Delete copy and move + Node(const Node&) = delete; + Node(Node&&) = delete; + Node& operator=(const Node& rhs) = delete; + Node& operator=(Node&& rhs) = delete; /** * Recursive helper to disconnect a Node and its children. @@ -935,39 +944,48 @@ private: void RecursiveDisconnectFromSceneGraph(BufferIndex updateBufferIndex); public: // Default properties - using TransformManagerParentsOrigin = TransformManagerPropertyVector3; - using TransformManagerAnchorPoint = TransformManagerPropertyVector3; - using TransformManagerSize = TransformManagerPropertyVector3; - using TransformManagerPosition = TransformManagerPropertyVector3; - using TransformManagerScale = TransformManagerPropertyVector3; - - TransformManagerData mTransformManagerData; - TransformManagerParentsOrigin mParentOrigin; ///< Local transform; the position is relative to this. Sets the Transform flag dirty when changed - TransformManagerAnchorPoint mAnchorPoint; ///< Local transform; local center of rotation. Sets the Transform flag dirty when changed - TransformManagerSize mSize; ///< Size is provided for layouting - TransformManagerPosition mPosition; ///< Local transform; distance between parent-origin & anchor-point - TransformManagerScale mScale; ///< Local transform; scale relative to parent node - TransformManagerPropertyQuaternion mOrientation; ///< Local transform; rotation relative to parent node + // Define a base offset for the following wrappers. The wrapper macros calculate offsets from the previous + // element such that each wrapper type generates a compile time offset to the transform manager data. + BASE(TransformManagerData, mTransformManagerData); + PROPERTY_WRAPPER(mTransformManagerData, TransformManagerPropertyVector3, TRANSFORM_PROPERTY_PARENT_ORIGIN, + mParentOrigin); // Local transform; the position is relative to this. Sets the Transform flag dirty when changed - AnimatableProperty mVisible; ///< Visibility can be inherited from the Node hierachy - AnimatableProperty mCulled; ///< True if the node is culled. This is not animatable. It is just double-buffered. - AnimatableProperty mColor; ///< Color can be inherited from the Node hierarchy - AnimatableProperty mUpdateSizeHint; ///< Update size hint is provided for damaged area calculation. This is not animatable. It is just double-buffered. (Because all these bloody properties are). + PROPERTY_WRAPPER(mParentOrigin, TransformManagerPropertyVector3, TRANSFORM_PROPERTY_ANCHOR_POINT, + mAnchorPoint); // Local transform; local center of rotation. Sets the Transform flag dirty when changed + + PROPERTY_WRAPPER(mAnchorPoint, TransformManagerPropertyVector3, TRANSFORM_PROPERTY_SIZE, + mSize); // Size is provided for layouting + + PROPERTY_WRAPPER(mSize, TransformManagerPropertyVector3, TRANSFORM_PROPERTY_POSITION, + mPosition); // Local transform; distance between parent-origin & anchor-point + PROPERTY_WRAPPER(mPosition, TransformManagerPropertyVector3, TRANSFORM_PROPERTY_SCALE, + mScale); // Local transform; scale relative to parent node + + TEMPLATE_WRAPPER(mScale, TransformManagerPropertyQuaternion, + mOrientation); // Local transform; rotation relative to parent node // Inherited properties; read-only from public API + TEMPLATE_WRAPPER(mOrientation, TransformManagerVector3Input, mWorldPosition); // Full inherited position + TEMPLATE_WRAPPER(mWorldPosition, TransformManagerVector3Input, mWorldScale); // Full inherited scale + TEMPLATE_WRAPPER(mWorldScale, TransformManagerQuaternionInput, mWorldOrientation); // Full inherited orientation + TEMPLATE_WRAPPER(mWorldOrientation, TransformManagerMatrixInput, mWorldMatrix); // Full inherited world matrix - TransformManagerVector3Input mWorldPosition; ///< Full inherited position - TransformManagerVector3Input mWorldScale; - TransformManagerQuaternionInput mWorldOrientation; ///< Full inherited orientation - TransformManagerMatrixInput mWorldMatrix; ///< Full inherited world matrix - InheritedColor mWorldColor; ///< Full inherited color + AnimatableProperty mVisible; ///< Visibility can be inherited from the Node hierachy + AnimatableProperty mCulled; ///< True if the node is culled. This is not animatable. It is just double-buffered. + AnimatableProperty mColor; ///< Color can be inherited from the Node hierarchy + InheritedColor mWorldColor; ///< Full inherited color + AnimatableProperty mUpdateAreaHint; ///< Update area hint is provided for damaged area calculation. (x, y, width, height) + ///< This is not animatable. It is just double-buffered. (Because all these bloody properties are). + uint64_t mUniformsHash{0u}; ///< Hash of uniform map property values uint32_t mClippingSortModifier; ///< Contains bit-packed clipping information for quick access when sorting const uint32_t mId; ///< The Unique ID of the node. protected: static uint32_t mNodeCounter; ///< count of total nodes, used for unique ids + PartialRenderingData mPartialRenderingData; ///< Cache to determine if this should be rendered again + Node* mParent; ///< Pointer to parent node (a child is owned by its parent) RenderTask* mExclusiveRenderTask; ///< Nodes can be marked as exclusive to a single RenderTask @@ -975,21 +993,18 @@ protected: NodeContainer mChildren; ///< Container of children; not owned - CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps of the node - uint32_t mUniformMapChanged[2]; ///< Records if the uniform map has been altered this frame - uint32_t mClippingDepth; ///< The number of stencil clipping nodes deep this node is - uint32_t mScissorDepth; ///< The number of scissor clipping nodes deep this node is - - uint32_t mDepthIndex; ///< Depth index of the node + uint32_t mClippingDepth; ///< The number of stencil clipping nodes deep this node is + uint32_t mScissorDepth; ///< The number of scissor clipping nodes deep this node is + uint32_t mDepthIndex; ///< Depth index of the node // flags, compressed to bitfield NodePropertyFlags mDirtyFlags; ///< Dirty flags for each of the Node properties - uint32_t mRegenerateUniformMap : 2; ///< Indicate if the uniform map has to be regenerated this frame DrawMode::Type mDrawMode : 3; ///< How the Node and its children should be drawn ColorMode mColorMode : 3; ///< Determines whether mWorldColor is inherited, 2 bits is enough ClippingMode::Type mClippingMode : 3; ///< The clipping mode of this node bool mIsRoot : 1; ///< True if the node cannot have a parent bool mIsLayer : 1; ///< True if the node is a layer + bool mIsCamera : 1; ///< True if the node is a camera bool mPositionUsesAnchorPoint : 1; ///< True if the node should use the anchor-point when calculating the position bool mTransparent : 1; ///< True if this node is transparent. This value do not affect children.