OgreSceneQuery.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4  (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6 
7 Copyright (c) 2000-2013 Torus Knot Software Ltd
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #ifndef __SceneQuery_H__
29 #define __SceneQuery_H__
30 
31 #include "OgrePrerequisites.h"
32 #include "OgreAxisAlignedBox.h"
33 #include "OgreSphere.h"
34 #include "OgreRay.h"
35 #include "OgreRenderOperation.h"
36 #include "OgrePlaneBoundedVolume.h"
37 #include "OgreHeaderPrefix.h"
38 
39 namespace Ogre {
40 
41  // forward declaration
42  class SceneQueryListener;
75  {
76  public:
93  WFT_RENDER_OPERATION
94  };
95 
109  struct WorldFragment {
117  void* geometry;
120 
121  };
122  protected:
128 
129  public:
131  SceneQuery(SceneManager* mgr);
132  virtual ~SceneQuery();
133 
143  virtual void setQueryMask(uint32 mask);
145  virtual uint32 getQueryMask(void) const;
146 
155  virtual void setQueryTypeMask(uint32 mask);
157  virtual uint32 getQueryTypeMask(void) const;
158 
169  virtual void setWorldFragmentType(enum WorldFragmentType wft);
170 
172  virtual WorldFragmentType getWorldFragmentType(void) const;
173 
176  {return &mSupportedWorldFragments;}
177 
178 
179  };
180 
188  {
189  public:
190  virtual ~SceneQueryListener() { }
196  virtual bool queryResult(MovableObject* object) = 0;
202  virtual bool queryResult(SceneQuery::WorldFragment* fragment) = 0;
203 
204  };
205 
210  {
215  };
216 
224  : public SceneQuery, public SceneQueryListener
225  {
226  protected:
228  public:
231  virtual ~RegionSceneQuery();
240  virtual SceneQueryResult& execute(void);
241 
249  virtual void execute(SceneQueryListener* listener) = 0;
250 
254  virtual SceneQueryResult& getLastResults(void) const;
261  virtual void clearResults(void);
262 
264  bool queryResult(MovableObject* first);
266  bool queryResult(SceneQuery::WorldFragment* fragment);
267  };
268 
271  {
272  protected:
274  public:
276  virtual ~AxisAlignedBoxSceneQuery();
277 
279  void setBox(const AxisAlignedBox& box);
280 
282  const AxisAlignedBox& getBox(void) const;
283 
284  };
285 
288  {
289  protected:
291  public:
293  virtual ~SphereSceneQuery();
295  void setSphere(const Sphere& sphere);
296 
298  const Sphere& getSphere() const;
299 
300  };
301 
305  {
306  protected:
308  public:
312  void setVolumes(const PlaneBoundedVolumeList& volumes);
313 
315  const PlaneBoundedVolumeList& getVolumes() const;
316 
317  };
318 
319 
320  /*
322  class _OgreExport PyramidSceneQuery : public RegionSceneQuery
323  {
324  public:
325  PyramidSceneQuery(SceneManager* mgr);
326  virtual ~PyramidSceneQuery();
327  };
328  */
329 
336  {
337  public:
345  virtual bool queryResult(MovableObject* obj, Real distance) = 0;
346 
353  virtual bool queryResult(SceneQuery::WorldFragment* fragment, Real distance) = 0;
354 
355  };
356 
359  {
367  bool operator < (const RaySceneQueryResultEntry& rhs) const
368  {
369  return this->distance < rhs.distance;
370  }
371 
372  };
374 
377  {
378  protected:
383 
384  public:
386  virtual ~RaySceneQuery();
388  virtual void setRay(const Ray& ray);
390  virtual const Ray& getRay(void) const;
409  virtual void setSortByDistance(bool sort, ushort maxresults = 0);
411  virtual bool getSortByDistance(void) const;
414  virtual ushort getMaxResults(void) const;
423  virtual RaySceneQueryResult& execute(void);
424 
432  virtual void execute(RaySceneQueryListener* listener) = 0;
433 
437  virtual RaySceneQueryResult& getLastResults(void);
444  virtual void clearResults(void);
445 
447  bool queryResult(MovableObject* obj, Real distance);
449  bool queryResult(SceneQuery::WorldFragment* fragment, Real distance);
450 
451 
452 
453 
454  };
455 
462  {
463  public:
471  virtual bool queryResult(MovableObject* first, MovableObject* second) = 0;
472 
479  virtual bool queryResult(MovableObject* movable, SceneQuery::WorldFragment* fragment) = 0;
480 
481  /* NB there are no results for world fragments intersecting other world fragments;
482  it is assumed that world geometry is either static or at least that self-intersections
483  are irrelevant or dealt with elsewhere (such as the custom scene manager) */
484 
485 
486  };
487 
488  typedef std::pair<MovableObject*, MovableObject*> SceneQueryMovableObjectPair;
489  typedef std::pair<MovableObject*, SceneQuery::WorldFragment*> SceneQueryMovableObjectWorldFragmentPair;
494  {
499 
500 
501 
502  };
503 
514  {
515  protected:
517  public:
519  virtual ~IntersectionSceneQuery();
520 
529  virtual IntersectionSceneQueryResult& execute(void);
530 
538  virtual void execute(IntersectionSceneQueryListener* listener) = 0;
539 
543  virtual IntersectionSceneQueryResult& getLastResults(void) const;
550  virtual void clearResults(void);
551 
553  bool queryResult(MovableObject* first, MovableObject* second);
555  bool queryResult(MovableObject* movable, SceneQuery::WorldFragment* fragment);
556  };
557 
561 }
562 
563 #include "OgreHeaderSuffix.h"
564 
565 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Wed Oct 23 2013 06:57:25