Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
	}
}
Exemplo n.º 3
0
void CgEffect::SetTechniqueByName(const char* name)
{
    CGtechnique tech = cgGetFirstTechnique(effect);
    
    while(tech)
    {
        if(!strcmp(cgGetTechniqueName(tech), name))
            break;

        tech = cgGetNextTechnique(tech);
    }

    this->activeTechnique = tech;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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);
}