add missing files after merging
[blender.git] / source / gameengine / Ketsji / KX_RayCast.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /** \file KX_RayCast.h
31  *  \ingroup ketsji
32  */
33
34 #ifndef __KX_RAYCAST_H__
35 #define __KX_RAYCAST_H__
36
37 #include "PHY_IPhysicsEnvironment.h"
38 #include "PHY_IPhysicsController.h"
39 #include "MT_Vector2.h"
40 #include "MT_Point3.h"
41 #include "MT_Vector3.h"
42
43 class RAS_MeshObject; 
44 struct KX_ClientObjectInfo;
45 class KX_IPhysicsController;
46
47 /**
48  *  Defines a function for doing a ray cast.
49  *
50  *  eg KX_RayCast::RayTest(ignore_physics_controller, physics_environment, frompoint, topoint, result_point, result_normal, KX_RayCast::Callback<KX_MyClass>(this, data)
51  *
52  *  Calls myclass->RayHit(client, hit_point, hit_normal, data) for all client
53  *  between frompoint and topoint
54  *
55  *  myclass->RayHit should return true to end the raycast, false to ignore the current client.
56  *
57  *  Returns true if a client was accepted, false if nothing found.
58  */
59 class KX_RayCast : public PHY_IRayCastFilterCallback
60 {
61 public:
62         bool                                    m_hitFound;
63         MT_Point3                               m_hitPoint;
64         MT_Vector3                              m_hitNormal;
65         const RAS_MeshObject*   m_hitMesh;
66         int                                             m_hitPolygon;
67         int                     m_hitUVOK;              // !=0 if UV coordinate in m_hitUV is valid
68         MT_Vector2                              m_hitUV;
69
70         KX_RayCast(KX_IPhysicsController* ignoreController, bool faceNormal, bool faceUV);
71         virtual ~KX_RayCast() {}
72
73         /**
74          * The physic environment returns the ray casting result through this function
75          */
76         virtual void reportHit(PHY_RayCastResult* result);
77
78         /** ray test callback.
79          *  either override this in your class, or use a callback wrapper.
80          */
81         virtual bool RayHit(KX_ClientObjectInfo* client) = 0;
82
83         /** 
84          *  Callback wrapper.
85          *
86          *  Construct with KX_RayCast::Callback<MyClass>(this, data)
87          *  and pass to KX_RayCast::RayTest
88          */
89         template<class T> class Callback;
90         
91         /// Public interface.
92         /// Implement bool RayHit in your class to receive ray callbacks.
93         static bool RayTest(
94                 PHY_IPhysicsEnvironment* physics_environment, 
95                 const MT_Point3& frompoint, 
96                 const MT_Point3& topoint, 
97                 KX_RayCast& callback);
98         
99         
100 #ifdef WITH_CXX_GUARDEDALLOC
101 public:
102         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast"); }
103         void operator delete( void *mem ) { MEM_freeN(mem); }
104 #endif
105 };
106
107 template<class T> class KX_RayCast::Callback : public KX_RayCast
108 {
109         T *self;
110         void *data;
111 public:
112         Callback(T *_self, KX_IPhysicsController* controller=NULL, void *_data = NULL, bool faceNormal=false, bool faceUV=false)
113                 : KX_RayCast(controller, faceNormal, faceUV),
114                 self(_self),
115                 data(_data)
116         {
117         }
118         
119         ~Callback() {}
120
121         virtual bool RayHit(KX_ClientObjectInfo* client)
122         {
123                 return self->RayHit(client, this, data);
124         }
125
126         virtual bool needBroadphaseRayCast(PHY_IPhysicsController* controller)
127         {
128                 KX_ClientObjectInfo* info = static_cast<KX_ClientObjectInfo*>(controller->getNewClientInfo());
129                 
130                 if (!info)
131                 {
132                         MT_assert(info && "Physics controller with no client object info");
133                         return false;
134                 }
135                 return self->NeedRayCast(info);
136         }
137         
138         
139 #ifdef WITH_CXX_GUARDEDALLOC
140 public:
141         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_RayCast::Callback"); }
142         void operator delete( void *mem ) { MEM_freeN(mem); }
143 #endif
144 };
145         
146
147 #endif