Fixed Material::RemoveSampler not calling SceneGraph::RemoveSamplerMessage to match... 41/48041/4
authorChu Hoang <c.hoang@samsung.com>
Fri, 11 Sep 2015 10:40:26 +0000 (11:40 +0100)
committerChu Hoang <c.hoang@samsung.com>
Fri, 11 Sep 2015 13:17:46 +0000 (14:17 +0100)
Change-Id: I2614bcb803d587a8e76486f00b9f2ac49fbb9695

dali/internal/event/rendering/material-impl.cpp
dali/internal/event/rendering/sampler-impl.cpp
dali/internal/event/rendering/sampler-impl.h
dali/internal/event/rendering/shader-impl.cpp
dali/internal/event/rendering/shader-impl.h
dali/internal/update/rendering/scene-graph-material.h

index c02df3df91a5b0fb0cf2cc9444e686dd4cce05c2..b243f8df309418ad1962bf0609c2bfb116b464dc 100644 (file)
@@ -74,7 +74,7 @@ void Material::SetShader( Shader& shader )
   DALI_ASSERT_DEBUG( mSceneObject )
   mShader = &shader;
 
-  const SceneGraph::Shader& sceneGraphShader = dynamic_cast<const SceneGraph::Shader&>( *shader.GetSceneObject() );
+  SceneGraph::Shader& sceneGraphShader = *shader.GetShaderSceneObject();
   SceneGraph::SetShaderMessage( GetEventThreadServices(), *mSceneObject, sceneGraphShader );
 }
 
@@ -89,7 +89,7 @@ void Material::AddSampler( Sampler& sampler )
   connector.Set( sampler, OnStage() );
   mSamplerConnectors.push_back( connector );
 
-  const SceneGraph::Sampler& sceneGraphSampler = dynamic_cast<const SceneGraph::Sampler&>( *sampler.GetSceneObject() );
+  SceneGraph::Sampler& sceneGraphSampler = *sampler.GetSamplerSceneObject();
   SceneGraph::AddSamplerMessage( GetEventThreadServices(), *mSceneObject, sceneGraphSampler );
 }
 
@@ -100,7 +100,13 @@ std::size_t Material::GetNumberOfSamplers() const
 
 void Material::RemoveSampler( std::size_t index )
 {
-  mSamplerConnectors.erase( mSamplerConnectors.begin() + index );
+  if( index < mSamplerConnectors.size() )
+  {
+    SamplerConnectorContainer::iterator iter = mSamplerConnectors.begin() + index;
+    SceneGraph::Sampler& sceneGraphSampler = *iter->Get()->GetSamplerSceneObject();
+    SceneGraph::RemoveSamplerMessage( GetEventThreadServices(), *mSceneObject, sceneGraphSampler );
+    mSamplerConnectors.erase( iter );
+  }
 }
 
 Sampler* Material::GetSamplerAt( unsigned int index ) const
index 17871790de8f55a16732617cae4464a985dd2b6d..4d58bd2025d1f42bf7b5038931dfac2ca308e69f 100644 (file)
@@ -118,6 +118,11 @@ const SceneGraph::Sampler* Sampler::GetSamplerSceneObject() const
   return mSceneObject;
 }
 
+SceneGraph::Sampler* Sampler::GetSamplerSceneObject()
+{
+  return mSceneObject;
+}
+
 unsigned int Sampler::GetDefaultPropertyCount() const
 {
   return SAMPLER_IMPL.GetDefaultPropertyCount();
index 340f14027bc37a870c0226ebcdcfb11c1b7b5227..e8daba07b0c762fe32c4b17b05fd37e230b40145 100644 (file)
@@ -90,6 +90,12 @@ public:
    */
   const SceneGraph::Sampler* GetSamplerSceneObject() const;
 
+  /**
+   * Retrieve the scene-graph sampler added by this object.
+   * @return A pointer to the sampler, or NULL if no sampler has been added to the scene-graph.
+   */
+  SceneGraph::Sampler* GetSamplerSceneObject();
+
 public: // Default property extensions from Object
 
   /**
index ecf64cb70e84c35d192ee2c04d02aaf879499782..1a075c248e741be27cdfa74fafdaa22cddd4dd60 100644 (file)
@@ -72,6 +72,11 @@ const SceneGraph::Shader* Shader::GetShaderSceneObject() const
   return mSceneObject;
 }
 
+SceneGraph::Shader* Shader::GetShaderSceneObject()
+{
+  return mSceneObject;
+}
+
 unsigned int Shader::GetDefaultPropertyCount() const
 {
   return SHADER_IMPL.GetDefaultPropertyCount();
index a1b25cf666f98b08c64cbb859cc3f18a1c5f330b..85da4bd5c17aa23ec11fb98ec6274abc3d5be74f 100644 (file)
@@ -60,6 +60,12 @@ public:
    */
   const SceneGraph::Shader* GetShaderSceneObject() const;
 
+  /**
+   * Retrieve the scene-graph shader added by this object.
+   * @return A pointer to the shader, or NULL if no shader has been added to the scene-graph.
+   */
+  SceneGraph::Shader* GetShaderSceneObject();
+
 public: // Default property extensions from Object
 
   /**
index d6b16e3766fd4f0bdd5b5967ba46812fc5031625..8d78a03944a616048a957dab653ec4bf5e77f889 100644 (file)
@@ -217,7 +217,7 @@ private:
   BlendPolicy mBlendPolicy; ///< The blend policy as determined by PrepareRender
 };
 
-inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Material& material, const Shader& shader )
+inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Material& material, Shader& shader )
 {
   typedef MessageValue1< Material, Shader* > LocalType;
 
@@ -225,10 +225,10 @@ inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Ma
   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
 
   // Construct message in the message queue memory; note that delete should not be called on the return value
-  new (slot) LocalType( &material, &Material::SetShader, const_cast<Shader*>(&shader) );
+  new (slot) LocalType( &material, &Material::SetShader, &shader );
 }
 
-inline void AddSamplerMessage( EventThreadServices& eventThreadServices, const Material& material, const Sampler& sampler )
+inline void AddSamplerMessage( EventThreadServices& eventThreadServices, const Material& material, Sampler& sampler )
 {
   typedef MessageValue1< Material, Sampler* > LocalType;
 
@@ -236,7 +236,7 @@ inline void AddSamplerMessage( EventThreadServices& eventThreadServices, const M
   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
 
   // Construct message in the message queue memory; note that delete should not be called on the return value
-  new (slot) LocalType( &material, &Material::AddSampler, const_cast<Sampler*>(&sampler) );
+  new (slot) LocalType( &material, &Material::AddSampler, &sampler );
 }
 
 inline void RemoveSamplerMessage( EventThreadServices& eventThreadServices, const Material& material, Sampler& sampler )
@@ -247,7 +247,7 @@ inline void RemoveSamplerMessage( EventThreadServices& eventThreadServices, cons
   unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) );
 
   // Construct message in the message queue memory; note that delete should not be called on the return value
-  new (slot) LocalType( &material, &Material::RemoveSampler, const_cast<Sampler*>(&sampler) );
+  new (slot) LocalType( &material, &Material::RemoveSampler, &sampler );
 }
 
 inline void SetBlendingOptionsMessage( EventThreadServices& eventThreadServices, const Material& material, unsigned int options )