2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include "scene-graph-geometry.h"
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>
34 : mRenderGeometry(NULL),
35 mSceneController(NULL),
37 mGeometryType(Dali::Geometry::TRIANGLES),
38 mRendererRefCount(0u),
39 mRequiresDepthTest(false)
42 // Observe our own PropertyOwner's uniform map
43 AddUniformMapObserver( *this );
48 mConnectionObservers.Destroy( *this );
51 void Geometry::AddVertexBuffer( Render::PropertyBuffer* vertexBuffer )
53 mVertexBuffers.PushBack( vertexBuffer );
54 mConnectionObservers.ConnectionsChanged(*this);
58 mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, false);
62 void Geometry::RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer )
64 DALI_ASSERT_DEBUG( NULL != vertexBuffer );
66 // Find the object and destroy it
67 size_t bufferCount(mVertexBuffers.Size());
68 for( size_t i(0); i<bufferCount; ++i )
70 if( vertexBuffer == mVertexBuffers[i] )
72 mVertexBuffers.Erase( mVertexBuffers.Begin()+i );
73 mConnectionObservers.ConnectionsChanged(*this);
77 mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
83 void Geometry::SetIndexBuffer( Render::PropertyBuffer* indexBuffer )
85 if( mIndexBuffer != indexBuffer )
87 mIndexBuffer = indexBuffer;
88 mConnectionObservers.ConnectionsChanged(*this);
92 mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, true );
97 void Geometry::ClearIndexBuffer()
101 if( mRenderGeometry )
103 mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer );
107 mConnectionObservers.ConnectionsChanged(*this);
110 void Geometry::SetGeometryType(Geometry::GeometryType geometryType )
112 mGeometryType = geometryType;
113 if( mRenderGeometry )
115 mSceneController->GetRenderMessageDispatcher().SetGeometryType( *mRenderGeometry, static_cast<int>(geometryType) );
119 void Geometry::SetRequiresDepthTest( bool requiresDepthTest )
121 mRequiresDepthTest = requiresDepthTest;
122 if( mRenderGeometry )
124 mSceneController->GetRenderMessageDispatcher().SetGeometryRequiresDepthTest( *mRenderGeometry, requiresDepthTest );
128 Vector<Render::PropertyBuffer*>& Geometry::GetVertexBuffers()
130 return mVertexBuffers;
133 Render::PropertyBuffer* Geometry::GetIndexBuffer()
138 Geometry::GeometryType Geometry::GetGeometryType( BufferIndex bufferIndex) const
140 return mGeometryType;
143 bool Geometry::GetRequiresDepthTesting( BufferIndex bufferIndex ) const
145 return mRequiresDepthTest;
148 void Geometry::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
152 void Geometry::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
156 void Geometry::AddConnectionObserver( ConnectionChangePropagator::Observer& observer )
158 mConnectionObservers.Add(observer);
161 void Geometry::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer )
163 mConnectionObservers.Remove(observer);
166 void Geometry::UniformMappingsChanged( const UniformMap& mappings )
168 // Our uniform map, or that of one of the watched children has changed.
169 // Inform connected observers.
170 mConnectionObservers.ConnectedUniformMapChanged();
173 RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController)
175 if(!mRenderGeometry )
177 //Create RenderGeometry
178 mSceneController = sceneController;
179 mRenderGeometry = new RenderGeometry( mGeometryType, mRequiresDepthTest );
181 size_t vertexBufferCount( mVertexBuffers.Size() );
182 for( size_t i(0); i<vertexBufferCount; ++i )
184 mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], false );
189 mRenderGeometry->AddPropertyBuffer( mIndexBuffer, true );
192 //Transfer ownership to RenderManager
193 sceneController->GetRenderMessageDispatcher().AddGeometry( *mRenderGeometry );
197 return mRenderGeometry;
200 void Geometry::OnRendererDisconnect()
203 if( mRendererRefCount == 0 )
205 //Delete the corresponding RenderGeometry via message to RenderManager
206 mSceneController->GetRenderMessageDispatcher().RemoveGeometry( *mRenderGeometry );
209 mSceneController = 0;
214 } // namespace SceneGraph
215 } // namespace Internal