1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_Utility.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/Utility/demo_Utility.h"
17 
18 namespace demo
19 {
20     /*!
21     @brief If a GL error occurs, the error type is debug output, and NN_TPANIC_function is called.
22     */
23 
PrintGLError(const GLenum errorCode)24     void PrintGLError(const GLenum errorCode)
25     {
26         if ( errorCode != GL_NO_ERROR )
27         {
28             switch ( errorCode )
29             {
30                 case GL_INVALID_ENUM:
31                     NN_TLOG_("GL Error : GL_INVALID_ENUM\n");
32                     break;
33                 case GL_INVALID_VALUE:
34                     NN_TLOG_("GL Error : GL_INVALID_VALUE\n");
35                     break;
36                 case GL_INVALID_OPERATION:
37                     NN_TLOG_("GL Error : GL_INVALID_OPERATION\n");
38                     break;
39                 case GL_OUT_OF_MEMORY:
40                     NN_TLOG_("GL Error : GL_OUT_OF_MEMORY\n");
41                     break;
42                 case GL_INVALID_FRAMEBUFFER_OPERATION:
43                     NN_TLOG_("GL Error : GL_INVALID_FRAMEBUFFER_OPERATION\n");
44                     break;
45                 default:
46                     NN_TLOG_("GL Error : errorCode = 0x%x\n", errorCode);
47                     break;
48             }
49         }
50     }
51 
52     /* ------------------------------------------------------------------------
53         Utility functions
54         ------------------------------------------------------------------------ */
55 
56     s32 s_UniformLocations[MAX_UNIFORM_LOCATIONS_NUM];
57 
InitializeUniforms(const GLuint programId)58     void InitializeUniforms(const GLuint programId)
59     {
60         DEMO_ASSERT_GL_ERROR();
61 
62         for (u32 uniformIndex = 0; uniformIndex < MAX_UNIFORM_LOCATIONS_NUM; uniformIndex++)
63         {
64             s_UniformLocations[uniformIndex] = -1;
65         }
66 
67         // Vertex uniform
68         s_UniformLocations[VERTEX_UNIFORM_PROJECTION] =
69             glGetUniformLocation(programId, "uProjection");
70         s_UniformLocations[VERTEX_UNIFORM_MODELVIEW] =
71             glGetUniformLocation(programId, "uModelView");
72 
73         DEMO_ASSERT_GL_ERROR();
74 
75         // Fragment uniform
76         s_UniformLocations[FRAGMENT_UNIFORM_ALPHA_TEST] =
77             glGetUniformLocation(programId, "dmp_FragOperation.enableAlphaTest");
78 
79         // Fragment uniform : Texture samplerType
80         s_UniformLocations[FRAGMENT_UNIFORM_TEXTURE0_SAMPLER_TYPE] =
81             glGetUniformLocation(programId, "dmp_Texture[0].samplerType");
82         s_UniformLocations[FRAGMENT_UNIFORM_TEXTURE1_SAMPLER_TYPE] =
83             glGetUniformLocation(programId, "dmp_Texture[1].samplerType");
84         s_UniformLocations[FRAGMENT_UNIFORM_TEXTURE2_SAMPLER_TYPE] =
85             glGetUniformLocation(programId, "dmp_Texture[2].samplerType");
86         s_UniformLocations[FRAGMENT_UNIFORM_TEXTURE3_SAMPLER_TYPE] =
87             glGetUniformLocation(programId, "dmp_Texture[3].samplerType");
88 
89         DEMO_ASSERT_GL_ERROR();
90 
91         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_CONFIG] =
92             glGetUniformLocation(programId, "dmp_LightEnv.config");
93         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_CLAMP_HIGHLIGHTS] =
94             glGetUniformLocation(programId, "dmp_LightEnv.clampHighlights");
95         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_LUT_ENABLED_REFL] =
96             glGetUniformLocation(programId, "dmp_LightEnv.lutEnabledRefl");
97 
98         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_LUT_ENABLED_D0] =
99             glGetUniformLocation(programId, "dmp_LightEnv.lutEnabledD0");
100         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_LUT_INPUT_D0] =
101             glGetUniformLocation(programId, "dmp_LightEnv.lutInputD0");
102         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_ABS_LUT_INPUT_D0] =
103             glGetUniformLocation(programId, "dmp_LightEnv.absLutInputD0");
104 
105         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_LUT_ENABLED_D1] =
106             glGetUniformLocation(programId, "dmp_LightEnv.lutEnabledD1");
107         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_LUT_INPUT_D1] =
108             glGetUniformLocation(programId, "dmp_LightEnv.lutInputD1");
109         s_UniformLocations[FRAGMENT_UNIFORM_LIGHT_ENV_ABS_LUT_INPUT_D1] =
110             glGetUniformLocation(programId, "dmp_LightEnv.absLutInputD1");
111 
112         // Fragment uniform : Fragment lighting
113         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHTING_ENABLED] =
114             glGetUniformLocation(programId, "dmp_FragmentLighting.enabled");
115         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHTING_AMBIENT] =
116             glGetUniformLocation(programId, "dmp_FragmentLighting.ambient");
117 
118         DEMO_ASSERT_GL_ERROR();
119 
120         // Fragment uniform : Fragment light0
121         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_ENABLED] =
122             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].enabled");
123         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_AMBIENT] =
124             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].ambient");
125         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_DIFFUSE] =
126             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].diffuse");
127         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_SPECULAR0] =
128             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].specular0");
129         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_SPECULAR1] =
130             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].specular1");
131         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_POSITION] =
132             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].position");
133         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_GEOM_FACTOR0] =
134             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].geomFactor0");
135         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_GEOM_FACTOR1] =
136             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].geomFactor1");
137         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_TWO_SIDE_DIFFUSE] =
138             glGetUniformLocation(programId, "dmp_FragmentLightSource[0].twoSideDiffuse");
139 
140         DEMO_ASSERT_GL_ERROR();
141 
142         // Fragment uniform : Fragment light1
143         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_ENABLED] =
144             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].enabled");
145         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_AMBIENT] =
146             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].ambient");
147         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_DIFFUSE] =
148             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].diffuse");
149         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_SPECULAR0] =
150             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].specular0");
151         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_SPECULAR1] =
152             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].specular1");
153         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_POSITION] =
154             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].position");
155         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_GEOM_FACTOR0] =
156             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].geomFactor0");
157         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_GEOM_FACTOR1] =
158             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].geomFactor1");
159         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_TWO_SIDE_DIFFUSE] =
160             glGetUniformLocation(programId, "dmp_FragmentLightSource[1].twoSideDiffuse");
161 
162         DEMO_ASSERT_GL_ERROR();
163 
164         // Fragment uniform : Fragment light2
165         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_ENABLED] =
166             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].enabled");
167         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_AMBIENT] =
168             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].ambient");
169         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_DIFFUSE] =
170             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].diffuse");
171         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_SPECULAR0] =
172             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].specular0");
173         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_SPECULAR1] =
174             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].specular1");
175         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_POSITION] =
176             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].position");
177         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_GEOM_FACTOR0] =
178             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].geomFactor0");
179         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_GEOM_FACTOR1] =
180             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].geomFactor1");
181         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_TWO_SIDE_DIFFUSE] =
182             glGetUniformLocation(programId, "dmp_FragmentLightSource[2].twoSideDiffuse");
183 
184         DEMO_ASSERT_GL_ERROR();
185 
186         // Fragment uniform : Fragment light3
187         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_ENABLED] =
188             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].enabled");
189         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_AMBIENT] =
190             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].ambient");
191         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_DIFFUSE] =
192             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].diffuse");
193         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_SPECULAR0] =
194             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].specular0");
195         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_SPECULAR1] =
196             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].specular1");
197         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_POSITION] =
198             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].position");
199         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_GEOM_FACTOR0] =
200             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].geomFactor0");
201         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_GEOM_FACTOR1] =
202             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].geomFactor1");
203         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_TWO_SIDE_DIFFUSE] =
204             glGetUniformLocation(programId, "dmp_FragmentLightSource[3].twoSideDiffuse");
205 
206         DEMO_ASSERT_GL_ERROR();
207 
208         // Fragment uniform : Material
209         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_AMBIENT] =
210             glGetUniformLocation(programId, "dmp_FragmentMaterial.ambient");
211         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_DIFFUSE] =
212             glGetUniformLocation(programId, "dmp_FragmentMaterial.diffuse");
213         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SPECULAR0] =
214             glGetUniformLocation(programId, "dmp_FragmentMaterial.specular0");
215         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SPECULAR1] =
216             glGetUniformLocation(programId, "dmp_FragmentMaterial.specular1");
217         s_UniformLocations[FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SAMPLER_D0] =
218             glGetUniformLocation(programId, "dmp_FragmentMaterial.samplerD0");
219 
220         DEMO_ASSERT_GL_ERROR();
221 
222         // Fragment uniform : Texture combiner0
223         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV0_SRC_RGB] =
224             glGetUniformLocation(programId, "dmp_TexEnv[0].srcRgb");
225         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV0_SRC_ALPHA] =
226             glGetUniformLocation(programId, "dmp_TexEnv[0].srcAlpha");
227         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV0_OPERAND_RGB] =
228             glGetUniformLocation(programId, "dmp_TexEnv[0].operandRgb");
229         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV0_OPERAND_ALPHA] =
230             glGetUniformLocation(programId, "dmp_TexEnv[0].operandAlpha");
231         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV0_COMBINE_RGB] =
232             glGetUniformLocation(programId, "dmp_TexEnv[0].combineRgb");
233         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV0_COMBINE_ALPHA] =
234             glGetUniformLocation(programId, "dmp_TexEnv[0].combineAlpha");
235 
236         // Fragment uniform : Texture combiner1
237         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV1_SRC_RGB] =
238             glGetUniformLocation(programId, "dmp_TexEnv[1].srcRgb");
239         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV1_SRC_ALPHA] =
240             glGetUniformLocation(programId, "dmp_TexEnv[1].srcAlpha");
241         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV1_OPERAND_RGB] =
242             glGetUniformLocation(programId, "dmp_TexEnv[1].operandRgb");
243         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV1_OPERAND_ALPHA] =
244             glGetUniformLocation(programId, "dmp_TexEnv[1].operandAlpha");
245         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV1_COMBINE_RGB] =
246             glGetUniformLocation(programId, "dmp_TexEnv[1].combineRgb");
247         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV1_COMBINE_ALPHA] =
248             glGetUniformLocation(programId, "dmp_TexEnv[1].combineAlpha");
249 
250         // Fragment uniform : Texture combiner2
251         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV2_SRC_RGB] =
252             glGetUniformLocation(programId, "dmp_TexEnv[2].srcRgb");
253         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV2_SRC_ALPHA] =
254             glGetUniformLocation(programId, "dmp_TexEnv[2].srcAlpha");
255         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV2_OPERAND_RGB] =
256             glGetUniformLocation(programId, "dmp_TexEnv[2].operandRgb");
257         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV2_OPERAND_ALPHA] =
258             glGetUniformLocation(programId, "dmp_TexEnv[2].operandAlpha");
259         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV2_COMBINE_RGB] =
260             glGetUniformLocation(programId, "dmp_TexEnv[2].combineRgb");
261         s_UniformLocations[FRAGMENT_UNIFORM_TEXENV2_COMBINE_ALPHA] =
262             glGetUniformLocation(programId, "dmp_TexEnv[2].combineAlpha");
263 
264         DEMO_ASSERT_GL_ERROR();
265     }
266 
GetRandomColor(f32 & red,f32 & green,f32 & blue)267     void GetRandomColor(f32& red, f32& green, f32& blue)
268     {
269         static bool s_InitializeRandomSeed = false;
270         if (! s_InitializeRandomSeed )
271         {
272             ::std::srand(0x1234);
273             s_InitializeRandomSeed = true;
274         }
275 
276         red = static_cast<f32>(::std::rand() % 256) / 256.0f;
277         green = static_cast<f32>(::std::rand() % 256) / 256.0f;
278         blue = static_cast<f32>(::std::rand() % 256) / 256.0f;
279     }
280 
281 }
282