void ShaderImpl::initialize(CL_GraphicContext &p_gc) { G_ASSERT(!m_initialized); CL_ResourceManager *resMgr = Gfx::Stage::getResourceManager(); m_program = CL_ProgramObject(p_gc); // load vertex shader const CL_String &vertShaderName = m_parent->getVertexShaderResourceName(); m_vertShader = CL_ShaderObject::load(p_gc, vertShaderName, resMgr); m_program.attach(m_vertShader); // load fragment shader const CL_String &fragShaderName = m_parent->getFragmentShaderResourceName(); m_fragShader = CL_ShaderObject::load(p_gc, fragShaderName, resMgr); m_program.attach(m_fragShader); // bind common attributes m_program.bind_attribute_location(CL_PRIARR_VERTS, "Position"); m_program.bind_attribute_location(CL_PRIARR_COLORS, "Color0"); m_program.bind_attribute_location(CL_PRIARR_TEXCOORDS, "TexCoord0"); // link the program if (!m_program.link()) { m_program.detach(m_vertShader); m_program.detach(m_fragShader); throw CL_Exception( cl_format( "error linking shader %1, %2: %3", vertShaderName, fragShaderName, m_program.get_info_log() ) ); } // build frame buffer m_frameBuffer = CL_FrameBuffer(p_gc); // build quad m_quad = CL_PrimitivesArray(p_gc); m_quad.set_attributes(CL_PRIARR_VERTS, m_quadVerts); m_quad.set_attributes(CL_PRIARR_COLORS, QUAD_COLORS); m_quad.set_attributes(CL_PRIARR_TEXCOORDS, QUAD_TEX_COORDS); m_initialized = true; }
void ShaderImpl::destroy() { G_ASSERT(m_initialized); m_quad = CL_PrimitivesArray(); m_frameBuffer = CL_FrameBuffer(); m_program.detach(m_vertShader); m_program.detach(m_fragShader); m_vertShader = CL_ShaderObject(); m_fragShader = CL_ShaderObject(); m_program = CL_ProgramObject(); m_initialized = false; }