[dali_1.1.7] Merge branch '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 : mIndexBuffer( NULL ),
35   mRenderGeometry(0),
36   mSceneController(0),
37   mRendererRefCount(0u),
38   mCenter(),
39   mGeometryType(Dali::Geometry::TRIANGLES),
40   mRequiresDepthTest(false)
41 {
42
43   // Observe our own PropertyOwner's uniform map
44   AddUniformMapObserver( *this );
45 }
46
47 Geometry::~Geometry()
48 {
49   mConnectionObservers.Destroy( *this );
50 }
51
52 void Geometry::AddVertexBuffer( Render::PropertyBuffer* vertexBuffer )
53 {
54   mVertexBuffers.PushBack( vertexBuffer );
55   mConnectionObservers.ConnectionsChanged(*this);
56
57   if( mRenderGeometry )
58   {
59     mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, false);
60   }
61 }
62
63 void Geometry::RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer )
64 {
65   DALI_ASSERT_DEBUG( NULL != vertexBuffer );
66
67   // Find the object and destroy it
68   size_t bufferCount(mVertexBuffers.Size());
69   for( size_t i(0); i<bufferCount; ++i )
70   {
71     if( vertexBuffer == mVertexBuffers[i] )
72     {
73       mVertexBuffers.Erase( mVertexBuffers.Begin()+i );
74       mConnectionObservers.ConnectionsChanged(*this);
75
76       if( mRenderGeometry )
77       {
78         mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
79       }
80     }
81   }
82 }
83
84 void Geometry::SetIndexBuffer( Render::PropertyBuffer* indexBuffer )
85 {
86   if( mIndexBuffer != indexBuffer )
87   {
88     mIndexBuffer = indexBuffer;
89     mConnectionObservers.ConnectionsChanged(*this);
90
91     if( mRenderGeometry )
92     {
93       mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, true );
94     }
95   }
96 }
97
98 void Geometry::ClearIndexBuffer()
99 {
100   if( mIndexBuffer )
101   {
102     if( mRenderGeometry )
103     {
104       mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer );
105     }
106   }
107   mIndexBuffer = 0;
108   mConnectionObservers.ConnectionsChanged(*this);
109 }
110
111 void Geometry::SetGeometryType( BufferIndex bufferIndex, Geometry::GeometryType geometryType )
112 {
113   mGeometryType.Set( bufferIndex, geometryType);
114 }
115
116 Vector<Render::PropertyBuffer*>& Geometry::GetVertexBuffers()
117 {
118   return mVertexBuffers;
119 }
120
121 Render::PropertyBuffer* Geometry::GetIndexBuffer()
122 {
123   return mIndexBuffer;
124 }
125
126 Geometry::GeometryType Geometry::GetGeometryType( BufferIndex bufferIndex) const
127 {
128   int geometryType = mGeometryType[ bufferIndex ];
129   return static_cast< GeometryDataProvider::GeometryType > ( geometryType );
130 }
131
132 bool Geometry::GetRequiresDepthTesting( BufferIndex bufferIndex ) const
133 {
134   return mRequiresDepthTest.GetBoolean( bufferIndex );
135 }
136
137 void Geometry::ResetDefaultProperties( BufferIndex updateBufferIndex )
138 {
139   // Reset the animated properties
140   mCenter.ResetToBaseValue( updateBufferIndex );
141
142   // Age the double buffered properties
143   mGeometryType.CopyPrevious(updateBufferIndex);
144   mRequiresDepthTest.CopyPrevious(updateBufferIndex);
145 }
146
147 void Geometry::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
148 {
149 }
150
151 void Geometry::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
152 {
153 }
154
155 void Geometry::AddConnectionObserver( ConnectionChangePropagator::Observer& observer )
156 {
157   mConnectionObservers.Add(observer);
158 }
159
160 void Geometry::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer )
161 {
162   mConnectionObservers.Remove(observer);
163 }
164
165 void Geometry::UniformMappingsChanged( const UniformMap& mappings )
166 {
167   // Our uniform map, or that of one of the watched children has changed.
168   // Inform connected observers.
169   mConnectionObservers.ConnectedUniformMapChanged();
170 }
171
172 RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController)
173 {
174   if(!mRenderGeometry )
175   {
176     //Create RenderGeometry
177     mSceneController = sceneController;
178     mRenderGeometry = new RenderGeometry( *this );
179
180     size_t vertexBufferCount( mVertexBuffers.Size() );
181     for( size_t i(0); i<vertexBufferCount; ++i )
182     {
183       mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], false );
184     }
185
186     if( mIndexBuffer )
187     {
188       mRenderGeometry->AddPropertyBuffer( mIndexBuffer, true );
189     }
190
191     //Transfer ownership to RenderManager
192     sceneController->GetRenderMessageDispatcher().AddGeometry( *mRenderGeometry );
193   }
194
195   ++mRendererRefCount;
196   return mRenderGeometry;
197 }
198
199 void Geometry::OnRendererDisconnect()
200 {
201   --mRendererRefCount;
202   if( mRendererRefCount == 0 )
203   {
204     //Delete the corresponding RenderGeometry via message to RenderManager
205     mSceneController->GetRenderMessageDispatcher().RemoveGeometry( *mRenderGeometry );
206
207     mRenderGeometry = 0;
208     mSceneController = 0;
209   }
210 }
211
212
213 } // namespace SceneGraph
214 } // namespace Internal
215 } // namespace Dali