Merge "Remove double-buffered properties from SceneGraph::Geometry" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / update / rendering / scene-graph-geometry.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 // CLASS HEADER
18 #include "scene-graph-geometry.h"
19
20 // INTERNAL HEADERS
21 #include <dali/internal/update/controllers/scene-controller.h>
22 #include <dali/internal/render/renderers/render-geometry.h>
23 #include <dali/internal/render/renderers/render-property-buffer.h>
24 #include <dali/internal/update/controllers/render-message-dispatcher.h>
25
26 namespace Dali
27 {
28 namespace Internal
29 {
30 namespace SceneGraph
31 {
32
33 Geometry::Geometry()
34 : mRenderGeometry(NULL),
35   mSceneController(NULL),
36   mIndexBuffer( NULL ),
37   mGeometryType(Dali::Geometry::TRIANGLES),
38   mRendererRefCount(0u),
39   mRequiresDepthTest(false)
40 {
41
42   // Observe our own PropertyOwner's uniform map
43   AddUniformMapObserver( *this );
44 }
45
46 Geometry::~Geometry()
47 {
48   mConnectionObservers.Destroy( *this );
49 }
50
51 void Geometry::AddVertexBuffer( Render::PropertyBuffer* vertexBuffer )
52 {
53   mVertexBuffers.PushBack( vertexBuffer );
54   mConnectionObservers.ConnectionsChanged(*this);
55
56   if( mRenderGeometry )
57   {
58     mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, false);
59   }
60 }
61
62 void Geometry::RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer )
63 {
64   DALI_ASSERT_DEBUG( NULL != vertexBuffer );
65
66   // Find the object and destroy it
67   size_t bufferCount(mVertexBuffers.Size());
68   for( size_t i(0); i<bufferCount; ++i )
69   {
70     if( vertexBuffer == mVertexBuffers[i] )
71     {
72       mVertexBuffers.Erase( mVertexBuffers.Begin()+i );
73       mConnectionObservers.ConnectionsChanged(*this);
74
75       if( mRenderGeometry )
76       {
77         mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
78       }
79     }
80   }
81 }
82
83 void Geometry::SetIndexBuffer( Render::PropertyBuffer* indexBuffer )
84 {
85   if( mIndexBuffer != indexBuffer )
86   {
87     mIndexBuffer = indexBuffer;
88     mConnectionObservers.ConnectionsChanged(*this);
89
90     if( mRenderGeometry )
91     {
92       mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, true );
93     }
94   }
95 }
96
97 void Geometry::ClearIndexBuffer()
98 {
99   if( mIndexBuffer )
100   {
101     if( mRenderGeometry )
102     {
103       mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer );
104     }
105   }
106   mIndexBuffer = 0;
107   mConnectionObservers.ConnectionsChanged(*this);
108 }
109
110 void Geometry::SetGeometryType(Geometry::GeometryType geometryType )
111 {
112   mGeometryType = geometryType;
113   if( mRenderGeometry )
114   {
115     mSceneController->GetRenderMessageDispatcher().SetGeometryType( *mRenderGeometry, static_cast<int>(geometryType) );
116   }
117 }
118
119 void Geometry::SetRequiresDepthTest( bool requiresDepthTest )
120 {
121   mRequiresDepthTest = requiresDepthTest;
122   if( mRenderGeometry )
123   {
124     mSceneController->GetRenderMessageDispatcher().SetGeometryRequiresDepthTest( *mRenderGeometry, requiresDepthTest );
125   }
126 }
127
128 Vector<Render::PropertyBuffer*>& Geometry::GetVertexBuffers()
129 {
130   return mVertexBuffers;
131 }
132
133 Render::PropertyBuffer* Geometry::GetIndexBuffer()
134 {
135   return mIndexBuffer;
136 }
137
138 Geometry::GeometryType Geometry::GetGeometryType( BufferIndex bufferIndex) const
139 {
140   return mGeometryType;
141 }
142
143 bool Geometry::GetRequiresDepthTesting( BufferIndex bufferIndex ) const
144 {
145   return mRequiresDepthTest;
146 }
147
148 void Geometry::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
149 {
150 }
151
152 void Geometry::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
153 {
154 }
155
156 void Geometry::AddConnectionObserver( ConnectionChangePropagator::Observer& observer )
157 {
158   mConnectionObservers.Add(observer);
159 }
160
161 void Geometry::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer )
162 {
163   mConnectionObservers.Remove(observer);
164 }
165
166 void Geometry::UniformMappingsChanged( const UniformMap& mappings )
167 {
168   // Our uniform map, or that of one of the watched children has changed.
169   // Inform connected observers.
170   mConnectionObservers.ConnectedUniformMapChanged();
171 }
172
173 RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController)
174 {
175   if(!mRenderGeometry )
176   {
177     //Create RenderGeometry
178     mSceneController = sceneController;
179     mRenderGeometry = new RenderGeometry( mGeometryType, mRequiresDepthTest );
180
181     size_t vertexBufferCount( mVertexBuffers.Size() );
182     for( size_t i(0); i<vertexBufferCount; ++i )
183     {
184       mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], false );
185     }
186
187     if( mIndexBuffer )
188     {
189       mRenderGeometry->AddPropertyBuffer( mIndexBuffer, true );
190     }
191
192     //Transfer ownership to RenderManager
193     sceneController->GetRenderMessageDispatcher().AddGeometry( *mRenderGeometry );
194   }
195
196   ++mRendererRefCount;
197   return mRenderGeometry;
198 }
199
200 void Geometry::OnRendererDisconnect()
201 {
202   --mRendererRefCount;
203   if( mRendererRefCount == 0 )
204   {
205     //Delete the corresponding RenderGeometry via message to RenderManager
206     mSceneController->GetRenderMessageDispatcher().RemoveGeometry( *mRenderGeometry );
207
208     mRenderGeometry = 0;
209     mSceneController = 0;
210   }
211 }
212
213
214 } // namespace SceneGraph
215 } // namespace Internal
216 } // namespace Dali