|
From: <pat...@us...> - 2013-07-05 21:12:00
|
Revision: 1284
http://sourceforge.net/p/ggt/code/1284
Author: patrickh
Date: 2013-07-05 21:11:58 +0000 (Fri, 05 Jul 2013)
Log Message:
-----------
Normalize the frustum normal.
>From the patch submission:
Regarding ggt-devel discussion thread "Should Frustum::mPlanes[].mNorm
be normalized?", the attached patch shows my proposed fix, should we
all decide that having normalized plane normals will not break any other
code.
Note that without normalized plane normals, the isInVolume(Frustum,...)
functions produce incorrect results. So, we either need to normalize
here (the logical, most efficient place), or in the isInVolume()
functions (much less efficient), or we need to keep a second
(normalized) copy of each plane's normal.
Submitted by: Paul Martz
Modified Paths:
--------------
trunk/gmtl/Frustum.h
Modified: trunk/gmtl/Frustum.h
===================================================================
--- trunk/gmtl/Frustum.h 2013-07-05 20:59:14 UTC (rev 1283)
+++ trunk/gmtl/Frustum.h 2013-07-05 21:11:58 UTC (rev 1284)
@@ -113,35 +113,48 @@
{
const gmtl::Matrix<DATA_TYPE, 4, 4>& m = projMatrix;
+ gmtl::Vec<DATA_TYPE, 3> n;
//left
- mPlanes[PLANE_LEFT].setNormal(gmtl::Vec<DATA_TYPE, 3>(m[3][0] + m[0][0],
- m[3][1] + m[0][1],
- m[3][2] + m[0][2]));
+ n = (gmtl::Vec<DATA_TYPE, 3>(m[3][0] + m[0][0],
+ m[3][1] + m[0][1],
+ m[3][2] + m[0][2]));
+ normalize( n );
+ mPlanes[PLANE_LEFT].setNormal( n );
mPlanes[PLANE_LEFT].setOffset(m[3][3] + m[0][3]);
//right
- mPlanes[PLANE_RIGHT].setNormal(gmtl::Vec<DATA_TYPE, 3>(m[3][0] - m[0][0],
- m[3][1] - m[0][1],
- m[3][2] - m[0][2]));
+ n = gmtl::Vec<DATA_TYPE, 3>(m[3][0] - m[0][0],
+ m[3][1] - m[0][1],
+ m[3][2] - m[0][2]);
+ normalize( n );
+ mPlanes[PLANE_RIGHT].setNormal( n );
mPlanes[PLANE_RIGHT].setOffset(m[3][3] - m[0][3]);
//bottom
- mPlanes[PLANE_BOTTOM].setNormal(gmtl::Vec<DATA_TYPE, 3>(m[3][0] + m[1][0],
- m[3][1] + m[1][1],
- m[3][2] + m[1][2]));
+ n = gmtl::Vec<DATA_TYPE, 3>(m[3][0] + m[1][0],
+ m[3][1] + m[1][1],
+ m[3][2] + m[1][2]);
+ normalize( n );
+ mPlanes[PLANE_BOTTOM].setNormal( n );
mPlanes[PLANE_BOTTOM].setOffset(m[3][3] + m[1][3]);
//top
- mPlanes[PLANE_TOP].setNormal(gmtl::Vec<DATA_TYPE, 3>(m[3][0] - m[1][0],
- m[3][1] - m[1][1],
- m[3][2] - m[1][2]));
+ n = gmtl::Vec<DATA_TYPE, 3>(m[3][0] - m[1][0],
+ m[3][1] - m[1][1],
+ m[3][2] - m[1][2]);
+ normalize( n );
+ mPlanes[PLANE_TOP].setNormal( n );
mPlanes[PLANE_TOP].setOffset(m[3][3] - m[1][3]);
//near
- mPlanes[PLANE_NEAR].setNormal(gmtl::Vec<DATA_TYPE, 3>(m[3][0] + m[2][0],
- m[3][1] + m[2][1],
- m[3][2] + m[2][2]));
+ n = gmtl::Vec<DATA_TYPE, 3>(m[3][0] + m[2][0],
+ m[3][1] + m[2][1],
+ m[3][2] + m[2][2]);
+ normalize( n );
+ mPlanes[PLANE_NEAR].setNormal( n );
mPlanes[PLANE_NEAR].setOffset(m[2][3] + m[3][3]);
//far
- mPlanes[PLANE_FAR].setNormal(gmtl::Vec<DATA_TYPE, 3>(m[3][0] - m[2][0],
- m[3][1] - m[2][1],
- m[3][2] - m[2][2]));
+ n = gmtl::Vec<DATA_TYPE, 3>(m[3][0] - m[2][0],
+ m[3][1] - m[2][1],
+ m[3][2] - m[2][2]);
+ normalize( n );
+ mPlanes[PLANE_FAR].setNormal( n );
mPlanes[PLANE_FAR].setOffset(m[3][3] - m[2][3]);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|