#include "ShaderProgram.h" #include "Matrix4x4.h" using namespace std; namespace CHCDemoEngine { ShaderProgram::ShaderProgram(CGcontext context, const std::string &filename, CGprofile profile, const std::string &functionName) { mProgram = cgCreateProgramFromFile(context, CG_SOURCE, filename.c_str(), profile, functionName.c_str(), NULL); if (mProgram) cgGLLoadProgram(mProgram); } CGparameter ShaderProgram::GetOrCreateParameter(const string &name) { CGparameter p; CGParameterMap::const_iterator it = mParamHash.find(name); if (it == mParamHash.end()) { p = cgGetNamedParameter(mProgram, name.c_str()); mParamHash[name] = p; } else { p = (*it).second; } //cout << "name: " << name << " " << p << " " << mProgram << endl; return p; } void ShaderProgram::SetValue1f(const string &name, float val) { cgGLSetParameter1f(GetOrCreateParameter(name), val); } void ShaderProgram::SetValue2f(const string &name, float val1, float val2) { cgGLSetParameter2f(GetOrCreateParameter(name), val1, val2); } void ShaderProgram::SetValue3f(const string &name, float val1, float val2, float val3) { cgGLSetParameter3f(GetOrCreateParameter(name), val1, val2, val3); } void ShaderProgram::SetArray1f(const string &name, float *vals, int numElements) { cgGLSetParameterArray1f(GetOrCreateParameter(name), 0, numElements, (const float *)vals); } void ShaderProgram::SetArray2f(const string &name, float *vals, int numElements) { cgGLSetParameterArray2f(GetOrCreateParameter(name), 0, numElements, (const float *)vals); } void ShaderProgram::SetArray3f(const string &name, float *vals, int numElements) { cgGLSetParameterArray3f(GetOrCreateParameter(name), 0, numElements, (const float *)vals); } void ShaderProgram::SetMatrix(const string &name, const Matrix4x4 &mat) { cgGLSetMatrixParameterfc(GetOrCreateParameter(name), (const float *)mat.x); } void ShaderProgram::SetTexture(const string &name, unsigned int tex) { CGparameter p = GetOrCreateParameter(name); cgGLSetTextureParameter(p, tex); cgGLEnableTextureParameter(p); mTextureParams.push_back(p); } void ShaderProgram::Bind() { cgGLBindProgram(mProgram); // enable all texture parameters CGParameterArray::const_iterator it, it_end = mTextureParams.end(); for (it = mTextureParams.begin(); it != it_end; ++ it) cgGLEnableTextureParameter(*it); } /* void ShaderProgram::Release() { CGParameterArray::const_iterator it, it_end = mTextureParams.end(); // disable all texture parameters for (it = mTextureParams.begin(); it != it_end; ++ it) cgGLDisableTextureParameter(*it); } */ } // namespace