c0ee2ca1cc1b6baa917545f9ee0847f2c3cc5275
[platform/core/uifw/dali-core.git] / dali / internal / update / effects / scene-graph-material.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-material.h"
19
20 // INTERNAL HEADERS
21 #include <dali/public-api/shader-effects/material.h>
22 #include <dali/internal/render/data-providers/sampler-data-provider.h>
23 #include <dali/internal/update/effects/scene-graph-sampler.h>
24
25 namespace Dali
26 {
27 namespace Internal
28 {
29 namespace SceneGraph
30 {
31
32 Material::Material()
33 : mColor( Color::WHITE ),
34   mBlendColor( Color::WHITE ),
35   mFaceCullingMode(Dali::Material::NONE),
36   mShader(NULL)
37 {
38   // Observe own property-owner's uniform map
39   AddUniformMapObserver( *this );
40 }
41
42 Material::~Material()
43 {
44 }
45
46 void Material::SetShader( const Shader* shader )
47 {
48   mShader = shader;
49   // Inform NewRenderer about this shader: (Will force a re-load of the
50   // shader from the data providers)
51   mConnectionObservers.ConnectionsChanged(*this);
52 }
53
54 Shader* Material::GetShader() const
55 {
56   // @todo - Fix this - move shader setup to the Renderer connect to stage...
57   return const_cast<Shader*>(mShader);
58 }
59
60 void Material::AddSampler( const Sampler* sampler )
61 {
62   const SamplerDataProvider* sdp = static_cast< const SamplerDataProvider*>( sampler );
63   mSamplers.PushBack( sdp );
64
65   Sampler* mutableSampler = const_cast<Sampler*>(sampler);
66   mutableSampler->AddConnectionObserver( *this );
67   mutableSampler->AddUniformMapObserver( *this );
68
69   mConnectionObservers.ConnectionsChanged(*this);
70 }
71
72 void Material::RemoveSampler( const Sampler* sampler )
73 {
74   const SamplerDataProvider* samplerDataProvider = sampler;
75   bool found = false;
76
77   RenderDataProvider::Samplers::Iterator iter = mSamplers.Begin();
78   for( ; iter != mSamplers.End(); ++iter )
79   {
80     if( *iter == samplerDataProvider )
81     {
82       found = true;
83       break;
84     }
85   }
86
87   if( found )
88   {
89     Sampler* mutableSampler = const_cast<Sampler*>(sampler);
90     mutableSampler->RemoveConnectionObserver( *this );
91     mutableSampler->RemoveUniformMapObserver( *this );
92     mSamplers.Erase(iter);
93     mConnectionObservers.ConnectionsChanged(*this);
94   }
95   else
96   {
97     DALI_ASSERT_DEBUG( 0 && "Sampler not found" );
98   }
99 }
100
101 const RenderDataProvider::Samplers& Material::GetSamplers() const
102 {
103   return mSamplers;
104 }
105
106 void Material::ConnectToSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
107 {
108 }
109
110 void Material::DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex )
111 {
112 }
113
114 void Material::AddConnectionObserver( ConnectionObservers::Observer& observer )
115 {
116   mConnectionObservers.Add(observer);
117 }
118
119 void Material::RemoveConnectionObserver( ConnectionObservers::Observer& observer )
120 {
121   mConnectionObservers.Remove(observer);
122 }
123
124 void Material::UniformMappingsChanged( const UniformMap& mappings )
125 {
126   // Our uniform map, or that of one of the watched children has changed.
127   // Inform connected observers.
128   mConnectionObservers.ConnectedUniformMapChanged();
129 }
130
131 void Material::ConnectionsChanged( PropertyOwner& owner )
132 {
133   mConnectionObservers.ConnectionsChanged(*this);
134 }
135
136 void Material::ConnectedUniformMapChanged( )
137 {
138   mConnectionObservers.ConnectedUniformMapChanged();
139 }
140
141 void Material::ResetDefaultProperties( BufferIndex updateBufferIndex )
142 {
143   mColor.ResetToBaseValue( updateBufferIndex );
144   mBlendColor.ResetToBaseValue( updateBufferIndex );
145   mFaceCullingMode.CopyPrevious( updateBufferIndex );
146 }
147
148 } // namespace SceneGraph
149 } // namespace Internal
150 } // namespace Dali