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, ¶m); 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