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