//////////////////////////////////////////////////////////////// // // 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; }
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; }