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