diff options
Diffstat (limited to 'materialsystem/cmatlightmaps.h')
| -rw-r--r-- | materialsystem/cmatlightmaps.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/materialsystem/cmatlightmaps.h b/materialsystem/cmatlightmaps.h new file mode 100644 index 0000000..f2b135f --- /dev/null +++ b/materialsystem/cmatlightmaps.h @@ -0,0 +1,199 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef CMATERIALLIGHTMAPS_H +#define CMATERIALLIGHTMAPS_H + +#include "tier1/utlvector.h" +#include "imagepacker.h" + +#ifndef MATSYS_INTERNAL +#error "This file is private to the implementation of IMaterialSystem/IMaterialSystemInternal" +#endif + +#if defined( _WIN32 ) +#pragma once +#endif + +//----------------------------------------------------------------------------- + +class CMaterialSystem; +class IMatRenderContextInternal; +class CMaterialDict; +class IMaterial; +class IMaterialInternal; +class FloatBitMap_t; +typedef int ShaderAPITextureHandle_t; +struct MaterialSystem_SortInfo_t; +typedef unsigned short MaterialHandle_t; + +//----------------------------------------------------------------------------- +// Manager of material system lightmaps +//----------------------------------------------------------------------------- +const int COUNT_DYNAMIC_LIGHTMAP_PAGES = 1; + +class CMatLightmaps +{ +public: + CMatLightmaps(); + + void Shutdown( ); + + //------------------------------------------------------------ + // Methods exposed in IMaterialSystem + //------------------------------------------------------------ + void BeginLightmapAllocation( void ); + void EndLightmapAllocation( void ); + + int AllocateLightmap( int width, int height, + int offsetIntoLightmapPage[2], + IMaterial *pMaterial ); + int AllocateWhiteLightmap( IMaterial *pMaterial ); + // NOTE: This returns a lightmap page ID, not a sortID like AllocateLightmap!!!! + int AllocateDynamicLightmap( int lightmapSize[2], int *pOutOffsetIntoPage, int frameID ); + + int GetNumSortIDs( void ); + void GetSortInfo( MaterialSystem_SortInfo_t *sortInfoArray ); + + void UpdateLightmap( int lightmapPageID, int lightmapSize[2], + int offsetIntoLightmapPage[2], + float *pFloatImage, float *pFloatImageBump1, + float *pFloatImageBump2, float *pFloatImageBump3 ); + + void GetLightmapPageSize( int lightmapPageID, int *width, int *height ) const; + + void ResetMaterialLightmapPageInfo( void ); + + //------------------------------------------------------------ + // Methods exposed in IMaterialSystemInternal + //------------------------------------------------------------ + int GetLightmapWidth( int lightmap ) const; + int GetLightmapHeight( int lightmap ) const; + + //------------------------------------------------------------ + // Methods used by other material system components + //------------------------------------------------------------ + + // Releases/restores lightmap pages + void ReleaseLightmapPages(); + void RestoreLightmapPages(); + + void EnableLightmapFiltering( bool enabled ); + + int GetNumLightmapPages() const { return m_NumLightmapPages;} + ShaderAPITextureHandle_t GetLightmapPageTextureHandle( int lightmap ) { return m_LightmapPageTextureHandles[lightmap]; } + bool IsDynamicLightmap( int lightmap ) const { return (lightmap >= m_firstDynamicLightmap ) ? true : false; } + + CMaterialSystem *GetMaterialSystem() const; + + void BeginUpdateLightmaps(); + void EndUpdateLightmaps(); + +private: + + // Gets the maximum lightmap page size... + int GetMaxLightmapPageWidth() const; + int GetMaxLightmapPageHeight() const; + + void CleanupLightmaps(); + + // Allocate lightmap textures in D3D + void AllocateLightmapTexture( int lightmap ); + + // Initializes lightmap bits + void InitLightmapBits( int lightmap ); + + // assumes m_LightmapPixelWriter is already set up - results written there + void BumpedLightmapBitsToPixelWriter_LDR( float* pFloatImage, float *pFloatImageBump1, float *pFloatImageBump2, + float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); + void BumpedLightmapBitsToPixelWriter_HDRF( float* pFloatImage, float *pFloatImageBump1, float *pFloatImageBump2, + float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); + + void BumpedLightmapBitsToPixelWriter_HDRI( float* pFloatImage, float *pFloatImageBump1, float *pFloatImageBump2, + float *pFloatImageBump3, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); + + void LightmapBitsToPixelWriter_LDR( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); + void LightmapBitsToPixelWriter_HDRF( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); + void LightmapBitsToPixelWriter_HDRI( float* pFloatImage, int pLightmapSize[2], int pOffsetIntoLightmapPage[2], FloatBitMap_t *pfmOut ); + + // For computing sort info + void ComputeSortInfo( MaterialSystem_SortInfo_t* pInfo, int& sortId, bool alpha ); + void ComputeWhiteLightmappedSortInfo( MaterialSystem_SortInfo_t* pInfo, int& sortId, bool alpha ); + + void EnumerateMaterials( void ); + + // Lock a lightmap for update. + bool LockLightmap( int lightmap ); + + + + //------------------------------------------------------------ + // Accessor helpers + //------------------------------------------------------------ + + IMaterialInternal* GetCurrentMaterialInternal() const; + void SetCurrentMaterialInternal(IMaterialInternal* pCurrentMaterial); + IMaterialInternal* GetMaterialInternal( MaterialHandle_t idx ) const; + const IMatRenderContextInternal *GetRenderContextInternal() const; + IMatRenderContextInternal *GetRenderContextInternal(); + const CMaterialDict *GetMaterialDict() const; + CMaterialDict *GetMaterialDict(); + + //------------------------------------------------------------ + + struct LightmapPageInfo_t + { + unsigned short m_Width; + unsigned short m_Height; + int m_Flags; + }; + + struct dynamiclightmap_t + { + void Init() + { + lightmapLocked = -1; + frameID = 0; + currentDynamicIndex = 0; + for ( int i = 0; i < COUNT_DYNAMIC_LIGHTMAP_PAGES; i++ ) + { + lightmapLockFrame[i] = 0; + } + } + + int lightmapLocked; + int frameID; + int currentDynamicIndex; + int lightmapLockFrame[COUNT_DYNAMIC_LIGHTMAP_PAGES]; + CImagePacker imagePackers[COUNT_DYNAMIC_LIGHTMAP_PAGES]; + }; + + + CUtlVector<CImagePacker> m_ImagePackers; + int m_numSortIDs; + IMaterialInternal *m_currentWhiteLightmapMaterial; + + LightmapPageInfo_t *m_pLightmapPages; + CUtlVector<ShaderAPITextureHandle_t> m_LightmapPageTextureHandles; + int m_NumLightmapPages; + int m_nUpdatingLightmapsStackDepth; + int m_firstDynamicLightmap; + CPixelWriter m_LightmapPixelWriter; + int m_nLockedLightmap; // -1 for nothing locked. + dynamiclightmap_t m_dynamic; + FloatBitMap_t **m_pLightmapDataPtrArray; + + enum LightmapsState + { + STATE_DEFAULT, // Lightmaps in default state - all operations allowed + STATE_RELEASED // Lightmaps in released state - usually due to lost/released D3D device, D3D operations disallowed, Restore() call to follow + }; + LightmapsState m_eLightmapsState; +}; + +//----------------------------------------------------------------------------- + +#endif // CMATERIALLIGHTMAPS_H |