Big patches:
[blender.git] / source / gameengine / Ketsji / KX_RayCast.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #ifndef __KX_RAYCAST_H__
34 #define __KX_RAYCAST_H__
35
36 class MT_Point3;
37 class MT_Vector3;
38 class KX_IPhysicsController;
39 class PHY_IPhysicsEnvironment;
40
41 struct KX_ClientObjectInfo;
42
43 /**
44  *  Defines a function for doing a ray cast.
45  *
46  *  eg KX_RayCast::RayTest(ignore_physics_controller, physics_environment, frompoint, topoint, result_point, result_normal, KX_RayCast::Callback<KX_MyClass>(this, data)
47  *
48  *  Calls myclass->RayHit(client, hit_point, hit_normal, data) for all client
49  *  between frompoint and topoint
50  *
51  *  myclass->RayHit should return true to end the raycast, false to ignore the current client.
52  *
53  *  Returns true if a client was accepted, false if nothing found.
54  */
55 class KX_RayCast
56 {
57 protected:
58         KX_RayCast() {};
59 public:
60         virtual ~KX_RayCast() {}
61
62         /** ray test callback.
63          *  either override this in your class, or use a callback wrapper.
64          */
65         virtual bool RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal) const = 0;
66
67         /** 
68          *  Callback wrapper.
69          *
70          *  Construct with KX_RayCast::Callback<MyClass>(this, data)
71          *  and pass to KX_RayCast::RayTest
72          */
73         template<class T> class Callback;
74         
75         /// Public interface.
76         /// Implement bool RayHit in your class to receive ray callbacks.
77         static bool RayTest(KX_IPhysicsController* physics_controller, 
78                 PHY_IPhysicsEnvironment* physics_environment, 
79                 const MT_Point3& _frompoint, 
80                 const MT_Point3& topoint, 
81                 MT_Point3& result_point, 
82                 MT_Vector3& result_normal, 
83                 const KX_RayCast& callback);
84         
85 };
86
87 template<class T> class KX_RayCast::Callback : public KX_RayCast
88 {
89         T *self;
90         void *data;
91 public:
92         Callback(T *_self, void *_data = NULL)
93                 : self(_self),
94                 data(_data)
95         {
96         }
97         
98         ~Callback() {}
99         
100         virtual bool RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal) const
101         {
102                 return self->RayHit(client, hit_point, hit_normal, data);
103         }
104 };
105         
106
107 #endif