1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: demo_FontProgram.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_FontProgram.h" 17 18 namespace demo 19 { 20 21 extern u64 demoFontBitmap[]; 22 23 /* ------------------------------------------------------------------------ 24 FontProgram class member function 25 ------------------------------------------------------------------------ */ 26 FontProgram(void)27 FontProgram::FontProgram(void) : 28 ProgramObject(), 29 m_FontTextureId(0) 30 { 31 InitializeVertexAttributes(); 32 } 33 ~FontProgram(void)34 FontProgram::~FontProgram(void) 35 { 36 Finalize(); 37 } 38 Initialize(const GLuint shaderId)39 bool FontProgram::Initialize(const GLuint shaderId) 40 { 41 if ( m_Initialized ) 42 { 43 return false; 44 } 45 46 m_ProgramId = glCreateProgram(); 47 48 // Vertex shader 49 m_ShaderIds[0] = shaderId; 50 glAttachShader(m_ProgramId, m_ShaderIds[0]); 51 52 // Fragment shader 53 glAttachShader(m_ProgramId, GL_DMP_FRAGMENT_SHADER_DMP); 54 55 // Bind 56 glBindAttribLocation(m_ProgramId, 0, "aPosition"); 57 glBindAttribLocation(m_ProgramId, 1, "aColor"); 58 glBindAttribLocation(m_ProgramId, 2, "aTexCoord"); 59 60 // Link 61 glLinkProgram(m_ProgramId); 62 63 // Validate 64 GLint param = 0; 65 glValidateProgram(m_ProgramId); 66 glGetProgramiv(m_ProgramId, GL_VALIDATE_STATUS, ¶m); 67 if ( param != GL_TRUE ) 68 { 69 NN_TPANIC_("[DEMO] : GL_VALIDATE_STATUS returned GL_FALSE.\n"); 70 71 return false; 72 } 73 74 DEMO_ASSERT_GL_ERROR(); 75 76 InitializeFontTexture(); 77 DEMO_ASSERT_GL_ERROR(); 78 79 ProgramObject::InitializeUniforms(); 80 DEMO_ASSERT_GL_ERROR(); 81 82 m_Initialized = true; 83 84 return true; 85 } 86 Finalize(void)87 bool FontProgram::Finalize(void) 88 { 89 if (! m_Initialized ) 90 { 91 return false; 92 } 93 94 if ( m_ProgramId != 0 ) 95 { 96 glDeleteProgram(m_ProgramId); 97 m_ProgramId = 0; 98 } 99 100 // Vertex shader 101 if ( m_ShaderIds[0] != 0 ) 102 { 103 glDeleteShader(m_ShaderIds[0]); 104 m_ShaderIds[0] = 0; 105 } 106 107 if ( m_FontTextureId != 0 ) 108 { 109 glDeleteTextures(1, &m_FontTextureId); 110 m_FontTextureId = 0; 111 } 112 113 m_Initialized = false; 114 115 return true; 116 } 117 Begin(void)118 bool FontProgram::Begin(void) 119 { 120 glEnable(GL_BLEND); 121 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 122 glBlendEquation(GL_FUNC_ADD); 123 124 glDisable(GL_CULL_FACE); 125 glDisable(GL_COLOR_LOGIC_OP); 126 127 return true; 128 } 129 Use(void)130 bool FontProgram::Use(void) 131 { 132 if (! m_Initialized ) 133 { 134 return false; 135 } 136 137 static bool initArrayFlag = false; 138 static GLfloat fontColor[4]; 139 if (! initArrayFlag ) 140 { 141 fontColor[0] = 1.0f; 142 fontColor[1] = 1.0f; 143 fontColor[2] = 1.0f; 144 fontColor[3] = 1.0f; 145 146 initArrayFlag = true; 147 } 148 149 glUseProgram(m_ProgramId); 150 151 glActiveTexture(GL_TEXTURE0); 152 glBindTexture(GL_TEXTURE_2D, m_FontTextureId); 153 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 154 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 155 156 UpdateModelViewProjectionMatrix(); 157 158 // uniform for reserved fragment shader alpha test 159 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_ALPHA_TEST], GL_FALSE); 160 161 // uniform for reserved fragment shader texture sampler 162 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE0_SAMPLER_TYPE], GL_TEXTURE_2D); 163 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE1_SAMPLER_TYPE], GL_FALSE); 164 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE2_SAMPLER_TYPE], GL_FALSE); 165 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE3_SAMPLER_TYPE], GL_FALSE); 166 167 // uniform for reserved fragment shader texture combiner 168 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_RGB], 169 GL_TEXTURE0, GL_PRIMARY_COLOR, GL_CONSTANT); 170 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_ALPHA], 171 GL_TEXTURE0, GL_PRIMARY_COLOR, GL_CONSTANT); 172 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_RGB], 173 GL_SRC_COLOR, GL_SRC_COLOR, GL_SRC_COLOR); 174 glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_ALPHA], 175 GL_SRC_ALPHA, GL_SRC_ALPHA, GL_SRC_ALPHA); 176 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_RGB], 177 GL_MODULATE); 178 glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_ALPHA], 179 GL_MODULATE); 180 glUniform4fv(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_CONST_RGBA], 181 1, fontColor); 182 183 glEnable(GL_BLEND); 184 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 185 glBlendEquation(GL_FUNC_ADD); 186 187 return true; 188 } 189 End(void)190 bool FontProgram::End(void) 191 { 192 glDisable(GL_BLEND); 193 194 return true; 195 } 196 InitializeVertexAttributes(void)197 void FontProgram::InitializeVertexAttributes(void) 198 { 199 m_VertexAttributes = VERTEX_POSITION_ATTRIBUTE | VERTEX_COLOR_ATTRIBUTE | VERTEX_TEXCOORD_ATTRIBUTE; 200 } 201 InitializeFontTexture(void)202 void FontProgram::InitializeFontTexture(void) 203 { 204 static u8 fontBitmap[64 * 128 * 2]; 205 206 glGenTextures(1, &m_FontTextureId); 207 208 glActiveTexture(GL_TEXTURE0); 209 glBindTexture(GL_TEXTURE_2D, m_FontTextureId); 210 211 u32 offset = 0; 212 u32 offsetDst = 0; 213 214 for (u32 i = 0; i < 128; i++) 215 { 216 for (u32 j = 0; j < 8; j++) 217 { 218 u64 pixels = (*(demoFontBitmap + offset)); 219 220 for (u32 k = 0; k < 8; k++) 221 { 222 (*(fontBitmap + offsetDst)) = static_cast<u8>(pixels >> (64 - (8 - k) * 8)); 223 (*(fontBitmap + offsetDst + 1)) = static_cast<u8>(pixels >> (64 - (8 - k)*8)); 224 offsetDst += 2; 225 } 226 227 offset++; 228 } 229 } 230 231 glTexImage2D(GL_TEXTURE_2D, 0, 232 GL_LUMINANCE_ALPHA, 233 64, 128, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 234 fontBitmap); 235 } 236 237 } 238