////////////////////////////////////////////////////////////////
//
// CEffectTemplateImpl::ValidateDepthBufferUsage
//
// Check if technique passes our rules
// Returns false if should fail validation
//
////////////////////////////////////////////////////////////////
bool CEffectTemplateImpl::ValidateDepthBufferUsage ( D3DXHANDLE hTechnique, SString& strOutErrorExtra )
{
    m_bUsesDepthBuffer = false;

    // Check depthbuffer handle
    D3DXHANDLE hDepthBuffer = m_pD3DEffect->GetParameterByName ( NULL, "DEPTHBUFFER" );
    if ( !hDepthBuffer )
        hDepthBuffer = m_pD3DEffect->GetParameterBySemantic ( NULL, "DEPTHBUFFER" );
    if ( hDepthBuffer )
    {
        D3DXPARAMETER_DESC ParameterDesc;
        m_pD3DEffect->GetParameterDesc ( hDepthBuffer, &ParameterDesc );
        if ( ParameterDesc.Type >= D3DXPT_TEXTURE && ParameterDesc.Type <= D3DXPT_TEXTURECUBE )
        {
            if ( m_pD3DEffect->IsParameterUsed ( hDepthBuffer, hTechnique ) )
            {
                ERenderFormat depthBufferFormat = m_pManager->GetDepthBufferFormat ();
                if ( depthBufferFormat == RFORMAT_UNKNOWN )
                {
                    strOutErrorExtra += " DEPTHBUFFER used, but readable depth buffer is not available";
                    return false;
                }
                m_bUsesDepthBuffer = true;
            }
        }
    }

    return true;
}
Пример #2
0
	bool Init(IDirect3DDevice9 *d3dev)
	{
		D3DXEFFECT_DESC		desc;
		
		{
			D3DCAPS9 hal_caps;
			ZeroMemory(&hal_caps, sizeof(D3DCAPS9));
			if(d3dev->GetDeviceCaps(&hal_caps)!=S_OK)
				return false;
			UINT ps_major = D3DSHADER_VERSION_MAJOR(hal_caps.PixelShaderVersion);
			UINT ps_minor = D3DSHADER_VERSION_MAJOR(hal_caps.PixelShaderVersion);
			if(ps_major<2)
				return false;
 		}

		{
			LPD3DXBUFFER		pErrorMsgs = NULL;
			if(FAILED(D3DXCreateEffectFromFile(d3dev, filename, NULL, NULL, 0, NULL, &effect, &pErrorMsgs)))
			{
				if(pErrorMsgs != NULL)
				{
					unsigned char* message = (unsigned char*)pErrorMsgs->GetBufferPointer();
					{ // save error log
						char					path[ALIB_PATH];
						FILE					*fic;
						strcpy(path, root);
						strcat(path, "\\shaders\\_errors.txt");
						fic=fopen(path, "w");
						if(fic)
						{
							fprintf(fic, (char *)message);
							fclose(fic);
						}
					}
				}
				return false;
			}
		}
		
		if(FAILED(effect->GetDesc(&desc)))
			return false;
		
		{
			int					i;
			for(i=0; i<(int)desc.Parameters; i++)
			{
				D3DXHANDLE			hp=effect->GetParameter(NULL, i);
				D3DXPARAMETER_DESC	descp;
				
				if(!hp)
					continue;
				
				if(FAILED(effect->GetParameterDesc(hp, &descp)))
					continue;
					
				if((descp.Class==D3DXPC_VECTOR)&&(descp.Type==D3DXPT_FLOAT))
				{
					if(!strcmp(descp.Name, "color"))
					{
						hColor=hp;
						hp=NULL;
					}
				}
				else if((descp.Class==D3DXPC_SCALAR)&&(descp.Type==D3DXPT_FLOAT))
				{	
					if(!strcmp(descp.Name, "power"))
						hPower=hp;
				}
			}
		}

		if(FAILED(d3dev->CreateVertexBuffer(VBUFSIZE, 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vb, NULL)))
			return false;

		return true;
	}