HRESULT ScalingEffect::ParseParameters(LPD3DXEFFECTCOMPILER lpEffectCompiler) { HRESULT hr = S_OK; if(m_pEffect == NULL) return E_FAIL; // Look at parameters for semantics and annotations that we know how to interpret D3DXPARAMETER_DESC ParamDesc; D3DXPARAMETER_DESC AnnotDesc; D3DXHANDLE hParam; D3DXHANDLE hAnnot; LPDIRECT3DBASETEXTURE9 pTex = NULL; for(UINT iParam = 0; iParam < m_EffectDesc.Parameters; iParam++) { LPCSTR pstrName = NULL; LPCSTR pstrFunction = NULL; LPCSTR pstrTarget = NULL; LPCSTR pstrTextureType = NULL; INT Width = D3DX_DEFAULT; INT Height= D3DX_DEFAULT; INT Depth = D3DX_DEFAULT; hParam = m_pEffect->GetParameter(NULL, iParam); m_pEffect->GetParameterDesc(hParam, &ParamDesc); if(ParamDesc.Semantic != NULL) { if(ParamDesc.Class == D3DXPC_MATRIX_ROWS || ParamDesc.Class == D3DXPC_MATRIX_COLUMNS) { if(strcmpi(ParamDesc.Semantic, "world") == 0) m_MatWorldEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "view") == 0) m_MatViewEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "projection") == 0) m_MatProjEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "worldview") == 0) m_MatWorldViewEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "viewprojection") == 0) m_MatViewProjEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "worldviewprojection") == 0) m_MatWorldViewProjEffectHandle = hParam; } else if(ParamDesc.Class == D3DXPC_VECTOR && ParamDesc.Type == D3DXPT_FLOAT) { if(strcmpi(ParamDesc.Semantic, "sourcedims") == 0) m_SourceDimsEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "texelsize") == 0) m_TexelSizeEffectHandle = hParam; } else if(ParamDesc.Class == D3DXPC_SCALAR && ParamDesc.Type == D3DXPT_FLOAT) { if(strcmpi(ParamDesc.Semantic, "SCALING") == 0) m_pEffect->GetFloat(hParam, &m_scale); } else if (ParamDesc.Class == D3DXPC_STRUCT) { if(strcmpi(ParamDesc.Semantic, "VIDPARAMS") == 0) { m_VideoInputHandle = hParam; m_VideoSizeHandle = m_pEffect->GetParameterByName(m_VideoInputHandle,"video_size"); m_TextureSizeHandle = m_pEffect->GetParameterByName(m_VideoInputHandle,"texture_size"); m_OutputSizeHandle = m_pEffect->GetParameterByName(m_VideoInputHandle,"output_size"); m_FrameCount = m_pEffect->GetParameterByName(m_VideoInputHandle,"frame_count"); } } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_TEXTURE) { if(strcmpi(ParamDesc.Semantic, "SOURCETEXTURE") == 0) m_SourceTextureEffectHandle = hParam; if(strcmpi(ParamDesc.Semantic, "WORKINGTEXTURE") == 0) m_WorkingTexture1EffectHandle = hParam; if(strcmpi(ParamDesc.Semantic, "WORKINGTEXTURE1") == 0) m_WorkingTexture2EffectHandle = hParam; if(strcmpi(ParamDesc.Semantic, "HQ2XLOOKUPTEXTURE") == 0) m_Hq2xLookupTextureHandle = hParam; } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_STRING) { LPCSTR pstrTechnique = NULL; if(strcmpi(ParamDesc.Semantic, "COMBINETECHNIQUE") == 0) { m_pEffect->GetString(hParam, &pstrTechnique); m_CombineTechniqueEffectHandle = m_pEffect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE") == 0) { m_pEffect->GetString(hParam, &pstrTechnique); m_PreprocessTechnique1EffectHandle = m_pEffect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE1") == 0) { m_pEffect->GetString(hParam, &pstrTechnique); m_PreprocessTechnique2EffectHandle = m_pEffect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "NAME") == 0) m_pEffect->GetString(hParam, &m_strName); } } for(UINT iAnnot = 0; iAnnot < ParamDesc.Annotations; iAnnot++) { hAnnot = m_pEffect->GetAnnotation (hParam, iAnnot); m_pEffect->GetParameterDesc(hAnnot, &AnnotDesc); if(strcmpi(AnnotDesc.Name, "name") == 0) m_pEffect->GetString(hAnnot, &pstrName); else if(strcmpi(AnnotDesc.Name, "function") == 0) m_pEffect->GetString(hAnnot, &pstrFunction); else if(strcmpi(AnnotDesc.Name, "target") == 0) m_pEffect->GetString(hAnnot, &pstrTarget); else if(strcmpi(AnnotDesc.Name, "width") == 0) m_pEffect->GetInt(hAnnot, &Width); else if(strcmpi(AnnotDesc.Name, "height") == 0) m_pEffect->GetInt(hAnnot, &Height); else if(strcmpi(AnnotDesc.Name, "depth") == 0) m_pEffect->GetInt(hAnnot, &Depth); else if(strcmpi(AnnotDesc.Name, "type") == 0) m_pEffect->GetString(hAnnot, &pstrTextureType); } if(pstrFunction != NULL) { LPD3DXBUFFER pTextureShader = NULL; LPD3DXBUFFER lpErrors = 0; if(pstrTarget == NULL || strcmp(pstrTarget,"tx_1_1")) pstrTarget = "tx_1_0"; if(SUCCEEDED(hr = lpEffectCompiler->CompileShader( hAnnot, pstrTarget, 0, &pTextureShader, &lpErrors, NULL))) { SAFE_RELEASE(lpErrors); if(Width == D3DX_DEFAULT) Width = 64; if(Height == D3DX_DEFAULT) Height = 64; if(Depth == D3DX_DEFAULT) Depth = 64; #if D3DX_SDK_VERSION >= 22 LPD3DXTEXTURESHADER ppTextureShader; D3DXCreateTextureShader((DWORD *)pTextureShader->GetBufferPointer(), &ppTextureShader); #endif if(pstrTextureType != NULL) { if(strcmpi(pstrTextureType, "volume") == 0) { LPDIRECT3DVOLUMETEXTURE9 pVolumeTex = NULL; if(SUCCEEDED(hr = D3DXCreateVolumeTexture(m_pd3dDevice, Width, Height, Depth, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pVolumeTex))) { #if D3DX_SDK_VERSION >= 22 if(SUCCEEDED(hr = D3DXFillVolumeTextureTX(pVolumeTex, ppTextureShader))) { #else if(SUCCEEDED(hr = D3DXFillVolumeTextureTX(pVolumeTex, (DWORD *)pTextureShader->GetBufferPointer(), NULL, 0))) { #endif pTex = pVolumeTex; } } } else if(strcmpi(pstrTextureType, "cube") == 0) { LPDIRECT3DCUBETEXTURE9 pCubeTex = NULL; if(SUCCEEDED(hr = D3DXCreateCubeTexture(m_pd3dDevice, Width, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pCubeTex))) { #if D3DX_SDK_VERSION >= 22 if(SUCCEEDED(hr = D3DXFillCubeTextureTX(pCubeTex, ppTextureShader))) { #else if(SUCCEEDED(hr = D3DXFillCubeTextureTX(pCubeTex, (DWORD *)pTextureShader->GetBufferPointer(), NULL, 0))) { #endif pTex = pCubeTex; } } } } else { LPDIRECT3DTEXTURE9 p2DTex = NULL; if(SUCCEEDED(hr = D3DXCreateTexture(m_pd3dDevice, Width, Height, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &p2DTex))) { #if D3DX_SDK_VERSION >= 22 if(SUCCEEDED(hr = D3DXFillTextureTX(p2DTex, ppTextureShader))) { #else if(SUCCEEDED(hr = D3DXFillTextureTX(p2DTex, (DWORD *)pTextureShader->GetBufferPointer(), NULL, 0))) { #endif pTex = p2DTex; } } } m_pEffect->SetTexture(m_pEffect->GetParameter(NULL, iParam), pTex); SAFE_RELEASE(pTex); SAFE_RELEASE(pTextureShader); #if D3DX_SDK_VERSION >= 22 SAFE_RELEASE(ppTextureShader); #endif } else { if(lpErrors) { m_strErrors += (char*) lpErrors->GetBufferPointer(); } m_strErrors += "Could not compile texture shader "; m_strErrors += pstrFunction; SAFE_RELEASE(lpErrors); return hr; } } } return S_OK; }
HRESULT ScalingEffect::ParseParameters(LPD3DXEFFECTCOMPILER lpEffectCompiler) { HRESULT hr = S_OK; if(m_pEffect == NULL) return E_FAIL; // Look at parameters for semantics and annotations that we know how to interpret D3DXPARAMETER_DESC ParamDesc; D3DXPARAMETER_DESC AnnotDesc; D3DXHANDLE hParam; D3DXHANDLE hAnnot; LPDIRECT3DBASETEXTURE9 pTex = NULL; for(UINT iParam = 0; iParam < m_EffectDesc.Parameters; iParam++) { LPCSTR pstrName = NULL; LPCSTR pstrFunction = NULL; LPCSTR pstrTarget = NULL; LPCSTR pstrTextureType = NULL; INT Width = D3DX_DEFAULT; INT Height= D3DX_DEFAULT; INT Depth = D3DX_DEFAULT; hParam = m_pEffect->GetParameter(NULL, iParam); m_pEffect->GetParameterDesc(hParam, &ParamDesc); if(ParamDesc.Semantic != NULL) { if(ParamDesc.Class == D3DXPC_MATRIX_ROWS || ParamDesc.Class == D3DXPC_MATRIX_COLUMNS) { if(strcmpi(ParamDesc.Semantic, "world") == 0) m_MatWorldEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "view") == 0) m_MatViewEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "projection") == 0) m_MatProjEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "worldview") == 0) m_MatWorldViewEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "viewprojection") == 0) m_MatViewProjEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "worldviewprojection") == 0) m_MatWorldViewProjEffectHandle = hParam; } else if(ParamDesc.Class == D3DXPC_VECTOR && ParamDesc.Type == D3DXPT_FLOAT) { if(strcmpi(ParamDesc.Semantic, "sourcedims") == 0) m_SourceDimsEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "texelsize") == 0) m_TexelSizeEffectHandle = hParam; else if(strcmpi(ParamDesc.Semantic, "inputdims") == 0) { if(m_iDim[0] && m_iDim[1] && ((hr = m_pEffect->SetFloatArray(hParam, m_iDim, 2)) != D3D_OK)) { m_strErrors += "Could not set inputdims parameter!"; return hr; } } } else if(ParamDesc.Class == D3DXPC_SCALAR && ParamDesc.Type == D3DXPT_FLOAT) { if(strcmpi(ParamDesc.Semantic, "SCALING") == 0) m_pEffect->GetFloat(hParam, &m_scale); } else if(ParamDesc.Class == D3DXPC_SCALAR && ParamDesc.Type == D3DXPT_BOOL) { if(strcmpi(ParamDesc.Semantic, "FORCEUPDATE") == 0) m_pEffect->GetBool(hParam, &m_forceupdate); } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_TEXTURE) { if(strcmpi(ParamDesc.Semantic, "SOURCETEXTURE") == 0) m_SourceTextureEffectHandle = hParam; if(strcmpi(ParamDesc.Semantic, "WORKINGTEXTURE") == 0) m_WorkingTexture1EffectHandle = hParam; if(strcmpi(ParamDesc.Semantic, "WORKINGTEXTURE1") == 0) m_WorkingTexture2EffectHandle = hParam; if(strcmpi(ParamDesc.Semantic, "HQ2XLOOKUPTEXTURE") == 0) m_Hq2xLookupTextureHandle = hParam; } else if(ParamDesc.Class == D3DXPC_OBJECT && ParamDesc.Type == D3DXPT_STRING) { LPCSTR pstrTechnique = NULL; if(strcmpi(ParamDesc.Semantic, "COMBINETECHNIQUE") == 0) { m_pEffect->GetString(hParam, &pstrTechnique); m_CombineTechniqueEffectHandle = m_pEffect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE") == 0) { m_pEffect->GetString(hParam, &pstrTechnique); m_PreprocessTechnique1EffectHandle = m_pEffect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "PREPROCESSTECHNIQUE1") == 0) { m_pEffect->GetString(hParam, &pstrTechnique); m_PreprocessTechnique2EffectHandle = m_pEffect->GetTechniqueByName(pstrTechnique); } else if(strcmpi(ParamDesc.Semantic, "NAME") == 0) m_pEffect->GetString(hParam, &m_strName); } } for(UINT iAnnot = 0; iAnnot < ParamDesc.Annotations; iAnnot++) { hAnnot = m_pEffect->GetAnnotation (hParam, iAnnot); m_pEffect->GetParameterDesc(hAnnot, &AnnotDesc); if(strcmpi(AnnotDesc.Name, "name") == 0) m_pEffect->GetString(hAnnot, &pstrName); else if(strcmpi(AnnotDesc.Name, "function") == 0) m_pEffect->GetString(hAnnot, &pstrFunction); else if(strcmpi(AnnotDesc.Name, "target") == 0) m_pEffect->GetString(hAnnot, &pstrTarget); else if(strcmpi(AnnotDesc.Name, "width") == 0) m_pEffect->GetInt(hAnnot, &Width); else if(strcmpi(AnnotDesc.Name, "height") == 0) m_pEffect->GetInt(hAnnot, &Height); else if(strcmpi(AnnotDesc.Name, "depth") == 0) m_pEffect->GetInt(hAnnot, &Depth); else if(strcmpi(AnnotDesc.Name, "type") == 0) m_pEffect->GetString(hAnnot, &pstrTextureType); } // Not used in DOSBox /* if(pstrName != NULL) { pTex = NULL; DXUtil_ConvertAnsiStringToGenericCch(strPath, pstrName, MAX_PATH); if(pstrTextureType != NULL) { if(strcmpi(pstrTextureType, "volume") == 0) { LPDIRECT3DVOLUMETEXTURE9 pVolumeTex = NULL; if(SUCCEEDED(hr = D3DXCreateVolumeTextureFromFileEx(m_pd3dDevice, strPath, Width, Height, Depth, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pVolumeTex))) { pTex = pVolumeTex; } else { m_strErrors += "Could not load volume texture "; m_strErrors += pstrName; } } else if(strcmpi(pstrTextureType, "cube") == 0) { LPDIRECT3DCUBETEXTURE9 pCubeTex = NULL; if(SUCCEEDED(hr = D3DXCreateCubeTextureFromFileEx(m_pd3dDevice, strPath, Width, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &pCubeTex))) { pTex = pCubeTex; } else { m_strErrors += "Could not load cube texture "; m_strErrors += pstrName; } } } else { LPDIRECT3DTEXTURE9 p2DTex = NULL; if(SUCCEEDED(hr = D3DXCreateTextureFromFileEx(m_pd3dDevice, strPath, Width, Height, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &p2DTex))) { pTex = p2DTex; } else { m_strErrors += "Could not load texture "; m_strErrors += pstrName; m_strErrors += "\n"; } } // Apply successfully loaded texture to effect if(SUCCEEDED(hr) && pTex != NULL) { m_pEffect->SetTexture(m_pEffect->GetParameter(NULL, iParam), pTex); SAFE_RELEASE(pTex); } } else */ if(pstrFunction != NULL) { LPD3DXBUFFER pTextureShader = NULL; LPD3DXBUFFER lpErrors = 0; if(pstrTarget == NULL || strcmp(pstrTarget,"tx_1_1")) pstrTarget = "tx_1_0"; if(SUCCEEDED(hr = lpEffectCompiler->CompileShader( pstrFunction, pstrTarget, 0, &pTextureShader, &lpErrors, NULL))) { SAFE_RELEASE(lpErrors); if((UINT)Width == D3DX_DEFAULT) Width = 64; if((UINT)Height == D3DX_DEFAULT) Height = 64; if((UINT)Depth == D3DX_DEFAULT) Depth = 64; #if D3DX_SDK_VERSION >= 22 LPD3DXTEXTURESHADER ppTextureShader; D3DXCreateTextureShader((DWORD *)pTextureShader->GetBufferPointer(), &ppTextureShader); #endif if(pstrTextureType != NULL) { if(strcmpi(pstrTextureType, "volume") == 0) { LPDIRECT3DVOLUMETEXTURE9 pVolumeTex = NULL; if(SUCCEEDED(hr = D3DXCreateVolumeTexture(m_pd3dDevice, Width, Height, Depth, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pVolumeTex))) { #if D3DX_SDK_VERSION >= 22 if(SUCCEEDED(hr = D3DXFillVolumeTextureTX(pVolumeTex, ppTextureShader))) { #else if(SUCCEEDED(hr = D3DXFillVolumeTextureTX(pVolumeTex, (DWORD *)pTextureShader->GetBufferPointer(), NULL, 0))) { #endif pTex = pVolumeTex; } } } else if(strcmpi(pstrTextureType, "cube") == 0) { LPDIRECT3DCUBETEXTURE9 pCubeTex = NULL; if(SUCCEEDED(hr = D3DXCreateCubeTexture(m_pd3dDevice, Width, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pCubeTex))) { #if D3DX_SDK_VERSION >= 22 if(SUCCEEDED(hr = D3DXFillCubeTextureTX(pCubeTex, ppTextureShader))) { #else if(SUCCEEDED(hr = D3DXFillCubeTextureTX(pCubeTex, (DWORD *)pTextureShader->GetBufferPointer(), NULL, 0))) { #endif pTex = pCubeTex; } } } } else { LPDIRECT3DTEXTURE9 p2DTex = NULL; if(SUCCEEDED(hr = D3DXCreateTexture(m_pd3dDevice, Width, Height, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &p2DTex))) { #if D3DX_SDK_VERSION >= 22 if(SUCCEEDED(hr = D3DXFillTextureTX(p2DTex, ppTextureShader))) { #else if(SUCCEEDED(hr = D3DXFillTextureTX(p2DTex, (DWORD *)pTextureShader->GetBufferPointer(), NULL, 0))) { #endif pTex = p2DTex; } } } m_pEffect->SetTexture(m_pEffect->GetParameter(NULL, iParam), pTex); SAFE_RELEASE(pTex); SAFE_RELEASE(pTextureShader); #if D3DX_SDK_VERSION >= 22 SAFE_RELEASE(ppTextureShader); #endif } else { if(lpErrors) { m_strErrors += (char*) lpErrors->GetBufferPointer(); } m_strErrors += "Could not compile texture shader "; m_strErrors += pstrFunction; SAFE_RELEASE(lpErrors); return hr; } } } return S_OK; }