# Visualization Library

A lightweight C++ OpenGL middleware for 2D/3D graphics

[Home] [Tutorials] [All Classes] [Grouped Classes]

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

# D:/VL/BuildSystem/VL_DISTRO/Visualization_Library_SDK/src/vlGraphics/RayIntersector.hpp

Go to the documentation of this file.

    00001 /**************************************************************************************/
    00002 /*                                                                                    */
    00003 /*  Visualization Library                                                             */
    00004 /*  http://www.visualizationlibrary.com                                               */
    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 #ifndef RayIntersector_INCLUDE_ONCE
    00033 #define RayIntersector_INCLUDE_ONCE
    00034
    00035 #include <vlCore/Ray.hpp>
    00036 #include <vlGraphics/Actor.hpp>
    00037 #include <vlGraphics/Geometry.hpp>
    00038 #include <vlCore/Vector4.hpp>
    00039 #include <vlCore/Matrix4.hpp>
    00040 #include <vlGraphics/Frustum.hpp>
    00041
    00042 namespace vl
    00043 {
    00044   class SceneManager;
    00045   //-----------------------------------------------------------------------------
    00046   // RayIntersection
    00047   //-----------------------------------------------------------------------------
    00050   class RayIntersection: public Object
    00051   {
    00052   public:
    00053     virtual const char* className() { return "vl::RayIntersection"; }
    00054     RayIntersection(): mActor(NULL), mDistance(0.0f)
    00055     {
    00056       VL_DEBUG_SET_OBJECT_NAME()
    00057     }
    00058
    00060     void setActor(Actor* a) { mActor = a; }
    00062     const Actor* actor() const { return mActor; }
    00064     Actor* actor() { return mActor; }
    00065
    00067     const vec3& intersectionPoint() const { return mIntersectionPoint; }
    00069     void setIntersectionPoint(const vec3& v) { mIntersectionPoint = v; }
    00070
    00072     float distance() const { return mDistance; }
    00074     void setDistance(float dist) { mDistance = dist; }
    00075
    00076   protected:
    00077     vec3 mIntersectionPoint;
    00078     Actor* mActor;
    00079     float mDistance;
    00080   };
    00081   //-----------------------------------------------------------------------------
    00082   // RayIntersectionGeometry
    00083   //-----------------------------------------------------------------------------
    00086   class RayIntersectionGeometry: public RayIntersection
    00087   {
    00088   public:
    00089     virtual const char* className() { return "vl::RayIntersectionGeometry"; }
    00090     RayIntersectionGeometry(): mGeometry(NULL), mDrawCalls(NULL), mTriangleIndex(-1)
    00091     {
    00092       VL_DEBUG_SET_OBJECT_NAME()
    00093       memset(mTriangle, 0xFF, sizeof(mTriangle));
    00094     }
    00095
    00097     Geometry* geometry() { return mGeometry; }
    00099     const Geometry* geometry() const { return mGeometry; }
    00101     DrawCall* drawCalls() { return mDrawCalls; }
    00103     const DrawCall* drawCalls() const { return mDrawCalls; }
    00105     int triangleIndex() const { return mTriangleIndex; }
    00107     int* triangle() const;
    00108
    00110     void setGeometry(Geometry* g) { mGeometry = g; }
    00112     void setPrimitives(DrawCall* p) { mDrawCalls = p; }
    00114     void setTriangleIndex(int t_idx) { mTriangleIndex = t_idx; }
    00116     void setTriangle(int a, int b, int c) { mTriangle[0] = a; mTriangle[0] = b; mTriangle[0] = c; }
    00117
    00118   protected:
    00119     vec3 mIntersectionPoint;
    00120     Geometry* mGeometry;
    00121     DrawCall* mDrawCalls;
    00122     int mTriangleIndex;
    00123     int mTriangle[3];
    00124     float mDistance;
    00125   };
    00126   //-----------------------------------------------------------------------------
    00127   // RayIntersector
    00128   //-----------------------------------------------------------------------------
    00131   class VLGRAPHICS_EXPORT RayIntersector: public Object
    00132   {
    00133   public:
    00134     virtual const char* className() { return "vl::RayIntersector"; }
    00135     RayIntersector()
    00136     {
    00137       VL_DEBUG_SET_OBJECT_NAME()
    00138       mActors = new ActorCollection;
    00139     }
    00140
    00142     const ActorCollection* actors() const { return mActors.get(); }
    00144     ActorCollection* actors() { return mActors.get(); }
    00145
    00147     const Ray& ray() const { return mRay; }
    00149     void setRay(const Ray& ray) { mRay = ray; }
    00150
    00152     const Frustum& frustum() const { return mFrustum; }
    00154     void setFrustum(const Frustum& frustum) { mFrustum = frustum; }
    00155
    00157     const std::vector< ref<RayIntersection> >& intersections() const { return mIntersections; }
    00158
    00163     void intersect();
    00164
    00174     void intersect(const Ray& ray, SceneManager* scene_manager);
    00175
    00176   protected:
    00177     static bool sorter(const ref<RayIntersection>& a, const ref<RayIntersection>& b) { return a->distance() < b->distance(); }
    00178
    00179     void intersect(Actor* act);
    00180     void intersectGeometry(Actor* act, Geometry* geom);
    00181
    00182     // T should be either fvec3-4 or dvec3-4
    00183     template<class T>
    00184     void intersectTriangle(const T& a, const T& b, const T& c, Actor*, Geometry* geom, DrawCall* prim, int prim_idx);
    00185
    00186   protected:
    00187     Frustum mFrustum;
    00188     std::vector< ref<RayIntersection> > mIntersections;
    00189     ref<ActorCollection> mActors;
    00190     Ray mRay;
    00191   };
    00192 }
    00193
    00194 #endif

Visualization Library v2011.05.1142 Reference Documentation
Copyright 2005-2011 Michele Bosi. All rights reserved.
Updated on Thu May 26 2011 22:51:24.
Permission is granted to use this page to write and publish articles regarding Visualization Library.