Files
FC1/ResourceCompilerImage/ImageObject.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

114 lines
3.7 KiB
C

// ImageObject allows the abstraction of different kinds of
// images generated during conversion
struct ImageObject
{
//! write image to disk, overwrites any existing file
virtual bool Save(const char *filename) = 0;
//! converts the psurfSrc to the native format for this object and stores it as the right mip
virtual HRESULT Convert(LPDIRECT3DSURFACE9 psurfSrc, int mip, int filter, D3DCUBEMAP_FACES facetype, LPDIRECT3DDEVICE9 pd3ddev) = 0;
//! creates a new XRGB texture of this image for images that can't be directly displayed (caller dealocates)
virtual IDirect3DTexture9 *CopyToXRGB(LPDIRECT3DDEVICE9 pd3ddev) { return NULL; };
//! gets the internal DX texture, if the object has one
virtual LPDIRECT3DBASETEXTURE9 GetDXTex() { return NULL; };
virtual void GetDXTexI(IDirect3DTexture9 *&pTexture) { pTexture = NULL; };
//! deallocates all internally held texture objects
virtual ~ImageObject() {};
};
// base DX Image, used for normal textures with mipmaps
struct DXImage : ImageObject
{
LPDIRECT3DBASETEXTURE9 m_pTex;
DXImage(LPDIRECT3DBASETEXTURE9 tex) : m_pTex(tex) {};
~DXImage() { m_pTex->Release(); };
bool Save(const char *filename)
{
return D3DXSaveTextureToFile(filename, D3DXIFF_DDS, m_pTex, NULL)==S_OK;
};
HRESULT Convert(LPDIRECT3DSURFACE9 psurfSrc, int mip, int filter, D3DCUBEMAP_FACES facetype, LPDIRECT3DDEVICE9 pd3ddev)
{
LPDIRECT3DSURFACE9 psurfDest = NULL;
HRESULT hr = ((LPDIRECT3DTEXTURE9)m_pTex)->GetSurfaceLevel(mip, &psurfDest);
if(hr==S_OK) hr = D3DXLoadSurfaceFromSurface(psurfDest, NULL, NULL, psurfSrc, NULL, NULL, filter, 0);
ReleasePpo(&psurfDest);
return hr;
};
LPDIRECT3DBASETEXTURE9 GetDXTex() { return m_pTex; };
virtual void GetDXTexI(IDirect3DTexture9 *&pTexture) { m_pTex->QueryInterface(IID_IDirect3DTexture9,(void **)&pTexture); };
};
// specialized for cubemaps
struct DXImageCube : DXImage
{
DXImageCube(LPDIRECT3DCUBETEXTURE9 tex) : DXImage(tex) {};
HRESULT Convert(LPDIRECT3DSURFACE9 psurfSrc, int mip, int filter, D3DCUBEMAP_FACES facetype, LPDIRECT3DDEVICE9 pd3ddev)
{
LPDIRECT3DSURFACE9 pcubeDest = NULL;
HRESULT hr = ((LPDIRECT3DCUBETEXTURE9)m_pTex)->GetCubeMapSurface(facetype, mip, &pcubeDest);
if(hr==S_OK) hr = D3DXLoadSurfaceFromSurface(pcubeDest, NULL, NULL, psurfSrc, NULL, NULL, filter, 0);
ReleasePpo(&pcubeDest);
return hr;
};
};
// specialized for volumetric textures
struct DXImageVol : DXImage
{
DXImageVol(LPDIRECT3DVOLUMETEXTURE9 tex) : DXImage(tex) {};
HRESULT Convert(LPDIRECT3DSURFACE9 psurfSrc, int mip, int filter, D3DCUBEMAP_FACES facetype, LPDIRECT3DDEVICE9 pd3ddev)
{
LPDIRECT3DVOLUME9 pvolDest = NULL;
HRESULT hr = ((LPDIRECT3DVOLUMETEXTURE9)m_pTex)->GetVolumeLevel(mip, &pvolDest);
if(hr==S_OK) hr = D3DXLoadVolumeFromVolume(pvolDest, NULL, NULL, (LPDIRECT3DVOLUME9)psurfSrc, NULL, NULL, filter, 0);
ReleasePpo(&pvolDest);
return hr;
};
};
// palettized 8 bit image, doesn't use DX internally at all
struct P8Image : ImageObject
{
unsigned char *m_pPalette;
unsigned char **m_ppIndices;
int m_nWidth, m_nHeight, m_nMips;
P8Image(int w, int h, int m) : m_pPalette(NULL), m_nWidth(w), m_nHeight(h), m_nMips(m)
{
m_ppIndices = new unsigned char *[m];
for(int i = 0; i<m_nMips; i++) m_ppIndices[i] = NULL;
};
~P8Image()
{
for(int i = 0; i<m_nMips; i++) if(m_ppIndices[i]) free(m_ppIndices[i]);
delete[] m_ppIndices;
};
bool Save(const char *filename);
void SavePaletizedTextureHeader(FILE *fh);
void SavePaletizedTextureMip(FILE *fh, unsigned char *buf, int mip);
HRESULT Convert(LPDIRECT3DSURFACE9 psurfSrc, int mip, int filter, D3DCUBEMAP_FACES facetype, LPDIRECT3DDEVICE9 pd3ddev);
IDirect3DTexture9 *CopyToXRGB(LPDIRECT3DDEVICE9 pd3ddev);
};