Test for source code
This is just a test for source code formatting with C++. Dropped in some old code from an OpenGL Project done years ago.
/** * \brief get the ID of the programobject assigned by glCreateProgramObjectARB(); */ unsigned long CgaProgramObject::getID(void) { return m_ulID; }
/****************************************************************************** * File: shader.cpp * Author: Herbert Mehlhose * Description: Shader class * * Copyright (C) 2007 Herbert Mehlhose. All Rights Reserved. * * History: * * File created 28.12.2007 H.Mehlhose * - Add function setUniform() for better shader mgmt 01.01.2007 * - Add vertex attribute location processing in first step 09.01.2008 * - Add new map for storing vertex attribute infos - VAM 01.01.2009 * - Change link function to store vertex attrib locs in new map 03.01.2009 * - Custom Flag now member of vattrib structure 08.01.2009 * ******************************************************************************/ #include <windows.h> #include <stdio.h> #include <sys/stat.h> // for the shader file read #include "glew.h" #include <GL/gl.h> // gl... functions #include "scenemgr.h" #include "glengine.h" #include "glext.h" #include "shader.h" #include "log.h" #include "vector3.h" #include "vector4.h" #include "matrix3.h" #include "matrix4.h" /* extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB; extern PFNGLDELETEOBJECTARBPROC glDeleteObjectARB; extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB; extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB; extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB; extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB; extern PFNGLGETINFOLOGARBPROC glGetInfoLogARB; extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB; extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB; extern PFNGLUNIFORM4FARBPROC glUniform4fARB; extern PFNGLUNIFORM1IARBPROC glUniform1iARB; extern PFNGLUNIFORM1FARBPROC glUniform1fARB; // extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; // HFCM extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; // HFCM pass matrix to shader extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; // HFCM pass matrix to shader extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB; // HFCM extern PFNGLUNIFORM3FVARBPROC glUniform3fvARB; extern PFNGLVERTEXATTRIB4FVARBPROC glVertexAttrib4fvARB; */ /** * \brief CgaProgramObject constructor */ CgaProgramObject::CgaProgramObject() { m_ulID=0xFFFFFFFF; strcpy(m_pszProgName,""); m_bIsLinked=false; m_idx=0; } CgaProgramObject::CgaProgramObject(const char *pszName) { //m_ulID=ulID; strcpy(m_pszProgName,pszName); m_ulID = glCreateProgramObjectARB(); m_bIsLinked=false; m_idx=0; } /** * \brief Program Object destructor */ CgaProgramObject::~CgaProgramObject() { INF(SB<<"Deleting Program Object <b>'"<<m_pszProgName<<"'</b>"); glDeleteObjectARB(m_ulID); VAM.clear(); UM.clear(); } /** * \brief compile and attach a shader */ bool CgaProgramObject::compileAndAttach(unsigned long ulType,const char *pszShaderFilename) { char pszFileDir[128] = "shaders\\"; char pszFilePath[128]; unsigned char *shaderAssembly; const char *pszShaderStrings; GLint bCompileOK; // flag for shader compilation char pszMsg[4096]; // message string INF(SB<<"Compile and attach shader <b>'"<<pszShaderFilename<<"'</b> to program <b>'"<<m_pszProgName<<"'</b>"); strcpy(pszFilePath,pszFileDir); strcat_s(pszFilePath,pszShaderFilename); shaderAssembly = readShaderFile(pszFilePath); if(shaderAssembly==NULL) { ERR(SB<<"Shader Source File <b>'"<<pszFilePath<<"'</b> skipped from compilation"); return false; } SH.push_back(glCreateShaderObjectARB(ulType)); //SH[m_idx]=glCreateShaderObjectARB(ulType); pszShaderStrings=(char*)shaderAssembly; glShaderSourceARB(SH[m_idx],1,&pszShaderStrings,NULL); glCompileShaderARB(SH[m_idx]); SAFE_DELETE(shaderAssembly); glGetObjectParameterivARB(SH[m_idx],GL_OBJECT_COMPILE_STATUS_ARB,&bCompileOK ); if(bCompileOK==false) { glGetInfoLogARB(SH[m_idx],sizeof(pszMsg),NULL,pszMsg); ERR(SB<<"Shader Compile Error: <br>"<<pszMsg); glDeleteObjectARB(SH[m_idx]); return false; } INF(SB<<"Successful compile of Shader: "<<pszShaderFilename<<", handle: "<<(int)SH[m_idx]); // now attach glAttachObjectARB(m_ulID,SH[m_idx]); // check for success??? m_idx++; return true; } /** * \brief attach a shader */ bool CgaProgramObject::link(void) { GLint bLinkOK; // flag for program linkage char pszMsg[4096]; // message string INF(SB<<"Starting link of Shader Program: <b>'"<<m_pszProgName<<"'</b>, handle: "<<m_ulID); glLinkProgramARB(m_ulID); // delete the shader objects that are attached after link is done for(int i=0;i<m_idx;i++) glDeleteObjectARB(SH[i]); SH.clear(); // check the link status glGetObjectParameterivARB(m_ulID,GL_OBJECT_LINK_STATUS_ARB,&bLinkOK); if(bLinkOK==false) { glGetInfoLogARB(m_ulID,sizeof(pszMsg),NULL,pszMsg); ERR(SB<<"Shader Linking Error: "<<pszMsg); return false; } m_bIsLinked=true; INF(SB<<"Successful link of Shader Program: <b>'"<<m_pszProgName<<"'</b>, handle: "<<m_ulID); // 03.01.2009 - fill in vertex attribute locations into VAM map - just query // all attributes DBG1(SB<<"Vertex Attributes in linked programobject "<<m_pszProgName<<": (loc -1 also for builtins)"); for(itVAM=VAM.begin();itVAM!=VAM.end();itVAM++) { (*itVAM).second.nLocation=glGetAttribLocationARB(m_ulID,(*itVAM).second.pszVarName); DBG1(SB<<"Semantic "<<(*itVAM).first<<": Variable="<<(*itVAM).second.pszVarName<<", Loc="<<(*itVAM).second.nLocation); } DBG1(SB<<"Uniforms in linked programobject "<<m_pszProgName<<":"); for(itUM=UM.begin();itUM!=UM.end();itUM++) { (*itUM).second.nLocation=glGetUniformLocationARB(m_ulID,(*itUM).second.pszVarName); DBG1(SB<<"Semantic "<<(*itUM).first<<": Variable="<<(*itUM).second.pszVarName<<", Loc="<<(*itUM).second.nLocation); } itVAM_Work=VAM.begin(); // setup for getNext... itUM_Work=UM.begin(); return true; }