From ee2a720b71ea82d85c4f9709172ca17c00c610a4 Mon Sep 17 00:00:00 2001 From: ponchio Date: Fri, 21 Jan 2005 18:06:05 +0000 Subject: [PATCH] Added remoteness ("distance" from frustum) --- wrap/gui/frustum.h | 48 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/wrap/gui/frustum.h b/wrap/gui/frustum.h index e5113bea..55c8b665 100644 --- a/wrap/gui/frustum.h +++ b/wrap/gui/frustum.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.6 2004/10/04 12:33:02 ponchio +Cleaning up and planes init more stable. + Revision 1.5 2004/09/28 10:23:28 ponchio Various generic changes. @@ -57,6 +60,7 @@ public: Point3 ViewPoint(); T Resolution(float dist = 1); bool IsOutside(Point3 &point); + float Remoteness(Point3 &point, T radius); bool IsOutside(Point3 &point, T radius); T Distance(Point3 &point, int plane); @@ -88,6 +92,26 @@ template bool Frustum::IsOutside(Point3 &point) { return false; } +template float Frustum::Remoteness(Point3 &point, T radius) { + Point3 r = Project(point); + T dist = (point - view_point).Norm(); + if(dist == 0) return 0; + T rad = resolution * radius / dist; + T mindist = 0; + T tmp; + tmp = viewport[0] - r[0] - rad; + if(tmp > mindist) mindist = tmp; + tmp = r[0] - rad - (viewport[0] + viewport[2]); + if(tmp > mindist) mindist = tmp; + + tmp = viewport[1] - r[1] - rad; + if(tmp > mindist) mindist = tmp; + tmp = r[1] - rad - (viewport[1] + viewport[3]); + if(tmp > mindist) mindist = tmp; + + return 1 + (mindist / (viewport[0] + viewport[2])); +} + template bool Frustum::IsOutside(Point3 &point, T radius) { for(int i = 0; i < 4; i++) { T dist = Distance(point, i); @@ -104,19 +128,19 @@ template T Frustum::Distance(Point3 &point, int plane) { template void Frustum::GetView() { View::GetView(); - int t = viewport[1] + viewport[3]; - int b = viewport[1]; - int r = viewport[0] + viewport[2]; - int l = viewport[0]; + float t = (float)(viewport[1] + viewport[3]); + float b = (float)viewport[1]; + float r = (float)(viewport[0] + viewport[2]); + float l = (float)viewport[0]; - Point3 nw = UnProject(Point3(l, b, 0)); - Point3 sw = UnProject(Point3(l, t, 0)); - Point3 ne = UnProject(Point3(r, b, 0)); - Point3 se = UnProject(Point3(r, t, 0)); - Point3 NW = UnProject(Point3(l, b, 1)); - Point3 SW = UnProject(Point3(l, t, 1)); - Point3 NE = UnProject(Point3(r, b, 1)); - Point3 SE = UnProject(Point3(r, t, 1)); + Point3 nw = UnProject(Point3(l, b, 0.0f)); + Point3 sw = UnProject(Point3(l, t, 0.0f)); + Point3 ne = UnProject(Point3(r, b, 0.0f)); + Point3 se = UnProject(Point3(r, t, 0.0f)); + Point3 NW = UnProject(Point3(l, b, 1.0f)); + Point3 SW = UnProject(Point3(l, t, 1.0f)); + Point3 NE = UnProject(Point3(r, b, 1.0f)); + Point3 SE = UnProject(Point3(r, t, 1.0f)); view_point = View::ViewPoint();