1 #ifndef DALI_INTERNAL_SCENE_GRAPH_RENDERER_ATTACHMENT_H
2 #define DALI_INTERNAL_SCENE_GRAPH_RENDERER_ATTACHMENT_H
5 * Copyright (c) 2015 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.
20 #include <dali/internal/event/common/event-thread-services.h>
21 #include <dali/internal/update/common/double-buffered.h>
22 #include <dali/internal/update/common/property-owner.h>
23 #include <dali/internal/update/common/animatable-property.h>
24 #include <dali/internal/update/common/scene-graph-connection-observers.h>
25 #include <dali/internal/update/controllers/render-message-dispatcher.h>
26 #include <dali/internal/update/controllers/scene-controller.h>
27 #include <dali/internal/update/node-attachments/scene-graph-renderable-attachment.h>
28 #include <dali/internal/render/data-providers/uniform-map-data-provider.h>
41 * The renderer attachment is the SceneGraph equivalent of Dali::Renderer. It is used to create an instance of a geometry and material for rendering, and is attached to an actor.
43 * It observes it's children (Material and Geometry) for connection change and for uniform map change, and observer's it's actor parent for uniform map change - this allows it to re-generate the uniform maps used by its RenderThread equivalent class.
45 * Lifetime and ownership
46 * It is created when a Dali::Renderer is created, and sent to UpdateManager. At this point
47 * Initialize is called on the object, but ownership is NOT taken by UpdateManager.
49 * When a Dali::Renderer is added to an actor, then this object becomes the node attachment
50 * for that actor, and the node takes ownership. It will create the Render::NewRenderer object
51 * in the Update thread on reciept of the connection message.
53 * When it's not attached to an actor, it is still possible to send messages to this
54 * object, to, e.g., set the material, or a property.
56 * @todo MESH_REWORK On merge with RenderableAttachment, change owner of all attachments to UpdateManager.
58 class RendererAttachment : public RenderableAttachment,
60 public UniformMapDataProvider,
61 public UniformMap::Observer,
62 public ConnectionObservers::Observer
66 * Create a new renderer attachment.
67 * @return The newly allocated RendererAttachment
69 static RendererAttachment* New();
79 virtual ~RendererAttachment();
82 * @copydoc RenderableAttachment::Initialize2().
84 virtual void Initialize2( BufferIndex updateBufferIndex );
87 * @copydoc RenderableAttachment::OnDestroy2().
89 virtual void OnDestroy2();
92 * @copydoc NodeAttachment::ConnectedToSceneGraph()
94 virtual void ConnectedToSceneGraph();
97 * @copydoc NodeAttachment::DisconnectedFromSceneGraph()
99 virtual void DisconnectedFromSceneGraph();
102 * Set the material for the renderer
103 * @param[in] bufferIndex The current frame's buffer index
104 * @param[in] material The material this renderer will use
106 void SetMaterial( BufferIndex bufferIndex, const Material* material);
109 * Get the material of this renderer
110 * @return the material this renderer uses
112 const Material& GetMaterial() const;
115 * Set the geometry for the renderer
116 * @param[in] bufferIndex The current frame's buffer index
117 * @param[in] geometry The geometry this renderer will use
119 void SetGeometry( BufferIndex bufferIndex, const Geometry* geometry);
122 * Get the geometry of this renderer
123 * @return the geometry this renderer uses
125 const Geometry& GetGeometry() const;
128 * Get the depth index
129 * @return The depth index of the renderer attachment in the current frame
131 int GetDepthIndex( BufferIndex bufferIndex ) const ;
133 protected: // From RenderableAttachment
135 * @copydoc RenderableAttachment::GetRenderer().
137 virtual Renderer& GetRenderer();
140 * @copydoc RenderableAttachment::GetRenderer().
142 virtual const Renderer& GetRenderer() const;
145 * @copydoc RenderableAttachment::DoPrepareRender()
147 virtual void DoPrepareRender( BufferIndex updateBufferIndex );
150 * @copydoc RenderableAttachment::IsFullyOpaque()
152 virtual bool IsFullyOpaque( BufferIndex updateBufferIndex );
155 * @copydoc RenderableAttachment::SizeChanged()
157 virtual void SizeChanged( BufferIndex updateBufferIndex );
160 * @copydoc RenderableAttachment::DoPrepareResources()
162 virtual bool DoPrepareResources( BufferIndex updateBufferIndex,
163 ResourceManager& resourceManager );
165 protected: // From ConnectionObserver
167 * @copydoc ConnectionObservers::Observer::ConnectionsChanged
169 virtual void ConnectionsChanged(PropertyOwner& object);
172 * @copydoc ConnectionObservers::Observer::ConnectedUniformMapChanged
174 virtual void ConnectedUniformMapChanged();
176 protected: // From UniformMap::Observer
178 * @copydoc UniformMap::Observer::UniformMappingsChanged
180 virtual void UniformMappingsChanged( const UniformMap& mappings );
182 protected: // From UniformMapDataProvider
184 * @copydoc UniformMapDataProvider::GetUniformMapChanged
186 virtual bool GetUniformMapChanged( BufferIndex bufferIndex ) const;
189 * @copydoc UniformMapDataProvider::GetUniformMap
191 virtual const CollectedUniformMap& GetUniformMap( BufferIndex bufferIndex ) const;
195 * Add any new mappings from map into the current map.
196 * This doesn't override any existing mappings.
198 void AddMappings( CollectedUniformMap& localMap, const UniformMap& map );
201 NewRenderer* mRenderer; ///< Raw pointer to the new renderer (that's owned by RenderManager)
203 Material* mMaterial; ///< The material this renderer uses. (Not owned)
204 Geometry* mGeometry; ///< The geometry this renderer uses. (Not owned)
206 CollectedUniformMap mCollectedUniformMap[2];
207 bool mUniformMapChanged[2]; ///< Records if the uniform map has been altered this frame
208 int mRegenerateUniformMap; ///< 2 if the map should be regenerated, 1 if it should be copied.
209 public: // Properties
211 AnimatableProperty<int> mDepthIndex; ///< Used only in PrepareRenderInstructions
214 // Messages for RendererAttachment
216 inline void SetMaterialMessage( EventThreadServices& eventThreadServices, const RendererAttachment& attachment, const Material& material )
218 typedef MessageDoubleBuffered1< RendererAttachment, const Material* > LocalType;
220 // Reserve some memory inside the message queue
221 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
223 // Construct message in the message queue memory; note that delete should not be called on the return value
224 new (slot) LocalType( &attachment, &RendererAttachment::SetMaterial, &material );
227 inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const RendererAttachment& attachment, const Geometry& geometry )
229 typedef MessageDoubleBuffered1< RendererAttachment, const Geometry* > LocalType;
231 // Reserve some memory inside the message queue
232 unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
234 // Construct message in the message queue memory; note that delete should not be called on the return value
235 new (slot) LocalType( &attachment, &RendererAttachment::SetGeometry, &geometry );
238 } // namespace SceneGraph
239 } // namespace Internal
243 #endif // DALI_INTERNAL_SCENE_GRAPH_RENDERER_ATTACHMENT_H