source-engine-2018-hl2_src/utils/vrad/incremental.h

176 lines
3.6 KiB
C
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef INCREMENTAL_H
#define INCREMENTAL_H
#ifdef _WIN32
#pragma once
#endif
#include "iincremental.h"
#include "utllinkedlist.h"
#include "utlvector.h"
#include "utlbuffer.h"
#include "vrad.h"
#define INCREMENTALFILE_VERSION 31241
class CIncLight;
class CLightValue
{
public:
float m_Dot;
};
class CLightFace
{
public:
unsigned short m_FaceIndex; // global face index
unsigned short m_LightFacesIndex; // index into CIncLight::m_LightFaces.
// The lightmap grid for this face. Only used while building lighting data for a face.
// Compressed into m_CompressedData immediately afterwards.
CUtlVector<CLightValue> m_LightValues;
CUtlBuffer m_CompressedData;
CIncLight *m_pLight;
};
class CIncLight
{
public:
CIncLight();
~CIncLight();
CLightFace* FindOrCreateLightFace( int iFace, int lmSize, bool *bNew=NULL );
public:
CRITICAL_SECTION m_CS;
// This is the light for which m_LightFaces was built.
dworldlight_t m_Light;
CLightFace *m_pCachedFaces[MAX_TOOL_THREADS+1];
// The list of faces that this light contributes to.
CUtlLinkedList<CLightFace*, unsigned short> m_LightFaces;
// Largest value in intensity of light. Used to scale dot products up into a
// range where their values make sense.
float m_flMaxIntensity;
};
class CIncrementalHeader
{
public:
class CLMSize
{
public:
unsigned char m_Width;
unsigned char m_Height;
};
CUtlVector<CLMSize> m_FaceLightmapSizes;
};
class CIncremental : public IIncremental
{
public:
CIncremental();
~CIncremental();
// IIncremental overrides.
public:
virtual bool Init( char const *pBSPFilename, char const *pIncrementalFilename );
// Load the light definitions out of the incremental file.
// Figure out which lights have changed.
// Change 'activelights' to only consist of new or changed lights.
virtual bool PrepareForLighting();
virtual void AddLightToFace(
IncrementalLightID lightID,
int iFace,
int iSample,
int lmSize,
float dot,
int iThread );
virtual void FinishFace(
IncrementalLightID lightID,
int iFace,
int iThread );
// For each face that was changed during the lighting process, save out
// new data for it in the incremental file.
virtual bool Finalize();
virtual void GetFacesTouched( CUtlVector<unsigned char> &touched );
virtual bool Serialize();
private:
// Read/write the header from the file.
bool ReadIncrementalHeader( long fp, CIncrementalHeader *pHeader );
bool WriteIncrementalHeader( long fp );
// Returns true if the incremental file is valid and we can use InitUpdate.
bool IsIncrementalFileValid();
void Term();
// For each light in 'activelights', add a light to m_Lights and link them together.
void AddLightsForActiveLights();
// Load and save the state.
bool LoadIncrementalFile();
bool SaveIncrementalFile();
typedef CUtlVector<CLightFace*> CFaceLightList;
void LinkLightsToFaces( CUtlVector<CFaceLightList> &faceLights );
private:
char const *m_pIncrementalFilename;
char const *m_pBSPFilename;
CUtlLinkedList<CIncLight*, IncrementalLightID>
m_Lights;
// The face index is set to 1 if a face has new lighting data applied to it.
// This is used to optimize the set of lightmaps we recomposite.
CUtlVector<unsigned char> m_FacesTouched;
int m_TotalMemory;
// Set to true when one or more runs were completed successfully.
bool m_bSuccessfulRun;
};
#endif // INCREMENTAL_H