void CDxtexDoc::OnFormatChangeCubeMapFaces() { HRESULT hr; LPDIRECT3DDEVICE9 pd3ddev = PDxtexApp()->Pd3ddev(); D3DSURFACE_DESC sd; LPDIRECT3DCUBETEXTURE9 ptexCube; DWORD iLevel; LPDIRECT3DSURFACE9 psurfSrc; LPDIRECT3DSURFACE9 psurfDest; CCubeMapDlg cubeMapDlg; if (IDCANCEL == cubeMapDlg.DoModal()) return; // Change m_ptexOrig into a cubemap ((LPDIRECT3DTEXTURE9)m_ptexOrig)->GetLevelDesc(0, &sd); hr = D3DXCreateCubeTexture(pd3ddev, m_dwWidth, m_numMips, 0, sd.Format, D3DPOOL_MANAGED, &ptexCube); for (iLevel = 0; iLevel < m_numMips; iLevel++) { hr = ((LPDIRECT3DTEXTURE9)m_ptexOrig)->GetSurfaceLevel(iLevel, &psurfSrc); hr = ptexCube->GetCubeMapSurface((D3DCUBEMAP_FACES)cubeMapDlg.m_iFace, iLevel, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); } ReleasePpo(&m_ptexOrig); m_ptexOrig = ptexCube; // Change m_ptexNew into a cubemap too if (m_ptexNew != NULL) { ((LPDIRECT3DTEXTURE9)m_ptexNew)->GetLevelDesc(0, &sd); hr = D3DXCreateCubeTexture(pd3ddev, m_dwWidth, m_numMips, 0, sd.Format, D3DPOOL_MANAGED, &ptexCube); for (iLevel = 0; iLevel < m_numMips; iLevel++) { hr = ((LPDIRECT3DTEXTURE9)m_ptexNew)->GetSurfaceLevel(iLevel, &psurfSrc); hr = ptexCube->GetCubeMapSurface((D3DCUBEMAP_FACES)cubeMapDlg.m_iFace, iLevel, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); } ReleasePpo(&m_ptexNew); m_ptexNew = ptexCube; } m_dwCubeMapFlags = DDS_CUBEMAP_ALLFACES; SetModifiedFlag(); UpdateAllViews(NULL, 1); // tell CView to pick up new surface pointers }
HRESULT KG3DPointLightShadow::ComputeCubeMapForPosition(D3DXVECTOR3 vPosition,KG3DScenePvsEditor* pScene,LPDIRECT3DCUBETEXTURE9 pCubeColor,LPDIRECT3DCUBETEXTURE9 pCubeDepth,KG3DRenderTargetTool* pToolColor,KG3DRenderTargetTool* pToolDepth) { HRESULT hr = E_FAIL; for( UINT i = 0; i < 6; i++ ) { // Set the view transform for this cubemap surface D3DUtil_GetCubeMapViewMatrix( (D3DCUBEMAP_FACES) i ,vPosition,m_vShadowMap.m_vCameraLight); m_vShadowMap.m_vCameraLight.SetPerspective(D3DX_PI / 2,1,5,40000 ); m_vShadowMap.m_vCameraLight.SetCamera(); m_vShadowMap.ProcessShadowMapWithPVS((KG3DRepresentObjectPVS*)pScene->GetPvs()); ////////////////////////////////////////////////////////////////////////// if(pCubeDepth) { LPDIRECT3DSURFACE9 pDest = NULL; hr = pCubeDepth->GetCubeMapSurface((D3DCUBEMAP_FACES)i,0,&pDest); KGLOG_COM_PROCESS_ERROR(hr); ExportToCubeSurface(pToolDepth,pDest,TRUE); SAFE_RELEASE(pDest); } if(pCubeColor) { LPDIRECT3DSURFACE9 pDest = NULL; hr = pCubeColor->GetCubeMapSurface((D3DCUBEMAP_FACES)i,0,&pDest); KGLOG_COM_PROCESS_ERROR(hr); ExportToCubeSurface(pToolColor,pDest,FALSE); SAFE_RELEASE(pDest); } } ////////////////////////////////////////////////////////////////////////// hr = S_OK; Exit0: return hr; }
void SetD3DResourcePrivateData(LPDIRECT3DRESOURCE9 res, const char* FName) { #if R3D_SET_DEBUG_D3D_NAMES DWORD sz = strlen(FName); res->SetPrivateData(WKPDID_D3DDebugObjectName, FName, sz, 0); void* p = 0; res->QueryInterface(IID_IDirect3DTexture9, &p); if(p) { LPDIRECT3DTEXTURE9 t = (LPDIRECT3DTEXTURE9)p; int mipsCount = t->GetLevelCount(); for (int i = 0; i < mipsCount; ++i) { LPDIRECT3DSURFACE9 surf; t->GetSurfaceLevel(i, &surf); surf->SetPrivateData(WKPDID_D3DDebugObjectName, FName, sz, 0); surf->Release(); } t->Release(); return; } p = 0; res->QueryInterface(IID_IDirect3DCubeTexture9, &p); if(p) { LPDIRECT3DCUBETEXTURE9 t = (LPDIRECT3DCUBETEXTURE9)p; int mipsCount = t->GetLevelCount(); for (int i = 0; i < mipsCount; ++i) { for (int j = D3DCUBEMAP_FACE_POSITIVE_X; j <= D3DCUBEMAP_FACE_NEGATIVE_Z; ++j) { LPDIRECT3DSURFACE9 surf; t->GetCubeMapSurface((D3DCUBEMAP_FACES)j, i, &surf); surf->SetPrivateData(WKPDID_D3DDebugObjectName, FName, sz, 0); surf->Release(); } } t->Release(); return; } #endif }
void CDxtexDoc::GenerateMipMaps() { LONG lwTempH; LONG lwTempW; LONG lwPowsW; LONG lwPowsH; LPDIRECT3DTEXTURE9 pddsNew = NULL; D3DFORMAT fmt; HRESULT hr; LPDIRECT3DDEVICE9 pd3ddev = PDxtexApp()->Pd3ddev(); LPDIRECT3DTEXTURE9 pmiptex = NULL; LPDIRECT3DCUBETEXTURE9 pcubetex = NULL; LPDIRECT3DVOLUMETEXTURE9 pvoltex = NULL; LPDIRECT3DTEXTURE9 pmiptexNew = NULL; LPDIRECT3DCUBETEXTURE9 pcubetexNew = NULL; LPDIRECT3DVOLUMETEXTURE9 pvoltexNew = NULL; LPDIRECT3DSURFACE9 psurfSrc; LPDIRECT3DSURFACE9 psurfDest; LPDIRECT3DVOLUME9 pvolSrc; LPDIRECT3DVOLUME9 pvolDest; if (IsVolumeMap()) pvoltex = (LPDIRECT3DVOLUMETEXTURE9)m_ptexOrig; else if (IsCubeMap()) pcubetex = (LPDIRECT3DCUBETEXTURE9)m_ptexOrig; else pmiptex = (LPDIRECT3DTEXTURE9)m_ptexOrig; if (pvoltex != NULL) { D3DVOLUME_DESC vd; pvoltex->GetLevelDesc(0, &vd); fmt = vd.Format; } else if (pcubetex != NULL) { D3DSURFACE_DESC sd; pcubetex->GetLevelDesc(0, &sd); fmt = sd.Format; } else { D3DSURFACE_DESC sd; pmiptex->GetLevelDesc(0, &sd); fmt = sd.Format; } lwTempW = m_dwWidth; lwTempH = m_dwHeight; lwPowsW = 0; lwPowsH = 0; while (lwTempW > 0) { lwPowsW++; lwTempW = lwTempW / 2; } while (lwTempH > 0) { lwPowsH++; lwTempH = lwTempH / 2; } m_numMips = lwPowsW > lwPowsH ? lwPowsW : lwPowsH; // Create destination mipmap surface - same format as source if (pvoltex != NULL) { if (FAILED(hr = pd3ddev->CreateVolumeTexture(m_dwWidth, m_dwHeight, m_dwDepth, m_numMips, 0, fmt, D3DPOOL_SYSTEMMEM, &pvoltexNew, NULL))) { goto LFail; } hr = pvoltex->GetVolumeLevel(0, &pvolSrc); hr = pvoltexNew->GetVolumeLevel(0, &pvolDest); hr = D3DXLoadVolumeFromVolume(pvolDest, NULL, NULL, pvolSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&pvolSrc); ReleasePpo(&pvolDest); hr = D3DXFilterVolumeTexture(pvoltexNew, NULL, 0, D3DX_DEFAULT); } else if (pmiptex != NULL) { if (FAILED(hr = pd3ddev->CreateTexture(m_dwWidth, m_dwHeight, m_numMips, 0, fmt, D3DPOOL_MANAGED, &pmiptexNew, NULL))) { goto LFail; } hr = pmiptex->GetSurfaceLevel(0, &psurfSrc); hr = pmiptexNew->GetSurfaceLevel(0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = D3DXFilterTexture(pmiptexNew, NULL, 0, D3DX_DEFAULT); } else { if (FAILED(hr = pd3ddev->CreateCubeTexture(m_dwWidth, m_numMips, 0, fmt, D3DPOOL_MANAGED, &pcubetexNew, NULL))) { goto LFail; } hr = pcubetex->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_X, 0, &psurfSrc); hr = pcubetexNew->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_X, 0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = pcubetex->GetCubeMapSurface(D3DCUBEMAP_FACE_NEGATIVE_X, 0, &psurfSrc); hr = pcubetexNew->GetCubeMapSurface(D3DCUBEMAP_FACE_NEGATIVE_X, 0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = pcubetex->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_Y, 0, &psurfSrc); hr = pcubetexNew->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_Y, 0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = pcubetex->GetCubeMapSurface(D3DCUBEMAP_FACE_NEGATIVE_Y, 0, &psurfSrc); hr = pcubetexNew->GetCubeMapSurface(D3DCUBEMAP_FACE_NEGATIVE_Y, 0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = pcubetex->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_Z, 0, &psurfSrc); hr = pcubetexNew->GetCubeMapSurface(D3DCUBEMAP_FACE_POSITIVE_Z, 0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = pcubetex->GetCubeMapSurface(D3DCUBEMAP_FACE_NEGATIVE_Z, 0, &psurfSrc); hr = pcubetexNew->GetCubeMapSurface(D3DCUBEMAP_FACE_NEGATIVE_Z, 0, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); hr = D3DXFilterCubeTexture(pcubetexNew, NULL, 0, D3DX_DEFAULT); } ReleasePpo(&m_ptexOrig); if (pvoltexNew != NULL) m_ptexOrig = pvoltexNew; else if (pcubetexNew != NULL) m_ptexOrig = pcubetexNew; else m_ptexOrig = pmiptexNew; if (m_ptexNew != NULL) { // Rather than filtering down the (probably-compressed) m_ptexNew // top level, compress each mip level from the (probably-uncompressed) // m_ptexOrig levels. if (pvoltexNew != NULL) { D3DVOLUME_DESC vd; ((LPDIRECT3DVOLUMETEXTURE9)m_ptexNew)->GetLevelDesc(0, &vd); fmt = vd.Format; } else if (pcubetexNew != NULL) { D3DSURFACE_DESC sd; ((LPDIRECT3DTEXTURE9)m_ptexNew)->GetLevelDesc(0, &sd); fmt = sd.Format; } else { D3DSURFACE_DESC sd; ((LPDIRECT3DCUBETEXTURE9)m_ptexNew)->GetLevelDesc(0, &sd); fmt = sd.Format; } Compress(fmt, FALSE); } m_bTitleModsChanged = TRUE; // Generate title bar update UpdateAllViews(NULL, 1); // tell CView to pick up new surface pointers SetModifiedFlag(); return; LFail: ReleasePpo(&pddsNew); }
HRESULT CDxtexDoc::BltAllLevels(D3DCUBEMAP_FACES FaceType, LPDIRECT3DBASETEXTURE9 ptexSrc, LPDIRECT3DBASETEXTURE9 ptexDest) { HRESULT hr; LPDIRECT3DTEXTURE9 pmiptexSrc; LPDIRECT3DTEXTURE9 pmiptexDest; LPDIRECT3DCUBETEXTURE9 pcubetexSrc; LPDIRECT3DCUBETEXTURE9 pcubetexDest; LPDIRECT3DVOLUMETEXTURE9 pvoltexSrc; LPDIRECT3DVOLUMETEXTURE9 pvoltexDest; DWORD iLevel; if (IsVolumeMap()) { pvoltexSrc = (LPDIRECT3DVOLUMETEXTURE9)ptexSrc; pvoltexDest = (LPDIRECT3DVOLUMETEXTURE9)ptexDest; } else if (IsCubeMap()) { pcubetexSrc = (LPDIRECT3DCUBETEXTURE9)ptexSrc; pcubetexDest = (LPDIRECT3DCUBETEXTURE9)ptexDest; } else { pmiptexSrc = (LPDIRECT3DTEXTURE9)ptexSrc; pmiptexDest = (LPDIRECT3DTEXTURE9)ptexDest; } for (iLevel = 0; iLevel < m_numMips; iLevel++) { if (IsVolumeMap()) { LPDIRECT3DVOLUME9 pvolSrc = NULL; LPDIRECT3DVOLUME9 pvolDest = NULL; hr = pvoltexSrc->GetVolumeLevel(iLevel, &pvolSrc); hr = pvoltexDest->GetVolumeLevel(iLevel, &pvolDest); hr = D3DXLoadVolumeFromVolume(pvolDest, NULL, NULL, pvolSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&pvolSrc); ReleasePpo(&pvolDest); } else if (IsCubeMap()) { LPDIRECT3DSURFACE9 psurfSrc = NULL; LPDIRECT3DSURFACE9 psurfDest = NULL; hr = pcubetexSrc->GetCubeMapSurface(FaceType, iLevel, &psurfSrc); hr = pcubetexDest->GetCubeMapSurface(FaceType, iLevel, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); } else { LPDIRECT3DSURFACE9 psurfSrc = NULL; LPDIRECT3DSURFACE9 psurfDest = NULL; hr = pmiptexSrc->GetSurfaceLevel(iLevel, &psurfSrc); hr = pmiptexDest->GetSurfaceLevel(iLevel, &psurfDest); hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, D3DX_DEFAULT, 0); ReleasePpo(&psurfSrc); ReleasePpo(&psurfDest); } } return S_OK; }