1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: demo_ProgramObject.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/ShaderProgram/demo_ProgramObject.h" 17 18 namespace demo 19 { 20 21 /* ------------------------------------------------------------------------ 22 ProgramObject class member function 23 ------------------------------------------------------------------------ */ 24 ProgramObject(void)25 ProgramObject::ProgramObject(void) : 26 m_Initialized(false), 27 m_VertexAttributes(VERTEX_NONE_ATTRIBUTE), 28 m_Use3d(false), 29 m_ProgramId(0), 30 m_ProjectionMatrix(), m_ModelViewMatrix() 31 { 32 for (u32 shaderIndex = 0; shaderIndex < PROGRAM_OBJECT_MAX_SHADERS; shaderIndex++) 33 { 34 m_ShaderIds[shaderIndex] = 0; 35 } 36 37 for (u32 locationIndex = 0; locationIndex < MAX_UNIFORM_LOCATIONS_NUM; locationIndex++) 38 { 39 m_UniformLocation[locationIndex] = -1; 40 } 41 42 MTX44Identity(&m_ProjectionMatrix); 43 MTX44Identity(&m_ModelViewMatrix); 44 } 45 ~ProgramObject(void)46 ProgramObject::~ProgramObject(void) 47 { 48 } 49 Begin(void)50 bool ProgramObject::Begin(void) 51 { 52 return true; 53 } 54 End(void)55 bool ProgramObject::End(void) 56 { 57 return true; 58 } 59 GetVertexAttributes(void)60 u32 ProgramObject::GetVertexAttributes(void) 61 { 62 return m_VertexAttributes; 63 } 64 SetUse3d(const bool use3d)65 void ProgramObject::SetUse3d(const bool use3d) 66 { 67 m_Use3d = use3d; 68 } 69 SetProjectionMatrix(const nn::math::MTX44 & projectionMatrix)70 void ProgramObject::SetProjectionMatrix(const nn::math::MTX44& projectionMatrix) 71 { 72 m_ProjectionMatrix = projectionMatrix; 73 } 74 SetModelViewMatrix(const nn::math::MTX44 & modelViewMatrix)75 void ProgramObject::SetModelViewMatrix(const nn::math::MTX44& modelViewMatrix) 76 { 77 m_ModelViewMatrix = modelViewMatrix; 78 } 79 SetTextureId(const GLuint textureId)80 void ProgramObject::SetTextureId(const GLuint textureId) 81 { 82 (void)textureId; 83 } 84 Update(void)85 void ProgramObject::Update(void) 86 { 87 } 88 InitializeVertexAttributes(void)89 void ProgramObject::InitializeVertexAttributes(void) 90 { 91 m_VertexAttributes = VERTEX_NONE_ATTRIBUTE; 92 } 93 InitializeUniforms(void)94 void ProgramObject::InitializeUniforms(void) 95 { 96 if ( m_ProgramId == 0 ) 97 { 98 NN_TPANIC_("m_ProgramId is 0.\n"); 99 return; 100 } 101 102 // Vertex shader uniform 103 m_UniformLocation[VERTEX_UNIFORM_PROJECTION] = 104 glGetUniformLocation(m_ProgramId, "uProjection"); 105 m_UniformLocation[VERTEX_UNIFORM_MODELVIEW] = 106 glGetUniformLocation(m_ProgramId, "uModelView"); 107 108 // uniform for reserved fragment shader alpha test 109 m_UniformLocation[FRAGMENT_UNIFORM_ALPHA_TEST] = 110 glGetUniformLocation(m_ProgramId, "dmp_FragOperation.enableAlphaTest"); 111 // uniform for reserved fragment shader texture sampler 112 m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE0_SAMPLER_TYPE] = 113 glGetUniformLocation(m_ProgramId, "dmp_Texture[0].samplerType"); 114 m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE1_SAMPLER_TYPE] = 115 glGetUniformLocation(m_ProgramId, "dmp_Texture[1].samplerType"); 116 m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE2_SAMPLER_TYPE] = 117 glGetUniformLocation(m_ProgramId, "dmp_Texture[2].samplerType"); 118 m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE3_SAMPLER_TYPE] = 119 glGetUniformLocation(m_ProgramId, "dmp_Texture[3].samplerType"); 120 121 // uniform for reserved fragment shader texture combiner 122 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_RGB] = 123 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].srcRgb"); 124 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_ALPHA] = 125 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].srcAlpha"); 126 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_RGB] = 127 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].operandRgb"); 128 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_ALPHA] = 129 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].operandAlpha"); 130 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_RGB] = 131 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].combineRgb"); 132 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_ALPHA] = 133 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].combineAlpha"); 134 m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_CONST_RGBA] = 135 glGetUniformLocation(m_ProgramId, "dmp_TexEnv[2].constRgba"); 136 } 137 UpdateModelViewProjectionMatrix(void)138 void ProgramObject::UpdateModelViewProjectionMatrix(void) 139 { 140 if ( m_ProgramId == 0 ) 141 { 142 NN_TPANIC_("m_ProgramId is 0.\n"); 143 return; 144 } 145 146 if ( m_Use3d ) 147 { 148 glUniformMatrix4fv(m_UniformLocation[VERTEX_UNIFORM_PROJECTION], 149 1, GL_FALSE, static_cast<f32*>(m_ProjectionMatrix)); 150 glUniformMatrix4fv(m_UniformLocation[VERTEX_UNIFORM_MODELVIEW], 151 1, GL_FALSE, static_cast<f32*>(m_ModelViewMatrix)); 152 } 153 else 154 { 155 static bool initArrayFlag = false; 156 static GLfloat projectionArray[16]; 157 static GLfloat modelViewArray[16]; 158 159 if (! initArrayFlag ) 160 { 161 for (u32 i = 0; i < 4; i++) 162 { 163 for (u32 j = 0; j < 4; j++) 164 { 165 if ( i == j ) 166 { 167 projectionArray[4 * i + j] = 1.0f; 168 modelViewArray[4 * i + j] = 1.0f; 169 } 170 else 171 { 172 projectionArray[4 * i + j] = 0.0f; 173 modelViewArray[4 * i + j] = 0.0f; 174 } 175 } 176 } 177 178 initArrayFlag = true; 179 } 180 181 glUniformMatrix4fv(m_UniformLocation[VERTEX_UNIFORM_PROJECTION], 182 1, GL_FALSE, projectionArray); 183 glUniformMatrix4fv(m_UniformLocation[VERTEX_UNIFORM_MODELVIEW], 184 1, GL_FALSE, modelViewArray); 185 } 186 } 187 188 } 189