1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_ColorFillProgram.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_ColorFillProgram.h"
17 
18 namespace demo
19 {
20 
21 /* ------------------------------------------------------------------------
22         ColorFillProgram class  member function
23    ------------------------------------------------------------------------ */
24 
ColorFillProgram(void)25     ColorFillProgram::ColorFillProgram(void) :
26     ProgramObject()
27     {
28         InitializeVertexAttributes();
29     }
30 
~ColorFillProgram(void)31     ColorFillProgram::~ColorFillProgram(void)
32     {
33         Finalize();
34     }
35 
Initialize(const GLuint shaderId)36     bool ColorFillProgram::Initialize(const GLuint shaderId)
37     {
38         if ( m_Initialized )
39         {
40             return false;
41         }
42 
43         m_ProgramId = glCreateProgram();
44 
45         // Vertex shader
46         m_ShaderIds[0] = shaderId;
47         glAttachShader(m_ProgramId, m_ShaderIds[0]);
48 
49         // Fragment shader
50         glAttachShader(m_ProgramId, GL_DMP_FRAGMENT_SHADER_DMP);
51 
52         // Bind
53         glBindAttribLocation(m_ProgramId, 0, "aPosition");
54         glBindAttribLocation(m_ProgramId, 1, "aColor");
55 
56         // Link
57         glLinkProgram(m_ProgramId);
58 
59         // Validate
60         GLint param = 0;
61         glValidateProgram(m_ProgramId);
62         glGetProgramiv(m_ProgramId, GL_VALIDATE_STATUS, &param);
63         if ( param != GL_TRUE )
64         {
65             NN_TPANIC_("GL_VALIDATE_STATUS returned GL_FALSE.\n");
66 
67             return false;
68         }
69 
70         ProgramObject::InitializeUniforms();
71         DEMO_ASSERT_GL_ERROR();
72 
73         m_Initialized = true;
74 
75         return true;
76     }
77 
Finalize(void)78     bool ColorFillProgram::Finalize(void)
79     {
80         if (! m_Initialized )
81         {
82             return false;
83         }
84 
85         if ( m_ProgramId != 0 )
86         {
87             glDeleteProgram(m_ProgramId);
88             m_ProgramId = 0;
89         }
90 
91         // Vertex shader
92         if ( m_ShaderIds[0] != 0 )
93         {
94             glDeleteShader(m_ShaderIds[0]);
95             m_ShaderIds[0] = 0;
96         }
97 
98         m_Initialized = false;
99 
100         return true;
101     }
102 
Use(void)103     bool ColorFillProgram::Use(void)
104     {
105         if (! m_Initialized )
106         {
107             return false;
108         }
109 
110         glUseProgram(m_ProgramId);
111         glBindTexture(GL_TEXTURE_2D, 0);
112 
113         UpdateModelViewProjectionMatrix();
114 
115         // uniform for reserved fragment shader alpha test
116         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_ALPHA_TEST], GL_FALSE);
117 
118         // uniform for reserved fragment shader texture sampler
119         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE0_SAMPLER_TYPE], GL_FALSE);
120         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE1_SAMPLER_TYPE], GL_FALSE);
121         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE2_SAMPLER_TYPE], GL_FALSE);
122         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXTURE3_SAMPLER_TYPE], GL_FALSE);
123 
124         // uniform for reserved fragment shader texture combiner
125         glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_RGB],
126             GL_PRIMARY_COLOR, GL_PREVIOUS, GL_PREVIOUS);
127         glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_SRC_ALPHA],
128             GL_PRIMARY_COLOR, GL_PREVIOUS, GL_PREVIOUS);
129         glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_RGB],
130             GL_SRC_COLOR, GL_SRC_COLOR, GL_SRC_COLOR);
131         glUniform3i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_OPERAND_ALPHA],
132             GL_SRC_ALPHA, GL_SRC_ALPHA, GL_SRC_ALPHA);
133         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_RGB],
134             GL_REPLACE);
135         glUniform1i(m_UniformLocation[FRAGMENT_UNIFORM_TEXENV2_COMBINE_ALPHA],
136             GL_REPLACE);
137 
138         return true;
139     }
140 
InitializeVertexAttributes(void)141     void ColorFillProgram::InitializeVertexAttributes(void)
142     {
143         m_VertexAttributes = VERTEX_POSITION_ATTRIBUTE | VERTEX_COLOR_ATTRIBUTE;
144     }
145 
146 }
147