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.
68 lines
1.5 KiB
68 lines
1.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: a class for performing cube-mapped spherical sample lookups. |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
|
|
#ifndef CUBEMAP_H |
|
#define CUBEMAP_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "tier0/platform.h" |
|
#include "tier1/utlmemory.h" |
|
#include "mathlib/mathlib.h" |
|
|
|
template<class T, int RES> struct CCubeMap |
|
{ |
|
T m_Samples[6][RES][RES]; |
|
|
|
public: |
|
FORCEINLINE void GetCoords( Vector const &vecNormalizedDirection, int &nX, int &nY, int &nFace ) |
|
{ |
|
// find largest magnitude component |
|
int nLargest = 0; |
|
int nAxis0 = 1; |
|
int nAxis1 = 2; |
|
if ( fabs( vecNormalizedDirection[1] ) > fabs( vecNormalizedDirection[0] ) ) |
|
{ |
|
nLargest = 1; |
|
nAxis0 = 0; |
|
nAxis1 = 2; |
|
} |
|
if ( fabs( vecNormalizedDirection[2] ) > fabs( vecNormalizedDirection[nLargest] ) ) |
|
{ |
|
nLargest = 2; |
|
nAxis0 = 0; |
|
nAxis1 = 1; |
|
} |
|
float flZ = vecNormalizedDirection[nLargest]; |
|
if ( flZ < 0 ) |
|
{ |
|
flZ = - flZ; |
|
nLargest += 3; |
|
} |
|
nFace = nLargest; |
|
flZ = 1.0 / flZ; |
|
nX = RemapValClamped( vecNormalizedDirection[nAxis0] * flZ, -1, 1, 0, RES - 1 ); |
|
nY = RemapValClamped( vecNormalizedDirection[nAxis1] * flZ, -1, 1, 0, RES - 1 ); |
|
} |
|
|
|
FORCEINLINE T & GetSample( Vector const &vecNormalizedDirection ) |
|
{ |
|
int nX, nY, nFace; |
|
GetCoords( vecNormalizedDirection, nX, nY, nFace ); |
|
return m_Samples[nFace][nX][nY]; |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
#endif // CUBEMAP_H
|
|
|