1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: demo_DecalTextureProgram.cpp 4 5 Copyright (C)2009-2012 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 46365 $ 14 *---------------------------------------------------------------------------*/ 15 16 #include "demo/ShaderProgram/demo_DecalTextureProgram.h" 17 18 namespace demo 19 { 20 21 /* ------------------------------------------------------------------------ 22 DecalTextureProgram class member function 23 ------------------------------------------------------------------------ */ 24 DecalTextureProgram(void)25 DecalTextureProgram::DecalTextureProgram(void) : 26 ProgramObject(), 27 m_TextureId(0) 28 { 29 InitializeVertexAttributes(); 30 } 31 ~DecalTextureProgram(void)32 DecalTextureProgram::~DecalTextureProgram(void) 33 { 34 Finalize(); 35 } 36 Initialize(const GLuint shaderId)37 bool DecalTextureProgram::Initialize(const GLuint shaderId) 38 { 39 if ( m_Initialized ) 40 { 41 return false; 42 } 43 44 m_ProgramId = glCreateProgram(); 45 46 // Vertex shader 47 m_ShaderIds[0] = shaderId; 48 glAttachShader(m_ProgramId, m_ShaderIds[0]); 49 50 // Fragment shader 51 glAttachShader(m_ProgramId, GL_DMP_FRAGMENT_SHADER_DMP); 52 53 // Bind 54 glBindAttribLocation(m_ProgramId, 0, "aPosition"); 55 glBindAttribLocation(m_ProgramId, 1, "aTexCoord"); 56 57 // Link 58 glLinkProgram(m_ProgramId); 59 60 // Validate 61 GLint param = 0; 62 glValidateProgram(m_ProgramId); 63 glGetProgramiv(m_ProgramId, GL_VALIDATE_STATUS, ¶m); 64 if ( param != GL_TRUE ) 65 { 66 NN_TPANIC_("[DEMO] : GL_VALIDATE_STATUS returned GL_FALSE.\n"); 67 68 return false; 69 } 70 71 ProgramObject::InitializeUniforms(); 72 73 DEMO_ASSERT_GL_ERROR(); 74 75 m_Initialized = true; 76 77 return true; 78 } 79 Finalize(void)80 bool DecalTextureProgram::Finalize(void) 81 { 82 if (! m_Initialized ) 83 { 84 return false; 85 } 86 87 if ( m_ProgramId != 0 ) 88 { 89 glDeleteProgram(m_ProgramId); 90 m_ProgramId = 0; 91 } 92 93 // Vertex shader 94 if ( m_ShaderIds[0] != 0 ) 95 { 96 glDeleteShader(m_ShaderIds[0]); 97 m_ShaderIds[0] = 0; 98 } 99 100 m_Initialized = false; 101 102 return true; 103 } 104 Use(void)105 bool DecalTextureProgram::Use(void) 106 { 107 if (! m_Initialized ) 108 { 109 return false; 110 } 111 112 glUseProgram(m_ProgramId); 113 114 glActiveTexture(GL_TEXTURE0); 115 glBindTexture(GL_TEXTURE_2D, m_TextureId); 116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 117 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 118 119 UpdateModelViewProjectionMatrix(); 120 121 // uniform for reserved fragment shader alpha test 122 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_ALPHA_TEST], GL_FALSE); 123 124 // uniform for reserved fragment shader texture sampler 125 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE0_SAMPLER_TYPE], GL_TEXTURE_2D); 126 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE1_SAMPLER_TYPE], GL_FALSE); 127 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE2_SAMPLER_TYPE], GL_FALSE); 128 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE3_SAMPLER_TYPE], GL_FALSE); 129 130 // uniform for reserved fragment shader texture combiner 131 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_RGB], 132 GL_TEXTURE0, GL_CONSTANT, GL_CONSTANT); 133 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_ALPHA], 134 GL_TEXTURE0, GL_CONSTANT, GL_CONSTANT); 135 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_RGB], 136 GL_SRC_COLOR, GL_SRC_COLOR, GL_SRC_COLOR); 137 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_ALPHA], 138 GL_SRC_ALPHA, GL_SRC_ALPHA, GL_SRC_ALPHA); 139 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_RGB], 140 GL_REPLACE); 141 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_ALPHA], 142 GL_REPLACE); 143 144 return true; 145 } 146 SetTextureId(const GLuint textureId)147 void DecalTextureProgram::SetTextureId(const GLuint textureId) 148 { 149 m_TextureId = textureId; 150 } 151 Update(void)152 void DecalTextureProgram::Update(void) 153 { 154 glBindTexture(GL_TEXTURE_2D, m_TextureId); 155 } 156 InitializeVertexAttributes(void)157 void DecalTextureProgram::InitializeVertexAttributes(void) 158 { 159 m_VertexAttributes = VERTEX_POSITION_ATTRIBUTE | VERTEX_TEXCOORD_ATTRIBUTE; 160 } 161 162 } 163