2 * Copyright (c) 2018 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/renderer-impl.h> // Dali::Internal::Renderer
22 #include <dali/devel-api/scripting/scripting.h>
23 #include <dali/devel-api/rendering/renderer-devel.h>
24 #include <dali/public-api/object/type-registry.h>
25 #include <dali/internal/event/common/object-impl-helper.h> // Dali::Internal::ObjectHelper
26 #include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
27 #include <dali/internal/event/common/property-input-impl.h>
28 #include <dali/internal/render/renderers/render-geometry.h>
29 #include <dali/internal/update/manager/update-manager.h>
30 #include <dali/internal/update/rendering/scene-graph-renderer.h>
41 * Properties: |name |type |writable|animatable|constraint-input|enum for index-checking|
43 DALI_PROPERTY_TABLE_BEGIN
44 DALI_PROPERTY( "depthIndex", INTEGER, true, false, false, Dali::Renderer::Property::DEPTH_INDEX )
45 DALI_PROPERTY( "faceCullingMode", INTEGER, true, false, false, Dali::Renderer::Property::FACE_CULLING_MODE )
46 DALI_PROPERTY( "blendMode", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_MODE )
47 DALI_PROPERTY( "blendEquationRgb", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_EQUATION_RGB )
48 DALI_PROPERTY( "blendEquationAlpha", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_EQUATION_ALPHA )
49 DALI_PROPERTY( "blendFactorSrcRgb", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_FACTOR_SRC_RGB )
50 DALI_PROPERTY( "blendFactorDestRgb", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_FACTOR_DEST_RGB )
51 DALI_PROPERTY( "blendFactorSrcAlpha", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_FACTOR_SRC_ALPHA )
52 DALI_PROPERTY( "blendFactorDestAlpha", INTEGER, true, false, false, Dali::Renderer::Property::BLEND_FACTOR_DEST_ALPHA )
53 DALI_PROPERTY( "blendColor", VECTOR4, true, false, false, Dali::Renderer::Property::BLEND_COLOR )
54 DALI_PROPERTY( "blendPreMultipliedAlpha", BOOLEAN, true, false, false, Dali::Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA )
55 DALI_PROPERTY( "indexRangeFirst", INTEGER, true, false, false, Dali::Renderer::Property::INDEX_RANGE_FIRST )
56 DALI_PROPERTY( "indexRangeCount", INTEGER, true, false, false, Dali::Renderer::Property::INDEX_RANGE_COUNT )
57 DALI_PROPERTY( "depthWriteMode", INTEGER, true, false, false, Dali::Renderer::Property::DEPTH_WRITE_MODE )
58 DALI_PROPERTY( "depthFunction", INTEGER, true, false, false, Dali::Renderer::Property::DEPTH_FUNCTION )
59 DALI_PROPERTY( "depthTestMode", INTEGER, true, false, false, Dali::Renderer::Property::DEPTH_TEST_MODE )
60 DALI_PROPERTY( "renderMode", INTEGER, true, false, false, Dali::Renderer::Property::RENDER_MODE )
61 DALI_PROPERTY( "stencilFunction", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_FUNCTION )
62 DALI_PROPERTY( "stencilFunctionMask", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_FUNCTION_MASK )
63 DALI_PROPERTY( "stencilFunctionReference", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_FUNCTION_REFERENCE )
64 DALI_PROPERTY( "stencilMask", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_MASK )
65 DALI_PROPERTY( "stencilOperationOnFail", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_OPERATION_ON_FAIL )
66 DALI_PROPERTY( "stencilOperationOnZFail", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL )
67 DALI_PROPERTY( "stencilOperationOnZPass", INTEGER, true, false, false, Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_PASS )
68 DALI_PROPERTY( "opacity", FLOAT, true, true, true, Dali::DevelRenderer::Property::OPACITY )
69 DALI_PROPERTY_TABLE_END( DEFAULT_RENDERER_PROPERTY_START_INDEX )
71 // Property string to enumeration tables:
73 DALI_ENUM_TO_STRING_TABLE_BEGIN( FACE_CULLING_MODE )
74 DALI_ENUM_TO_STRING_WITH_SCOPE( FaceCullingMode, NONE )
75 DALI_ENUM_TO_STRING_WITH_SCOPE( FaceCullingMode, FRONT )
76 DALI_ENUM_TO_STRING_WITH_SCOPE( FaceCullingMode, BACK )
77 DALI_ENUM_TO_STRING_WITH_SCOPE( FaceCullingMode, FRONT_AND_BACK )
78 DALI_ENUM_TO_STRING_TABLE_END( FACE_CULLING_MODE )
80 DALI_ENUM_TO_STRING_TABLE_BEGIN( BLEND_MODE )
81 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendMode, OFF )
82 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendMode, AUTO )
83 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendMode, ON )
84 DALI_ENUM_TO_STRING_TABLE_END( BLEND_MODE )
86 DALI_ENUM_TO_STRING_TABLE_BEGIN( BLEND_EQUATION )
87 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendEquation, ADD )
88 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendEquation, SUBTRACT )
89 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendEquation, REVERSE_SUBTRACT )
90 DALI_ENUM_TO_STRING_TABLE_END( BLEND_EQUATION )
92 DALI_ENUM_TO_STRING_TABLE_BEGIN( BLEND_FACTOR )
93 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ZERO )
94 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE )
95 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, SRC_COLOR )
96 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE_MINUS_SRC_COLOR )
97 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, SRC_ALPHA )
98 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE_MINUS_SRC_ALPHA )
99 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, DST_ALPHA )
100 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE_MINUS_DST_ALPHA )
101 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, DST_COLOR )
102 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE_MINUS_DST_COLOR )
103 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, SRC_ALPHA_SATURATE )
104 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, CONSTANT_COLOR )
105 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE_MINUS_CONSTANT_COLOR )
106 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, CONSTANT_ALPHA )
107 DALI_ENUM_TO_STRING_WITH_SCOPE( BlendFactor, ONE_MINUS_CONSTANT_ALPHA )
108 DALI_ENUM_TO_STRING_TABLE_END( BLEND_FACTOR )
110 DALI_ENUM_TO_STRING_TABLE_BEGIN( DEPTH_WRITE_MODE )
111 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthWriteMode, OFF )
112 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthWriteMode, AUTO )
113 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthWriteMode, ON )
114 DALI_ENUM_TO_STRING_TABLE_END( DEPTH_WRITE_MODE )
116 DALI_ENUM_TO_STRING_TABLE_BEGIN( DEPTH_TEST_MODE )
117 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthTestMode, OFF )
118 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthTestMode, AUTO )
119 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthTestMode, ON )
120 DALI_ENUM_TO_STRING_TABLE_END( DEPTH_TEST_MODE )
122 DALI_ENUM_TO_STRING_TABLE_BEGIN( DEPTH_FUNCTION )
123 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, NEVER )
124 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, ALWAYS )
125 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, LESS )
126 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, GREATER )
127 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, EQUAL )
128 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, NOT_EQUAL )
129 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, LESS_EQUAL )
130 DALI_ENUM_TO_STRING_WITH_SCOPE( DepthFunction, GREATER_EQUAL )
131 DALI_ENUM_TO_STRING_TABLE_END( DEPTH_FUNCTION )
133 DALI_ENUM_TO_STRING_TABLE_BEGIN( STENCIL_FUNCTION )
134 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, NEVER )
135 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, LESS )
136 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, EQUAL )
137 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, LESS_EQUAL )
138 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, GREATER )
139 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, NOT_EQUAL )
140 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, GREATER_EQUAL )
141 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilFunction, ALWAYS )
142 DALI_ENUM_TO_STRING_TABLE_END( STENCIL_FUNCTION )
144 DALI_ENUM_TO_STRING_TABLE_BEGIN( RENDER_MODE )
145 DALI_ENUM_TO_STRING_WITH_SCOPE( RenderMode, NONE )
146 DALI_ENUM_TO_STRING_WITH_SCOPE( RenderMode, AUTO )
147 DALI_ENUM_TO_STRING_WITH_SCOPE( RenderMode, COLOR )
148 DALI_ENUM_TO_STRING_WITH_SCOPE( RenderMode, STENCIL )
149 DALI_ENUM_TO_STRING_WITH_SCOPE( RenderMode, COLOR_STENCIL )
150 DALI_ENUM_TO_STRING_TABLE_END( RENDER_MODE )
152 DALI_ENUM_TO_STRING_TABLE_BEGIN( STENCIL_OPERATION )
153 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, ZERO )
154 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, KEEP )
155 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, REPLACE )
156 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, INCREMENT )
157 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, DECREMENT )
158 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, INVERT )
159 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, INCREMENT_WRAP )
160 DALI_ENUM_TO_STRING_WITH_SCOPE( StencilOperation, DECREMENT_WRAP )
161 DALI_ENUM_TO_STRING_TABLE_END( STENCIL_OPERATION )
163 const ObjectImplHelper<DEFAULT_PROPERTY_COUNT> RENDERER_IMPL = { DEFAULT_PROPERTY_DETAILS, DEFAULT_RENDERER_PROPERTY_START_INDEX };
167 return Dali::BaseHandle();
170 TypeRegistration mType( typeid( Dali::Renderer ), typeid( Dali::Handle ), Create );
172 } // unnamed namespace
174 RendererPtr Renderer::New()
176 RendererPtr rendererPtr( new Renderer() );
177 rendererPtr->Initialize();
181 void Renderer::SetGeometry( Geometry& geometry )
183 mGeometry = &geometry;
185 const Render::Geometry* geometrySceneObject = geometry.GetRenderObject();
186 SetGeometryMessage( GetEventThreadServices(), *mSceneObject, *geometrySceneObject );
189 Geometry* Renderer::GetGeometry() const
191 return mGeometry.Get();
194 void Renderer::SetTextures( TextureSet& textureSet )
196 mTextureSet = &textureSet;
197 const SceneGraph::TextureSet* textureSetSceneObject = textureSet.GetTextureSetSceneObject();
198 SetTexturesMessage( GetEventThreadServices(), *mSceneObject, *textureSetSceneObject );
201 TextureSet* Renderer::GetTextures() const
203 return mTextureSet.Get();
206 void Renderer::SetShader( Shader& shader )
209 SceneGraph::Shader& sceneGraphShader = *shader.GetShaderSceneObject();
210 SceneGraph::SetShaderMessage( GetEventThreadServices(), *mSceneObject, sceneGraphShader );
213 Shader* Renderer::GetShader() const
215 return mShader.Get();
218 void Renderer::SetDepthIndex( int depthIndex )
220 if ( mDepthIndex != depthIndex )
222 mDepthIndex = depthIndex;
223 SetDepthIndexMessage( GetEventThreadServices(), *mSceneObject, depthIndex );
227 int Renderer::GetDepthIndex() const
232 void Renderer::SetBlendMode( BlendMode::Type mode )
234 if( mBlendMode != mode )
238 SetBlendModeMessage( GetEventThreadServices(), *mSceneObject, mBlendMode );
242 BlendMode::Type Renderer::GetBlendMode() const
247 void Renderer::SetBlendFunc( BlendFactor::Type srcFactorRgba, BlendFactor::Type destFactorRgba )
249 mBlendingOptions.SetBlendFunc( srcFactorRgba, destFactorRgba, srcFactorRgba, destFactorRgba );
250 SetBlendingOptionsMessage( GetEventThreadServices(), *mSceneObject, mBlendingOptions.GetBitmask() );
253 void Renderer::SetBlendFunc( BlendFactor::Type srcFactorRgb,
254 BlendFactor::Type destFactorRgb,
255 BlendFactor::Type srcFactorAlpha,
256 BlendFactor::Type destFactorAlpha )
258 mBlendingOptions.SetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
259 SetBlendingOptionsMessage( GetEventThreadServices(), *mSceneObject, mBlendingOptions.GetBitmask() );
262 void Renderer::GetBlendFunc( BlendFactor::Type& srcFactorRgb,
263 BlendFactor::Type& destFactorRgb,
264 BlendFactor::Type& srcFactorAlpha,
265 BlendFactor::Type& destFactorAlpha ) const
267 srcFactorRgb = mBlendingOptions.GetBlendSrcFactorRgb();
268 destFactorRgb = mBlendingOptions.GetBlendDestFactorRgb();
269 srcFactorAlpha = mBlendingOptions.GetBlendSrcFactorAlpha();
270 destFactorAlpha = mBlendingOptions.GetBlendDestFactorAlpha();
273 void Renderer::SetBlendEquation( BlendEquation::Type equationRgba )
275 mBlendingOptions.SetBlendEquation( equationRgba, equationRgba );
276 SetBlendingOptionsMessage( GetEventThreadServices(), *mSceneObject, mBlendingOptions.GetBitmask() );
279 void Renderer::SetBlendEquation( BlendEquation::Type equationRgb,
280 BlendEquation::Type equationAlpha )
282 mBlendingOptions.SetBlendEquation( equationRgb, equationAlpha );
283 SetBlendingOptionsMessage( GetEventThreadServices(), *mSceneObject, mBlendingOptions.GetBitmask() );
286 void Renderer::GetBlendEquation( BlendEquation::Type& equationRgb,
287 BlendEquation::Type& equationAlpha ) const
289 // These are not animatable, the cached values are up-to-date.
290 equationRgb = mBlendingOptions.GetBlendEquationRgb();
291 equationAlpha = mBlendingOptions.GetBlendEquationAlpha();
294 void Renderer::SetIndexedDrawFirstElement( size_t firstElement )
296 if( firstElement != mIndexedDrawFirstElement )
298 mIndexedDrawFirstElement = firstElement;
299 SetIndexedDrawFirstElementMessage( GetEventThreadServices(), *mSceneObject, mIndexedDrawFirstElement );
303 void Renderer::SetIndexedDrawElementsCount( size_t elementsCount )
305 if( elementsCount != mIndexedDrawElementCount )
307 mIndexedDrawElementCount = elementsCount;
308 SetIndexedDrawElementsCountMessage( GetEventThreadServices(), *mSceneObject, mIndexedDrawElementCount );
313 void Renderer::EnablePreMultipliedAlpha( bool preMultipled )
315 if( mPremultipledAlphaEnabled != preMultipled )
319 SetBlendFunc( BlendFactor::ONE, BlendFactor::ONE_MINUS_SRC_ALPHA, BlendFactor::ONE, BlendFactor::ONE_MINUS_SRC_ALPHA );
323 SetBlendFunc( BlendFactor::SRC_ALPHA, BlendFactor::ONE_MINUS_SRC_ALPHA, BlendFactor::ONE, BlendFactor::ONE_MINUS_SRC_ALPHA );
325 mPremultipledAlphaEnabled = preMultipled;
326 SetEnablePreMultipliedAlphaMessage( GetEventThreadServices(), *mSceneObject, mPremultipledAlphaEnabled );
330 bool Renderer::IsPreMultipliedAlphaEnabled() const
332 return mPremultipledAlphaEnabled;
335 SceneGraph::Renderer* Renderer::GetRendererSceneObject()
340 unsigned int Renderer::GetDefaultPropertyCount() const
342 return RENDERER_IMPL.GetDefaultPropertyCount();
345 void Renderer::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
347 RENDERER_IMPL.GetDefaultPropertyIndices( indices );
350 const char* Renderer::GetDefaultPropertyName(Property::Index index) const
352 return RENDERER_IMPL.GetDefaultPropertyName( index );
355 Property::Index Renderer::GetDefaultPropertyIndex( const std::string& name ) const
357 return RENDERER_IMPL.GetDefaultPropertyIndex( name );
360 bool Renderer::IsDefaultPropertyWritable( Property::Index index ) const
362 return RENDERER_IMPL.IsDefaultPropertyWritable( index );
365 bool Renderer::IsDefaultPropertyAnimatable( Property::Index index ) const
367 return RENDERER_IMPL.IsDefaultPropertyAnimatable( index );
370 bool Renderer::IsDefaultPropertyAConstraintInput( Property::Index index ) const
372 return RENDERER_IMPL.IsDefaultPropertyAConstraintInput( index );
375 Property::Type Renderer::GetDefaultPropertyType( Property::Index index ) const
377 return RENDERER_IMPL.GetDefaultPropertyType( index );
380 void Renderer::SetDefaultProperty( Property::Index index,
381 const Property::Value& propertyValue )
385 case Dali::Renderer::Property::DEPTH_INDEX:
387 SetDepthIndex( propertyValue.Get<int>() );
390 case Dali::Renderer::Property::FACE_CULLING_MODE:
392 FaceCullingMode::Type convertedValue = mFaceCullingMode;
393 if( Scripting::GetEnumerationProperty< FaceCullingMode::Type >( propertyValue, FACE_CULLING_MODE_TABLE, FACE_CULLING_MODE_TABLE_COUNT, convertedValue ) )
395 mFaceCullingMode = convertedValue;
396 SetFaceCullingModeMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
400 case Dali::Renderer::Property::BLEND_MODE:
402 BlendMode::Type convertedValue = mBlendMode;
403 if( Scripting::GetEnumerationProperty< BlendMode::Type >( propertyValue, BLEND_MODE_TABLE, BLEND_MODE_TABLE_COUNT, convertedValue ) )
405 SetBlendMode( convertedValue );
409 case Dali::Renderer::Property::BLEND_EQUATION_RGB:
411 BlendEquation::Type convertedValue = mBlendingOptions.GetBlendEquationRgb();
413 if( Scripting::GetEnumerationProperty< BlendEquation::Type >( propertyValue, BLEND_EQUATION_TABLE, BLEND_EQUATION_TABLE_COUNT, convertedValue ) )
415 BlendEquation::Type alphaEquation = mBlendingOptions.GetBlendEquationAlpha();
416 mBlendingOptions.SetBlendEquation( convertedValue, alphaEquation );
417 SetBlendingOptionsMessage( GetEventThreadServices(), *mSceneObject, mBlendingOptions.GetBitmask() );
421 case Dali::Renderer::Property::BLEND_EQUATION_ALPHA:
423 BlendEquation::Type convertedValue = mBlendingOptions.GetBlendEquationAlpha();
425 if( Scripting::GetEnumerationProperty< BlendEquation::Type >( propertyValue, BLEND_EQUATION_TABLE, BLEND_EQUATION_TABLE_COUNT, convertedValue ) )
427 BlendEquation::Type rgbEquation = mBlendingOptions.GetBlendEquationRgb();
428 mBlendingOptions.SetBlendEquation( rgbEquation, convertedValue );
429 SetBlendingOptionsMessage( GetEventThreadServices(), *mSceneObject, mBlendingOptions.GetBitmask() );
433 case Dali::Renderer::Property::BLEND_FACTOR_SRC_RGB:
435 BlendFactor::Type sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha;
436 GetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
438 if( Scripting::GetEnumerationProperty< BlendFactor::Type >( propertyValue, BLEND_FACTOR_TABLE, BLEND_FACTOR_TABLE_COUNT, sourceFactorRgb ) )
440 SetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
444 case Dali::Renderer::Property::BLEND_FACTOR_DEST_RGB:
446 BlendFactor::Type sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha;
447 GetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
449 if( Scripting::GetEnumerationProperty< BlendFactor::Type >( propertyValue, BLEND_FACTOR_TABLE, BLEND_FACTOR_TABLE_COUNT, destinationFactorRgb ) )
451 SetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
455 case Dali::Renderer::Property::BLEND_FACTOR_SRC_ALPHA:
457 BlendFactor::Type sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha;
458 GetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
460 if( Scripting::GetEnumerationProperty< BlendFactor::Type >( propertyValue, BLEND_FACTOR_TABLE, BLEND_FACTOR_TABLE_COUNT, sourceFactorAlpha ) )
462 SetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
466 case Dali::Renderer::Property::BLEND_FACTOR_DEST_ALPHA:
468 BlendFactor::Type sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha;
469 GetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
471 if( Scripting::GetEnumerationProperty< BlendFactor::Type >( propertyValue, BLEND_FACTOR_TABLE, BLEND_FACTOR_TABLE_COUNT, destinationFactorAlpha ) )
473 SetBlendFunc( sourceFactorRgb, destinationFactorRgb, sourceFactorAlpha, destinationFactorAlpha );
477 case Dali::Renderer::Property::BLEND_COLOR:
480 if( propertyValue.Get( blendColor ) )
482 SetBlendColor( blendColor );
486 case Dali::Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA:
489 if( propertyValue.Get( preMultipled ) )
491 EnablePreMultipliedAlpha( preMultipled );
495 case Dali::Renderer::Property::INDEX_RANGE_FIRST:
498 if( propertyValue.Get( firstElement ) )
500 SetIndexedDrawFirstElement( firstElement );
504 case Dali::Renderer::Property::INDEX_RANGE_COUNT:
507 if( propertyValue.Get( elementsCount ) )
509 SetIndexedDrawElementsCount( elementsCount );
513 case Dali::Renderer::Property::DEPTH_WRITE_MODE:
515 DepthWriteMode::Type convertedValue = mDepthWriteMode;
516 if( Scripting::GetEnumerationProperty< DepthWriteMode::Type >( propertyValue, DEPTH_WRITE_MODE_TABLE, DEPTH_WRITE_MODE_TABLE_COUNT, convertedValue ) )
518 mDepthWriteMode = convertedValue;
519 SetDepthWriteModeMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
523 case Dali::Renderer::Property::DEPTH_FUNCTION:
525 DepthFunction::Type convertedValue = mDepthFunction;
526 if( Scripting::GetEnumerationProperty< DepthFunction::Type >( propertyValue, DEPTH_FUNCTION_TABLE, DEPTH_FUNCTION_TABLE_COUNT, convertedValue ) )
528 mDepthFunction = convertedValue;
529 SetDepthFunctionMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
533 case Dali::Renderer::Property::DEPTH_TEST_MODE:
535 DepthTestMode::Type convertedValue = mDepthTestMode;
536 if( Scripting::GetEnumerationProperty< DepthTestMode::Type >( propertyValue, DEPTH_TEST_MODE_TABLE, DEPTH_TEST_MODE_TABLE_COUNT, convertedValue ) )
538 mDepthTestMode = convertedValue;
539 SetDepthTestModeMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
543 case Dali::Renderer::Property::RENDER_MODE:
545 RenderMode::Type convertedValue = mStencilParameters.renderMode;
546 if( Scripting::GetEnumerationProperty< RenderMode::Type >( propertyValue, RENDER_MODE_TABLE, RENDER_MODE_TABLE_COUNT, convertedValue ) )
548 mStencilParameters.renderMode = convertedValue;
549 SetRenderModeMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
553 case Dali::Renderer::Property::STENCIL_FUNCTION:
555 StencilFunction::Type convertedValue = mStencilParameters.stencilFunction;
556 if( Scripting::GetEnumerationProperty< StencilFunction::Type >( propertyValue, STENCIL_FUNCTION_TABLE, STENCIL_FUNCTION_TABLE_COUNT, convertedValue ) )
558 mStencilParameters.stencilFunction = convertedValue;
559 SetStencilFunctionMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
563 case Dali::Renderer::Property::STENCIL_FUNCTION_MASK:
565 int stencilFunctionMask;
566 if( propertyValue.Get( stencilFunctionMask ) )
568 if( stencilFunctionMask != mStencilParameters.stencilFunctionMask )
570 mStencilParameters.stencilFunctionMask = stencilFunctionMask;
571 SetStencilFunctionMaskMessage( GetEventThreadServices(), *mSceneObject, stencilFunctionMask );
576 case Dali::Renderer::Property::STENCIL_FUNCTION_REFERENCE:
578 int stencilFunctionReference;
579 if( propertyValue.Get( stencilFunctionReference ) )
581 if( stencilFunctionReference != mStencilParameters.stencilFunctionReference )
583 mStencilParameters.stencilFunctionReference = stencilFunctionReference;
584 SetStencilFunctionReferenceMessage( GetEventThreadServices(), *mSceneObject, stencilFunctionReference );
589 case Dali::Renderer::Property::STENCIL_MASK:
592 if( propertyValue.Get( stencilMask ) )
594 if( stencilMask != mStencilParameters.stencilMask )
596 mStencilParameters.stencilMask = stencilMask;
597 SetStencilMaskMessage( GetEventThreadServices(), *mSceneObject, stencilMask );
602 case Dali::Renderer::Property::STENCIL_OPERATION_ON_FAIL:
604 StencilOperation::Type convertedValue = mStencilParameters.stencilOperationOnFail;
605 if( Scripting::GetEnumerationProperty< StencilOperation::Type >( propertyValue, STENCIL_OPERATION_TABLE, STENCIL_OPERATION_TABLE_COUNT, convertedValue ) )
607 mStencilParameters.stencilOperationOnFail = convertedValue;
608 SetStencilOperationOnFailMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
612 case Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL:
614 StencilOperation::Type convertedValue = mStencilParameters.stencilOperationOnZFail;
615 if( Scripting::GetEnumerationProperty< StencilOperation::Type >( propertyValue, STENCIL_OPERATION_TABLE, STENCIL_OPERATION_TABLE_COUNT, convertedValue ) )
617 mStencilParameters.stencilOperationOnZFail = convertedValue;
618 SetStencilOperationOnZFailMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
622 case Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_PASS:
624 StencilOperation::Type convertedValue = mStencilParameters.stencilOperationOnZPass;
625 if( Scripting::GetEnumerationProperty< StencilOperation::Type >( propertyValue, STENCIL_OPERATION_TABLE, STENCIL_OPERATION_TABLE_COUNT, convertedValue ) )
627 mStencilParameters.stencilOperationOnZPass = convertedValue;
628 SetStencilOperationOnZPassMessage( GetEventThreadServices(), *mSceneObject, convertedValue );
632 case Dali::DevelRenderer::Property::OPACITY:
635 if( propertyValue.Get( opacity ) )
637 if( !Equals( mOpacity, opacity ) )
640 BakeOpacityMessage( GetEventThreadServices(), *mSceneObject, mOpacity );
648 void Renderer::SetSceneGraphProperty( Property::Index index,
649 const PropertyMetadata& entry,
650 const Property::Value& value )
652 RENDERER_IMPL.SetSceneGraphProperty( GetEventThreadServices(), this, index, entry, value );
653 OnPropertySet(index, value);
656 Property::Value Renderer::GetDefaultProperty( Property::Index index ) const
658 Property::Value value;
660 if( ! GetCachedPropertyValue( index, value ) )
662 // If property value is not stored in the event-side, then it must be a scene-graph only property
663 GetCurrentPropertyValue( index, value );
669 Property::Value Renderer::GetDefaultPropertyCurrentValue( Property::Index index ) const
671 Property::Value value;
673 if( ! GetCurrentPropertyValue( index, value ) )
675 // If unable to retrieve scene-graph property value, then it must be an event-side only property
676 GetCachedPropertyValue( index, value );
682 void Renderer::OnNotifyDefaultPropertyAnimation( Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType )
684 switch( animationType )
687 case Animation::BETWEEN:
691 case Dali::DevelRenderer::Property::OPACITY:
693 value.Get( mOpacity );
704 case Dali::DevelRenderer::Property::OPACITY:
706 AdjustValue< float >( mOpacity, value );
715 const SceneGraph::PropertyOwner* Renderer::GetPropertyOwner() const
720 const SceneGraph::PropertyOwner* Renderer::GetSceneObject() const
725 const SceneGraph::PropertyBase* Renderer::GetSceneObjectAnimatableProperty( Property::Index index ) const
727 DALI_ASSERT_ALWAYS( IsPropertyAnimatable(index) && "Property is not animatable" );
728 const SceneGraph::PropertyBase* property = NULL;
730 property = RENDERER_IMPL.GetRegisteredSceneGraphProperty(
732 &Renderer::FindAnimatableProperty,
733 &Renderer::FindCustomProperty,
738 if( index == DevelRenderer::Property::OPACITY )
740 property = &mSceneObject->mOpacity;
747 const PropertyInputImpl* Renderer::GetSceneObjectInputProperty( Property::Index index ) const
749 const PropertyInputImpl* property = NULL;
751 const SceneGraph::PropertyBase* baseProperty =
752 RENDERER_IMPL.GetRegisteredSceneGraphProperty( this,
753 &Renderer::FindAnimatableProperty,
754 &Renderer::FindCustomProperty,
756 property = static_cast<const PropertyInputImpl*>( baseProperty );
761 int Renderer::GetPropertyComponentIndex( Property::Index index ) const
763 return Property::INVALID_COMPONENT_INDEX;
767 : mSceneObject(NULL ),
769 mIndexedDrawFirstElement( 0 ),
770 mIndexedDrawElementCount( 0 ),
771 mStencilParameters( RenderMode::AUTO, StencilFunction::ALWAYS, 0xFF, 0x00, 0xFF, StencilOperation::KEEP, StencilOperation::KEEP, StencilOperation::KEEP ),
774 mDepthFunction( DepthFunction::LESS ),
775 mFaceCullingMode( FaceCullingMode::NONE ),
776 mBlendMode( BlendMode::AUTO ),
777 mDepthWriteMode( DepthWriteMode::AUTO ),
778 mDepthTestMode( DepthTestMode::AUTO ),
779 mPremultipledAlphaEnabled( false )
783 void Renderer::Initialize()
785 EventThreadServices& eventThreadServices = GetEventThreadServices();
786 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
788 mSceneObject = SceneGraph::Renderer::New();
789 OwnerPointer< SceneGraph::Renderer > transferOwnership( mSceneObject );
790 AddRendererMessage( updateManager, transferOwnership );
792 eventThreadServices.RegisterObject( this );
795 void Renderer::SetBlendColor( const Vector4& blendColor )
797 mBlendingOptions.SetBlendColor( blendColor );
798 SetBlendColorMessage( GetEventThreadServices(), *mSceneObject, GetBlendColor() );
801 const Vector4& Renderer::GetBlendColor() const
803 const Vector4* blendColor = mBlendingOptions.GetBlendColor();
808 return Color::TRANSPARENT; // GL default
811 Renderer::~Renderer()
813 if( EventThreadServices::IsCoreRunning() )
815 EventThreadServices& eventThreadServices = GetEventThreadServices();
816 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
817 RemoveRendererMessage( updateManager, *mSceneObject );
819 eventThreadServices.UnregisterObject( this );
823 bool Renderer::GetCachedPropertyValue( Property::Index index, Property::Value& value ) const
825 bool valueSet = true;
829 case Dali::Renderer::Property::DEPTH_INDEX:
831 value = GetDepthIndex();
834 case Dali::Renderer::Property::FACE_CULLING_MODE:
836 value = mFaceCullingMode;
839 case Dali::Renderer::Property::BLEND_MODE:
844 case Dali::Renderer::Property::BLEND_EQUATION_RGB:
846 value = static_cast<int>( mBlendingOptions.GetBlendEquationRgb() );
849 case Dali::Renderer::Property::BLEND_EQUATION_ALPHA:
851 value = static_cast<int>( mBlendingOptions.GetBlendEquationAlpha() );
854 case Dali::Renderer::Property::BLEND_FACTOR_SRC_RGB:
856 BlendFactor::Type srcFactorRgb;
857 BlendFactor::Type destFactorRgb;
858 BlendFactor::Type srcFactorAlpha;
859 BlendFactor::Type destFactorAlpha;
860 GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
861 value = static_cast<int>( srcFactorRgb );
864 case Dali::Renderer::Property::BLEND_FACTOR_DEST_RGB:
866 BlendFactor::Type srcFactorRgb;
867 BlendFactor::Type destFactorRgb;
868 BlendFactor::Type srcFactorAlpha;
869 BlendFactor::Type destFactorAlpha;
870 GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
871 value = static_cast<int>( destFactorRgb );
874 case Dali::Renderer::Property::BLEND_FACTOR_SRC_ALPHA:
876 BlendFactor::Type srcFactorRgb;
877 BlendFactor::Type destFactorRgb;
878 BlendFactor::Type srcFactorAlpha;
879 BlendFactor::Type destFactorAlpha;
880 GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
881 value = static_cast<int>( srcFactorAlpha );
884 case Dali::Renderer::Property::BLEND_FACTOR_DEST_ALPHA:
886 BlendFactor::Type srcFactorRgb;
887 BlendFactor::Type destFactorRgb;
888 BlendFactor::Type srcFactorAlpha;
889 BlendFactor::Type destFactorAlpha;
890 GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
891 value = static_cast<int>( destFactorAlpha );
894 case Dali::Renderer::Property::BLEND_COLOR:
896 value = GetBlendColor();
899 case Dali::Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA:
901 value = IsPreMultipliedAlphaEnabled();
904 case Dali::Renderer::Property::INDEX_RANGE_FIRST:
906 value = static_cast<int>( mIndexedDrawFirstElement );
909 case Dali::Renderer::Property::INDEX_RANGE_COUNT:
911 value = static_cast<int>( mIndexedDrawElementCount );
914 case Dali::Renderer::Property::DEPTH_WRITE_MODE:
916 value = mDepthWriteMode;
919 case Dali::Renderer::Property::DEPTH_FUNCTION:
921 value = mDepthFunction;
924 case Dali::Renderer::Property::DEPTH_TEST_MODE:
926 value = mDepthTestMode;
929 case Dali::Renderer::Property::STENCIL_FUNCTION:
931 value = mStencilParameters.stencilFunction;
934 case Dali::Renderer::Property::STENCIL_FUNCTION_MASK:
936 value = mStencilParameters.stencilFunctionMask;
939 case Dali::Renderer::Property::STENCIL_FUNCTION_REFERENCE:
941 value = mStencilParameters.stencilFunctionReference;
944 case Dali::Renderer::Property::STENCIL_MASK:
946 value = mStencilParameters.stencilMask;
949 case Dali::Renderer::Property::RENDER_MODE:
951 value = mStencilParameters.renderMode;
954 case Dali::Renderer::Property::STENCIL_OPERATION_ON_FAIL:
956 value = mStencilParameters.stencilOperationOnFail;
959 case Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL:
961 value = mStencilParameters.stencilOperationOnZFail;
964 case Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_PASS:
966 value = mStencilParameters.stencilOperationOnZPass;
969 case Dali::DevelRenderer::Property::OPACITY:
976 // Must be a scene-graph only property
985 bool Renderer::GetCurrentPropertyValue( Property::Index index, Property::Value& value ) const
987 bool valueSet = true;
991 case Dali::Renderer::Property::DEPTH_INDEX:
993 value = mSceneObject->GetDepthIndex();
996 case Dali::Renderer::Property::FACE_CULLING_MODE:
998 value = mSceneObject->GetFaceCullingMode();
1001 case Dali::Renderer::Property::BLEND_MODE:
1003 value = mSceneObject->GetBlendMode();
1006 case Dali::Renderer::Property::BLEND_EQUATION_RGB:
1008 unsigned int bitMask = mSceneObject->GetBlendingOptions();
1009 BlendingOptions blendingOptions;
1010 blendingOptions.SetBitmask( bitMask );
1011 value = static_cast<int>( blendingOptions.GetBlendEquationRgb() );
1014 case Dali::Renderer::Property::BLEND_EQUATION_ALPHA:
1016 unsigned int bitMask = mSceneObject->GetBlendingOptions();
1017 BlendingOptions blendingOptions;
1018 blendingOptions.SetBitmask( bitMask );
1019 value = static_cast<int>( blendingOptions.GetBlendEquationAlpha() );
1022 case Dali::Renderer::Property::BLEND_FACTOR_SRC_RGB:
1024 unsigned int bitMask = mSceneObject->GetBlendingOptions();
1025 BlendingOptions blendingOptions;
1026 blendingOptions.SetBitmask( bitMask );
1027 value = static_cast<int>( blendingOptions.GetBlendSrcFactorRgb() );
1030 case Dali::Renderer::Property::BLEND_FACTOR_DEST_RGB:
1032 unsigned int bitMask = mSceneObject->GetBlendingOptions();
1033 BlendingOptions blendingOptions;
1034 blendingOptions.SetBitmask( bitMask );
1035 value = static_cast<int>( blendingOptions.GetBlendDestFactorRgb() );
1038 case Dali::Renderer::Property::BLEND_FACTOR_SRC_ALPHA:
1040 unsigned int bitMask = mSceneObject->GetBlendingOptions();
1041 BlendingOptions blendingOptions;
1042 blendingOptions.SetBitmask( bitMask );
1043 value = static_cast<int>( blendingOptions.GetBlendSrcFactorAlpha() );
1046 case Dali::Renderer::Property::BLEND_FACTOR_DEST_ALPHA:
1048 unsigned int bitMask = mSceneObject->GetBlendingOptions();
1049 BlendingOptions blendingOptions;
1050 blendingOptions.SetBitmask( bitMask );
1051 value = static_cast<int>( blendingOptions.GetBlendDestFactorAlpha() );
1054 case Dali::Renderer::Property::BLEND_COLOR:
1056 value = mSceneObject->GetBlendColor();
1059 case Dali::Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA:
1061 value = mSceneObject->IsPreMultipliedAlphaEnabled();
1064 case Dali::Renderer::Property::INDEX_RANGE_FIRST:
1066 value = static_cast<int>( mSceneObject->GetIndexedDrawFirstElement() );
1069 case Dali::Renderer::Property::INDEX_RANGE_COUNT:
1071 value = static_cast<int>( mSceneObject->GetIndexedDrawElementsCount() );
1074 case Dali::Renderer::Property::DEPTH_WRITE_MODE:
1076 value = mSceneObject->GetDepthWriteMode();
1079 case Dali::Renderer::Property::DEPTH_FUNCTION:
1081 value = mSceneObject->GetDepthFunction();
1084 case Dali::Renderer::Property::DEPTH_TEST_MODE:
1086 value = mSceneObject->GetDepthTestMode();
1089 case Dali::Renderer::Property::STENCIL_FUNCTION:
1091 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1092 value = stencilParameters.stencilFunction;
1095 case Dali::Renderer::Property::STENCIL_FUNCTION_MASK:
1097 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1098 value = stencilParameters.stencilFunctionMask;
1101 case Dali::Renderer::Property::STENCIL_FUNCTION_REFERENCE:
1103 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1104 value = stencilParameters.stencilFunctionReference;
1107 case Dali::Renderer::Property::STENCIL_MASK:
1109 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1110 value = stencilParameters.stencilMask;
1113 case Dali::Renderer::Property::RENDER_MODE:
1115 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1116 value = stencilParameters.renderMode;
1119 case Dali::Renderer::Property::STENCIL_OPERATION_ON_FAIL:
1121 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1122 value = stencilParameters.stencilOperationOnFail;
1125 case Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_FAIL:
1127 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1128 value = stencilParameters.stencilOperationOnZFail;
1131 case Dali::Renderer::Property::STENCIL_OPERATION_ON_Z_PASS:
1133 Render::Renderer::StencilParameters stencilParameters = mSceneObject->GetStencilParameters();
1134 value = stencilParameters.stencilOperationOnZPass;
1137 case Dali::DevelRenderer::Property::OPACITY:
1139 value = mSceneObject->GetOpacity( GetEventThreadServices().GetEventBufferIndex() );
1144 // Must be an event-side only property
1153 } // namespace Internal