Visualization Library v1.0.3A lightweight C++ OpenGL middleware for 2D/3D graphics |
[Download] [Tutorials] [All Classes] [Grouped Classes] |
00001 /**************************************************************************************/ 00002 /* */ 00003 /* Visualization Library */ 00004 /* http://visualizationlibrary.org */ 00005 /* */ 00006 /* Copyright (c) 2005-2010, Michele Bosi */ 00007 /* All rights reserved. */ 00008 /* */ 00009 /* Redistribution and use in source and binary forms, with or without modification, */ 00010 /* are permitted provided that the following conditions are met: */ 00011 /* */ 00012 /* - Redistributions of source code must retain the above copyright notice, this */ 00013 /* list of conditions and the following disclaimer. */ 00014 /* */ 00015 /* - Redistributions in binary form must reproduce the above copyright notice, this */ 00016 /* list of conditions and the following disclaimer in the documentation and/or */ 00017 /* other materials provided with the distribution. */ 00018 /* */ 00019 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND */ 00020 /* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED */ 00021 /* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ 00022 /* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR */ 00023 /* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */ 00024 /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; */ 00025 /* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */ 00026 /* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */ 00027 /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ 00028 /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 00029 /* */ 00030 /**************************************************************************************/ 00031 00032 #include <vlCore/Plane.hpp> 00033 #include <vlCore/AABB.hpp> 00034 00035 using namespace vl; 00036 00037 //----------------------------------------------------------------------------- 00038 // Plane 00039 //----------------------------------------------------------------------------- 00040 real Plane::distance(const vec3 &v) const 00041 { 00042 return dot(v, mNormal) - mOrigin; 00043 } 00044 //----------------------------------------------------------------------------- 00045 bool Plane::isOutside(const AABB& aabb) const 00046 { 00047 vec3 pt; 00048 pt.x() = mNormal.x() >= 0 ? aabb.minCorner().x() : aabb.maxCorner().x(); 00049 pt.y() = mNormal.y() >= 0 ? aabb.minCorner().y() : aabb.maxCorner().y(); 00050 pt.z() = mNormal.z() >= 0 ? aabb.minCorner().z() : aabb.maxCorner().z(); 00051 return distance(pt) >= 0; 00052 } 00053 //----------------------------------------------------------------------------- 00054 int Plane::classify(const AABB& aabb) const 00055 { 00056 vec3 corner[] = 00057 { 00058 vec3(aabb.minCorner().x(), aabb.minCorner().y(), aabb.minCorner().z()), 00059 vec3(aabb.minCorner().x(), aabb.minCorner().y(), aabb.maxCorner().z()), 00060 vec3(aabb.minCorner().x(), aabb.maxCorner().y(), aabb.minCorner().z()), 00061 vec3(aabb.minCorner().x(), aabb.maxCorner().y(), aabb.maxCorner().z()), 00062 vec3(aabb.maxCorner().x(), aabb.minCorner().y(), aabb.minCorner().z()), 00063 vec3(aabb.maxCorner().x(), aabb.minCorner().y(), aabb.maxCorner().z()), 00064 vec3(aabb.maxCorner().x(), aabb.maxCorner().y(), aabb.minCorner().z()), 00065 vec3(aabb.maxCorner().x(), aabb.maxCorner().y(), aabb.maxCorner().z()) 00066 }; 00067 00068 int left = 0; 00069 int right = 0; 00070 real const NEPS = -0.0001f; 00071 real const PEPS = +0.0001f; 00072 00073 for(int i=0;i<8; ++i) 00074 { 00075 if ( distance(corner[i]) < NEPS ) 00076 left++; 00077 else 00078 if ( distance(corner[i]) > PEPS ) 00079 right++; 00080 // else -> we don't count the points on the plane 00081 00082 if(left && right) // its clearly intersecting the plane 00083 return 0; 00084 } 00085 00086 if (left) 00087 return -1; 00088 else 00089 if (right) 00090 return +1; 00091 else // all the points were on the plane 00092 return 0; 00093 } 00094 //-----------------------------------------------------------------------------