📄 loadsavedds.cpp
字号:
if (FAILED(hr = BltAllLevels(D3DCUBEMAP_FACE_NEGATIVE_X, m_ptexOrig, m_ptexNew)))
return hr;
if (FAILED(hr = BltAllLevels(D3DCUBEMAP_FACE_POSITIVE_X, m_ptexOrig, m_ptexNew)))
return hr;
if (FAILED(hr = BltAllLevels(D3DCUBEMAP_FACE_NEGATIVE_Y, m_ptexOrig, m_ptexNew)))
return hr;
if (FAILED(hr = BltAllLevels(D3DCUBEMAP_FACE_POSITIVE_Y, m_ptexOrig, m_ptexNew)))
return hr;
if (FAILED(hr = BltAllLevels(D3DCUBEMAP_FACE_NEGATIVE_Z, m_ptexOrig, m_ptexNew)))
return hr;
if (FAILED(hr = BltAllLevels(D3DCUBEMAP_FACE_POSITIVE_Z, m_ptexOrig, m_ptexNew)))
return hr;
}
else
{
hr = m_pd3ddev->CreateTexture(m_dwWidth, m_dwHeight, m_numMips,
0, fmtTo, D3DPOOL_MANAGED, &pmiptexNew);
if (FAILED(hr))
return hr;
ReleasePpo(&m_ptexNew);
m_ptexNew = pmiptexNew;
if (FAILED(BltAllLevels(D3DCUBEMAP_FACE_FORCE_DWORD, m_ptexOrig, m_ptexNew)))
return hr;
}
//SetModifiedFlag();
//m_bTitleModsChanged = TRUE; // force title bar update
//if (bSwitchView)
// AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_VIEW_COMPRESSED, 0);
return S_OK;
}
/*void CDDS::OnGenerateMipMaps()
{
GenerateMipMaps();
}
*/
void CDDS::GenerateMipMaps()
{
LONG lwTempH;
LONG lwTempW;
LONG lwPowsW;
LONG lwPowsH;
LPDIRECT3DTEXTURE8 pddsNew = NULL;
D3DFORMAT fmt;
HRESULT hr;
//LPDIRECT3DDEVICE8 pd3ddev = PDxtexApp()->Pd3ddev();
LPDIRECT3DTEXTURE8 pmiptex = NULL;
LPDIRECT3DCUBETEXTURE8 pcubetex = NULL;
LPDIRECT3DVOLUMETEXTURE8 pvoltex = NULL;
LPDIRECT3DTEXTURE8 pmiptexNew = NULL;
LPDIRECT3DCUBETEXTURE8 pcubetexNew = NULL;
LPDIRECT3DVOLUMETEXTURE8 pvoltexNew = NULL;
LPDIRECT3DSURFACE8 psurfSrc;
LPDIRECT3DSURFACE8 psurfDest;
LPDIRECT3DVOLUME8 pvolSrc;
LPDIRECT3DVOLUME8 pvolDest;
if (IsVolumeMap())
pvoltex = (LPDIRECT3DVOLUMETEXTURE8)m_ptexOrig;
else if (IsCubeMap())
pcubetex = (LPDIRECT3DCUBETEXTURE8)m_ptexOrig;
else
pmiptex = (LPDIRECT3DTEXTURE8)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;
}
// Ensure that source image is power of 2
lwTempW = m_dwWidth;
lwTempH = m_dwHeight;
lwPowsW = 1;
lwPowsH = 1;
while ((lwTempW & 1) == 0)
{
lwPowsW++;
lwTempW = lwTempW >> 1;
}
while ((lwTempH & 1) == 0)
{
lwPowsH++;
lwTempH = lwTempH >> 1;
}
if (lwTempW != 1 || lwTempH != 1)
{
AfxMessageBox(ID_ERROR_NOTPOW2);
return;
}
m_numMips = lwPowsW > lwPowsH ? lwPowsW : lwPowsH;
// Create destination mipmap surface - same format as source
if (pvoltex != NULL)
{
if (FAILED(hr = m_pd3ddev->CreateVolumeTexture(m_dwWidth, m_dwHeight, m_dwDepth,
m_numMips, 0, fmt, D3DPOOL_SYSTEMMEM, &pvoltexNew)))
{
goto LFail;
}
hr = pvoltex->GetVolumeLevel(0, &pvolSrc);
hr = pvoltexNew->GetVolumeLevel(0, &pvolDest);
hr = D3DXLoadVolumeFromVolume(pvolDest, NULL, NULL, pvolSrc, NULL, NULL,
D3DX_FILTER_TRIANGLE, 0);
ReleasePpo(&pvolSrc);
ReleasePpo(&pvolDest);
hr = D3DXFilterVolumeTexture(pvoltexNew, NULL, 0, D3DX_FILTER_TRIANGLE);
}
else if (pmiptex != NULL)
{
if (FAILED(hr = m_pd3ddev->CreateTexture(m_dwWidth, m_dwHeight, m_numMips,
0, fmt, D3DPOOL_MANAGED, &pmiptexNew)))
{
goto LFail;
}
hr = pmiptex->GetSurfaceLevel(0, &psurfSrc);
hr = pmiptexNew->GetSurfaceLevel(0, &psurfDest);
hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL,
D3DX_FILTER_TRIANGLE, 0);
ReleasePpo(&psurfSrc);
ReleasePpo(&psurfDest);
hr = D3DXFilterTexture(pmiptexNew, NULL, 0, D3DX_FILTER_TRIANGLE);
}
else
{
if (FAILED(hr = m_pd3ddev->CreateCubeTexture(m_dwWidth, m_numMips,
0, fmt, D3DPOOL_MANAGED, &pcubetexNew)))
{
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_FILTER_TRIANGLE, 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_FILTER_TRIANGLE, 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_FILTER_TRIANGLE, 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_FILTER_TRIANGLE, 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_FILTER_TRIANGLE, 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_FILTER_TRIANGLE, 0);
ReleasePpo(&psurfSrc);
ReleasePpo(&psurfDest);
hr = D3DXFilterCubeTexture(pcubetexNew, NULL, 0, D3DX_FILTER_TRIANGLE);
}
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;
((LPDIRECT3DVOLUMETEXTURE8)m_ptexNew)->GetLevelDesc(0, &vd);
fmt = vd.Format;
}
else if (pcubetexNew != NULL)
{
D3DSURFACE_DESC sd;
((LPDIRECT3DTEXTURE8)m_ptexNew)->GetLevelDesc(0, &sd);
fmt = sd.Format;
}
else
{
D3DSURFACE_DESC sd;
((LPDIRECT3DCUBETEXTURE8)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);
}
void CDDS::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
{
//CDocument::SetPathName(lpszPathName, bAddToMRU);
TCHAR* pszLeaf = strrchr(lpszPathName, '\\') + 1;
TCHAR* pszExtension = strrchr(lpszPathName, '.');
if (lstrcmpi(pszExtension, ".dds") != 0)
{
lstrcpy(pszExtension, "");
//SetModifiedFlag(TRUE);
//SetTitle(pszLeaf);
m_strPathName.empty();
}
}
DWORD CDDS::NumMips(VOID)
{
return m_numMips;
}
/*
void CDDS::OnFileOpenAlpha()
{
HRESULT hr;
CSTR fileName;
LPDIRECT3DTEXTURE8 pmiptex;
if (IsCubeMap() || IsVolumeMap())
return;
pmiptex = (LPDIRECT3DTEXTURE8)m_ptexOrig;
// Premultiplied-alpha files don't support this feature:
D3DSURFACE_DESC sd;
pmiptex->GetLevelDesc(0, &sd);
if (sd.Format == D3DFMT_DXT2 || sd.Format == D3DFMT_DXT4)
{
AfxMessageBox(ID_ERROR_PREMULTALPHA);
return;
}
if (!PromptForBmp(&fileName))
return;
LPDIRECT3DSURFACE8 psurf;
if (FAILED(hr = pmiptex->GetSurfaceLevel(0, &psurf)))
return;
if (FAILED(hr = LoadAlphaIntoSurface(fileName, psurf)))
return;
if (m_numMips > 1)
OnGenerateMipMaps();
else if (m_ptexNew != NULL)
{
((LPDIRECT3DTEXTURE8)m_ptexNew)->GetLevelDesc(0, &sd);
Compress(sd.Format, FALSE);
}
UpdateAllViews(NULL, 1);
}
*/
HRESULT CDDS::LoadAlphaIntoSurface(CSTR& strPath, LPDIRECT3DSURFACE8 psurf)
{
HRESULT hr;
D3DSURFACE_DESC sd;
//LPDIRECT3DDEVICE8 pd3ddev = PDxtexApp()->Pd3ddev();
LPDIRECT3DTEXTURE8 ptexAlpha;
LPDIRECT3DSURFACE8 psurfAlpha;
LPDIRECT3DSURFACE8 psurfTarget;
psurf->GetDesc(&sd);
// Load the alpha BMP into psurfAlpha, a new A8R8G8B8 surface
hr = D3DXCreateTextureFromFileEx(m_pd3ddev, strPath.c_str(), sd.Width, sd.Height, 1, 0,
D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE,
D3DX_FILTER_TRIANGLE, 0, NULL, NULL, &ptexAlpha);
hr = ptexAlpha->GetSurfaceLevel(0, &psurfAlpha);
// Copy the target surface into an A8R8G8B8 surface
hr = m_pd3ddev->CreateImageSurface(sd.Width, sd.Height, D3DFMT_A8R8G8B8, &psurfTarget);
hr = D3DXLoadSurfaceFromSurface(psurfTarget, NULL, NULL, psurf, NULL, NULL,
D3DX_FILTER_TRIANGLE, 0);
// Fill in the alpha channels of psurfTarget based on the blue channel of psurfAlpha
D3DLOCKED_RECT lrSrc;
D3DLOCKED_RECT lrDest;
hr = psurfAlpha->LockRect(&lrSrc, NULL, D3DLOCK_READONLY);
hr = psurfTarget->LockRect(&lrDest, NULL, 0);
DWORD xp;
DWORD yp;
DWORD* pdwRowSrc = (DWORD*)lrSrc.pBits;
DWORD* pdwRowDest = (DWORD*)lrDest.pBits;
DWORD* pdwSrc;
DWORD* pdwDest;
DWORD dwAlpha;
LONG dataBytesPerRow = 4 * sd.Width;
for (yp = 0; yp < sd.Height; yp++)
{
pdwSrc = pdwRowSrc;
pdwDest = pdwRowDest;
for (xp = 0; xp < sd.Width; xp++)
{
dwAlpha = *pdwSrc << 24;
*pdwDest &= 0x00ffffff;
*pdwDest |= dwAlpha;
pdwSrc++;
pdwDest++;
}
pdwRowSrc += lrSrc.Pitch / 4;
pdwRowDest += lrDest.Pitch / 4;
}
psurfAlpha->UnlockRect();
psurfTarget->UnlockRect();
// Copy psurfTarget back into real surface
hr = D3DXLoadSurfaceFromSurface(psurf, NULL, NULL, psurfTarget, NULL, NULL,
D3DX_FILTER_TRIANGLE, 0);
// Release allocated interfaces
ReleasePpo(&psurfTarget);
ReleasePpo(&psurfAlpha);
ReleasePpo(&ptexAlpha);
return S_OK;
}
/*
BOOL CDDS::PromptForBmp(CSTR* pstrPath)
{
CFileDialog dlgFile(TRUE);
CSTR title;
VERIFY(title.LoadString(AFX_IDS_OPENFILE));
CSTR strFilter;
CSTR strDefault;
strFilter += "Bitmap Files (*.bmp, *.tga)";
strFilter += (TCHAR)'\0'; // next string please
strFilter += _T("*.bmp;*.tga");
strFilter += (TCHAR)'\0'; // last string
dlgFile.m_ofn.nMaxCustFilter++;
// append the "*.*" all files filter
CSTR allFilter;
VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));
strFilter += allFilter;
strFilter += (TCHAR)'\0'; // next string please
strFilter += _T("*.*");
strFilter += (TCHAR)'\0'; // last string
dlgFile.m_ofn.nMaxCustFilter++;
dlgFile.m_ofn.lpstrFilter = strFilter;
dlgFile.m_ofn.lpstrTitle = title;
dlgFile.m_ofn.lpstrFile = pstrPath->GetBuffer(_MAX_PATH);
INT_PTR nResult = dlgFile.DoModal();
pstrPath->ReleaseBuffer();
if (nResult != IDOK)
return FALSE;
return TRUE;
} */
void CDDS::OpenSubsurface(CSTR fileName, D3DCUBEMAP_FACES FaceType, LONG lwMip, LONG lwSlice)
{
HRESULT hr;
//CSTR fileName;
//LPDIRECT3DDEVICE8 pd3ddev = PDxtexApp()->Pd3ddev();
LPDIRECT3DTEXTURE8 ptex = NULL;
LPDIRECT3DSURFACE8 psurfOrig = NULL;
LPDIRECT3DSURFACE8 psurfNew = NULL;
//if (!PromptForBmp(&fileName))
// return;
if (IsVolumeMap())
{
hr = D3DXCreateTextureFromFile(m_pd3ddev, fileName.c_str(), &ptex);
hr = ptex->GetSurfaceLevel(0, &psurfOrig);
}
else if (IsCubeMap())
{
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexOrig)->GetCubeMapSurface(FaceType, lwMip, &psurfOrig);
if (m_ptexNew != NULL)
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexNew)->GetCubeMapSurface(FaceType, lwMip, &psurfNew);
hr = D3DXLoadSurfaceFromFile(psurfOrig, NULL, NULL, fileName.c_str(), NULL, D3DX_FILTER_TRIANGLE, 0, NULL);
}
else
{
hr = ((LPDIRECT3DTEXTURE8)m_ptexOrig)->GetSurfaceLevel(lwMip, &psurfOrig);
if (m_ptexNew != NULL)
hr = ((LPDIRECT3DTEXTURE8)m_ptexNew)->GetSurfaceLevel(lwMip, &psurfNew);
hr = D3DXLoadSurfaceFromFile(psurfOrig, NULL, NULL, fileName.c_str(), NULL, D3DX_FILTER_TRIANGLE, 0, NULL);
}
// Look for "foo_a.bmp" for alpha channel
int i = fileName.rfind('.');
//fileName = fileName.Left(i) + "_a.bmp";
CSTR strPath2;
strPath2 = fileName.substr(0, i) + "_a.bmp";
//CFileStatus status;
if (FileExists(strPath2))
{
if (FAILED(hr = LoadAlphaIntoSurface(strPath2, psurfOrig)))
return;
}
if (IsVolumeMap())
{
LPDIRECT3DVOLUME8 pvol;
hr = ((LPDIRECT3DVOLUMETEXTURE8)m_ptexOrig)->GetVolumeLevel(lwMip, &pvol);
hr = LoadVolumeSliceFromSurface(pvol, lwSlice, psurfOrig);
ReleasePpo(&pvol);
if (m_ptexNew)
{
hr = ((LPDIRECT3DVOLUMETEXTURE8)m_ptexNew)->GetVolumeLevel(lwMip, &pvol);
hr = LoadVolumeSliceFromSurface(pvol, lwSlice, psurfOrig);
ReleasePpo(&pvol);
}
}
else if (psurfNew != NULL)
{
hr = D3DXLoadSurfaceFromSurface(psurfNew, NULL, NULL, psurfOrig, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
}
ReleasePpo(&psurfOrig);
ReleasePpo(&psurfNew);
ReleasePpo(&ptex);
//SetModifiedFlag(TRUE);
//UpdateAllViews(NULL, 1);
}
void CDDS::OpenAlphaSubsurface(CSTR fileName, D3DCUBEMAP_FACES FaceType, LONG lwMip, LONG lwSlice)
{
HRESULT hr;
//CSTR fileName;
//LPDIRECT3DDEVICE8 pd3ddev = PDxtexApp()->Pd3ddev();
LPDIRECT3DTEXTURE8 ptexOrig = NULL;
LPDIRECT3DTEXTURE8 ptexNew = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -