This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

64 lines
1.8 KiB
C++

//========= 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 <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