#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__