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