//========= 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 "mathlib/mathlib.h" #include "tier0/platform.h" #include "tier1/utlmemory.h" template 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