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.
19 #include <dali/internal/event/rendering/material-impl.h> // Dali::Internal::Material
25 #include <dali/public-api/object/type-registry.h>
26 #include <dali/devel-api/rendering/material.h> // Dali::Internal::Material
27 #include <dali/internal/event/common/object-impl-helper.h> // Dali::Internal::ObjectHelper
28 #include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
29 #include <dali/internal/update/manager/update-manager.h>
30 #include <dali/internal/update/rendering/scene-graph-material.h>
40 const ObjectImplHelper<0> MATERIAL_IMPL = { NULL };
44 return Dali::BaseHandle();
47 TypeRegistration mType( typeid( Dali::Material ), typeid( Dali::Handle ), Create );
49 } // unnamed namespace
51 MaterialPtr Material::New()
53 MaterialPtr material( new Material() );
54 material->Initialize();
58 void Material::SetShader( Shader& shader )
60 DALI_ASSERT_DEBUG( mSceneObject )
63 SceneGraph::Shader& sceneGraphShader = *shader.GetShaderSceneObject();
64 SceneGraph::SetShaderMessage( GetEventThreadServices(), *mSceneObject, sceneGraphShader );
67 Shader* Material::GetShader() const
72 size_t Material::AddTexture( ImagePtr image, const std::string& uniformName, SamplerPtr sampler )
74 size_t index = mTextures.size();
75 mTextures.push_back( Texture( uniformName, image, sampler ) );
77 Render::Sampler* renderSampler(0);
80 renderSampler = sampler->GetSamplerRenderObject();
88 SceneGraph::AddTextureMessage( GetEventThreadServices(), *mSceneObject, uniformName, image->GetResourceId(), renderSampler );
92 void Material::RemoveTexture( size_t index )
94 if( index < GetNumberOfTextures() )
96 mTextures.erase( mTextures.begin() + index );
97 SceneGraph::RemoveTextureMessage( GetEventThreadServices(), *mSceneObject, index );
101 void Material::SetTextureImage( size_t index, Image* image )
103 if( index < GetNumberOfTextures() )
105 if( mTextures[index].mImage && mOnStage )
107 mTextures[index].mImage->Disconnect();
115 mTextures[index].mImage.Reset(image);
116 SceneGraph::SetTextureImageMessage( GetEventThreadServices(), *mSceneObject, index, mTextures[index].mImage.Get()->GetResourceId() );
120 void Material::SetTextureSampler( size_t index, Sampler* sampler )
122 if( index < GetNumberOfTextures() )
124 mTextures[index].mSampler.Reset(sampler);
126 Render::Sampler* renderSampler(0);
129 renderSampler = sampler->GetSamplerRenderObject();
131 SceneGraph::SetTextureSamplerMessage( GetEventThreadServices(), *mSceneObject, index, renderSampler );
135 Sampler* Material::GetTextureSampler( size_t index ) const
137 if( index < GetNumberOfTextures() )
139 return mTextures[index].mSampler.Get();
145 void Material::SetTextureUniformName( size_t index, const std::string& uniformName )
147 if( index < GetNumberOfTextures() )
149 mTextures[index].mUniformName = uniformName;
150 SceneGraph::SetTextureUniformNameMessage( GetEventThreadServices(), *mSceneObject, index, uniformName );
154 int Material::GetTextureIndex( const std::string& uniformName ) const
156 size_t textureCount(GetNumberOfTextures());
157 for( size_t i(0); i<textureCount; ++i )
159 if( uniformName.compare( mTextures[i].mUniformName ) == 0 )
168 Image* Material::GetTexture( const std::string& uniformName ) const
170 int textureId = GetTextureIndex( uniformName );
171 if( textureId != -1 )
173 return GetTexture( textureId );
179 Image* Material::GetTexture( size_t index ) const
181 if( index < GetNumberOfTextures() )
183 return mTextures[ index ].mImage.Get();
189 size_t Material::GetNumberOfTextures() const
191 return mTextures.size();
194 const SceneGraph::Material* Material::GetMaterialSceneObject() const
199 unsigned int Material::GetDefaultPropertyCount() const
201 return MATERIAL_IMPL.GetDefaultPropertyCount();
204 void Material::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
206 MATERIAL_IMPL.GetDefaultPropertyIndices( indices );
209 const char* Material::GetDefaultPropertyName(Property::Index index) const
211 return MATERIAL_IMPL.GetDefaultPropertyName( index );
214 Property::Index Material::GetDefaultPropertyIndex( const std::string& name ) const
216 return MATERIAL_IMPL.GetDefaultPropertyIndex( name );
219 bool Material::IsDefaultPropertyWritable( Property::Index index ) const
221 return MATERIAL_IMPL.IsDefaultPropertyWritable( index );
224 bool Material::IsDefaultPropertyAnimatable( Property::Index index ) const
226 return MATERIAL_IMPL.IsDefaultPropertyAnimatable( index );
229 bool Material::IsDefaultPropertyAConstraintInput( Property::Index index ) const
231 return MATERIAL_IMPL.IsDefaultPropertyAConstraintInput( index );
234 Property::Type Material::GetDefaultPropertyType( Property::Index index ) const
236 return MATERIAL_IMPL.GetDefaultPropertyType( index );
239 void Material::SetDefaultProperty( Property::Index index,
240 const Property::Value& propertyValue )
244 void Material::SetSceneGraphProperty( Property::Index index,
245 const PropertyMetadata& entry,
246 const Property::Value& value )
248 MATERIAL_IMPL.SetSceneGraphProperty( GetEventThreadServices(), this, index, entry, value );
249 OnPropertySet(index, value);
252 Property::Value Material::GetDefaultProperty( Property::Index index ) const
254 Property::Value value;
258 const SceneGraph::PropertyOwner* Material::GetPropertyOwner() const
263 const SceneGraph::PropertyOwner* Material::GetSceneObject() const
268 const SceneGraph::PropertyBase* Material::GetSceneObjectAnimatableProperty( Property::Index index ) const
270 PropertyMetadata* property = index >= PROPERTY_CUSTOM_START_INDEX ? static_cast<PropertyMetadata*>(FindCustomProperty( index )) : static_cast<PropertyMetadata*>(FindAnimatableProperty( index ));
271 DALI_ASSERT_ALWAYS( property && "Property index is invalid" );
272 return property->GetSceneGraphProperty();
275 const PropertyInputImpl* Material::GetSceneObjectInputProperty( Property::Index index ) const
277 return GetSceneObjectAnimatableProperty( index );
280 int Material::GetPropertyComponentIndex( Property::Index index ) const
282 return Property::INVALID_COMPONENT_INDEX;
285 bool Material::OnStage() const
290 void Material::Connect()
294 for( size_t i(0); i<mTextures.size(); ++i )
296 if( mTextures[i].mImage )
298 mTextures[i].mImage->Connect();
299 if( mTextures[i].mImage->GetResourceId() != 0 )
301 SceneGraph::SetTextureImageMessage( GetEventThreadServices(), *mSceneObject, i, mTextures[i].mImage->GetResourceId() );
307 void Material::Disconnect()
309 for( size_t i(0); i<mTextures.size(); ++i )
311 if( mTextures[i].mImage )
313 mTextures[i].mImage->Disconnect();
321 : mSceneObject( NULL ),
328 void Material::Initialize()
330 EventThreadServices& eventThreadServices = GetEventThreadServices();
331 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
333 mSceneObject = SceneGraph::Material::New();
334 AddMessage( updateManager, updateManager.GetMaterialOwner(), *mSceneObject );
336 eventThreadServices.RegisterObject( this );
339 Material::~Material()
341 if( EventThreadServices::IsCoreRunning() )
343 EventThreadServices& eventThreadServices = GetEventThreadServices();
344 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
345 RemoveMessage( updateManager, updateManager.GetMaterialOwner(), *mSceneObject );
347 eventThreadServices.UnregisterObject( this );
351 } // namespace Internal