Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

Cg.cpp

Go to the documentation of this file.
00001 #include "Cg.h"
00002 
00003 #include <assert.h>
00004 
00005 
00006 static CgObjects* g_pCg = NULL;
00007 
00008 
00009 CgObjects::CgObjects()
00010 {
00011   // profiles
00012   if (cgGLIsProfileSupported(CG_PROFILE_FP30)) {
00013     printf( "fragment program profile fp30 ... " );
00014     _fragmentProfile = CG_PROFILE_FP30;
00015   }
00016   /*  else if (cgGLIsProfileSupported(CG_PROFILE_FP20)) {
00017     printf( "fragment program profile fp20 ... " );
00018     _fragmentProfile = CG_PROFILE_FP20;
00019   }
00020   else if (cgGLIsProfileSupported(CG_PROFILE_ARBFP1)) {
00021     printf( "fragment program profile arbfp1 ... " );
00022     _fragmentProfile = CG_PROFILE_ARBFP1;
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  *** CgProgram ***
00113  *************************/
00114 
00115 CgProgram::CgProgram()
00116 {
00117   // programs
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   // Use fragment program
00167   cgGLEnableProfile(_Profile);
00168   cgGLBindProgram(_Program);
00169 }
00170 
00172 void CgProgram::disable()
00173 {
00174   // disable profile
00175   cgGLDisableProfile( _Profile );
00176 }
00177 
00179 CGparameter CgProgram::parameter( const string &var )
00180 {
00181   // First try to find parameter in the map
00182   map<string, CGparameter>::const_iterator it = _parameters.find( var );
00183   if (it != _parameters.end()) {
00184     return (*it).second;
00185   }
00186   
00187   // Obtain parameter handle from Cg
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  *** CgVertexProgram ***
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  *** CgFragmentProgram ***
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   // enable textures
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   // disable textures
00307   map<CGparameter,GLuint>::const_iterator it = _textures.begin();
00308   while (it != _textures.end()) {
00309     cgGLDisableTextureParameter( (*it).first );
00310     it++;
00311   }
00312   // disable profile
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 

Generated on Thu Jan 20 02:47:12 2005 for Projective_Texture_Effect_Demo by doxygen 1.3.6