00001 #include "Cg.h"
00002
00003 #include <assert.h>
00004
00005
00006 static CgObjects* g_pCg = NULL;
00007
00008
00009 CgObjects::CgObjects()
00010 {
00011
00012 if (cgGLIsProfileSupported(CG_PROFILE_FP30)) {
00013 printf( "fragment program profile fp30 ... " );
00014 _fragmentProfile = CG_PROFILE_FP30;
00015 }
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 else {
00026 printf( "Fragment programming extensions (GL_ARB_fragment_program or "
00027 "GL_NV_fragment_program) not supported, exiting...\n" );
00028 assert( false );
00029 }
00030
00031 if (cgGLIsProfileSupported(CG_PROFILE_ARBVP1))
00032 _vertexProfile = CG_PROFILE_ARBVP1;
00033 else if (cgGLIsProfileSupported(CG_PROFILE_VP20))
00034 _vertexProfile = CG_PROFILE_VP20;
00035 else {
00036 printf( "Vertex programming extensions (GL_ARB_vertex_program or "
00037 "GL_NV_vertex_program) not supported, exiting...\n" );
00038 assert( false );
00039 }
00040
00041 cgSetErrorCallback(cgErrorCallback);
00042 _shaderContext = cgCreateContext();
00043 }
00044
00045 CgObjects::~CgObjects()
00046 {
00047 }
00048
00049 CGprofile CgObjects::fragmentProfile()
00050 {
00051 return _fragmentProfile;
00052 }
00053 const CGprofile CgObjects::fragmentProfile() const
00054 {
00055 return _fragmentProfile;
00056 }
00057
00058 CGprofile CgObjects::vertexProfile()
00059 {
00060 return _vertexProfile;
00061 }
00062 const CGprofile CgObjects::vertexProfile() const
00063 {
00064 return _vertexProfile;
00065 }
00066
00067 CGcontext CgObjects::shaderContext()
00068 {
00069 return _shaderContext;
00070 }
00071 const CGcontext CgObjects::shaderContext() const
00072 {
00073 return _shaderContext;
00074 }
00075
00076 void CgObjects::cgErrorCallback(void)
00077 {
00078 CGerror LastError = cgGetError();
00079
00080 if(LastError) {
00081 printf( "Cg Error.\n" );
00082 const char *Listing = cgGetLastListing(Cg()->shaderContext());
00083 printf( "\n---------------------------------------------------\n");
00084 printf("%s\n\n", cgGetErrorString(LastError));
00085 printf("%s\n", Listing);
00086 printf("---------------------------------------------------\n");
00087 printf("Cg error, exiting...\n");
00088 assert( false );
00089 }
00090 }
00091
00092 CgObjects* Cg()
00093 {
00094 if (g_pCg == NULL) {
00095 printf( "Initializing Cg ... " );
00096 g_pCg = new CgObjects;
00097 printf( "done.\n" );
00098 }
00099 return g_pCg;
00100 }
00101
00102 void releaseCg()
00103 {
00104 printf( "Destroying Cg Objects ....\n" );
00105 delete g_pCg;
00106 g_pCg = NULL;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115 CgProgram::CgProgram()
00116 {
00117
00118 _Program = NULL;
00119 _Profile = (CGprofile)0xffff;
00120 }
00121
00122 void CgProgram::setFilename( const string &fn )
00123 {
00124 _filename = fn;
00125 }
00126
00127 void CgProgram::initProfile( CGprofile p )
00128 {
00129 _Profile = p;
00130 }
00131
00132
00133 CgProgram::~CgProgram()
00134 {
00135 if (_Program != NULL) {
00136 cgDestroyProgram(_Program);
00137 }
00138 }
00139
00140
00142
00143 void CgProgram::setup()
00144 {
00145 if (_Program != NULL) {
00146 cgDestroyProgram(_Program);
00147 _Program = NULL;
00148 }
00149
00150 _Program = cgCreateProgramFromFile(Cg()->shaderContext(),
00151 CG_SOURCE,
00152 _filename.c_str(),
00153 _Profile, NULL, NULL);
00154 if (_Program == NULL) {
00155 printf( "Could not create program %s\n", _filename.c_str() );
00156 assert( false );
00157 }
00158 cgGLLoadProgram(_Program);
00159 _parameters.erase( _parameters.begin(), _parameters.end() );
00160 }
00161
00162
00164 void CgProgram::enable()
00165 {
00166
00167 cgGLEnableProfile(_Profile);
00168 cgGLBindProgram(_Program);
00169 }
00170
00172 void CgProgram::disable()
00173 {
00174
00175 cgGLDisableProfile( _Profile );
00176 }
00177
00179 CGparameter CgProgram::parameter( const string &var )
00180 {
00181
00182 map<string, CGparameter>::const_iterator it = _parameters.find( var );
00183 if (it != _parameters.end()) {
00184 return (*it).second;
00185 }
00186
00187
00188 CGparameter p = cgGetNamedParameter(_Program, var.c_str() );
00189 if (!p) {
00190 printf( "Unable to retrieve program parameter %s, exiting.\n", var.c_str() );
00191 assert( false );
00192 }
00193 _parameters[var] = p;
00194 return p;
00195 }
00196
00197 void CgProgram::setParameter( const CGparameter &p, int n, const float *v ) const
00198 {
00199 switch( n ) {
00200 case 1:
00201 cgGLSetParameter1fv( p, v );
00202 break;
00203 case 2:
00204 cgGLSetParameter2fv( p, v );
00205 break;
00206 case 3:
00207 cgGLSetParameter3fv( p, v );
00208 break;
00209 case 4:
00210 cgGLSetParameter4fv( p, v );
00211 break;
00212 case 16:
00213 cgGLSetMatrixParameterfr( p, v );
00214 break;
00215 default:
00216 printf( "Illegal parameter length.\n" );
00217 assert( false );
00218 }
00219 }
00220
00221
00222 void CgProgram::setParameter( const string &pname, int n, const float *v )
00223 {
00224 setParameter( parameter(pname), n,v );
00225 }
00226
00227
00228
00229
00230
00231
00232
00233
00234 CgVertexProgram::CgVertexProgram()
00235 {
00236 }
00237
00238 CgVertexProgram::~CgVertexProgram()
00239 {
00240 }
00241
00242
00243 void CgVertexProgram::setup()
00244 {
00245 initProfile( Cg()->vertexProfile() );
00246 CgProgram::setup();
00247 }
00248
00249
00250
00252 void CgVertexProgram::setStateMatrixParameter( const CGparameter &p,
00253 const CGGLenum matrix, const CGGLenum transform ) const
00254 {
00255 cgGLSetStateMatrixParameter( p, matrix, transform );
00256 }
00257
00259 void CgVertexProgram::setStateMatrixParameter( const string &pname,
00260 const CGGLenum matrix, const CGGLenum transform )
00261 {
00262 setStateMatrixParameter( parameter(pname), matrix, transform );
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272 CgFragmentProgram::CgFragmentProgram()
00273 {
00274 }
00275
00276 CgFragmentProgram::~CgFragmentProgram()
00277 {
00278 }
00279
00280
00282
00283 void CgFragmentProgram::setup()
00284 {
00285 initProfile( Cg()->fragmentProfile() );
00286 CgProgram::setup();
00287 _textures.erase( _textures.begin(), _textures.end() );
00288 }
00289
00291 void CgFragmentProgram::enable()
00292 {
00293 CgProgram::enable();
00294
00295 map<CGparameter,GLuint>::const_iterator it = _textures.begin();
00296 while (it != _textures.end()) {
00297 cgGLEnableTextureParameter( (*it).first );
00298 cgGLSetTextureParameter( (*it).first, (*it).second );
00299 it++;
00300 }
00301 }
00302
00304 void CgFragmentProgram::disable()
00305 {
00306
00307 map<CGparameter,GLuint>::const_iterator it = _textures.begin();
00308 while (it != _textures.end()) {
00309 cgGLDisableTextureParameter( (*it).first );
00310 it++;
00311 }
00312
00313 CgProgram::disable();
00314 }
00315
00317 void CgFragmentProgram::bindTexture( const string &var, GLuint T )
00318 {
00319 bindTexture( parameter(var), T );
00320 }
00321
00323 void CgFragmentProgram::bindTexture( const CGparameter &p, GLuint T )
00324 {
00325 _textures[p] = T;
00326 cgGLSetTextureParameter(p, T);
00327 }
00328
00329