📄 loadsavedds.cpp
字号:
LPDIRECT3DSURFACE8 psurfOrig = NULL;
LPDIRECT3DSURFACE8 psurfNew = NULL;
LPDIRECT3DVOLUME8 pvolOrig = NULL;
LPDIRECT3DVOLUME8 pvolNew = NULL;
D3DSURFACE_DESC sd;
DWORD dwWidth = m_dwWidth;
DWORD dwHeight = m_dwHeight;
if (IsVolumeMap())
{
for (int i = 0; i < lwMip; i++)
{
dwWidth /= 2;
dwHeight /= 2;
}
hr = m_pd3ddev->CreateTexture(dwWidth, dwHeight, 1,
0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &ptexOrig);
hr = ptexOrig->GetSurfaceLevel(0, &psurfOrig);
hr = ((LPDIRECT3DVOLUMETEXTURE8)m_ptexOrig)->GetVolumeLevel(lwMip, &pvolOrig);
hr = LoadSurfaceFromVolumeSlice(pvolOrig, lwSlice, psurfOrig);
if (m_ptexNew != NULL)
{
hr = m_pd3ddev->CreateTexture(dwWidth, dwHeight, 1,
0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &ptexNew);
hr = ptexNew->GetSurfaceLevel(0, &psurfOrig);
hr = ((LPDIRECT3DVOLUMETEXTURE8)m_ptexOrig)->GetVolumeLevel(lwMip, &pvolNew);
hr = LoadSurfaceFromVolumeSlice(pvolNew, lwSlice, psurfOrig);
}
}
else if (IsCubeMap())
{
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexOrig)->GetCubeMapSurface(FaceType, lwMip, &psurfOrig);
((LPDIRECT3DCUBETEXTURE8)m_ptexOrig)->GetLevelDesc(lwMip, &sd);
if (sd.Format == D3DFMT_DXT2 || sd.Format == D3DFMT_DXT4)
{
AfxMessageBox(ID_ERROR_PREMULTALPHA);
return;
}
if (m_ptexNew != NULL)
{
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexNew)->GetCubeMapSurface(FaceType, lwMip, &psurfNew);
((LPDIRECT3DCUBETEXTURE8)m_ptexNew)->GetLevelDesc(lwMip, &sd);
if (sd.Format == D3DFMT_DXT2 || sd.Format == D3DFMT_DXT4)
{
AfxMessageBox(ID_ERROR_PREMULTALPHA);
return;
}
}
}
else
{
hr = ((LPDIRECT3DTEXTURE8)m_ptexOrig)->GetSurfaceLevel(lwMip, &psurfOrig);
((LPDIRECT3DTEXTURE8)m_ptexOrig)->GetLevelDesc(lwMip, &sd);
if (sd.Format == D3DFMT_DXT2 || sd.Format == D3DFMT_DXT4)
{
AfxMessageBox(ID_ERROR_PREMULTALPHA);
return;
}
if (m_ptexNew != NULL)
{
hr = ((LPDIRECT3DTEXTURE8)m_ptexNew)->GetSurfaceLevel(lwMip, &psurfNew);
((LPDIRECT3DTEXTURE8)m_ptexNew)->GetLevelDesc(lwMip, &sd);
if (sd.Format == D3DFMT_DXT2 || sd.Format == D3DFMT_DXT4)
{
AfxMessageBox(ID_ERROR_PREMULTALPHA);
return;
}
}
}
//if (!PromptForBmp(&fileName))
// return;
if (FAILED(hr = LoadAlphaIntoSurface(fileName, psurfOrig)))
return;
if (psurfNew != NULL)
{
if (FAILED(hr = LoadAlphaIntoSurface(fileName, psurfNew)))
return;
}
if (pvolOrig != NULL)
{
hr = LoadVolumeSliceFromSurface(pvolOrig, lwSlice, psurfOrig);
}
if (pvolNew != NULL)
{
hr = LoadVolumeSliceFromSurface(pvolNew, lwSlice, psurfNew);
}
ReleasePpo(&psurfOrig);
ReleasePpo(&psurfNew);
ReleasePpo(&ptexOrig);
ReleasePpo(&ptexNew);
ReleasePpo(&pvolOrig);
ReleasePpo(&pvolNew);
//SetModifiedFlag(TRUE);
//UpdateAllViews(NULL, 1);
}
/*void CDDS::OnFormatChangeCubeMapFaces()
{
HRESULT hr;
LPDIRECT3DDEVICE8 pd3ddev = PDxtexApp()->Pd3ddev();
D3DSURFACE_DESC sd;
LPDIRECT3DCUBETEXTURE8 ptexCube;
DWORD iLevel;
LPDIRECT3DSURFACE8 psurfSrc;
LPDIRECT3DSURFACE8 psurfDest;
CCubeMapDlg cubeMapDlg;
if (IDCANCEL == cubeMapDlg.DoModal())
return;
// Change m_ptexOrig into a cubemap
((LPDIRECT3DTEXTURE8)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 = ((LPDIRECT3DTEXTURE8)m_ptexOrig)->GetSurfaceLevel(iLevel, &psurfSrc);
hr = ptexCube->GetCubeMapSurface((D3DCUBEMAP_FACES)cubeMapDlg.m_iFace, iLevel, &psurfDest);
hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL,
psurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
ReleasePpo(&psurfSrc);
ReleasePpo(&psurfDest);
}
ReleasePpo(&m_ptexOrig);
m_ptexOrig = ptexCube;
// Change m_ptexNew into a cubemap too
if (m_ptexNew != NULL)
{
((LPDIRECT3DTEXTURE8)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 = ((LPDIRECT3DTEXTURE8)m_ptexNew)->GetSurfaceLevel(iLevel, &psurfSrc);
hr = ptexCube->GetCubeMapSurface((D3DCUBEMAP_FACES)cubeMapDlg.m_iFace, iLevel, &psurfDest);
hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL,
psurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, 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
}
void CDDS::OnFormatMakeIntoVolumeMap()
{
HRESULT hr;
//LPDIRECT3DDEVICE8 pd3ddev = PDxtexApp()->Pd3ddev();
D3DSURFACE_DESC sd;
LPDIRECT3DVOLUMETEXTURE8 ptexVolume;
DWORD iLevel;
LPDIRECT3DSURFACE8 psurfSrc;
LPDIRECT3DVOLUME8 pvolumeDest;
UINT numLayers;
CVolumeMapDlg volumeMapDlg;
if (IDCANCEL == volumeMapDlg.DoModal())
return;
numLayers = (1 << volumeMapDlg.m_powLayers) * 2;
// Change m_ptexOrig into a volumemap
((LPDIRECT3DTEXTURE8)m_ptexOrig)->GetLevelDesc(0, &sd);
hr = pd3ddev->CreateVolumeTexture(m_dwWidth, m_dwHeight, numLayers,
m_numMips, 0, sd.Format, D3DPOOL_SYSTEMMEM, &ptexVolume);
if (FAILED(hr))
return;
for (iLevel = 0; iLevel < m_numMips; iLevel++)
{
hr = ((LPDIRECT3DTEXTURE8)m_ptexOrig)->GetSurfaceLevel(iLevel, &psurfSrc);
hr = ptexVolume->GetVolumeLevel(iLevel, &pvolumeDest);
hr = LoadVolumeSliceFromSurface(pvolumeDest, 0, psurfSrc);
ReleasePpo(&psurfSrc);
ReleasePpo(&pvolumeDest);
}
ReleasePpo(&m_ptexOrig);
m_ptexOrig = ptexVolume;
// Change m_ptexNew into a volumemap too
if (m_ptexNew != NULL)
{
((LPDIRECT3DTEXTURE8)m_ptexNew)->GetLevelDesc(0, &sd);
hr = pd3ddev->CreateVolumeTexture(m_dwWidth, m_dwHeight, numLayers,
m_numMips, 0, sd.Format, D3DPOOL_SYSTEMMEM, &ptexVolume);
if (FAILED(hr))
return;
for (iLevel = 0; iLevel < m_numMips; iLevel++)
{
hr = ((LPDIRECT3DTEXTURE8)m_ptexNew)->GetSurfaceLevel(iLevel, &psurfSrc);
hr = ptexVolume->GetVolumeLevel(iLevel, &pvolumeDest);
hr = LoadVolumeSliceFromSurface(pvolumeDest, 0, psurfSrc);
ReleasePpo(&psurfSrc);
ReleasePpo(&pvolumeDest);
}
ReleasePpo(&m_ptexNew);
m_ptexNew = ptexVolume;
}
m_dwDepth = numLayers;
SetModifiedFlag();
UpdateAllViews(NULL, 1); // tell CView to pick up new surface pointers
}
*/
HRESULT CDDS::LoadVolumeSliceFromSurface(LPDIRECT3DVOLUME8 pVolume, UINT iSlice, LPDIRECT3DSURFACE8 psurf)
{
HRESULT hr;
D3DSURFACE_DESC sd;
D3DVOLUME_DESC vd;
D3DLOCKED_RECT lr;
D3DBOX boxSrc;
D3DBOX boxDest;
psurf->GetDesc(&sd);
pVolume->GetDesc(&vd);
boxSrc.Left = 0;
boxSrc.Right = sd.Width;
boxSrc.Top = 0;
boxSrc.Bottom = sd.Height;
boxSrc.Front = 0;
boxSrc.Back = 1;
boxDest.Left = 0;
boxDest.Right = vd.Width;
boxDest.Top = 0;
boxDest.Bottom = vd.Height;
boxDest.Front = iSlice;
boxDest.Back = iSlice + 1;
hr = psurf->LockRect(&lr, NULL, 0);
if (FAILED(hr))
return hr;
hr = D3DXLoadVolumeFromMemory(pVolume, NULL, &boxDest, lr.pBits, sd.Format, lr.Pitch,
0, NULL, &boxSrc, D3DX_FILTER_TRIANGLE, 0);
psurf->UnlockRect();
return hr;
}
HRESULT CDDS::LoadSurfaceFromVolumeSlice(LPDIRECT3DVOLUME8 pVolume, UINT iSlice, LPDIRECT3DSURFACE8 psurf)
{
HRESULT hr;
D3DVOLUME_DESC vd;
D3DLOCKED_BOX lb;
D3DBOX box;
RECT rc;
pVolume->GetDesc(&vd);
box.Left = 0;
box.Right = vd.Width;
box.Top = 0;
box.Bottom = vd.Height;
box.Front = iSlice;
box.Back = iSlice + 1;
rc.left = 0;
rc.right = vd.Width;
rc.top = 0;
rc.bottom = vd.Height;
hr = pVolume->LockBox(&lb, &box, 0);
if (FAILED(hr))
return hr;
hr = D3DXLoadSurfaceFromMemory(psurf, NULL, NULL, lb.pBits, vd.Format, lb.RowPitch,
NULL, &rc, D3DX_FILTER_TRIANGLE, 0);
pVolume->UnlockBox();
return hr;
}
HRESULT CDDS::BltAllLevels(D3DCUBEMAP_FACES FaceType,
LPDIRECT3DBASETEXTURE8 ptexSrc, LPDIRECT3DBASETEXTURE8 ptexDest)
{
HRESULT hr;
LPDIRECT3DTEXTURE8 pmiptexSrc;
LPDIRECT3DTEXTURE8 pmiptexDest;
LPDIRECT3DCUBETEXTURE8 pcubetexSrc;
LPDIRECT3DCUBETEXTURE8 pcubetexDest;
LPDIRECT3DVOLUMETEXTURE8 pvoltexSrc;
LPDIRECT3DVOLUMETEXTURE8 pvoltexDest;
LPDIRECT3DSURFACE8 psurfSrc;
LPDIRECT3DSURFACE8 psurfDest;
LPDIRECT3DVOLUME8 pvolSrc;
LPDIRECT3DVOLUME8 pvolDest;
DWORD iLevel;
if (IsVolumeMap())
{
pvoltexSrc = (LPDIRECT3DVOLUMETEXTURE8)ptexSrc;
pvoltexDest = (LPDIRECT3DVOLUMETEXTURE8)ptexDest;
}
else if (IsCubeMap())
{
pcubetexSrc = (LPDIRECT3DCUBETEXTURE8)ptexSrc;
pcubetexDest = (LPDIRECT3DCUBETEXTURE8)ptexDest;
}
else
{
pmiptexSrc = (LPDIRECT3DTEXTURE8)ptexSrc;
pmiptexDest = (LPDIRECT3DTEXTURE8)ptexDest;
}
for (iLevel = 0; iLevel < m_numMips; iLevel++)
{
if (IsVolumeMap())
{
hr = pvoltexSrc->GetVolumeLevel(iLevel, &pvolSrc);
hr = pvoltexDest->GetVolumeLevel(iLevel, &pvolDest);
hr = D3DXLoadVolumeFromVolume(pvolDest, NULL, NULL,
pvolSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
}
if (IsCubeMap())
{
hr = pcubetexSrc->GetCubeMapSurface(FaceType, iLevel, &psurfSrc);
hr = pcubetexDest->GetCubeMapSurface(FaceType, iLevel, &psurfDest);
hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL,
psurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
}
else
{
hr = pmiptexSrc->GetSurfaceLevel(iLevel, &psurfSrc);
hr = pmiptexDest->GetSurfaceLevel(iLevel, &psurfDest);
hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL,
psurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
}
}
return S_OK;
}
void CDDS::OpenCubeFace(CSTR fileName, D3DCUBEMAP_FACES FaceType)
{
HRESULT hr;
LPDIRECT3DSURFACE8 psurfOrig = NULL;
LPDIRECT3DSURFACE8 psurfNew = NULL;
if (!IsCubeMap())
return;
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexOrig)->GetCubeMapSurface(FaceType, 0, &psurfOrig);
if (m_ptexNew != NULL)
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexNew)->GetCubeMapSurface(FaceType, 0, &psurfNew);
//if (!PromptForBmp(&fileName))
// return;
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 fileName2 = fileName.substr(0, i) + "_a.bmp";
//CFileStatus status;
if (FileExists(fileName2))
{
if (FAILED(hr = LoadAlphaIntoSurface(fileName2, psurfOrig)))
return;
}
if (m_numMips > 1)
{
hr = D3DXFilterCubeTexture((LPDIRECT3DCUBETEXTURE8)m_ptexOrig, NULL, 0, D3DX_FILTER_TRIANGLE);
}
if (psurfNew != NULL)
{
hr = D3DXLoadSurfaceFromSurface(psurfNew, NULL, NULL, psurfOrig, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
if (m_numMips > 1)
{
hr = D3DXFilterCubeTexture((LPDIRECT3DCUBETEXTURE8)m_ptexNew, NULL, 0, D3DX_FILTER_TRIANGLE);
}
}
ReleasePpo(&psurfOrig);
ReleasePpo(&psurfNew);
//SetModifiedFlag(TRUE);
//UpdateAllViews(NULL, 1);
}
void CDDS::OpenAlphaCubeFace(CSTR fileName, D3DCUBEMAP_FACES FaceType)
{
HRESULT hr;
LPDIRECT3DSURFACE8 psurfOrig = NULL;
LPDIRECT3DSURFACE8 psurfNew = NULL;
D3DSURFACE_DESC sd;
if (!IsCubeMap())
return;
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexOrig)->GetCubeMapSurface(FaceType, 0, &psurfOrig);
((LPDIRECT3DCUBETEXTURE8)m_ptexOrig)->GetLevelDesc(0, &sd);
if (sd.Format == D3DFMT_DXT2 || sd.Format == D3DFMT_DXT4)
{
AfxMessageBox(ID_ERROR_PREMULTALPHA);
return;
}
if (m_ptexNew != NULL)
{
hr = ((LPDIRECT3DCUBETEXTURE8)m_ptexNew)->GetCubeMapSurface(FaceType, 0, &psurfNew);
}
//if (!PromptForBmp(&fileName))
// return;
if (FAILED(hr = LoadAlphaIntoSurface(fileName, psurfOrig)))
return;
if (psurfNew != NULL)
{
if (FAILED(hr = LoadAlphaIntoSurface(fileName, psurfNew)))
return;
}
if (m_numMips > 1)
{
hr = D3DXFilterCubeTexture((LPDIRECT3DCUBETEXTURE8)m_ptexOrig, NULL, 0, D3DX_FILTER_TRIANGLE);
}
if (psurfNew != NULL)
{
hr = D3DXLoadSurfaceFromSurface(psurfNew, NULL, NULL, psurfOrig, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
if (m_numMips > 1)
{
hr = D3DXFilterCubeTexture((LPDIRECT3DCUBETEXTURE8)m_ptexNew, NULL, 0, D3DX_FILTER_TRIANGLE);
}
}
ReleasePpo(&psurfOrig);
ReleasePpo(&psurfNew);
//SetModifiedFlag(TRUE);
//UpdateAllViews(NULL, 1);
}
DWORD CDDS::DwDepthAt(LONG lwMip)
{
DWORD dwDepth = m_dwDepth;
while (lwMip > 0 && dwDepth > 1)
{
dwDepth /= 2;
lwMip--;
}
return dwDepth;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -