1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: font_TextWriterResource.cpp
4
5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. 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 $Revision: 21076 $
14 *---------------------------------------------------------------------------*/
15
16 #include "precompiled.h"
17
18 #include <GLES2/gl2.h>
19 #include <GLES2/gl2ext.h>
20 #include <nn.h>
21 #include <nw/font/font_TextWriterResource.h>
22 #include <nw/font/font_DispStringBuffer.h>
23 #include <nw/font/font_RectDrawer.h>
24
25 #include <nw/assert.h> // NW_GL_ASSERT用
26
27 #define NW_FONT_TEXENV3 "dmp_TexEnv[3]"
28 #define NW_FONT_TEXENV4 "dmp_TexEnv[4]"
29 #define NW_FONT_TEXENV5 "dmp_TexEnv[5]"
30
31 namespace nw {
32 namespace font {
33
34 namespace
35 {
36
37 int
GetUniformLocation(GLuint programId,const char * name)38 GetUniformLocation(
39 GLuint programId,
40 const char* name
41 )
42 {
43 int result = glGetUniformLocation(programId, name);
44 NN_ASSERT(result != -1);
45 return result;
46 }
47
48 } // namespace
49
TextWriterResource()50 TextWriterResource::TextWriterResource()
51 : m_PosZ(0.f),
52 m_IsInitialized(false)
53 {
54 ResetLoadingTexture(); // m_LoadingTexture
55 }
56
~TextWriterResource()57 TextWriterResource::~TextWriterResource()
58 {
59 Finalize();
60 }
61
62 void
InitResource(const void * shaderBinary,u32 size)63 TextWriterResource::InitResource(
64 const void* shaderBinary,
65 u32 size
66 )
67 {
68 NN_ASSERT(! m_IsInitialized);
69
70 m_ProgramId = glCreateProgram();
71 NN_ASSERT(m_ProgramId != 0);
72
73 GLuint shaderHandle = glCreateShader(GL_VERTEX_SHADER);
74 NN_ASSERT(shaderHandle != 0);
75 glShaderBinary(1, &shaderHandle, GL_PLATFORM_BINARY_DMP, shaderBinary, size);
76
77 glAttachShader(m_ProgramId, shaderHandle);
78
79 glDeleteShader(shaderHandle);
80 glAttachShader(m_ProgramId, GL_DMP_FRAGMENT_SHADER_DMP);
81
82 glBindAttribLocation(m_ProgramId, internal::VERTEX_ATTR_POS, "aPosition");
83 glBindAttribLocation(m_ProgramId, internal::VERTEX_ATTR_POS_Z, "aPositionZ");
84 glBindAttribLocation(m_ProgramId, internal::VERTEX_ATTR_COLOR, "aColor");
85 glBindAttribLocation(m_ProgramId, internal::VERTEX_ATTR_TEXCOORD, "aTexCoord");
86
87 glLinkProgram(m_ProgramId);
88
89 glGenTextures(1, &m_TextureId);
90
91 NW_GL_ASSERT();
92
93 m_UniformLocations[internal::LOC_PROJECTION] =
94 GetUniformLocation(m_ProgramId, "uProjection");
95 m_UniformLocations[internal::LOC_MODELVIEW] =
96 GetUniformLocation(m_ProgramId, "uModelView");
97 m_UniformLocations[internal::LOC_FRAGMENTLIGHTING_ENABLED] =
98 GetUniformLocation(m_ProgramId, "dmp_FragmentLighting.enabled"),
99 m_UniformLocations[internal::LOC_TEXTURE0_SAMPLERTYPE] =
100 GetUniformLocation(m_ProgramId, "dmp_Texture[0].samplerType"),
101 m_UniformLocations[internal::LOC_FOG_MODE] =
102 GetUniformLocation(m_ProgramId, "dmp_Fog.mode");
103 m_UniformLocations[internal::LOC_FRAGOPERATION_ENABLEALPHATEST] =
104 GetUniformLocation(m_ProgramId, "dmp_FragOperation.enableAlphaTest");
105
106 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_SRCRGB ] =
107 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".srcRgb" );
108 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_SRCALPHA ] =
109 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".srcAlpha" );
110 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_OPERANDRGB ] =
111 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".operandRgb" );
112 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_OPERANDALPHA] =
113 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".operandAlpha");
114 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_COMBINERGB ] =
115 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".combineRgb" );
116 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_COMBINEALPHA] =
117 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".combineAlpha");
118 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_SCALERGB ] =
119 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".scaleRgb" );
120 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_SCALEALPHA ] =
121 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".scaleAlpha" );
122 m_TexEnvUniformLocations[internal::TEXENV_3][internal::TCLOC_CONSTRGBA ] =
123 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV3 ".constRgba" );
124
125 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_SRCRGB ] =
126 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".srcRgb" );
127 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_SRCALPHA ] =
128 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".srcAlpha" );
129 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_OPERANDRGB ] =
130 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".operandRgb" );
131 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_OPERANDALPHA] =
132 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".operandAlpha");
133 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_COMBINERGB ] =
134 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".combineRgb" );
135 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_COMBINEALPHA] =
136 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".combineAlpha");
137 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_SCALERGB ] =
138 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".scaleRgb" );
139 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_SCALEALPHA ] =
140 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".scaleAlpha" );
141 m_TexEnvUniformLocations[internal::TEXENV_4][internal::TCLOC_CONSTRGBA ] =
142 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV4 ".constRgba" );
143
144 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_SRCRGB ] =
145 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".srcRgb" );
146 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_SRCALPHA ] =
147 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".srcAlpha" );
148 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_OPERANDRGB ] =
149 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".operandRgb" );
150 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_OPERANDALPHA] =
151 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".operandAlpha");
152 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_COMBINERGB ] =
153 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".combineRgb" );
154 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_COMBINEALPHA] =
155 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".combineAlpha");
156 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_SCALERGB ] =
157 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".scaleRgb" );
158 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_SCALEALPHA ] =
159 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".scaleAlpha" );
160 m_TexEnvUniformLocations[internal::TEXENV_5][internal::TCLOC_CONSTRGBA ] =
161 GetUniformLocation(m_ProgramId, NW_FONT_TEXENV5 ".constRgba" );
162
163 m_IsInitialized = true;
164 }
165
166 void
FinalizeGX()167 TextWriterResource::FinalizeGX()
168 {
169 for (int i = 0; i < internal::VERTEX_ATTR_NUM; ++i)
170 {
171 glDisableVertexAttribArray(i);
172 }
173 }
174
175 void
Finalize()176 TextWriterResource::Finalize()
177 {
178 if (m_IsInitialized)
179 {
180 FinalizeGX();
181 glDeleteTextures(1, &m_TextureId);
182 m_IsInitialized = false;
183
184 glUseProgram(0);
185 glDeleteProgram(m_ProgramId);
186
187 NN_LOG("nw::font::TextWriterResource: delete buffer\n");
188 }
189 }
190
191 void
SetProjectionMtx(const nn::math::MTX44 & mtx) const192 TextWriterResource::SetProjectionMtx(const nn::math::MTX44& mtx) const
193 {
194 NN_ASSERT(m_IsInitialized);
195
196 glUniform4fv(m_UniformLocations[internal::LOC_PROJECTION], 4, mtx.a);
197 }
198
199 void
SetViewMtx(const nn::math::MTX34 & mtx) const200 TextWriterResource::SetViewMtx(const nn::math::MTX34& mtx) const
201 {
202 NN_ASSERT(m_IsInitialized);
203
204 glUniform4fv(m_UniformLocations[internal::LOC_MODELVIEW], 3, mtx.a);
205 }
206
207 void
SetPosZ(f32 posZ)208 TextWriterResource::SetPosZ(f32 posZ)
209 {
210 m_PosZ = posZ;
211 glVertexAttrib1f(internal::VERTEX_ATTR_POS_Z, m_PosZ);
212 }
213
214 } // namespace font
215 } // namespace nw
216