//========== Copyright © 2005, 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 intp 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(); void CleanupLightmaps(); private: // Gets the maximum lightmap page size... int GetMaxLightmapPageWidth() const; int GetMaxLightmapPageHeight() const; // 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 ) RESTRICT; 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 m_ImagePackers; int m_numSortIDs; IMaterialInternal *m_currentWhiteLightmapMaterial; LightmapPageInfo_t *m_pLightmapPages; CUtlVector 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