You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
6.9 KiB
199 lines
6.9 KiB
//========= 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
|
|
|