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.
186 lines
4.0 KiB
186 lines
4.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef BSPLIGHTING_H |
|
#define BSPLIGHTING_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "stdafx.h" |
|
#include "ibsplighting.h" |
|
#include "utlvector.h" |
|
#include "utllinkedlist.h" |
|
#include "bspfile.h" |
|
#include "interface.h" |
|
#include "ivraddll.h" |
|
#include "ibsplightingthread.h" |
|
|
|
|
|
class CBSPLighting : public IBSPLighting |
|
{ |
|
public: |
|
|
|
CBSPLighting(); |
|
virtual ~CBSPLighting(); |
|
virtual void Release(); |
|
|
|
virtual bool Load( char const *pFilename ); |
|
virtual void Term(); |
|
virtual bool Serialize(); |
|
virtual void StartLighting( char const *pVMFFileWithEnts ); |
|
virtual float GetPercentComplete(); |
|
virtual void Interrupt(); |
|
virtual bool CheckForNewLightmaps(); |
|
virtual void Draw(); |
|
|
|
|
|
private: |
|
class CVert |
|
{ |
|
public: |
|
Vector m_vPos; |
|
Vector2D m_vTexCoords; |
|
Vector2D m_vLightCoords; |
|
}; |
|
|
|
// This is the face data we store for each face. Just enough to |
|
// let us update the lightmaps in memory. |
|
class CFaceMaterial; |
|
class CFace; |
|
class CStoredFace |
|
{ |
|
public: |
|
int m_iMapFace; // index into dfaces. |
|
int m_LightmapPageID; |
|
int m_OffsetIntoLightmapPage[2]; |
|
int m_LightmapSize[2]; // This already has 1 added to it (unlike dface). |
|
CFaceMaterial *m_pMaterial; |
|
CFace *m_pFace; // only valid inside of Load |
|
float m_BumpSTexCoordOffset; |
|
|
|
// Indices into CFaceMaterial::m_pMesh |
|
int m_iFirstIndex; |
|
int m_nIndices; |
|
}; |
|
|
|
class CDrawCommand |
|
{ |
|
public: |
|
CUtlVector<CPrimList> m_PrimLists; |
|
int m_LightmapPageID; |
|
}; |
|
|
|
friend bool FindDrawCommand( CUtlVector<CDrawCommand*> &drawCommands, int lmPageID, int &index ); |
|
|
|
class CMaterialBuf |
|
{ |
|
public: |
|
CMaterialBuf(); |
|
~CMaterialBuf(); |
|
|
|
CUtlLinkedList<CStoredFace*, unsigned short> m_Faces; |
|
|
|
// Commands to draw everything in this material as fast as possible. |
|
CUtlVector<CDrawCommand*> m_DrawCommands; |
|
|
|
int m_nVerts; |
|
int m_nIndices; |
|
|
|
IMesh *m_pMesh; |
|
}; |
|
|
|
|
|
class CFaceMaterial |
|
{ |
|
public: |
|
~CFaceMaterial(); |
|
|
|
IMaterial *m_pMaterial; |
|
|
|
// Faces using this material. |
|
CUtlLinkedList<CStoredFace*, unsigned short> m_Faces; |
|
|
|
// Static buffers to hold all the verts. |
|
CUtlLinkedList<CMaterialBuf*, unsigned short> m_MaterialBufs; |
|
}; |
|
|
|
class CFace |
|
{ |
|
public: |
|
|
|
int m_iDispInfo; |
|
dface_t *m_pDFace; // used while loading.. |
|
|
|
CStoredFace *m_pStoredFace; |
|
int m_LightmapSortID; |
|
|
|
float m_LightmapVecs[2][4]; |
|
int m_LightmapTextureMinsInLuxels[2]; |
|
|
|
int m_iVertStart; // Indexes CBSPLighting::m_Verts. |
|
int m_nVerts; |
|
}; |
|
|
|
class CDispInfoFaces |
|
{ |
|
public: |
|
CUtlVector<CVert> m_Verts; |
|
int m_Power; |
|
}; |
|
|
|
private: |
|
|
|
void AssignFaceMaterialCounts( |
|
CBSPInfo &file, |
|
CUtlVector<CFace> &faces ); |
|
|
|
VertexFormat_t ComputeLMGroupVertexFormat( IMaterial * pMaterial ); |
|
|
|
void BuildLMGroups( |
|
CBSPInfo &file, |
|
CUtlVector<CFace> &faces, |
|
CUtlVector<CVert> &verts, |
|
CUtlVector<CDispInfoFaces> &dispInfos |
|
); |
|
|
|
void BuildDrawCommands(); |
|
|
|
void ReloadLightmaps(); |
|
bool LoadVRADDLL( char const *pFilename ); |
|
void CreateDisplacements( CBSPInfo &file, CUtlVector<CFace> &faces, CUtlVector<CDispInfoFaces> &dispInfos ); |
|
|
|
// Fast material ID to CFaceMaterial lookups.. |
|
void InitMaterialLUT( CBSPInfo &file ); |
|
CFaceMaterial* FindOrAddMaterial( CBSPInfo &file, int stringTableID ); |
|
|
|
|
|
private: |
|
CUtlVector<CStoredFace> m_StoredFaces; |
|
CUtlLinkedList<CFaceMaterial*, unsigned short> m_FaceMaterials; |
|
|
|
int m_nTotalTris; |
|
|
|
// The VRAD DLL. This holds the level file. |
|
CSysModule *m_hVRadDLL; |
|
IVRadDLL *m_pVRadDLL; |
|
|
|
// The lighting thread. |
|
IBSPLightingThread *m_pBSPLightingThread; |
|
|
|
// Used to detect when lighting is finished so it can update the lightmaps |
|
// in the material system. |
|
bool m_bLightingInProgress; |
|
|
|
// Maps string table IDs to materials. |
|
CUtlVector<CFaceMaterial*> m_StringTableIDToMaterial; |
|
}; |
|
|
|
|
|
|
|
#endif // BSPLIGHTING_H
|
|
|