static bool AddTechnique(JSON &json, CGtechnique technique, UniformsMap &uniformRemapping) { bool success = true; const char * const techniqueName = cgGetTechniqueName(technique); if (sVerbose) { puts(techniqueName); } json.AddArray(techniqueName); CGpass pass = cgGetFirstPass(technique); if (NULL == pass) { success = false; } while (NULL != pass) { success &= AddPass(technique, json, pass, uniformRemapping); pass = cgGetNextPass(pass); } json.CloseArray(); // techniqueName return success; }
cgfxTechnique::cgfxTechnique( CGtechnique technique, const cgfxProfile* profile ) : fTechnique( technique), fValid(false), fPasses(NULL), fNumPasses(0), fNext(NULL) { if (technique) { fName = cgGetTechniqueName(technique); CGpass pass = cgGetFirstPass(technique); cgfxPass** nextPass = &fPasses; while (pass) { ++fNumPasses; *nextPass = new cgfxPass(pass, profile); nextPass = &(*nextPass)->fNext; pass = cgGetNextPass(pass); } fHasBlending = hasBlending(fTechnique); setProfile(profile); } }
void CgEffect::SetTechniqueByName(const char* name) { CGtechnique tech = cgGetFirstTechnique(effect); while(tech) { if(!strcmp(cgGetTechniqueName(tech), name)) break; tech = cgGetNextTechnique(tech); } this->activeTechnique = tech; }
bool cEffect::Init(const std::string &lacNameId, const std::string &lacFile) { //Initialization of the class atributes macFile = lacFile; macLastTechnique = ""; mEffect = NULL; mTechnique = NULL; mCurrentPass = NULL; mbLoaded = false; //Loading of the effect CGcontext lCGContext = cEffectManager::Get().GetCGContext(); mEffect = cgCreateEffectFromFile(lCGContext, lacFile.c_str(), NULL); if (!mEffect) { OutputDebugString("Unable to create effect\n"); const char *lacListing = cgGetLastListing(lCGContext); if (lacListing) { char lacBuffer[512]; sprintf(lacBuffer, "%s\n", lacListing); OutputDebugString(lacBuffer); } return false; } // Check if the techniques are valid CGtechnique lTechnique = cgGetFirstTechnique(mEffect); while (lTechnique) { if (cgValidateTechnique(lTechnique) == CG_FALSE) { char lacBuffer[512]; sprintf(lacBuffer, "Technique %s did not validate. Skipping. \n", cgGetTechniqueName(lTechnique)); OutputDebugString( lacBuffer ); const char *lacListing = cgGetLastListing(lCGContext); if (lacListing) { char lacBuffer[512]; sprintf(lacBuffer, "%s\n", lacListing); OutputDebugString(lacBuffer); } } lTechnique = cgGetNextTechnique(lTechnique); } mbLoaded = true; return true; }
static bool AddPass(CGtechnique technique, JSON &json, CGpass pass, UniformsMap &uniformRemapping) { bool success = true; json.AddObject(NULL); const char * const passName = cgGetPassName(pass); if (NULL != passName) { json.AddString("name", passName); } bool firstParameter = true; #if CG_VERSION_NUM >= 3000 const int CG_NUMBER_OF_DOMAINS = (CG_TESSELLATION_EVALUATION_DOMAIN + 1); #endif for (int domain = CG_FIRST_DOMAIN; domain < CG_NUMBER_OF_DOMAINS; domain++) { const CGprogram program = cgGetPassProgram(pass, (CGdomain)domain); if (NULL != program) { const char * const programString = cgGetProgramString(program, CG_COMPILED_PROGRAM); CGparameter param = cgGetFirstParameter(program, CG_GLOBAL); while (NULL != param) { if (cgIsParameterUsed(param, program) && CG_UNIFORM == cgGetParameterVariability(param)) { if (firstParameter) { firstParameter = false; json.AddArray("parameters", true); json.BeginData(true); } const char * const paramName = cgGetParameterName(param); AddMappedParameter(json, paramName, programString, uniformRemapping); } param = cgGetNextParameter(param); } param = cgGetFirstParameter(program, CG_PROGRAM); while (NULL != param) { if (cgIsParameterUsed(param, program) && CG_UNIFORM == cgGetParameterVariability(param)) { if (firstParameter) { firstParameter = false; json.AddArray("parameters", true); json.BeginData(true); } const char * const paramName = cgGetParameterName(param); AddMappedParameter(json, paramName, programString, uniformRemapping); } param = cgGetNextParameter(param); } } } if (!firstParameter) { json.EndData(); json.CloseArray(true); // parameters } json.AddArray("semantics", true); json.BeginData(true); CGprogram vertexProgram = cgGetPassProgram(pass, CG_VERTEX_DOMAIN); CGparameter vertexInputParameter = cgGetFirstLeafParameter(vertexProgram, CG_PROGRAM); while (NULL != vertexInputParameter) { const CGenum variability = cgGetParameterVariability(vertexInputParameter); if (CG_VARYING == variability) { const CGenum direction = cgGetParameterDirection(vertexInputParameter); if (CG_IN == direction || CG_INOUT == direction) { const char * const semantic = cgGetParameterSemantic(vertexInputParameter); json.AddData(semantic, strlen(semantic)); } } vertexInputParameter = cgGetNextLeafParameter(vertexInputParameter); } json.EndData(); json.CloseArray(true); // semantics json.AddObject("states"); CGstateassignment state = cgGetFirstStateAssignment(pass); if (NULL != state) { do { success &= AddState(json, state); state = cgGetNextStateAssignment(state); } while (NULL != state); } json.CloseObject(); // states json.AddArray("programs", true); json.BeginData(true); for (int domain = CG_FIRST_DOMAIN; domain < CG_NUMBER_OF_DOMAINS; domain++) { const CGprogram program = cgGetPassProgram(pass, (CGdomain)domain); if (NULL != program) { const char * const entryPoint = cgGetProgramString(program, CG_PROGRAM_ENTRY); json.AddData(entryPoint, strlen(entryPoint)); } else if (domain == CG_VERTEX_DOMAIN) { ErrorMessage("%s : No vertex program.", cgGetTechniqueName(technique)); success = false; } else if(domain == CG_FRAGMENT_DOMAIN) { ErrorMessage("%s : No fragment program.", cgGetTechniqueName(technique)); success = false; } } json.EndData(); json.CloseArray(true); // programs json.CloseObject(); // pass return success; }
bool CgFXTechnique::validate(CgFXMaterial *pMat, DrawEnv *pEnv) { if(0x00 == (_uiValidationState & ValidationTried)) { #if 0 fprintf(stderr, "Validate %p\n", _pCGTechnique); #endif _uiValidationState = 0x03; #if 0 if(pWin != NULL) { pWin->activate(); } #endif if(_pCGTechnique == NULL || cgValidateTechnique(_pCGTechnique) == CG_FALSE ) { CgFXMaterial::checkForCgError("cgValidateTechnique", NULL); _uiValidationState = 0x02; } else { CgFXMaterial::checkForCgError("cgValidateTechnique", NULL); const CgFXMaterial::MFTexturesType *pTextures = pMat->getMFTextures(); CGpass pPass = cgGetFirstPass(_pCGTechnique); CgFXMaterial::checkForCgError("cgGetFirstPass", NULL); for(UInt32 i = 0; i < pTextures->size(); ++i) { const Char8 *szTexParamName = getName((*pTextures)[i]); Int32 iTexParamVal = -1; const ShaderVariable *pVar = pMat->getVariable(szTexParamName); OSG_ASSERT(pVar != NULL); const CgFXVariableTexObj *pTexVar = static_cast<const CgFXVariableTexObj *>(pVar); OSG_ASSERT(pTexVar != NULL); iTexParamVal = pTexVar->getValue(); if(iTexParamVal == -1) { CGparameter pParam = cgGetNamedEffectParameter(pMat->getEffect(), szTexParamName); CgFXMaterial::checkForCgError("cgGetNamedEffectParameter", NULL); (*pTextures)[i]->activate(pEnv, 0); Window::GLObjectId texObjId = pEnv->getWindow()->getGLObjectId( (*pTextures)[i]->getGLId()); cgGLSetTextureParameter(pParam, texObjId); CgFXMaterial::checkForCgError("cgGLSetTextureParameter", NULL); cgSetSamplerState (pParam ); CgFXMaterial::checkForCgError("cgSetSamplerState", NULL); CgFXVariableTexObj *pTexVarW = const_cast<CgFXVariableTexObj *>(pTexVar); pTexVarW->setValue(texObjId); (*pTextures)[i]->deactivate(pEnv); } } int count = 0; while(pPass) { StateUnrecPtr pState = State ::create(); CgFXPassChunkUnrecPtr pChunk = CgFXPassChunk::create(); pChunk->setPass (pPass); pChunk->setMaterial(pMat ); pState->addChunk(pChunk); this->addPassState(pState); pPass = cgGetNextPass(pPass); CgFXMaterial::checkForCgError("cgGetNextPass", NULL); count++; } pMat->updateUniformVariables(); } #if 0 if(_pCGTechnique != NULL) { fprintf(stderr, "Validated technique %s : %x\n", cgGetTechniqueName(_pCGTechnique), UInt32(_uiValidationState)); } #endif #if 0 if(pWin != NULL) { pWin->deactivate(); } #endif } return (_uiValidationState & TechniqueValid); }