1
/***************************************************************************
2
OgrePagingLandScapeRaySceneQuery.cpp - description
4
begin : Fri Sep 10 2003
5
copyright : (C) 2003-2006 by Jose A Milan && Tuan Kuranes
6
email : spoke2@supercable.es && tuan.kuranes@free.fr
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU Lesser General Public License as *
13
* published by the Free Software Foundation; either version 2 of the *
14
* License, or (at your option) any later version. *
16
***************************************************************************/
18
#include "OgrePagingLandScapePrecompiledHeaders.h"
20
#include "OgreEntity.h"
22
#include "OgreVector3.h"
23
#include "OgreColourValue.h"
25
#include "OgreSceneManager.h"
26
#include "OgrePagingLandScapeOctreeSceneManager.h"
28
#include "OgrePagingLandScapeOptions.h"
29
#include "OgrePagingLandScapeSceneManager.h"
30
#include "OgrePagingLandScapeData2DManager.h"
31
#include "OgrePagingLandScapeRaySceneQuery.h"
36
//----------------------------------------------------------------------------
37
// This function return the vertex interpolated height.
38
// Supplied by Praetor. Thanks a lot. ]:)
39
void PagingLandScapeRaySceneQuery::execute(RaySceneQueryListener* listener)
42
///Make sure that there really is some world geometry first
43
if ((static_cast<PagingLandScapeSceneManager*>(mParentSceneMgr)->mWorldGeomIsSetup) && (getQueryTypeMask() & SceneManager::WORLD_GEOMETRY_TYPE_MASK))
46
mWorldFrag.fragmentType = SceneQuery::WFT_SINGLE_INTERSECTION;
48
const Vector3& dir(mRay.getDirection());
49
const Vector3& origin(mRay.getOrigin());
51
PagingLandScapeSceneManager* mSceneMgr = static_cast<PagingLandScapeSceneManager*>(mParentSceneMgr);
52
if (mWorldFragmentType & WFT_SINGLE_INTERSECTION)
54
if (dir == Vector3::UNIT_Y ||
55
dir == Vector3::NEGATIVE_UNIT_Y)
58
if (mSceneMgr->getOptions()->queryNoInterpolation)
59
height = mSceneMgr->getData2DManager()->getWorldHeight(origin.x, origin.z);
61
height = mSceneMgr->getData2DManager()->getInterpolatedWorldHeight(origin.x, origin.z);
63
mWorldFrag.singleIntersection.x = origin.x;
64
mWorldFrag.singleIntersection.z = origin.z;
65
mWorldFrag.singleIntersection.y = height;
67
mWorldFrag.singleIntersection += mSceneMgr->getOptions()->position; //consider terrain offset
69
listener->queryResult(&mWorldFrag, (Math::Abs(mWorldFrag.singleIntersection.y - origin.y)));
72
else if (mSceneMgr->intersectSegmentTerrain(
74
dir * mSceneMgr->getOptions()->queryResolutionFactor,
75
&mWorldFrag.singleIntersection))
77
listener->queryResult(&mWorldFrag, (mWorldFrag.singleIntersection - origin).length());
79
PagingLandScapeOctreeRaySceneQuery::execute(listener);
86
// multiple terrain intersection
87
const Vector3 raydir (mRay.getDirection());
88
const Vector3 raymove (raydir * mSceneMgr->getOptions()->queryResolutionFactor);
89
const Real distmove = mSceneMgr->getOptions()->queryResolutionFactor;
90
const Real maxHeight = mSceneMgr->getData2DManager()->getMaxHeight ();
91
const Real MaxTerrainX = mSceneMgr->getOptions()->maxScaledX;
92
const Real MaxTerrainZ = mSceneMgr->getOptions()->maxScaledZ;
94
Vector3 ray (mRay.getOrigin());
97
// while ray is inside or ray is outside but raydir going inside
98
while ((ray.y < 0 && raydir.y > 0) ||
99
(ray.y > maxHeight && raydir.y < 0) ||
100
(ray.x < -MaxTerrainX && raydir.x > 0) ||
101
(ray.x > MaxTerrainX && raydir.x < 0) ||
102
(ray.z < -MaxTerrainZ && raydir.z > 0) ||
103
(ray.z > MaxTerrainZ && raydir.z < 0))
107
if (ray.y < maxHeight)// no need to do complex tests
109
const Vector3 land (getHeightAt(ray));
112
WorldFragment* frag = new WorldFragment();
113
//fragmentList.push_back(frag);
115
frag->fragmentType = SceneQuery::WFT_SINGLE_INTERSECTION;
116
frag->singleIntersection = land;
118
if (!listener->queryResult(frag, dist))
126
// if anything else is queried, ask underlying Octree Scene Manager.
127
PagingLandScapeOctreeRaySceneQuery::execute(listener);
129
//----------------------------------------------------------------------------
130
Vector3 PagingLandScapeRaySceneQuery::getHeightAt(const Vector3& origin) const
133
PagingLandScapeSceneManager * mSceneMgr = static_cast<PagingLandScapeSceneManager*>(mParentSceneMgr);
134
return Vector3(origin.x, mSceneMgr->getData2DManager()->getInterpolatedWorldHeight(origin.x, origin.z), origin.z);