2 * Copyright (c) 2014 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/modeling/material-impl.h>
22 #include <dali/public-api/common/constants.h>
23 #include <dali/internal/update/modeling/scene-graph-material.h>
24 #include <dali/internal/common/event-to-update.h>
25 #include <dali/internal/event/images/image-impl.h>
26 #include <dali/internal/event/common/stage-impl.h>
27 #include <dali/internal/event/common/thread-local-storage.h>
35 MaterialProperties::MaterialProperties()
36 : mOpacity (Dali::Material::DEFAULT_OPACITY),
37 mShininess (Dali::Material::DEFAULT_SHININESS),
38 mAmbientColor (Dali::Material::DEFAULT_AMBIENT_COLOR),
39 mDiffuseColor (Dali::Material::DEFAULT_DIFFUSE_COLOR),
40 mSpecularColor (Dali::Material::DEFAULT_SPECULAR_COLOR),
41 mEmissiveColor (Dali::Material::DEFAULT_EMISSIVE_COLOR),
42 mMapU (Dali::Material::DEFAULT_MAPPING_MODE),
43 mMapV (Dali::Material::DEFAULT_MAPPING_MODE),
44 mDiffuseUVIndex (Dali::Material::DEFAULT_DIFFUSE_UV_INDEX),
45 mOpacityUVIndex (Dali::Material::DEFAULT_OPACITY_UV_INDEX),
46 mNormalUVIndex (Dali::Material::DEFAULT_NORMAL_UV_INDEX),
47 mHasHeightMap (Dali::Material::DEFAULT_HAS_HEIGHT_MAP)
51 MaterialProperties::MaterialProperties(const MaterialProperties& rhs)
52 : mOpacity(rhs.mOpacity),
53 mShininess(rhs.mShininess),
54 mAmbientColor(rhs.mAmbientColor),
55 mDiffuseColor(rhs.mDiffuseColor),
56 mSpecularColor(rhs.mSpecularColor),
57 mEmissiveColor(rhs.mEmissiveColor),
60 mDiffuseUVIndex(rhs.mDiffuseUVIndex),
61 mOpacityUVIndex(rhs.mOpacityUVIndex),
62 mNormalUVIndex(rhs.mNormalUVIndex),
63 mHasHeightMap(rhs.mHasHeightMap)
67 MaterialProperties& MaterialProperties::operator=(const MaterialProperties& rhs)
69 mOpacity = rhs.mOpacity;
70 mShininess = rhs.mShininess;
71 mAmbientColor = rhs.mAmbientColor;
72 mDiffuseColor = rhs.mDiffuseColor;
73 mSpecularColor = rhs.mSpecularColor;
74 mEmissiveColor = rhs.mEmissiveColor;
77 mDiffuseUVIndex = rhs.mDiffuseUVIndex;
78 mOpacityUVIndex = rhs.mOpacityUVIndex;
79 mNormalUVIndex = rhs.mNormalUVIndex;
80 mHasHeightMap = rhs.mHasHeightMap;
86 Material* Material::New(const std::string& name)
88 return new Material(name);
91 Material::Material(const std::string& name)
101 Material::~Material()
104 Stage::IsInstalled()/*Guard to allow handle destruction after Core has been destroyed*/ )
106 RemoveMaterialMessage( *mUpdateManager, mSceneObject );
110 SceneGraph::Material* Material::CreateSceneObject()
112 DALI_ASSERT_DEBUG( mSceneObject == NULL );
114 if(mEventToUpdate == NULL)
116 EventToUpdate& eventToUpdate = ThreadLocalStorage::Get().GetEventToUpdate();
117 mEventToUpdate = &eventToUpdate;
120 if(mUpdateManager == NULL)
122 SceneGraph::UpdateManager& updateManager = ThreadLocalStorage::Get().GetUpdateManager();
123 mUpdateManager = &updateManager;
126 mSceneObject = SceneGraph::Material::New(this);
129 mSceneObject->SetDiffuseTextureId( GetImplementation(mDiffuseImage).GetResourceId() );
133 mSceneObject->SetOpacityTextureId( GetImplementation(mOpacityImage).GetResourceId() );
137 mSceneObject->SetNormalMapId( GetImplementation(mNormalMap).GetResourceId() );
139 AddMaterialMessage( *mUpdateManager, mSceneObject );
144 // Used for staging material
145 const SceneGraph::Material* Material::GetSceneObject()
147 if( mSceneObject == NULL )
149 mSceneObject = CreateSceneObject();
154 void Material::Connect()
156 if(mConnectionCount == 0)
158 if( mSceneObject == NULL )
160 mSceneObject = CreateSceneObject();
165 GetImplementation(mDiffuseImage).Connect();
166 SendDiffuseImageToSceneObject(mDiffuseImage);
170 GetImplementation(mOpacityImage).Connect();
171 SendOpacityImageToSceneObject(mOpacityImage);
175 GetImplementation(mNormalMap).Connect();
176 SendNormalMapToSceneObject(mNormalMap);
181 DALI_ASSERT_DEBUG(mSceneObject);
186 void Material::Disconnect()
188 if(mConnectionCount > 0)
190 DALI_ASSERT_DEBUG(mSceneObject);
194 if(mConnectionCount <= 0)
198 GetImplementation(mDiffuseImage).Disconnect();
202 GetImplementation(mOpacityImage).Disconnect();
206 GetImplementation(mNormalMap).Disconnect();
211 void Material::SendPropertiesToSceneObject()
213 if( mSceneObject != NULL )
215 DALI_ASSERT_DEBUG( mEventToUpdate != NULL );
216 if( mEventToUpdate != NULL )
218 SetPropertiesMessage( *mEventToUpdate, *mSceneObject, mProperties );
223 void Material::SendDiffuseImageToSceneObject(Dali::Image image)
225 if( image && mSceneObject != NULL && mEventToUpdate != NULL )
227 ResourceId id = GetImplementation(image).GetResourceId();
228 SetDiffuseTextureMessage( *mEventToUpdate, *mSceneObject, id );
232 void Material::SendOpacityImageToSceneObject(Dali::Image image)
234 if( image && mSceneObject != NULL && mEventToUpdate != NULL )
236 ResourceId id = GetImplementation(image).GetResourceId();
237 SetOpacityTextureMessage( *mEventToUpdate, *mSceneObject, id );
241 void Material::SendNormalMapToSceneObject(Dali::Image image)
243 if( image && mSceneObject != NULL && mEventToUpdate != NULL )
245 ResourceId id = GetImplementation(image).GetResourceId();
246 SetNormalMapMessage( *mEventToUpdate, *mSceneObject, id );
250 void Material::SetOpacity(const float opacity)
252 mProperties.mOpacity = opacity;
253 SendPropertiesToSceneObject();
256 float Material::GetOpacity() const
258 return mProperties.mOpacity;
261 void Material::SetShininess(const float shininess)
263 mProperties.mShininess = shininess;
264 SendPropertiesToSceneObject();
267 float Material::GetShininess() const
269 return mProperties.mShininess;
272 void Material::SetAmbientColor(const Vector4& color)
274 mProperties.mAmbientColor = color;
275 SendPropertiesToSceneObject();
278 const Vector4& Material::GetAmbientColor() const
280 return mProperties.mAmbientColor;
283 void Material::SetDiffuseColor(const Vector4& color)
285 mProperties.mDiffuseColor = color;
286 SendPropertiesToSceneObject();
289 const Vector4& Material::GetDiffuseColor() const
291 return mProperties.mDiffuseColor;
294 void Material::SetSpecularColor(const Vector4& color)
296 mProperties.mSpecularColor = color;
297 SendPropertiesToSceneObject();
300 const Vector4& Material::GetSpecularColor() const
302 return mProperties.mSpecularColor;
305 void Material::SetEmissiveColor(const Vector4& color)
307 mProperties.mEmissiveColor = color;
308 SendPropertiesToSceneObject();
311 const Vector4& Material::GetEmissiveColor() const
313 return mProperties.mEmissiveColor;
316 void Material::SetDiffuseTexture(Dali::Image image)
318 if( mDiffuseImage == image )
323 if( mDiffuseImage && mConnectionCount > 0 )
325 GetImplementation(mDiffuseImage).Disconnect();
328 mDiffuseImage = image;
330 if( image && mConnectionCount > 0 )
332 GetImplementation(image).Connect();
335 /// @todo currently there is a bug in material rendering if image is not loaded at this point (Trac issue #475)
336 SendDiffuseImageToSceneObject(image);
339 void Material::SetDiffuseTextureFileName(const std::string filename)
341 mDiffuseName = filename;
344 Dali::Image Material::GetDiffuseTexture() const
346 return mDiffuseImage;
349 const std::string& Material::GetDiffuseTextureFileName() const
354 void Material::SetOpacityTexture(Dali::Image image)
356 if (mOpacityImage == image)
361 if (mOpacityImage && mConnectionCount > 0)
363 GetImplementation(mOpacityImage).Disconnect();
366 mOpacityImage = image;
368 if (image && mConnectionCount > 0)
370 GetImplementation(image).Connect();
373 /// @todo currently there is a bug in material rendering if image is not loaded at this point (Trac issue #475)
374 SendOpacityImageToSceneObject(image);
377 void Material::SetOpacityTextureFileName(const std::string filename)
379 mOpacityName = filename;
382 Dali::Image Material::GetOpacityTexture() const
384 return mOpacityImage;
387 const std::string& Material::GetOpacityTextureFileName() const
392 void Material::SetNormalMap(Dali::Image image)
394 if (mNormalMap == image)
399 if (mNormalMap && mConnectionCount > 0)
401 GetImplementation(mNormalMap).Disconnect();
406 if (image && mConnectionCount > 0)
408 GetImplementation(image).Connect();
411 /// @todo currently there is a bug in material rendering if image is not loaded at this point (Trac issue #475)
412 SendNormalMapToSceneObject(image);
415 void Material::SetNormalMapFileName(const std::string filename)
417 mNormalMapName = filename;
420 Dali::Image Material::GetNormalMap() const
425 const std::string& Material::GetNormalMapFileName() const
427 return mNormalMapName;
430 void Material::SetMapU(const unsigned int map)
432 mProperties.mMapU = map;
433 SendPropertiesToSceneObject();
436 unsigned int Material::GetMapU() const
438 return mProperties.mMapU;
441 void Material::SetMapV(const unsigned int map)
443 mProperties.mMapV = map;
444 SendPropertiesToSceneObject();
447 unsigned int Material::GetMapV() const
449 return mProperties.mMapV;
452 void Material::SetDiffuseUVIndex(const int index)
454 mProperties.mDiffuseUVIndex = index;
455 SendPropertiesToSceneObject();
458 unsigned int Material::GetDiffuseUVIndex() const
460 return mProperties.mDiffuseUVIndex;
463 void Material::SetOpacityUVIndex(const int index)
465 mProperties.mOpacityUVIndex = index;
466 SendPropertiesToSceneObject();
469 unsigned int Material::GetOpacityUVIndex() const
471 return mProperties.mOpacityUVIndex;
474 void Material::SetNormalUVIndex(const int index)
476 mProperties.mNormalUVIndex = index;
477 SendPropertiesToSceneObject();
480 unsigned int Material::GetNormalUVIndex() const
482 return mProperties.mNormalUVIndex;
485 void Material::SetHasHeightMap(const bool flag)
487 mProperties.mHasHeightMap = true;
488 SendPropertiesToSceneObject();
491 bool Material::GetHasHeightMap() const
493 return mProperties.mHasHeightMap;
498 } // namespace Internal