source-engine/materialsystem/cmatlightmaps.h
2022-06-05 01:13:12 +03:00

200 lines
6.9 KiB
C++

//========= 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 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();
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 ) 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<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