1#include "Utilities/TessellationPredicates.h"
3#define _USE_MATH_DEFINES
8 const glm::mat4& clipToLocal,
9 const glm::vec4& clipPosition,
10 const float localRadius)
12 glm::vec4 locPos4 = clipToLocal*clipPosition;
13 glm::vec3 locPos3 = (1.f / locPos4.w)*glm::vec3(locPos4);
15 glm::vec4 locPosDispX4 = clipToLocal*(clipPosition + glm::vec4(clipPosition.w, 0.f, 0.f, 0.f));
16 glm::vec3 locPosDispX3 = (1.f / locPosDispX4.w)*glm::vec3(locPosDispX4);
18 glm::vec4 locPosDispY4 = clipToLocal*(clipPosition + glm::vec4(0.f, clipPosition.w, 0.f, 0.f));
19 glm::vec3 locPosDispY3 = (1.f / locPosDispY4.w)*glm::vec3(locPosDispY4);
22 return localRadius*glm::vec2(1.f / glm::distance(locPos3, locPosDispX3),
23 1.f / glm::distance(locPos3, locPosDispY3));
25 float screenSpaceRadius = 0.f;
27 glm::vec4 locPos4 = clipToLocal*screenPosition;
28 glm::vec3 locPos3 = (1.f / locPos4.w)*glm::vec3(locPos4);
31 glm::vec4 xp4 = localToClip*glm::vec4(locPos3 + glm::vec3(localRadius, 0.f, 0.f), 1.f);
32 glm::vec4 xm4 = localToClip*glm::vec4(locPos3 - glm::vec3(localRadius, 0.f, 0.f), 1.f);
33 if ((xp4.z > -xp4.w) && (xm4.z > -xm4.w)) {
34 glm::vec2 p = (0.5f / xp4.w)*viewportSize*glm::vec2(xp4.x, xp4.y);
35 glm::vec2 m = (0.5f / xm4.w)*viewportSize*glm::vec2(xm4.x, xm4.y);
36 screenSpaceRadius = glm::max(screenSpaceRadius, glm::distance(p, m));
40 glm::vec4 yp4 = localToClip*glm::vec4(locPos3 + glm::vec3(0.f, localRadius, 0.f), 1.f);
41 glm::vec4 ym4 = localToClip*glm::vec4(locPos3 - glm::vec3(0.f, localRadius, 0.f), 1.f);
42 if ((yp4.z > -yp4.w) && (ym4.z > -ym4.w)) {
43 glm::vec2 p = (0.5f / yp4.w)*viewportSize*glm::vec2(yp4.x, yp4.y);
44 glm::vec2 m = (0.5f / ym4.w)*viewportSize*glm::vec2(ym4.x, ym4.y);
45 screenSpaceRadius = glm::max(screenSpaceRadius, glm::distance(p, m));
49 glm::vec4 zp4 = localToClip*glm::vec4(locPos3 + glm::vec3(0.f, 0.f, localRadius), 1.f);
50 glm::vec4 zm4 = localToClip*glm::vec4(locPos3 - glm::vec3(0.f, 0.f, localRadius), 1.f);
51 if ((zp4.z > -zp4.w) && (zm4.z > -zm4.w)) {
52 glm::vec2 p = (0.5f / zp4.w)*viewportSize*glm::vec2(zp4.x, zp4.y);
53 glm::vec2 m = (0.5f / zm4.w)*viewportSize*glm::vec2(zm4.x, zm4.y);
54 screenSpaceRadius = glm::max(screenSpaceRadius, glm::distance(p, m));
57 return 0.5f*screenSpaceRadius;
62float Cogs::Core::sphereSectorGeometricDistancePredicate(
const glm::vec2 screenSpaceRadii,
63 const glm::vec2 viewportSize,
64 const float distancePixelTolerance,
65 const float minSectors,
66 const float maxSectors)
68 glm::vec2 pixelRadii = 0.5f*viewportSize*screenSpaceRadii;
69 float radius = glm::max(pixelRadii.x, pixelRadii.y);
101 static const float pi = float(M_PI);
102 float a = 1.f - distancePixelTolerance / radius;
105 a = std::max(a, std::cos(pi / minSectors));
106 a = std::min(a, std::cos(pi / maxSectors));
108 float sectors = float(M_PI) / glm::max(std::numeric_limits<float>::epsilon(), std::acos(a));
110 return glm::clamp(sectors, minSectors, maxSectors);
113float Cogs::Core::sphereSectorGeometricAreaPredicate(
const glm::vec2 screenSpaceRadii,
114 const glm::vec2 viewportSize,
115 const float areaPixelTolerance,
116 const float minSectors,
117 const float maxSectors)
119 glm::vec2 pixelRadii = 0.5f*viewportSize*screenSpaceRadii;
120 float radius = glm::max(pixelRadii.x, pixelRadii.y);
170 float phi = std::cbrt(16.f*areaPixelTolerance / (radius*radius));
172 float sectors = 2.f*float(M_PI)/phi;
174 return glm::clamp(sectors, minSectors, maxSectors);
COGSCORE_DLL_API glm::vec2 localSphereRadiusInScreenSpace(const glm::mat4 &localToClip, const glm::mat4 &clipToLocal, const glm::vec4 &clipPosition, const float localRadius)
Given a screen space reference position and a local space radius, find the corresponding screen space...