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