mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-03 05:49:41 +03:00
1
This commit is contained in:
230
utils/vrad/samplehash.cpp
Normal file
230
utils/vrad/samplehash.cpp
Normal file
@@ -0,0 +1,230 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//
|
||||
//=============================================================================//
|
||||
|
||||
#include "vrad.h"
|
||||
#include "lightmap.h"
|
||||
|
||||
#define SAMPLEHASH_NUM_BUCKETS 65536
|
||||
#define SAMPLEHASH_GROW_SIZE 0
|
||||
#define SAMPLEHASH_INIT_SIZE 0
|
||||
|
||||
int samplesAdded = 0;
|
||||
int patchSamplesAdded = 0;
|
||||
static unsigned short g_PatchIterationKey = 0;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
bool SampleData_CompareFunc( SampleData_t const &src1, SampleData_t const &src2 )
|
||||
{
|
||||
return ( ( src1.x == src2.x ) &&
|
||||
( src1.y == src2.y ) &&
|
||||
( src1.z == src2.z ) );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
unsigned int SampleData_KeyFunc( SampleData_t const &src )
|
||||
{
|
||||
return ( src.x + src.y + src.z );
|
||||
}
|
||||
|
||||
|
||||
CUtlHash<SampleData_t> g_SampleHashTable( SAMPLEHASH_NUM_BUCKETS,
|
||||
SAMPLEHASH_GROW_SIZE,
|
||||
SAMPLEHASH_INIT_SIZE,
|
||||
SampleData_CompareFunc, SampleData_KeyFunc );
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
UtlHashHandle_t SampleData_Find( sample_t *pSample )
|
||||
{
|
||||
SampleData_t sampleData;
|
||||
sampleData.x = ( int )( pSample->pos.x / SAMPLEHASH_VOXEL_SIZE ) * 100;
|
||||
sampleData.y = ( int )( pSample->pos.y / SAMPLEHASH_VOXEL_SIZE ) * 10;
|
||||
sampleData.z = ( int )( pSample->pos.z / SAMPLEHASH_VOXEL_SIZE );
|
||||
|
||||
return g_SampleHashTable.Find( sampleData );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
UtlHashHandle_t SampleData_InsertIntoHashTable( sample_t *pSample, SampleHandle_t sampleHandle )
|
||||
{
|
||||
SampleData_t sampleData;
|
||||
sampleData.x = ( int )( pSample->pos.x / SAMPLEHASH_VOXEL_SIZE ) * 100;
|
||||
sampleData.y = ( int )( pSample->pos.y / SAMPLEHASH_VOXEL_SIZE ) * 10;
|
||||
sampleData.z = ( int )( pSample->pos.z / SAMPLEHASH_VOXEL_SIZE );
|
||||
|
||||
UtlHashHandle_t handle = g_SampleHashTable.AllocEntryFromKey( sampleData );
|
||||
|
||||
SampleData_t *pSampleData = &g_SampleHashTable.Element( handle );
|
||||
pSampleData->x = sampleData.x;
|
||||
pSampleData->y = sampleData.y;
|
||||
pSampleData->z = sampleData.z;
|
||||
pSampleData->m_Samples.AddToTail( sampleHandle );
|
||||
|
||||
samplesAdded++;
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
UtlHashHandle_t SampleData_AddSample( sample_t *pSample, SampleHandle_t sampleHandle )
|
||||
{
|
||||
|
||||
// find the key -- if it doesn't exist add new sample data to the
|
||||
// hash table
|
||||
UtlHashHandle_t handle = SampleData_Find( pSample );
|
||||
if( handle == g_SampleHashTable.InvalidHandle() )
|
||||
{
|
||||
handle = SampleData_InsertIntoHashTable( pSample, sampleHandle );
|
||||
}
|
||||
else
|
||||
{
|
||||
SampleData_t *pSampleData = &g_SampleHashTable.Element( handle );
|
||||
pSampleData->m_Samples.AddToTail( sampleHandle );
|
||||
|
||||
samplesAdded++;
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
void SampleData_Log( void )
|
||||
{
|
||||
if( g_bLogHashData )
|
||||
{
|
||||
g_SampleHashTable.Log( "samplehash.txt" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================
|
||||
//=============================================================================
|
||||
//
|
||||
// PatchSample Functions
|
||||
//
|
||||
//=============================================================================
|
||||
//=============================================================================
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
bool PatchSampleData_CompareFunc( PatchSampleData_t const &src1, PatchSampleData_t const &src2 )
|
||||
{
|
||||
return ( ( src1.x == src2.x ) &&
|
||||
( src1.y == src2.y ) &&
|
||||
( src1.z == src2.z ) );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
unsigned int PatchSampleData_KeyFunc( PatchSampleData_t const &src )
|
||||
{
|
||||
return ( src.x + src.y + src.z );
|
||||
}
|
||||
|
||||
|
||||
CUtlHash<PatchSampleData_t> g_PatchSampleHashTable( SAMPLEHASH_NUM_BUCKETS,
|
||||
SAMPLEHASH_GROW_SIZE,
|
||||
SAMPLEHASH_INIT_SIZE,
|
||||
PatchSampleData_CompareFunc, PatchSampleData_KeyFunc );
|
||||
|
||||
void GetPatchSampleHashXYZ( const Vector &vOrigin, int &x, int &y, int &z )
|
||||
{
|
||||
x = ( int )( vOrigin.x / SAMPLEHASH_VOXEL_SIZE );
|
||||
y = ( int )( vOrigin.y / SAMPLEHASH_VOXEL_SIZE );
|
||||
z = ( int )( vOrigin.z / SAMPLEHASH_VOXEL_SIZE );
|
||||
}
|
||||
|
||||
|
||||
unsigned short IncrementPatchIterationKey()
|
||||
{
|
||||
if ( g_PatchIterationKey == 0xFFFF )
|
||||
{
|
||||
g_PatchIterationKey = 1;
|
||||
for ( int i=0; i < g_Patches.Count(); i++ )
|
||||
g_Patches[i].m_IterationKey = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_PatchIterationKey++;
|
||||
}
|
||||
return g_PatchIterationKey;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
void PatchSampleData_AddSample( CPatch *pPatch, int ndxPatch )
|
||||
{
|
||||
int patchSampleMins[3], patchSampleMaxs[3];
|
||||
|
||||
#if defined( SAMPLEHASH_USE_AREA_PATCHES )
|
||||
GetPatchSampleHashXYZ( pPatch->mins, patchSampleMins[0], patchSampleMins[1], patchSampleMins[2] );
|
||||
GetPatchSampleHashXYZ( pPatch->maxs, patchSampleMaxs[0], patchSampleMaxs[1], patchSampleMaxs[2] );
|
||||
#else
|
||||
// If not using area patches, just use the patch's origin to add it to the voxels.
|
||||
GetPatchSampleHashXYZ( pPatch->origin, patchSampleMins[0], patchSampleMins[1], patchSampleMins[2] );
|
||||
memcpy( patchSampleMaxs, patchSampleMins, sizeof( patchSampleMaxs ) );
|
||||
#endif
|
||||
|
||||
// Make sure mins are smaller than maxs so we don't iterate for 4 bil.
|
||||
Assert( patchSampleMins[0] <= patchSampleMaxs[0] && patchSampleMins[1] <= patchSampleMaxs[1] && patchSampleMins[2] <= patchSampleMaxs[2] );
|
||||
patchSampleMins[0] = min( patchSampleMins[0], patchSampleMaxs[0] );
|
||||
patchSampleMins[1] = min( patchSampleMins[1], patchSampleMaxs[1] );
|
||||
patchSampleMins[2] = min( patchSampleMins[2], patchSampleMaxs[2] );
|
||||
|
||||
int iterateCoords[3];
|
||||
for ( iterateCoords[0]=patchSampleMins[0]; iterateCoords[0] <= patchSampleMaxs[0]; iterateCoords[0]++ )
|
||||
{
|
||||
for ( iterateCoords[1]=patchSampleMins[1]; iterateCoords[1] <= patchSampleMaxs[1]; iterateCoords[1]++ )
|
||||
{
|
||||
for ( iterateCoords[2]=patchSampleMins[2]; iterateCoords[2] <= patchSampleMaxs[2]; iterateCoords[2]++ )
|
||||
{
|
||||
// find the key -- if it doesn't exist add new sample data to the
|
||||
// hash table
|
||||
PatchSampleData_t iteratePatch;
|
||||
iteratePatch.x = iterateCoords[0] * 100;
|
||||
iteratePatch.y = iterateCoords[1] * 10;
|
||||
iteratePatch.z = iterateCoords[2];
|
||||
|
||||
UtlHashHandle_t handle = g_PatchSampleHashTable.Find( iteratePatch );
|
||||
if( handle == g_PatchSampleHashTable.InvalidHandle() )
|
||||
{
|
||||
UtlHashHandle_t handle = g_PatchSampleHashTable.AllocEntryFromKey( iteratePatch );
|
||||
|
||||
PatchSampleData_t *pPatchData = &g_PatchSampleHashTable.Element( handle );
|
||||
pPatchData->x = iteratePatch.x;
|
||||
pPatchData->y = iteratePatch.y;
|
||||
pPatchData->z = iteratePatch.z;
|
||||
pPatchData->m_ndxPatches.AddToTail( ndxPatch );
|
||||
|
||||
patchSamplesAdded++;
|
||||
}
|
||||
else
|
||||
{
|
||||
PatchSampleData_t *pPatchData = &g_PatchSampleHashTable.Element( handle );
|
||||
pPatchData->m_ndxPatches.AddToTail( ndxPatch );
|
||||
|
||||
patchSamplesAdded++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user