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/render/renderers/render-renderer.h>
23 #include <dali/internal/render/gl-resources/context.h>
24 #include <dali/internal/render/shaders/scene-graph-shader.h>
25 #include <dali/internal/render/shaders/program.h>
26 #include <dali/internal/render/data-providers/node-data-provider.h>
27 #include <dali/public-api/actors/blending.h>
28 #include <dali/internal/common/image-sampler.h>
29 #include <dali/internal/render/renderers/render-new-renderer.h>
40 static Matrix gModelViewProjectionMatrix( false ); ///< a shared matrix to calculate the MVP matrix, dont want to store it in object to reduce storage overhead
41 static Matrix3 gNormalMatrix; ///< a shared matrix to calculate normal matrix, dont want to store it in object to reduce storage overhead
44 * Helper to set view and projection matrices once per program
45 * @param program to set the matrices to
46 * @param modelMatrix to set
47 * @param viewMatrix to set
48 * @param projectionMatrix to set
49 * @param modelViewMatrix to set
50 * @param modelViewProjectionMatrix to set
52 inline void SetMatrices( Program& program,
53 const Matrix& modelMatrix,
54 const Matrix& viewMatrix,
55 const Matrix& projectionMatrix,
56 const Matrix& modelViewMatrix )
58 GLint loc = program.GetUniformLocation( Program::UNIFORM_MODEL_MATRIX );
59 if( Program::UNIFORM_UNKNOWN != loc )
61 program.SetUniformMatrix4fv( loc, 1, modelMatrix.AsFloat() );
63 loc = program.GetUniformLocation( Program::UNIFORM_VIEW_MATRIX );
64 if( Program::UNIFORM_UNKNOWN != loc )
66 if( program.GetViewMatrix() != &viewMatrix )
68 program.SetViewMatrix( &viewMatrix );
69 program.SetUniformMatrix4fv( loc, 1, viewMatrix.AsFloat() );
72 // set projection matrix if program has not yet received it this frame or if it is dirty
73 loc = program.GetUniformLocation( Program::UNIFORM_PROJECTION_MATRIX );
74 if( Program::UNIFORM_UNKNOWN != loc )
76 if( program.GetProjectionMatrix() != &projectionMatrix )
78 program.SetProjectionMatrix( &projectionMatrix );
79 program.SetUniformMatrix4fv( loc, 1, projectionMatrix.AsFloat() );
82 loc = program.GetUniformLocation(Program::UNIFORM_MODELVIEW_MATRIX);
83 if( Program::UNIFORM_UNKNOWN != loc )
85 program.SetUniformMatrix4fv( loc, 1, modelViewMatrix.AsFloat() );
88 loc = program.GetUniformLocation( Program::UNIFORM_MVP_MATRIX );
89 if( Program::UNIFORM_UNKNOWN != loc )
91 Matrix::Multiply( gModelViewProjectionMatrix, modelViewMatrix, projectionMatrix );
92 program.SetUniformMatrix4fv( loc, 1, gModelViewProjectionMatrix.AsFloat() );
95 loc = program.GetUniformLocation( Program::UNIFORM_NORMAL_MATRIX );
96 if( Program::UNIFORM_UNKNOWN != loc )
98 gNormalMatrix = modelViewMatrix;
99 gNormalMatrix.Invert();
100 gNormalMatrix.Transpose();
101 program.SetUniformMatrix3fv( loc, 1, gNormalMatrix.AsFloat() );
110 void Renderer::Initialize( Context& context, SceneGraph::TextureCache& textureCache, Render::UniformNameCache& uniformNameCache )
113 mTextureCache = &textureCache;
114 mUniformNameCache = &uniformNameCache;
117 Renderer::~Renderer()
121 void Renderer::SetShader( SceneGraph::Shader* shader )
126 void Renderer::SetCullFace( Dali::Material::FaceCullingMode mode )
128 DALI_ASSERT_DEBUG( mode >= Dali::Material::NONE && mode <= Dali::Material::CULL_BACK_AND_FRONT );
129 mCullFaceMode = mode;
132 void Renderer::SetSampler( unsigned int samplerBitfield )
134 mSamplerBitfield = samplerBitfield;
137 void Renderer::Render( Context& context,
138 SceneGraph::TextureCache& textureCache,
139 BufferIndex bufferIndex,
140 const SceneGraph::NodeDataProvider& node,
141 SceneGraph::Shader& defaultShader,
142 const Matrix& modelViewMatrix,
143 const Matrix& viewMatrix,
144 const Matrix& projectionMatrix,
148 NewRenderer* renderer = GetNewRenderer(); // avoid a dynamic cast per item per frame
152 // Get the shader from the material:
153 mShader = &renderer->mRenderDataProvider->GetShader();
156 // if mShader is NULL it means we're set to default
159 mShader = &defaultShader;
162 if( !CheckResources() )
164 // CheckResources() is overriden in derived classes.
165 // Prevents modify the GL state if resources are not ready and nothing is to be rendered.
169 // Get the program to use:
170 Program* program = mShader->GetProgram();
173 // if program is NULL it means this is a custom shader with non matching geometry type so we need to use default shaders program
174 program = defaultShader.GetProgram();
175 DALI_ASSERT_DEBUG( program && "Default shader should always have a program available." );
178 DALI_LOG_ERROR( "Failed to get program for shader at address %p.", (void*) &*mShader );
183 // Take the program into use so we can send uniforms to it
186 DoSetCullFaceMode( context );
188 // Enable/disable blending
189 context.SetBlend( blend );
192 DoSetBlending( context );
195 // Ignore missing uniforms - custom shaders and flat color shaders don't have SAMPLER
196 // set projection and view matrix if program has not yet received them yet this frame
197 const Matrix& modelMatrix = node.GetModelMatrix( bufferIndex );
198 SetMatrices( *program, modelMatrix, viewMatrix, projectionMatrix, modelViewMatrix );
201 GLint loc = program->GetUniformLocation( Program::UNIFORM_COLOR );
202 if( Program::UNIFORM_UNKNOWN != loc )
204 const Vector4& color = node.GetRenderColor( bufferIndex );
205 program->SetUniform4f( loc, color.r, color.g, color.b, color.a );
208 //@todo MESH_REWORK Remove after removing ImageRenderer
209 DoSetUniforms(context, bufferIndex, mShader, program );
211 // subclass rendering and actual draw call
212 DoRender( context, textureCache, node, bufferIndex, *program, modelViewMatrix, viewMatrix );
215 void Renderer::SetSortAttributes( BufferIndex bufferIndex, SceneGraph::RendererWithSortAttributes& sortAttributes ) const
217 sortAttributes.shader = mShader;
218 sortAttributes.textureResourceId = Integration::InvalidResourceId;
219 sortAttributes.geometry = NULL;
222 // can be overridden by deriving class
223 void Renderer::DoSetUniforms(Context& context, BufferIndex bufferIndex, SceneGraph::Shader* shader, Program* program )
225 shader->SetUniforms( context, *program, bufferIndex );
228 // can be overridden by deriving class
229 void Renderer::DoSetCullFaceMode( Context& context )
231 // Set face culling mode
232 context.CullFace( mCullFaceMode );
237 mTextureCache( NULL ),
238 mUniformNameCache( NULL ),
240 mSamplerBitfield( ImageSampler::PackBitfield( FilterMode::DEFAULT, FilterMode::DEFAULT ) ),
241 mCullFaceMode( Dali::Material::NONE )
245 } // namespace SceneGraph
247 } // namespace Internal