1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_Utility.h
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 #ifndef DEMO_UTILITY_H_
17 #define DEMO_UTILITY_H_
18 
19 #include <cstdio>
20 #include <cstdlib>
21 
22 #include <nn/types.h>
23 #include <nn/assert.h>
24 #include <nn/util/util_NonCopyable.h>
25 
26 #include <nn/fnd/fnd_ExpHeap.h>
27 
28 #include <nn/os/os_MemoryTypes.h>
29 
30 #include <nn/gx.h>
31 #include <GLES2/gl2.h>
32 #include <GLES2/gl2ext.h>
33 
34 #include <nn/gx/CTR/gx_CTR.h>
35 #include <nn/gx/CTR/gx_Lcd.h>
36 
37 #include <nn/math.h>
38 
39 #include <nn/applet.h>
40 
41 namespace demo
42 {
43     /* Please see man pages for details
44 
45 
46 
47     */
48 
49     const f32 DISPLAY0_ASPECT = static_cast<f32>(nn::gx::CTR::DISPLAY0_HEIGHT) / static_cast<f32>(nn::gx::CTR::DISPLAY0_WIDTH);
50     const f32 DISPLAY1_ASPECT = static_cast<f32>(nn::gx::CTR::DISPLAY1_HEIGHT) / static_cast<f32>(nn::gx::CTR::DISPLAY1_WIDTH);
51 
52     /* Please see man pages for details
53 
54 
55 
56     */
57 
58     void PrintGLError(const GLenum errorCode);
59 
60     /* Please see man pages for details
61 
62 
63 
64     */
65 
66 #define DEMO_ASSERT_GL_ERROR()            \
67     {                                     \
68        GLenum errorCode = glGetError();   \
69        if ( errorCode != GL_NO_ERROR )    \
70        {                                  \
71            demo::PrintGLError(errorCode); \
72            NN_TPANIC_("\n");             \
73        }                                  \
74     }
75 
76 #define DEMO_FORCE_LINK_APPLET_LIB()               \
77     {                                              \
78         volatile bool initialized;                 \
79         initialized = nn::applet::IsInitialized(); \
80     }
81 
82     /* Please see man pages for details
83 
84 
85 
86     */
87 
88     enum
89     {
90         // Vertex uniform
91         VERTEX_UNIFORM_PROJECTION = 0,
92         VERTEX_UNIFORM_MODELVIEW,
93         // Fragment uniform
94         FRAGMENT_UNIFORM_ALPHA_TEST,
95         // Fragment uniform : Texture samplerType
96         FRAGMENT_UNIFORM_TEXTURE0_SAMPLER_TYPE,
97         FRAGMENT_UNIFORM_TEXTURE1_SAMPLER_TYPE,
98         FRAGMENT_UNIFORM_TEXTURE2_SAMPLER_TYPE,
99         FRAGMENT_UNIFORM_TEXTURE3_SAMPLER_TYPE,
100         // LightEnv
101         FRAGMENT_UNIFORM_LIGHT_ENV_CONFIG,
102         FRAGMENT_UNIFORM_LIGHT_ENV_CLAMP_HIGHLIGHTS,
103         FRAGMENT_UNIFORM_LIGHT_ENV_LUT_ENABLED_REFL,
104         // D0
105         FRAGMENT_UNIFORM_LIGHT_ENV_LUT_ENABLED_D0,
106         FRAGMENT_UNIFORM_LIGHT_ENV_LUT_INPUT_D0,
107         FRAGMENT_UNIFORM_LIGHT_ENV_ABS_LUT_INPUT_D0,
108         // D1
109         FRAGMENT_UNIFORM_LIGHT_ENV_LUT_ENABLED_D1,
110         FRAGMENT_UNIFORM_LIGHT_ENV_LUT_INPUT_D1,
111         FRAGMENT_UNIFORM_LIGHT_ENV_ABS_LUT_INPUT_D1,
112         // Fragment uniform : Fragment lighting
113         FRAGMENT_UNIFORM_FRAGMENT_LIGHTING_ENABLED,
114         FRAGMENT_UNIFORM_FRAGMENT_LIGHTING_AMBIENT,
115         // Fragment uniform : Fragment light0
116         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_ENABLED,
117         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_AMBIENT,
118         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_DIFFUSE,
119         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_SPECULAR0,
120         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_SPECULAR1,
121         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_POSITION,
122         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_GEOM_FACTOR0,
123         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_GEOM_FACTOR1,
124         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE0_TWO_SIDE_DIFFUSE,
125         // Fragment uniform : Fragment light1
126         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_ENABLED,
127         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_AMBIENT,
128         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_DIFFUSE,
129         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_SPECULAR0,
130         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_SPECULAR1,
131         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_POSITION,
132         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_GEOM_FACTOR0,
133         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_GEOM_FACTOR1,
134         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE1_TWO_SIDE_DIFFUSE,
135         // Fragment uniform : Fragment light2
136         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_ENABLED,
137         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_AMBIENT,
138         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_DIFFUSE,
139         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_SPECULAR0,
140         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_SPECULAR1,
141         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_POSITION,
142         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_GEOM_FACTOR0,
143         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_GEOM_FACTOR1,
144         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE2_TWO_SIDE_DIFFUSE,
145         // Fragment uniform : Fragment light3
146         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_ENABLED,
147         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_AMBIENT,
148         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_DIFFUSE,
149         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_SPECULAR0,
150         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_SPECULAR1,
151         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_POSITION,
152         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_GEOM_FACTOR0,
153         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_GEOM_FACTOR1,
154         FRAGMENT_UNIFORM_FRAGMENT_LIGHT_SOURCE3_TWO_SIDE_DIFFUSE,
155         // Fragment uniform : Material
156         FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_AMBIENT,
157         FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_DIFFUSE,
158         FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SPECULAR0,
159         FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SPECULAR1,
160         FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SAMPLER_D0,
161         FRAGMENT_UNIFORM_FRAGMENT_MATERIAL_SAMPLER_D1,
162         // Fragment uniform : Texture combiner0
163         FRAGMENT_UNIFORM_TEXENV0_SRC_RGB,
164         FRAGMENT_UNIFORM_TEXENV0_SRC_ALPHA,
165         FRAGMENT_UNIFORM_TEXENV0_OPERAND_RGB,
166         FRAGMENT_UNIFORM_TEXENV0_OPERAND_ALPHA,
167         FRAGMENT_UNIFORM_TEXENV0_COMBINE_RGB,
168         FRAGMENT_UNIFORM_TEXENV0_COMBINE_ALPHA,
169         FRAGMENT_UNIFORM_TEXENV0_CONST_RGBA,
170         // Fragment uniform : Texture combiner1
171         FRAGMENT_UNIFORM_TEXENV1_SRC_RGB,
172         FRAGMENT_UNIFORM_TEXENV1_SRC_ALPHA,
173         FRAGMENT_UNIFORM_TEXENV1_OPERAND_RGB,
174         FRAGMENT_UNIFORM_TEXENV1_OPERAND_ALPHA,
175         FRAGMENT_UNIFORM_TEXENV1_COMBINE_RGB,
176         FRAGMENT_UNIFORM_TEXENV1_COMBINE_ALPHA,
177         FRAGMENT_UNIFORM_TEXENV1_CONST_RGBA,
178         // Fragment uniform : Texture combiner2
179         FRAGMENT_UNIFORM_TEXENV2_SRC_RGB,
180         FRAGMENT_UNIFORM_TEXENV2_SRC_ALPHA,
181         FRAGMENT_UNIFORM_TEXENV2_OPERAND_RGB,
182         FRAGMENT_UNIFORM_TEXENV2_OPERAND_ALPHA,
183         FRAGMENT_UNIFORM_TEXENV2_COMBINE_RGB,
184         FRAGMENT_UNIFORM_TEXENV2_COMBINE_ALPHA,
185         FRAGMENT_UNIFORM_TEXENV2_CONST_RGBA,
186         // Max uniform locations num
187         MAX_UNIFORM_LOCATIONS_NUM
188     };
189 
190     /* Please see man pages for details
191 
192 
193 
194     */
195     extern s32 s_UniformLocations[MAX_UNIFORM_LOCATIONS_NUM];
196 
197     /* Please see man pages for details
198 
199 
200 
201     */
202     void InitializeUniforms(const GLuint programId);
203 
204     /* Please see man pages for details
205 
206 
207 
208     */
209     void GetRandomColor(f32& red, f32& green, f32& blue);
210 }
211 
212 #endif
213