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, &param);
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