Added remoteness ("distance" from frustum)

This commit is contained in:
Federico Ponchio 2005-01-21 18:06:05 +00:00
parent 8da5fad884
commit ee2a720b71
1 changed files with 36 additions and 12 deletions

View File

@ -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<T> ViewPoint();
T Resolution(float dist = 1);
bool IsOutside(Point3<T> &point);
float Remoteness(Point3<T> &point, T radius);
bool IsOutside(Point3<T> &point, T radius);
T Distance(Point3<T> &point, int plane);
@ -88,6 +92,26 @@ template <class T> bool Frustum<T>::IsOutside(Point3<T> &point) {
return false;
}
template <class T> float Frustum<T>::Remoteness(Point3<T> &point, T radius) {
Point3<T> 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 <class T> bool Frustum<T>::IsOutside(Point3<T> &point, T radius) {
for(int i = 0; i < 4; i++) {
T dist = Distance(point, i);
@ -104,19 +128,19 @@ template <class T> T Frustum<T>::Distance(Point3<T> &point, int plane) {
template <class T> void Frustum<T>::GetView() {
View<T>::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<T> nw = UnProject(Point3<T>(l, b, 0));
Point3<T> sw = UnProject(Point3<T>(l, t, 0));
Point3<T> ne = UnProject(Point3<T>(r, b, 0));
Point3<T> se = UnProject(Point3<T>(r, t, 0));
Point3<T> NW = UnProject(Point3<T>(l, b, 1));
Point3<T> SW = UnProject(Point3<T>(l, t, 1));
Point3<T> NE = UnProject(Point3<T>(r, b, 1));
Point3<T> SE = UnProject(Point3<T>(r, t, 1));
Point3<T> nw = UnProject(Point3<T>(l, b, 0.0f));
Point3<T> sw = UnProject(Point3<T>(l, t, 0.0f));
Point3<T> ne = UnProject(Point3<T>(r, b, 0.0f));
Point3<T> se = UnProject(Point3<T>(r, t, 0.0f));
Point3<T> NW = UnProject(Point3<T>(l, b, 1.0f));
Point3<T> SW = UnProject(Point3<T>(l, t, 1.0f));
Point3<T> NE = UnProject(Point3<T>(r, b, 1.0f));
Point3<T> SE = UnProject(Point3<T>(r, t, 1.0f));
view_point = View<T>::ViewPoint();