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