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