HRESULT ScalingEffect::LoadEffect(const TCHAR *filename) { KillThis(); LPD3DXBUFFER lpBufferEffect = 0; LPD3DXBUFFER lpErrors = 0; LPD3DXEFFECTCOMPILER lpEffectCompiler = 0; m_strErrors += filename; m_strErrors += ":\n"; // First create an effect compiler HRESULT hr = D3DXCreateEffectCompilerFromFile(filename, NULL, NULL,NULL, &lpEffectCompiler, &lpErrors); // Errors... if(FAILED(hr)) { if(lpErrors) { m_strErrors += (char*) lpErrors->GetBufferPointer(); SAFE_RELEASE(lpErrors); } m_strErrors += "Unable to create effect compiler from "; m_strErrors += filename; } if(SUCCEEDED(hr)) { #ifdef C_D3DSHADERS_COMPILE_WITH_DEBUG hr = lpEffectCompiler->CompileEffect(D3DXSHADER_DEBUG, &lpBufferEffect, &lpErrors); #else hr = lpEffectCompiler->CompileEffect(0, &lpBufferEffect, &lpErrors); #endif // Errors... if(FAILED(hr)) { if(lpErrors) { m_strErrors += (char*) lpErrors->GetBufferPointer(); SAFE_RELEASE(lpErrors); } m_strErrors += "Unable to compile effect from "; m_strErrors += filename; } } if(SUCCEEDED(hr)) { hr = D3DXCreateEffect(m_pd3dDevice, lpBufferEffect->GetBufferPointer(), lpBufferEffect->GetBufferSize(), NULL, NULL, 0, NULL, &m_pEffect, &lpErrors); // Errors... if(FAILED(hr)) { if(lpErrors) { m_strErrors += (char*) lpErrors->GetBufferPointer(); SAFE_RELEASE(lpErrors); } m_strErrors += "Unable to create effect from compiled "; m_strErrors += filename; } } if(SUCCEEDED(hr)) { m_pEffect->GetDesc(&m_EffectDesc); hr = ParseParameters(lpEffectCompiler); } SAFE_RELEASE(lpErrors); SAFE_RELEASE(lpBufferEffect); SAFE_RELEASE(lpEffectCompiler); return hr; }
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; }
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; }
//----------------------------------------------------------------------------- // Name: CMultiAnim::Setup() // Desc: The class is initialized with this method. // We create the effect from the fx file, and load the animation mesh // from the given X file. We then call SetupBonePtrs() to initialize // the mesh containers to enable bone matrix lookup by index. The // Allocation Hierarchy is passed by pointer to allow an app to subclass // it for its own implementation. //----------------------------------------------------------------------------- HRESULT CMultiAnim::Setup( LPDIRECT3DDEVICE9 pDevice, TCHAR sXFile[], TCHAR sFxFile[], CMultiAnimAllocateHierarchy *pAH, LPD3DXLOADUSERDATA pLUD ) { assert( pDevice != NULL ); assert( sXFile ); assert( sFxFile ); assert( pAH ); // set the MA instance for CMultiAnimAllocateHierarchy pAH->SetMA( this ); // set the device m_pDevice = pDevice; m_pDevice->AddRef(); HRESULT hr; Vector3 vCenter; LPD3DXEFFECTCOMPILER pEC = NULL; // Increase the palette size if the shader allows it. We are sort // of cheating here since we know tiny has 35 bones. The alternative // is use the maximum number that vs_2_0 allows. D3DXMACRO mac[2] = { { "MATRIX_PALETTE_SIZE_DEFAULT", "35" }, { NULL, NULL } }; // If we support VS_2_0, increase the palette size; else, use the default // of 26 bones from the .fx file by passing NULL D3DCAPS9 caps; D3DXMACRO *pmac = NULL; m_pDevice->GetDeviceCaps( & caps ); if( caps.VertexShaderVersion > D3DVS_VERSION( 1, 1 ) ) pmac = mac; // create effect -- do this first, so LMHFX has access to the palette size TCHAR tszPath[ MAX_PATH ]; hr = DXUtil_FindMediaFileCch( tszPath, MAX_PATH, sFxFile ); if( FAILED( hr ) ) goto e_Exit; // Define DEBUG_VS and/or DEBUG_PS to debug vertex and/or pixel shaders with the shader debugger. // Debugging vertex shaders requires either REF or software vertex processing, and debugging // pixel shaders requires REF. The D3DXSHADER_FORCE_*_SOFTWARE_NOOPT flag improves the debug // experience in the shader debugger. It enables source level debugging, prevents instruction // reordering, prevents dead code elimination, and forces the compiler to compile against the next // higher available software target, which ensures that the unoptimized shaders do not exceed // the shader model limitations. Setting these flags will cause slower rendering since the shaders // will be unoptimized and forced into software. See the DirectX documentation for more information // about using the shader debugger. { DWORD dwShaderFlags = 0; #ifdef DEBUG_VS dwShaderFlags |= D3DXSHADER_FORCE_VS_SOFTWARE_NOOPT; #endif #ifdef DEBUG_PS dwShaderFlags |= D3DXSHADER_FORCE_PS_SOFTWARE_NOOPT; #endif hr = D3DXCreateEffectFromFile( m_pDevice, tszPath, pmac, NULL, dwShaderFlags, NULL, &m_pEffect, NULL ); if( FAILED( hr ) ) goto e_Exit; } // create the mesh, frame hierarchy, and animation controller from the x file hr = DXUtil_FindMediaFileCch( tszPath, MAX_PATH, sXFile ); if( FAILED( hr ) ) goto e_Exit; hr = D3DXLoadMeshHierarchyFromX( tszPath, 0, m_pDevice, pAH, pLUD, (LPD3DXFRAME *) &m_pFrameRoot, &m_pAC ); if( FAILED( hr ) ) goto e_Exit; if( !m_pAC ) { hr = E_FAIL; MessageBox( NULL, _T("The sample is attempting to load a mesh without animation or incompatible animation. This sample requires tiny_4anim.x or a mesh with identical animation sets. The program will now exit."), _T("Mesh Load Error"), MB_OK ); goto e_Exit; } // set up bone pointers hr = SetupBonePtrs( m_pFrameRoot ); if( FAILED( hr ) ) goto e_Exit; // get bounding radius hr = D3DXFrameCalculateBoundingSphere( m_pFrameRoot, (D3DXVECTOR3*)& vCenter, & m_fBoundingRadius ); if( FAILED( hr ) ) goto e_Exit; // If there are existing instances, update their animation controllers. { vector< CAnimInstance* >::iterator itCur, itEnd = m_v_pAnimInstances.end(); for( itCur = m_v_pAnimInstances.begin(); itCur != itEnd; ++ itCur ) { LPD3DXANIMATIONCONTROLLER pNewAC = NULL; hr = m_pAC->CloneAnimationController( m_pAC->GetMaxNumAnimationOutputs(), m_pAC->GetMaxNumAnimationSets(), m_pAC->GetMaxNumTracks(), m_pAC->GetMaxNumEvents(), &pNewAC ); // Release existing animation controller if( ( * itCur )->m_pAC ) ( * itCur )->m_pAC->Release(); ( * itCur )->Setup( pNewAC ); } } e_Exit: if( FAILED( hr ) ) { if( m_amxWorkingPalette ) { delete [] m_amxWorkingPalette; m_amxWorkingPalette = NULL; m_dwWorkingPaletteSize = 0; } if( m_pAC ) { m_pAC->Release(); m_pAC = NULL; } if( m_pFrameRoot ) { D3DXFrameDestroy( m_pFrameRoot, pAH ); m_pFrameRoot = NULL; } if( m_pEffect ) { m_pEffect->Release(); m_pEffect = NULL; } if( pEC ) pEC->Release(); m_pDevice->Release(); m_pDevice = NULL; } return hr; }