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/sampler-impl.h> // Dali::Internal::Sampler
22 #include <dali/public-api/object/type-registry.h>
23 #include <dali/devel-api/rendering/sampler.h> // Dali::Internal::Sampler
24 #include <dali/internal/event/common/object-impl-helper.h> // Dali::Internal::ObjectHelper
25 #include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
26 #include <dali/internal/update/rendering/scene-graph-sampler.h> // Dali::Internal::SceneGraph::Sampler
27 #include <dali/internal/update/manager/update-manager.h>
38 * |name |type |writable|animatable|constraint-input|enum for index-checking|
40 DALI_PROPERTY_TABLE_BEGIN
41 DALI_PROPERTY( "minification-filter", INTEGER, true, false, true, Dali::Sampler::Property::MINIFICATION_FILTER )
42 DALI_PROPERTY( "magnification-filter", INTEGER, true, false, true, Dali::Sampler::Property::MAGNIGICATION_FILTER )
43 DALI_PROPERTY( "u-wrap", INTEGER, true, false, true, Dali::Sampler::Property::U_WRAP )
44 DALI_PROPERTY( "v-wrap", INTEGER, true, false, true, Dali::Sampler::Property::V_WRAP )
45 DALI_PROPERTY( "affects-transparency", BOOLEAN, true, false, true, Dali::Sampler::Property::AFFECTS_TRANSPARENCY )
46 DALI_PROPERTY_TABLE_END( DEFAULT_ACTOR_PROPERTY_START_INDEX )
48 const ObjectImplHelper<DEFAULT_PROPERTY_COUNT> SAMPLER_IMPL = { DEFAULT_PROPERTY_DETAILS };
52 return Dali::BaseHandle();
55 TypeRegistration mType( typeid( Dali::Sampler ), typeid( Dali::Handle ), Create );
57 } // unnamed namespace
59 SamplerPtr Sampler::New( const std::string& textureUnitUniformName )
61 SamplerPtr sampler( new Sampler() );
62 sampler->Initialize( textureUnitUniformName );
66 void Sampler::SetTextureUnitUniformName( const std::string& name )
68 SetTextureUnitUniformNameMessage( GetEventThreadServices(), *mSceneObject, name);
71 const std::string& Sampler::GetTextureUnitUniformName() const
73 return mSceneObject->GetTextureUnitUniformName();
76 void Sampler::SetImage( ImagePtr& image )
78 // Keep a reference to the image object
79 mImageConnector.Set( image, OnStage() );
81 // sceneObject is being used in a separate thread; queue a message to set
84 unsigned int resourceId = image->GetResourceId();
87 SetTextureMessage( GetEventThreadServices(), *mSceneObject, resourceId );
92 ImagePtr Sampler::GetImage() const
94 return mImageConnector.Get();
97 void Sampler::SetFilterMode( Dali::Sampler::FilterMode minFilter, Dali::Sampler::FilterMode magFilter )
99 if( NULL != mSceneObject )
101 SetFilterModeMessage( GetEventThreadServices(), *mSceneObject, minFilter, magFilter );
105 void Sampler::SetWrapMode( Dali::Sampler::WrapMode uWrap, Dali::Sampler::WrapMode vWrap )
107 if( NULL != mSceneObject )
109 SetWrapModeMessage( GetEventThreadServices(), *mSceneObject, uWrap, vWrap );
113 void Sampler::SetAffectsTransparency( bool affectsTransparency )
115 if( NULL != mSceneObject )
117 SceneGraph::DoubleBufferedPropertyMessage<bool>::Send( GetEventThreadServices(), mSceneObject, &mSceneObject->mAffectsTransparency, &SceneGraph::DoubleBufferedProperty<bool>::Set, affectsTransparency );
121 const SceneGraph::Sampler* Sampler::GetSamplerSceneObject() const
126 SceneGraph::Sampler* Sampler::GetSamplerSceneObject()
131 unsigned int Sampler::GetDefaultPropertyCount() const
133 return SAMPLER_IMPL.GetDefaultPropertyCount();
136 void Sampler::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
138 SAMPLER_IMPL.GetDefaultPropertyIndices( indices );
141 const char* Sampler::GetDefaultPropertyName(Property::Index index) const
143 return SAMPLER_IMPL.GetDefaultPropertyName( index );
146 Property::Index Sampler::GetDefaultPropertyIndex( const std::string& name ) const
148 return SAMPLER_IMPL.GetDefaultPropertyIndex( name );
151 bool Sampler::IsDefaultPropertyWritable( Property::Index index ) const
153 return SAMPLER_IMPL.IsDefaultPropertyWritable( index );
156 bool Sampler::IsDefaultPropertyAnimatable( Property::Index index ) const
158 return SAMPLER_IMPL.IsDefaultPropertyAnimatable( index );
161 bool Sampler::IsDefaultPropertyAConstraintInput( Property::Index index ) const
163 return SAMPLER_IMPL.IsDefaultPropertyAConstraintInput( index );
166 Property::Type Sampler::GetDefaultPropertyType( Property::Index index ) const
168 return SAMPLER_IMPL.GetDefaultPropertyType( index );
171 void Sampler::SetDefaultProperty( Property::Index index,
172 const Property::Value& propertyValue )
176 case Dali::Sampler::Property::MINIFICATION_FILTER:
178 SceneGraph::DoubleBufferedPropertyMessage<int>::Send( GetEventThreadServices(), mSceneObject, &mSceneObject->mMinFilter, &SceneGraph::DoubleBufferedProperty<int>::Set, propertyValue.Get<int>() );
181 case Dali::Sampler::Property::MAGNIGICATION_FILTER:
183 SceneGraph::DoubleBufferedPropertyMessage<int>::Send( GetEventThreadServices(), mSceneObject, &mSceneObject->mMagFilter, &SceneGraph::DoubleBufferedProperty<int>::Set, propertyValue.Get<int>() );
186 case Dali::Sampler::Property::U_WRAP:
188 SceneGraph::DoubleBufferedPropertyMessage<int>::Send( GetEventThreadServices(), mSceneObject, &mSceneObject->mUWrapMode, &SceneGraph::DoubleBufferedProperty<int>::Set, propertyValue.Get<int>() );
191 case Dali::Sampler::Property::V_WRAP:
193 SceneGraph::DoubleBufferedPropertyMessage<int>::Send( GetEventThreadServices(), mSceneObject, &mSceneObject->mVWrapMode, &SceneGraph::DoubleBufferedProperty<int>::Set, propertyValue.Get<int>() );
196 case Dali::Sampler::Property::AFFECTS_TRANSPARENCY:
198 SceneGraph::DoubleBufferedPropertyMessage<bool>::Send( GetEventThreadServices(), mSceneObject, &mSceneObject->mAffectsTransparency, &SceneGraph::DoubleBufferedProperty<bool>::Set, propertyValue.Get<bool>() );
204 void Sampler::SetSceneGraphProperty( Property::Index index,
205 const PropertyMetadata& entry,
206 const Property::Value& value )
208 SAMPLER_IMPL.SetSceneGraphProperty( GetEventThreadServices(), this, index, entry, value );
209 OnPropertySet(index, value);
212 Property::Value Sampler::GetDefaultProperty( Property::Index index ) const
214 BufferIndex bufferIndex = GetEventThreadServices().GetEventBufferIndex();
215 Property::Value value;
219 case Dali::Sampler::Property::MINIFICATION_FILTER:
221 value = mSceneObject->mMinFilter[bufferIndex];
224 case Dali::Sampler::Property::MAGNIGICATION_FILTER:
226 value = mSceneObject->mMagFilter[bufferIndex];
229 case Dali::Sampler::Property::U_WRAP:
231 value = mSceneObject->mUWrapMode[bufferIndex];
234 case Dali::Sampler::Property::V_WRAP:
236 value = mSceneObject->mVWrapMode[bufferIndex];
239 case Dali::Sampler::Property::AFFECTS_TRANSPARENCY:
241 value = mSceneObject->mAffectsTransparency[bufferIndex];
248 const SceneGraph::PropertyOwner* Sampler::GetPropertyOwner() const
253 const SceneGraph::PropertyOwner* Sampler::GetSceneObject() const
258 const SceneGraph::PropertyBase* Sampler::GetSceneObjectAnimatableProperty( Property::Index index ) const
260 DALI_ASSERT_ALWAYS( IsPropertyAnimatable( index ) && "Property is not animatable" );
262 const SceneGraph::PropertyBase* property = NULL;
266 property = SAMPLER_IMPL.GetRegisteredSceneGraphProperty( this,
267 &Sampler::FindAnimatableProperty,
268 &Sampler::FindCustomProperty,
271 if( property == NULL && index < DEFAULT_PROPERTY_MAX_COUNT )
273 // No animatable default props
274 DALI_ASSERT_ALWAYS( 0 && "Property is not animatable" );
281 const PropertyInputImpl* Sampler::GetSceneObjectInputProperty( Property::Index index ) const
283 const PropertyInputImpl* property = NULL;
287 const SceneGraph::PropertyBase* baseProperty =
288 SAMPLER_IMPL.GetRegisteredSceneGraphProperty( this,
289 &Sampler::FindAnimatableProperty,
290 &Sampler::FindCustomProperty,
292 property = static_cast<const PropertyInputImpl*>( baseProperty );
294 if( property == NULL && index < DEFAULT_PROPERTY_MAX_COUNT )
298 case Dali::Sampler::Property::MINIFICATION_FILTER:
300 property = &mSceneObject->mMinFilter;
303 case Dali::Sampler::Property::MAGNIGICATION_FILTER:
305 property = &mSceneObject->mMagFilter;
308 case Dali::Sampler::Property::U_WRAP:
310 property = &mSceneObject->mUWrapMode;
313 case Dali::Sampler::Property::V_WRAP:
315 property = &mSceneObject->mVWrapMode;
318 case Dali::Sampler::Property::AFFECTS_TRANSPARENCY:
320 property = &mSceneObject->mAffectsTransparency;
330 int Sampler::GetPropertyComponentIndex( Property::Index index ) const
332 return Property::INVALID_COMPONENT_INDEX;
335 bool Sampler::OnStage() const
340 void Sampler::Connect()
344 mImageConnector.OnStageConnect();
346 // sceneObject is being used in a separate thread; queue a message to set
347 unsigned int resourceId = mImageConnector.Get()->GetResourceId();
348 SetTextureMessage( GetEventThreadServices(), *mSceneObject, resourceId );
351 void Sampler::Disconnect()
355 mImageConnector.OnStageDisconnect();
359 : mSceneObject( NULL ),
364 void Sampler::Initialize( const std::string& textureUnitUniformName )
366 EventThreadServices& eventThreadServices = GetEventThreadServices();
367 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
369 mSceneObject = new SceneGraph::Sampler( textureUnitUniformName );
370 AddMessage( updateManager, updateManager.GetSamplerOwner(), *mSceneObject );
372 eventThreadServices.RegisterObject( this );
377 if( EventThreadServices::IsCoreRunning() )
379 EventThreadServices& eventThreadServices = GetEventThreadServices();
380 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
381 RemoveMessage( updateManager, updateManager.GetSamplerOwner(), *mSceneObject );
383 eventThreadServices.UnregisterObject( this );
387 } // namespace Internal