202 lines
6.6 KiB
C++
202 lines
6.6 KiB
C++
#ifndef __MIPVOL_HPP__
|
|
#define __MIPVOL_HPP__
|
|
|
|
/*==========================================================================;
|
|
*
|
|
* Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: mipvol.hpp
|
|
* Content: Class header the mip-volume class. This class acts a
|
|
* container for Volumes that are used as textures.
|
|
*
|
|
*
|
|
***************************************************************************/
|
|
|
|
// Includes
|
|
#include "texture.hpp"
|
|
#include "pixel.hpp"
|
|
|
|
// Forward decls
|
|
class CVolume;
|
|
|
|
//
|
|
// The mip-map class holds a collection of CVolumes. The MipVolume class
|
|
// implements the IDirect3DVolumeTexture8 interface; each Volume implements
|
|
// the IDirect3DVolume8 interface. To reduce overhead per level, we have
|
|
// put most of the "real" guts of each volume into the container class;
|
|
// i.e. most of the methods of the Volume really just end up calling
|
|
// something in the MipVolume object.
|
|
//
|
|
// The base class implementation assumes a sys-mem allocation.
|
|
//
|
|
|
|
class CMipVolume : public CBaseTexture, public IDirect3DVolumeTexture8
|
|
{
|
|
public:
|
|
// Creation method to allow creation of MipVolumes no matter
|
|
// their actual underlying type.
|
|
static HRESULT Create(CBaseDevice *pDevice,
|
|
DWORD cpWidth,
|
|
DWORD cpHeight,
|
|
DWORD cpDepth,
|
|
DWORD cLevels,
|
|
DWORD dwUsage,
|
|
D3DFORMAT Format,
|
|
D3DPOOL Pool,
|
|
IDirect3DVolumeTexture8 **ppMipVolume);
|
|
|
|
// Destructor
|
|
virtual ~CMipVolume();
|
|
|
|
// IUnknown methods
|
|
STDMETHOD(QueryInterface) (REFIID riid,
|
|
VOID **ppvObj);
|
|
STDMETHOD_(ULONG,AddRef) ();
|
|
STDMETHOD_(ULONG,Release) ();
|
|
|
|
// IDirect3DResource methods
|
|
STDMETHOD(GetDevice) (IDirect3DDevice8 **ppvObj);
|
|
|
|
STDMETHOD(SetPrivateData)(REFGUID riid,
|
|
CONST VOID *pvData,
|
|
DWORD cbData,
|
|
DWORD dwFlags);
|
|
|
|
STDMETHOD(GetPrivateData)(REFGUID riid,
|
|
VOID *pvData,
|
|
DWORD *pcbData);
|
|
|
|
STDMETHOD(FreePrivateData)(REFGUID riid);
|
|
|
|
STDMETHOD_(DWORD, GetPriority)();
|
|
STDMETHOD_(DWORD, SetPriority)(DWORD dwPriority);
|
|
STDMETHOD_(void, PreLoad)();
|
|
STDMETHOD_(D3DRESOURCETYPE, GetType)();
|
|
|
|
// IDirect3DMipTexture methods
|
|
STDMETHOD_(DWORD, GetLOD)();
|
|
STDMETHOD_(DWORD, SetLOD)(DWORD dwLOD);
|
|
STDMETHOD_(DWORD, GetLevelCount)();
|
|
|
|
// IDirect3DMipVolume methods
|
|
STDMETHOD(GetLevelDesc)(UINT iLevel, D3DVOLUME_DESC *pDesc);
|
|
STDMETHOD(GetVolumeLevel)(UINT iLevel,
|
|
IDirect3DVolume8 **ppVolumeLevel);
|
|
|
|
STDMETHOD(LockBox)(UINT iLevel,
|
|
D3DLOCKED_BOX *pLockedBox,
|
|
CONST D3DBOX *pBox,
|
|
DWORD dwFlags);
|
|
STDMETHOD(UnlockBox)(UINT iLevel);
|
|
|
|
|
|
STDMETHOD(AddDirtyBox)(CONST D3DBOX *pBox);
|
|
|
|
// Direct accessor for surface descriptor
|
|
const D3DVOLUME_DESC *Desc() const
|
|
{
|
|
return &m_desc;
|
|
} // AccessDesc;
|
|
|
|
// Helper for Lock
|
|
void ComputeMipVolumeOffset(UINT iLevel,
|
|
CONST D3DBOX *pBox,
|
|
D3DLOCKED_BOX *pLockedBoxData)
|
|
{
|
|
CPixel::ComputeMipVolumeOffset(Desc(),
|
|
iLevel,
|
|
m_rgbPixels,
|
|
pBox,
|
|
pLockedBoxData);
|
|
} // ComputeMipVolumeOffset
|
|
|
|
// Notification when a mip-level is locked for writing
|
|
void OnVolumeLock(DWORD iLevel, CONST D3DBOX *pBox, DWORD dwFlags);
|
|
|
|
|
|
// Methods for the CResource
|
|
|
|
// Specifies a creation of a resource that
|
|
// looks just like the current one; in a new POOL
|
|
// with a new LOD.
|
|
virtual HRESULT Clone(D3DPOOL Pool,
|
|
CResource **ppResource) const;
|
|
|
|
// Provides a method to access basic structure of the
|
|
// pieces of the resource.
|
|
virtual const D3DBUFFER_DESC* GetBufferDesc() const;
|
|
|
|
// Updates destination with source dirty rects
|
|
virtual HRESULT UpdateDirtyPortion(CResource *pResourceTarget);
|
|
|
|
// Allows the Resource Manager to mark the texture
|
|
// as needing to be completely updated on next
|
|
// call to UpdateDirtyPortion
|
|
virtual void MarkAllDirty();
|
|
|
|
// Methods for CBaseTexture
|
|
|
|
// Method for UpdateTexture to call; does type-specific
|
|
// parameter checking before calling UpdateDirtyPortion
|
|
virtual HRESULT UpdateTexture(CBaseTexture *pTextureTarget);
|
|
|
|
// Parameter validation method to make sure that no part of
|
|
// the texture is locked.
|
|
#ifdef DEBUG
|
|
virtual BOOL IsTextureLocked();
|
|
#endif // DEBUG
|
|
|
|
|
|
private:
|
|
// Constructor returns an error code
|
|
// if the object could not be fully
|
|
// constructed
|
|
CMipVolume(CBaseDevice *pDevice,
|
|
DWORD cpWidth,
|
|
DWORD cpHeight,
|
|
DWORD cpDepth,
|
|
DWORD cLevels,
|
|
DWORD dwUsage,
|
|
D3DFORMAT Format,
|
|
D3DPOOL Pool,
|
|
REF_TYPE refType,
|
|
HRESULT *phr
|
|
);
|
|
|
|
// Internal implementation of AddDirtyBox
|
|
void InternalAddDirtyBox(CONST D3DBOX *pBox);
|
|
|
|
// Each MipVolume has an array of CMipSurfaces
|
|
CVolume **m_VolumeArray;
|
|
|
|
// Each MipVolume has a memory block that holds
|
|
// all the pixel data in a contiguous chunk
|
|
BYTE *m_rgbPixels;
|
|
|
|
// Keep track of description
|
|
D3DVOLUME_DESC m_desc;
|
|
|
|
// In DX7 we kept track of upto 6 RECTs per mip-chain.
|
|
// These rects indicate which portion of the top-most level of
|
|
// a mip-chain were modified. (We continue to ignore modifications
|
|
// to lower levels of the mip-chain. This is by-design.)
|
|
//
|
|
// For MipVolumes, we follow the same guidelines.. but it is less
|
|
// clear that this is the right number to choose.
|
|
|
|
enum
|
|
{
|
|
MIPVOLUME_MAXDIRTYBOX = 6,
|
|
MIPVOLUME_ALLDIRTY = 7
|
|
};
|
|
|
|
D3DBOX m_DirtyBoxArray[MIPVOLUME_MAXDIRTYBOX];
|
|
|
|
// If m_cBoxUsed is greater than MIPVOLUME_MAXDIRTYBOX
|
|
// then it means that everything is dirty
|
|
UINT m_cBoxUsed;
|
|
|
|
}; // class CMipVolume
|
|
|
|
#endif // __MIPVOL_HPP__
|