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 : mIndexBuffer( NULL ),
37 mRendererRefCount(0u),
39 mGeometryType(Dali::Geometry::TRIANGLES),
40 mRequiresDepthTest(false)
43 // Observe our own PropertyOwner's uniform map
44 AddUniformMapObserver( *this );
49 mConnectionObservers.Destroy( *this );
52 void Geometry::AddVertexBuffer( Render::PropertyBuffer* vertexBuffer )
54 mVertexBuffers.PushBack( vertexBuffer );
55 mConnectionObservers.ConnectionsChanged(*this);
59 mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, vertexBuffer, false);
63 void Geometry::RemoveVertexBuffer( Render::PropertyBuffer* vertexBuffer )
65 DALI_ASSERT_DEBUG( NULL != vertexBuffer );
67 // Find the object and destroy it
68 size_t bufferCount(mVertexBuffers.Size());
69 for( size_t i(0); i<bufferCount; ++i )
71 if( vertexBuffer == mVertexBuffers[i] )
73 mVertexBuffers.Erase( mVertexBuffers.Begin()+i );
74 mConnectionObservers.ConnectionsChanged(*this);
78 mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, vertexBuffer );
84 void Geometry::SetIndexBuffer( Render::PropertyBuffer* indexBuffer )
86 if( mIndexBuffer != indexBuffer )
88 mIndexBuffer = indexBuffer;
89 mConnectionObservers.ConnectionsChanged(*this);
93 mSceneController->GetRenderMessageDispatcher().AddPropertyBuffer( *mRenderGeometry, indexBuffer, true );
98 void Geometry::ClearIndexBuffer()
102 if( mRenderGeometry )
104 mSceneController->GetRenderMessageDispatcher().RemovePropertyBuffer( *mRenderGeometry, mIndexBuffer );
108 mConnectionObservers.ConnectionsChanged(*this);
111 void Geometry::SetGeometryType( BufferIndex bufferIndex, Geometry::GeometryType geometryType )
113 mGeometryType.Set( bufferIndex, geometryType);
116 Vector<Render::PropertyBuffer*>& Geometry::GetVertexBuffers()
118 return mVertexBuffers;
121 Render::PropertyBuffer* Geometry::GetIndexBuffer()
126 Geometry::GeometryType Geometry::GetGeometryType( BufferIndex bufferIndex) const
128 int geometryType = mGeometryType[ bufferIndex ];
129 return static_cast< GeometryDataProvider::GeometryType > ( geometryType );
132 bool Geometry::GetRequiresDepthTesting( BufferIndex bufferIndex ) const
134 return mRequiresDepthTest.GetBoolean( bufferIndex );
137 void Geometry::ResetDefaultProperties( BufferIndex updateBufferIndex )
139 // Reset the animated properties
140 mCenter.ResetToBaseValue( updateBufferIndex );
142 // Age the double buffered properties
143 mGeometryType.CopyPrevious(updateBufferIndex);
144 mRequiresDepthTest.CopyPrevious(updateBufferIndex);
147 void Geometry::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
151 void Geometry::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
155 void Geometry::AddConnectionObserver( ConnectionChangePropagator::Observer& observer )
157 mConnectionObservers.Add(observer);
160 void Geometry::RemoveConnectionObserver( ConnectionChangePropagator::Observer& observer )
162 mConnectionObservers.Remove(observer);
165 void Geometry::UniformMappingsChanged( const UniformMap& mappings )
167 // Our uniform map, or that of one of the watched children has changed.
168 // Inform connected observers.
169 mConnectionObservers.ConnectedUniformMapChanged();
172 RenderGeometry* Geometry::GetRenderGeometry(SceneController* sceneController)
174 if(!mRenderGeometry )
176 //Create RenderGeometry
177 mSceneController = sceneController;
178 mRenderGeometry = new RenderGeometry( *this );
180 size_t vertexBufferCount( mVertexBuffers.Size() );
181 for( size_t i(0); i<vertexBufferCount; ++i )
183 mRenderGeometry->AddPropertyBuffer( mVertexBuffers[i], false );
188 mRenderGeometry->AddPropertyBuffer( mIndexBuffer, true );
191 //Transfer ownership to RenderManager
192 sceneController->GetRenderMessageDispatcher().AddGeometry( *mRenderGeometry );
196 return mRenderGeometry;
199 void Geometry::OnRendererDisconnect()
202 if( mRendererRefCount == 0 )
204 //Delete the corresponding RenderGeometry via message to RenderManager
205 mSceneController->GetRenderMessageDispatcher().RemoveGeometry( *mRenderGeometry );
208 mSceneController = 0;
213 } // namespace SceneGraph
214 } // namespace Internal