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;
}