54#ifndef DVD_CLIP_REGION_H_
55#define DVD_CLIP_REGION_H_
69 F32 &clipMin,
F32 &clipMax) {
70 F32 nz = (lightRadius - nc * lc) / lz;
72 (lc * lc + lz * lz - lightRadius * lightRadius) / (lz - nz / nc * lc);
75 F32 c = -nz * cameraScale / nc;
78 clipMin = std::max(clipMin, c);
80 clipMax = std::min(clipMax, c);
91 F32 &clipMin,
F32 &clipMax) {
92 F32 rSq = lightRadius * lightRadius;
93 F32 lcSqPluslzSq = lc * lc + lz * lz;
94 F32 d = rSq * lc * lc - lcSqPluslzSq * (rSq - lz * lz);
97 F32 a = lightRadius * lc;
99 F32 nx0 = (a + b) / lcSqPluslzSq;
100 F32 nx1 = (a - b) / lcSqPluslzSq;
115 vec4<F32> clipRegion(1.0f, 1.0f, -1.0f, -1.0f);
116 if (lightPosView.
z - lightRadius <= -cameraNear) {
121 projection.
element(1, 1), clipMin.
x, clipMax.
x);
124 projection.
element(2, 2), clipMin.
y, clipMax.
y);
126 clipRegion.
set(clipMin, clipMax);
T & element(U8 row, U8 column) noexcept
void set(const T *v) noexcept
set the 4 components of the vector manually using a source pointer to a (large enough) array
Handle console commands that start with a forward slash.
vec4< F32 > computeClipRegion(const vec3< F32 > &lightPosView, F32 lightRadius, F32 cameraNear, const mat4< F32 > &projection)
void updateClipRegionRoot(F32 nc, F32 lc, F32 lz, F32 lightRadius, F32 cameraScale, F32 &clipMin, F32 &clipMax)
void updateClipRegion(F32 lc, F32 lz, F32 lightRadius, F32 cameraScale, F32 &clipMin, F32 &clipMax)