2011-10-25 05:03:10 +00:00
//
// KRShader.cpp
// KREngine
//
2012-03-15 20:09:01 +00:00
// Copyright 2012 Kearwood Gilbert. All rights reserved.
2011-10-25 06:16:47 +00:00
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY KEARWOOD GILBERT ''AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KEARWOOD GILBERT OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// The views and conclusions contained in the software and documentation are those of the
// authors and should not be interpreted as representing official policies, either expressed
// or implied, of Kearwood Gilbert.
2011-10-25 05:03:10 +00:00
//
# include "KRShader.h"
2012-09-20 10:51:28 +00:00
# import "assert.h"
2011-10-25 05:03:10 +00:00
2012-04-13 23:24:07 +00:00
KRShader : : KRShader ( char * szKey , std : : string options , std : : string vertShaderSource , const std : : string fragShaderSource ) {
2012-03-15 20:09:01 +00:00
strcpy ( m_szKey , szKey ) ;
2011-10-25 05:03:10 +00:00
m_iProgram = 0 ;
GLuint vertexShader = 0 , fragShader = 0 ;
try {
2012-04-13 23:24:07 +00:00
const GLchar * vertSource [ 2 ] = { options . c_str ( ) , vertShaderSource . c_str ( ) } ;
const GLchar * fragSource [ 2 ] = { options . c_str ( ) , fragShaderSource . c_str ( ) } ;
2011-10-25 05:03:10 +00:00
// Create shader program.
2012-09-13 20:09:19 +00:00
GLDEBUG ( m_iProgram = glCreateProgram ( ) ) ;
2011-10-25 05:03:10 +00:00
// Create and compile vertex shader.
2012-09-13 20:09:19 +00:00
GLDEBUG ( vertexShader = glCreateShader ( GL_VERTEX_SHADER ) ) ;
GLDEBUG ( glShaderSource ( vertexShader , 2 , vertSource , NULL ) ) ;
GLDEBUG ( glCompileShader ( vertexShader ) ) ;
2011-10-25 05:03:10 +00:00
2012-04-13 22:48:13 +00:00
// Report any compile issues to stderr
GLint logLength ;
2012-09-13 20:09:19 +00:00
GLDEBUG ( glGetShaderiv ( vertexShader , GL_INFO_LOG_LENGTH , & logLength ) ) ;
2012-04-13 22:48:13 +00:00
if ( logLength > 0 ) {
GLchar * log = ( GLchar * ) malloc ( logLength ) ;
2012-09-20 09:32:20 +00:00
assert ( log ! = NULL ) ;
2012-09-13 20:09:19 +00:00
GLDEBUG ( glGetShaderInfoLog ( vertexShader , logLength , & logLength , log ) ) ;
2012-04-13 22:48:13 +00:00
fprintf ( stderr , " KREngine - Failed to compile vertex shader: %s \n Shader compile log: \n %s " , szKey , log ) ;
free ( log ) ;
}
2011-10-25 05:03:10 +00:00
// Create and compile vertex shader.
2012-09-13 20:09:19 +00:00
GLDEBUG ( fragShader = glCreateShader ( GL_FRAGMENT_SHADER ) ) ;
GLDEBUG ( glShaderSource ( fragShader , 2 , fragSource , NULL ) ) ;
GLDEBUG ( glCompileShader ( fragShader ) ) ;
2011-10-25 05:03:10 +00:00
2012-04-13 22:48:13 +00:00
// Report any compile issues to stderr
2012-09-13 20:09:19 +00:00
GLDEBUG ( glGetShaderiv ( fragShader , GL_INFO_LOG_LENGTH , & logLength ) ) ;
2012-04-13 22:48:13 +00:00
if ( logLength > 0 ) {
GLchar * log = ( GLchar * ) malloc ( logLength ) ;
2012-09-20 09:32:20 +00:00
assert ( log ! = NULL ) ;
2012-09-13 20:09:19 +00:00
GLDEBUG ( glGetShaderInfoLog ( fragShader , logLength , & logLength , log ) ) ;
2012-04-13 22:48:13 +00:00
fprintf ( stderr , " KREngine - Failed to compile fragment shader: %s \n Shader compile log: \n %s " , szKey , log ) ;
free ( log ) ;
}
2011-10-25 05:03:10 +00:00
// Attach vertex shader to program.
2012-09-13 20:09:19 +00:00
GLDEBUG ( glAttachShader ( m_iProgram , vertexShader ) ) ;
2011-10-25 05:03:10 +00:00
// Attach fragment shader to program.
2012-09-13 20:09:19 +00:00
GLDEBUG ( glAttachShader ( m_iProgram , fragShader ) ) ;
2011-10-25 05:03:10 +00:00
// Bind attribute locations.
// This needs to be done prior to linking.
2012-09-13 20:09:19 +00:00
GLDEBUG ( glBindAttribLocation ( m_iProgram , KRENGINE_ATTRIB_VERTEX , " vertex_position " ) ) ;
GLDEBUG ( glBindAttribLocation ( m_iProgram , KRENGINE_ATTRIB_NORMAL , " vertex_normal " ) ) ;
GLDEBUG ( glBindAttribLocation ( m_iProgram , KRENGINE_ATTRIB_TANGENT , " vertex_tangent " ) ) ;
GLDEBUG ( glBindAttribLocation ( m_iProgram , KRENGINE_ATTRIB_TEXUVA , " vertex_uv " ) ) ;
GLDEBUG ( glBindAttribLocation ( m_iProgram , KRENGINE_ATTRIB_TEXUVB , " vertex_lightmap_uv " ) ) ;
2012-04-14 02:15:35 +00:00
2011-10-25 05:03:10 +00:00
// Link program.
2012-09-13 20:09:19 +00:00
GLDEBUG ( glLinkProgram ( m_iProgram ) ) ;
2011-10-25 05:03:10 +00:00
2012-09-20 09:32:20 +00:00
GLint link_success = GL_FALSE ;
GLDEBUG ( glGetProgramiv ( m_iProgram , GL_LINK_STATUS , & link_success ) ) ;
if ( link_success ! = GL_TRUE ) {
// Report any linking issues to stderr
fprintf ( stderr , " KREngine - Failed to link shader program: %s \n " , szKey ) ;
GLDEBUG ( glGetProgramiv ( m_iProgram , GL_INFO_LOG_LENGTH , & logLength ) ) ;
if ( logLength > 0 )
{
GLchar * log = ( GLchar * ) malloc ( logLength ) ;
assert ( log ! = NULL ) ;
GLDEBUG ( glGetProgramInfoLog ( m_iProgram , logLength , & logLength , log ) ) ;
fprintf ( stderr , " Program link log: \n %s " , log ) ;
free ( log ) ;
}
GLDEBUG ( glDeleteProgram ( m_iProgram ) ) ;
m_iProgram = 0 ;
} else {
2012-04-13 22:48:13 +00:00
2012-09-20 09:32:20 +00:00
// Get uniform locations
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MATERIAL_AMBIENT ] = glGetUniformLocation ( m_iProgram , " material_ambient " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MATERIAL_DIFFUSE ] = glGetUniformLocation ( m_iProgram , " material_diffuse " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MATERIAL_SPECULAR ] = glGetUniformLocation ( m_iProgram , " material_specular " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MATERIAL_REFLECTION ] = glGetUniformLocation ( m_iProgram , " material_reflection " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_POSITION ] = glGetUniformLocation ( m_iProgram , " light_position " ) ) ;
2012-10-12 00:02:24 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE ] = glGetUniformLocation ( m_iProgram , " view_space_model_origin " ) ) ;
2012-09-20 09:32:20 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_COLOR ] = glGetUniformLocation ( m_iProgram , " light_color " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_INTENSITY ] = glGetUniformLocation ( m_iProgram , " light_intensity " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_DECAY_START ] = glGetUniformLocation ( m_iProgram , " light_decay_start " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_CUTOFF ] = glGetUniformLocation ( m_iProgram , " light_cutoff " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_FLARE_SIZE ] = glGetUniformLocation ( m_iProgram , " flare_size " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MATERIAL_ALPHA ] = glGetUniformLocation ( m_iProgram , " material_alpha " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MATERIAL_SHININESS ] = glGetUniformLocation ( m_iProgram , " material_shininess " ) ) ;
2012-10-12 00:02:24 +00:00
2012-09-20 09:32:20 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MVP ] = glGetUniformLocation ( m_iProgram , " mvp_matrix " ) ) ;
2012-10-10 22:09:28 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_INVMVP ] = glGetUniformLocation ( m_iProgram , " inv_mvp_matrix " ) ) ;
2012-10-12 00:02:24 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_INVP ] = glGetUniformLocation ( m_iProgram , " inv_projection_matrix " ) ) ;
2012-10-10 22:09:28 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE ] = glGetUniformLocation ( m_iProgram , " inv_mvp_matrix_no_translate " ) ) ;
2012-10-12 00:02:24 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE ] = glGetUniformLocation ( m_iProgram , " model_view_inverse_transpose_matrix " ) ) ;
2012-10-12 02:27:59 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE ] = glGetUniformLocation ( m_iProgram , " model_inverse_transpose_matrix " ) ) ;
2012-10-20 02:15:48 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MODEL_VIEW ] = glGetUniformLocation ( m_iProgram , " model_view_matrix " ) ) ;
2012-10-12 00:02:24 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_MODEL_MATRIX ] = glGetUniformLocation ( m_iProgram , " model_matrix " ) ) ;
2012-09-20 09:32:20 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SHADOWMVP1 ] = glGetUniformLocation ( m_iProgram , " shadow_mvp1 " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SHADOWMVP2 ] = glGetUniformLocation ( m_iProgram , " shadow_mvp2 " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SHADOWMVP3 ] = glGetUniformLocation ( m_iProgram , " shadow_mvp3 " ) ) ;
2012-10-20 01:10:57 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE ] = glGetUniformLocation ( m_iProgram , " light_direction_model_space " ) ) ;
2012-09-20 09:32:20 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_DIRECTION_VIEW_SPACE ] = glGetUniformLocation ( m_iProgram , " light_direction_view_space " ) ) ;
2012-10-20 01:10:57 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE ] = glGetUniformLocation ( m_iProgram , " camera_position_model_space " ) ) ;
2012-09-20 09:32:20 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_VIEWPORT ] = glGetUniformLocation ( m_iProgram , " viewport " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_DIFFUSETEXTURE ] = glGetUniformLocation ( m_iProgram , " diffuseTexture " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SPECULARTEXTURE ] = glGetUniformLocation ( m_iProgram , " specularTexture " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_REFLECTIONTEXTURE ] = glGetUniformLocation ( m_iProgram , " reflectionTexture " ) ) ;
2012-10-12 00:02:24 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_REFLECTIONCUBETEXTURE ] = glGetUniformLocation ( m_iProgram , " reflectionCubeTexture " ) ) ;
2012-09-20 09:32:20 +00:00
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_NORMALTEXTURE ] = glGetUniformLocation ( m_iProgram , " normalTexture " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_DIFFUSETEXTURE_SCALE ] = glGetUniformLocation ( m_iProgram , " diffuseTexture_Scale " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SPECULARTEXTURE_SCALE ] = glGetUniformLocation ( m_iProgram , " specularTexture_Scale " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_REFLECTIONTEXTURE_SCALE ] = glGetUniformLocation ( m_iProgram , " reflectionTexture_Scale " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_NORMALTEXTURE_SCALE ] = glGetUniformLocation ( m_iProgram , " normalTexture_Scale " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_AMBIENTTEXTURE_SCALE ] = glGetUniformLocation ( m_iProgram , " ambientTexture_Scale " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_DIFFUSETEXTURE_OFFSET ] = glGetUniformLocation ( m_iProgram , " diffuseTexture_Offset " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SPECULARTEXTURE_OFFSET ] = glGetUniformLocation ( m_iProgram , " specularTexture_Offset " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_REFLECTIONTEXTURE_OFFSET ] = glGetUniformLocation ( m_iProgram , " reflectionTexture_Offset " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_NORMALTEXTURE_OFFSET ] = glGetUniformLocation ( m_iProgram , " normalTexture_Offset " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_AMBIENTTEXTURE_OFFSET ] = glGetUniformLocation ( m_iProgram , " ambientTexture_Offset " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SHADOWTEXTURE1 ] = glGetUniformLocation ( m_iProgram , " shadowTexture1 " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SHADOWTEXTURE2 ] = glGetUniformLocation ( m_iProgram , " shadowTexture2 " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_SHADOWTEXTURE3 ] = glGetUniformLocation ( m_iProgram , " shadowTexture3 " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_GBUFFER_FRAME ] = glGetUniformLocation ( m_iProgram , " gbuffer_frame " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_GBUFFER_DEPTH ] = glGetUniformLocation ( m_iProgram , " gbuffer_depth " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_DEPTH_FRAME ] = glGetUniformLocation ( m_iProgram , " depthFrame " ) ) ;
GLDEBUG ( m_uniforms [ KRENGINE_UNIFORM_RENDER_FRAME ] = glGetUniformLocation ( m_iProgram , " renderFrame " ) ) ;
}
2012-09-19 20:26:30 +00:00
2011-10-25 05:03:10 +00:00
} catch ( . . . ) {
if ( vertexShader ) {
2012-09-13 20:09:19 +00:00
GLDEBUG ( glDeleteShader ( vertexShader ) ) ;
2011-10-25 05:03:10 +00:00
vertexShader = 0 ;
}
if ( fragShader ) {
2012-09-13 20:09:19 +00:00
GLDEBUG ( glDeleteShader ( fragShader ) ) ;
2011-10-25 05:03:10 +00:00
fragShader = 0 ;
}
if ( m_iProgram ) {
2012-09-13 20:09:19 +00:00
GLDEBUG ( glDeleteProgram ( m_iProgram ) ) ;
2011-10-25 05:03:10 +00:00
m_iProgram = 0 ;
}
}
// Release vertex and fragment shaders.
if ( vertexShader ) {
2012-09-13 20:09:19 +00:00
GLDEBUG ( glDeleteShader ( vertexShader ) ) ;
2011-10-25 05:03:10 +00:00
}
if ( fragShader ) {
2012-09-13 20:09:19 +00:00
GLDEBUG ( glDeleteShader ( fragShader ) ) ;
2011-10-25 05:03:10 +00:00
}
}
KRShader : : ~ KRShader ( ) {
if ( m_iProgram ) {
2012-09-13 20:09:19 +00:00
GLDEBUG ( glDeleteProgram ( m_iProgram ) ) ;
2011-10-25 05:03:10 +00:00
}
}
2012-04-20 01:06:12 +00:00
# if TARGET_OS_IPHONE
2012-10-12 00:02:24 +00:00
bool KRShader : : bind ( KRCamera * pCamera , KRMat4 & matModel , KRMat4 & matView , KRMat4 & mvpMatrix , KRVector3 & lightDirection , KRMat4 * pShadowMatrices , GLuint * shadowDepthTextures , int cShadowBuffers , KRNode : : RenderPass renderPass ) {
2012-09-20 09:32:20 +00:00
if ( m_iProgram = = 0 ) {
return false ;
}
2012-10-20 02:15:48 +00:00
GLDEBUG ( glUseProgram ( m_iProgram ) ) ;
2012-09-20 09:32:20 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE ] ! = - 1 | | m_uniforms [ KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE ] ! = - 1 ) {
KRMat4 inverseModelMatrix = matModel ;
inverseModelMatrix . invert ( ) ;
if ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE ] ! = - 1 ) {
// Bind the light direction vector
KRVector3 lightDirObject = KRMat4 : : Dot ( inverseModelMatrix , lightDirection ) ;
lightDirObject . normalize ( ) ;
lightDirObject . setUniform ( m_uniforms [ KRENGINE_UNIFORM_LIGHT_DIRECTION_MODEL_SPACE ] ) ;
}
if ( m_uniforms [ KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE ] ! = - 1 ) {
// Transform location of camera to object space for calculation of specular halfVec
KRMat4 inverseViewMatrix = matView ;
inverseViewMatrix . invert ( ) ;
KRVector3 cameraPosition = KRMat4 : : Dot ( inverseViewMatrix , KRVector3 : : Zero ( ) ) ;
KRVector3 cameraPosObject = KRMat4 : : Dot ( inverseModelMatrix , cameraPosition ) ;
cameraPosObject . setUniform ( m_uniforms [ KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE ] ) ;
}
}
2012-09-20 09:32:20 +00:00
2011-10-25 05:03:10 +00:00
// Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram
2012-10-18 08:37:19 +00:00
mvpMatrix . setUniform ( m_uniforms [ KRENGINE_UNIFORM_MVP ] ) ;
2012-10-12 00:02:24 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE ] ! = - 1 | | m_uniforms [ KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE ] ! = - 1 ) {
KRMat4 matModelView = matModel * matView ;
matModelView . setUniform ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_MODEL_VIEW ] ) ;
if ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE ] ! = - 1 ) {
KRVector3 view_space_model_origin = KRMat4 : : Dot ( matModelView , KRVector3 : : Zero ( ) ) ; // Origin point of model space is the light source position. No perspective, so no w divide required
view_space_model_origin . setUniform ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE ] ) ;
}
if ( m_uniforms [ KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE ] ! = - 1 ) {
KRMat4 matModelViewInverseTranspose = matModelView ;
matModelViewInverseTranspose . transpose ( ) ;
matModelViewInverseTranspose . invert ( ) ;
matModelViewInverseTranspose . setUniform ( m_uniforms [ KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE ] ) ;
}
}
2012-10-12 00:02:24 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE ] ! = - 1 ) {
KRMat4 matModelInverseTranspose = matModel ;
matModelInverseTranspose . transpose ( ) ;
matModelInverseTranspose . invert ( ) ;
matModelInverseTranspose . setUniform ( m_uniforms [ KRENGINE_UNIFORM_MODEL_INVERSE_TRANSPOSE ] ) ;
}
2012-10-10 22:09:28 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_INVP ] ! = - 1 ) {
KRMat4 matInvProjection = pCamera - > getProjectionMatrix ( ) ;
matInvProjection . invert ( ) ;
matInvProjection . setUniform ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_INVP ] ) ;
}
2012-10-10 22:09:28 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_INVMVP ] ! = - 1 ) {
KRMat4 matInvMVP = mvpMatrix ;
matInvMVP . invert ( ) ;
matInvMVP . setUniform ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_INVMVP ] ) ;
}
2012-10-10 22:09:28 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE ] ! = - 1 ) {
KRMat4 matInvMVPNoTranslate = matModel * matView ;
// Remove the translation
matInvMVPNoTranslate . getPointer ( ) [ 3 ] = 0 ;
matInvMVPNoTranslate . getPointer ( ) [ 7 ] = 0 ;
matInvMVPNoTranslate . getPointer ( ) [ 11 ] = 0 ;
matInvMVPNoTranslate . getPointer ( ) [ 12 ] = 0 ;
matInvMVPNoTranslate . getPointer ( ) [ 13 ] = 0 ;
matInvMVPNoTranslate . getPointer ( ) [ 14 ] = 0 ;
matInvMVPNoTranslate . getPointer ( ) [ 15 ] = 1.0 ;
matInvMVPNoTranslate = matInvMVPNoTranslate * pCamera - > getProjectionMatrix ( ) ;
matInvMVPNoTranslate . invert ( ) ;
matInvMVPNoTranslate . setUniform ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE ] ) ;
}
2012-10-10 22:09:28 +00:00
2012-10-18 08:37:19 +00:00
matModel . setUniform ( m_uniforms [ KRShader : : KRENGINE_UNIFORM_MODEL_MATRIX ] ) ;
2012-10-12 00:02:24 +00:00
2012-10-20 02:15:48 +00:00
if ( m_uniforms [ KRENGINE_UNIFORM_VIEWPORT ] ! = - 1 ) {
GLDEBUG ( glUniform4f (
m_uniforms [ KRENGINE_UNIFORM_VIEWPORT ] ,
( GLfloat ) 0.0 ,
( GLfloat ) 0.0 ,
( GLfloat ) pCamera - > getViewportSize ( ) . x ,
( GLfloat ) pCamera - > getViewportSize ( ) . y
) ) ;
2012-10-12 00:02:24 +00:00
}
2012-04-19 23:39:32 +00:00
2011-10-25 05:03:10 +00:00
// Bind the shadowmap space matrices
for ( int iShadow = 0 ; iShadow < cShadowBuffers ; iShadow + + ) {
2012-10-18 08:37:19 +00:00
pShadowMatrices [ iShadow ] . setUniform ( m_uniforms [ KRENGINE_UNIFORM_SHADOWMVP1 + iShadow ] ) ;
2011-10-25 05:03:10 +00:00
}
// Sets the diffuseTexture variable to the first texture unit
2012-09-13 20:09:19 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_DIFFUSETEXTURE ] , 0 ) ) ;
2011-10-25 05:03:10 +00:00
// Sets the specularTexture variable to the second texture unit
2012-09-13 20:09:19 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_SPECULARTEXTURE ] , 1 ) ) ;
2011-10-25 05:03:10 +00:00
// Sets the normalTexture variable to the third texture unit
2012-09-13 20:09:19 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_NORMALTEXTURE ] , 2 ) ) ;
2011-10-25 05:03:10 +00:00
// Sets the shadowTexture variable to the fourth texture unit
2012-09-13 20:09:19 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_SHADOWTEXTURE1 ] , 3 ) ) ;
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_SHADOWTEXTURE2 ] , 4 ) ) ;
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_SHADOWTEXTURE3 ] , 5 ) ) ;
2011-10-25 05:03:10 +00:00
2012-10-12 00:02:24 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_REFLECTIONCUBETEXTURE ] , 4 ) ) ;
2012-09-13 20:09:19 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_GBUFFER_FRAME ] , 6 ) ) ;
2012-05-08 23:39:52 +00:00
2012-09-13 20:09:19 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_GBUFFER_DEPTH ] , 7 ) ) ; // Texture unit 7 is used for reading the depth buffer in gBuffer pass #2 and in post-processing pass
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_REFLECTIONTEXTURE ] , 7 ) ) ; // Texture unit 7 is used for the reflection map textures in gBuffer pass #3 and when using forward rendering
2012-04-13 22:48:13 +00:00
2012-09-19 20:26:30 +00:00
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_DEPTH_FRAME ] , 0 ) ) ;
GLDEBUG ( glUniform1i ( m_uniforms [ KRENGINE_UNIFORM_RENDER_FRAME ] , 1 ) ) ;
2011-10-25 05:03:10 +00:00
# if defined(DEBUG)
2012-03-15 23:58:37 +00:00
GLint logLength ;
2011-10-25 05:03:10 +00:00
2012-09-20 10:51:28 +00:00
GLint validate_status = GL_FALSE ;
2012-09-13 20:09:19 +00:00
GLDEBUG ( glValidateProgram ( m_iProgram ) ) ;
2012-09-20 10:51:28 +00:00
GLDEBUG ( glGetProgramiv ( m_iProgram , GL_VALIDATE_STATUS , & validate_status ) ) ;
if ( validate_status ! = GL_TRUE ) {
fprintf ( stderr , " KREngine - Failed to validate shader program: %s \n " , m_szKey ) ;
GLDEBUG ( glGetProgramiv ( m_iProgram , GL_INFO_LOG_LENGTH , & logLength ) ) ;
if ( logLength > 0 )
{
GLchar * log = ( GLchar * ) malloc ( logLength ) ;
assert ( log ! = NULL ) ;
GLDEBUG ( glGetProgramInfoLog ( m_iProgram , logLength , & logLength , log ) ) ;
fprintf ( stderr , " Program validate log: \n %s " , log ) ;
free ( log ) ;
}
2012-09-20 09:32:20 +00:00
return false ;
2011-10-25 05:03:10 +00:00
}
2012-02-10 05:48:59 +00:00
# endif
2012-09-20 09:32:20 +00:00
return true ;
2011-10-25 05:03:10 +00:00
}
2012-04-20 01:06:12 +00:00
# endif
2011-10-25 05:03:10 +00:00
GLuint KRShader : : getProgram ( ) {
return m_iProgram ;
}
2012-03-15 20:09:01 +00:00
char * KRShader : : getKey ( ) {
return m_szKey ;
}