Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
DynamicTree.cpp
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#include "
DynamicTree.h
"
7
//#include "QuadTree.h"
8
//#include "RegularGrid.h"
9
#include "
BoundingIntervalHierarchyWrapper.h
"
10
11
#include "
Log.h
"
12
#include "
RegularGrid.h
"
13
#include "
Timer.h
"
14
#include "
GameObjectModel.h
"
15
#include "
ModelInstance.h
"
16
17
#include <G3D/AABox.h>
18
#include <G3D/Ray.h>
19
#include <G3D/Vector3.h>
20
21
using
VMAP::ModelInstance
;
22
23
namespace
{
24
25
int
CHECK_TREE_PERIOD = 200;
26
27
}
// namespace
28
29
template
<>
struct
HashTrait<
GameObjectModel
>{
30
static
size_t
hashCode
(
const
GameObjectModel
& g) {
return
(
size_t
)(
void
*)&g; }
31
};
32
33
template
<>
struct
PositionTrait<
GameObjectModel
> {
34
static
void
getPosition
(
const
GameObjectModel
& g, G3D::Vector3& p) { p = g.
getPosition
(); }
35
};
36
37
template
<>
struct
BoundsTrait<
GameObjectModel
> {
38
static
void
getBounds
(
const
GameObjectModel
& g, G3D::AABox& out) { out = g.
getBounds
();}
39
static
void
getBounds2
(
const
GameObjectModel
* g, G3D::AABox& out) { out = g->
getBounds
();}
40
};
41
42
/*
43
static bool operator == (const GameObjectModel& mdl, const GameObjectModel& mdl2){
44
return &mdl == &mdl2;
45
}
46
*/
47
48
typedef
RegularGrid2D<GameObjectModel, BIHWrap<GameObjectModel>
>
ParentTree
;
49
50
struct
DynTreeImpl
:
public
ParentTree
/*, public Intersectable*/
51
{
52
typedef
GameObjectModel
Model
;
53
typedef
ParentTree
base
;
54
55
DynTreeImpl
() :
56
rebalance_timer
(CHECK_TREE_PERIOD),
57
unbalanced_times
(0)
58
{
59
}
60
61
void
insert
(
const
Model
& mdl)
62
{
63
base::insert
(mdl);
64
++
unbalanced_times
;
65
}
66
67
void
remove
(
const
Model
& mdl)
68
{
69
base::remove
(mdl);
70
++
unbalanced_times
;
71
}
72
73
void
balance
()
74
{
75
base::balance
();
76
unbalanced_times
= 0;
77
}
78
79
void
update
(
uint32
difftime)
80
{
81
if
(!
size
())
82
return
;
83
84
rebalance_timer
.Update(difftime);
85
if
(
rebalance_timer
.Passed())
86
{
87
rebalance_timer
.Reset(CHECK_TREE_PERIOD);
88
if
(
unbalanced_times
> 0)
89
balance
();
90
}
91
}
92
93
TimeTrackerSmall
rebalance_timer
;
94
int
unbalanced_times
;
95
};
96
97
DynamicMapTree::DynamicMapTree
() :
impl
(new
DynTreeImpl
()) { }
98
99
DynamicMapTree::~DynamicMapTree
()
100
{
101
delete
impl
;
102
}
103
104
void
DynamicMapTree::insert
(
const
GameObjectModel
& mdl)
105
{
106
impl
->insert(mdl);
107
}
108
109
void
DynamicMapTree::remove
(
const
GameObjectModel
& mdl)
110
{
111
impl
->remove(mdl);
112
}
113
114
bool
DynamicMapTree::contains
(
const
GameObjectModel
& mdl)
const
115
{
116
return
impl
->contains(mdl);
117
}
118
119
void
DynamicMapTree::balance
()
120
{
121
impl
->balance();
122
}
123
124
int
DynamicMapTree::size
()
const
125
{
126
return
impl
->size();
127
}
128
129
void
DynamicMapTree::update
(
uint32
t_diff)
130
{
131
impl
->update(t_diff);
132
}
133
134
struct
DynamicTreeIntersectionCallback
135
{
136
bool
did_hit
;
137
uint32
phase_mask
;
138
explicit
DynamicTreeIntersectionCallback
(
uint32
phasemask) :
did_hit
(false),
phase_mask
(phasemask) { }
139
bool
operator()
(
const
G3D::Ray& r,
const
GameObjectModel
& obj,
float
& distance)
140
{
141
did_hit
= obj.
intersectRay
(r, distance,
true
,
phase_mask
);
142
return
did_hit
;
143
}
144
bool
didHit
()
const
{
return
did_hit
;}
145
};
146
147
struct
DynamicTreeIntersectionCallback_WithLogger
148
{
149
bool
did_hit
;
150
uint32
phase_mask
;
151
explicit
DynamicTreeIntersectionCallback_WithLogger
(
uint32
phasemask) :
did_hit
(false),
phase_mask
(phasemask)
152
{
153
SF_LOG_DEBUG
(
"maps"
,
"Dynamic Intersection log"
);
154
}
155
bool
operator()
(
const
G3D::Ray& r,
const
GameObjectModel
& obj,
float
& distance)
156
{
157
SF_LOG_DEBUG
(
"maps"
,
"testing intersection with %s"
, obj.
name
.c_str());
158
bool
hit = obj.
intersectRay
(r, distance,
true
,
phase_mask
);
159
if
(hit)
160
{
161
did_hit
=
true
;
162
SF_LOG_DEBUG
(
"maps"
,
"result: intersects"
);
163
}
164
return
hit;
165
}
166
bool
didHit
()
const
{
return
did_hit
;}
167
};
168
169
bool
DynamicMapTree::getIntersectionTime
(
const
uint32
phasemask,
const
G3D::Ray& ray,
170
const
G3D::Vector3& endPos,
float
& maxDist)
const
171
{
172
float
distance = maxDist;
173
DynamicTreeIntersectionCallback
callback(phasemask);
174
impl
->intersectRay(ray, callback, distance, endPos);
175
if
(callback.
didHit
())
176
maxDist = distance;
177
return
callback.
didHit
();
178
}
179
180
bool
DynamicMapTree::getObjectHitPos
(
const
uint32
phasemask,
const
G3D::Vector3& startPos,
181
const
G3D::Vector3& endPos, G3D::Vector3& resultHit,
182
float
modifyDist)
const
183
{
184
bool
result =
false
;
185
float
maxDist = (endPos - startPos).magnitude();
186
// valid map coords should *never ever* produce float overflow, but this would produce NaNs too
187
ASSERT
(maxDist < std::numeric_limits<float>::max());
188
// prevent NaN values which can cause BIH intersection to enter infinite loop
189
if
(maxDist < 1e-10f)
190
{
191
resultHit = endPos;
192
return
false
;
193
}
194
G3D::Vector3 dir = (endPos - startPos)/maxDist;
// direction with length of 1
195
G3D::Ray ray(startPos, dir);
196
float
dist = maxDist;
197
if
(
getIntersectionTime
(phasemask, ray, endPos, dist))
198
{
199
resultHit = startPos + dir * dist;
200
if
(modifyDist < 0)
201
{
202
if
((resultHit - startPos).magnitude() > -modifyDist)
203
resultHit = resultHit + dir*modifyDist;
204
else
205
resultHit = startPos;
206
}
207
else
208
resultHit = resultHit + dir*modifyDist;
209
210
result =
true
;
211
}
212
else
213
{
214
resultHit = endPos;
215
result =
false
;
216
}
217
return
result;
218
}
219
220
bool
DynamicMapTree::isInLineOfSight
(
float
x1,
float
y1,
float
z1,
float
x2,
float
y2,
float
z2,
uint32
phasemask)
const
221
{
222
G3D::Vector3 v1(x1, y1, z1), v2(x2, y2, z2);
223
224
float
maxDist = (v2 - v1).magnitude();
225
226
if
(!G3D::fuzzyGt(maxDist, 0) )
227
return
true
;
228
229
G3D::Ray r(v1, (v2-v1) / maxDist);
230
DynamicTreeIntersectionCallback
callback(phasemask);
231
impl
->intersectRay(r, callback, maxDist, v2);
232
233
return
!callback.
did_hit
;
234
}
235
236
float
DynamicMapTree::getHeight
(
float
x,
float
y,
float
z,
float
maxSearchDist,
uint32
phasemask)
const
237
{
238
G3D::Vector3 v(x, y, z);
239
G3D::Ray r(v, G3D::Vector3(0, 0, -1));
240
DynamicTreeIntersectionCallback
callback(phasemask);
241
impl
->intersectZAllignedRay(r, callback, maxSearchDist);
242
243
if
(callback.
didHit
())
244
return
v.z - maxSearchDist;
245
else
246
return
-G3D::inf();
247
}
BoundingIntervalHierarchyWrapper.h
uint32
std::uint32_t uint32
Definition
Define.h:77
ParentTree
RegularGrid2D< GameObjectModel, BIHWrap< GameObjectModel > > ParentTree
Definition
DynamicTree.cpp:48
DynamicTree.h
ASSERT
#define ASSERT
Definition
Errors.h:29
GameObjectModel.h
Log.h
SF_LOG_DEBUG
#define SF_LOG_DEBUG(filterType__,...)
Definition
Log.h:134
ModelInstance.h
RegularGrid.h
Timer.h
DynamicMapTree::contains
bool contains(const GameObjectModel &) const
Definition
DynamicTree.cpp:114
DynamicMapTree::balance
void balance()
Definition
DynamicTree.cpp:119
DynamicMapTree::insert
void insert(const GameObjectModel &)
Definition
DynamicTree.cpp:104
DynamicMapTree::getIntersectionTime
bool getIntersectionTime(uint32 phasemask, const G3D::Ray &ray, const G3D::Vector3 &endPos, float &maxDist) const
Definition
DynamicTree.cpp:169
DynamicMapTree::isInLineOfSight
bool isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask) const
Definition
DynamicTree.cpp:220
DynamicMapTree::~DynamicMapTree
~DynamicMapTree()
Definition
DynamicTree.cpp:99
DynamicMapTree::impl
DynTreeImpl * impl
Definition
DynamicTree.h:23
DynamicMapTree::update
void update(uint32 diff)
Definition
DynamicTree.cpp:129
DynamicMapTree::size
int size() const
Definition
DynamicTree.cpp:124
DynamicMapTree::getHeight
float getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const
Definition
DynamicTree.cpp:236
DynamicMapTree::getObjectHitPos
bool getObjectHitPos(uint32 phasemask, const G3D::Vector3 &pPos1, const G3D::Vector3 &pPos2, G3D::Vector3 &pResultHitPos, float pModifyDist) const
Definition
DynamicTree.cpp:180
DynamicMapTree::DynamicMapTree
DynamicMapTree()
Definition
DynamicTree.cpp:97
DynamicMapTree::remove
void remove(const GameObjectModel &)
Definition
DynamicTree.cpp:109
GameObjectModel
Definition
GameObjectModel.h:39
GameObjectModel::getBounds
const G3D::AABox & getBounds() const
Definition
GameObjectModel.h:56
GameObjectModel::getPosition
const G3D::Vector3 & getPosition() const
Definition
GameObjectModel.h:60
GameObjectModel::name
std::string name
Definition
GameObjectModel.h:54
GameObjectModel::intersectRay
bool intersectRay(const G3D::Ray &Ray, float &MaxDist, bool StopAtFirstHit, uint32 ph_mask) const
Definition
GameObjectModel.cpp:145
RegularGrid2D
Definition
RegularGrid.h:29
RegularGrid2D< GameObjectModel, BIHWrap< GameObjectModel > >::size
int size() const
Definition
RegularGrid.h:78
RegularGrid2D< GameObjectModel, BIHWrap< GameObjectModel > >::remove
void remove(const GameObjectModel &value)
Definition
RegularGrid.h:62
RegularGrid2D< GameObjectModel, BIHWrap< GameObjectModel > >::insert
void insert(const GameObjectModel &value)
Definition
RegularGrid.h:53
RegularGrid2D< GameObjectModel, BIHWrap< GameObjectModel > >::balance
void balance()
Definition
RegularGrid.h:69
VMAP::ModelInstance
Definition
ModelInstance.h:51
BoundsTrait< GameObjectModel >::getBounds
static void getBounds(const GameObjectModel &g, G3D::AABox &out)
Definition
DynamicTree.cpp:38
BoundsTrait< GameObjectModel >::getBounds2
static void getBounds2(const GameObjectModel *g, G3D::AABox &out)
Definition
DynamicTree.cpp:39
DynTreeImpl
Definition
DynamicTree.cpp:51
DynTreeImpl::balance
void balance()
Definition
DynamicTree.cpp:73
DynTreeImpl::remove
void remove(const Model &mdl)
Definition
DynamicTree.cpp:67
DynTreeImpl::rebalance_timer
TimeTrackerSmall rebalance_timer
Definition
DynamicTree.cpp:93
DynTreeImpl::base
ParentTree base
Definition
DynamicTree.cpp:53
DynTreeImpl::insert
void insert(const Model &mdl)
Definition
DynamicTree.cpp:61
DynTreeImpl::unbalanced_times
int unbalanced_times
Definition
DynamicTree.cpp:94
DynTreeImpl::update
void update(uint32 difftime)
Definition
DynamicTree.cpp:79
DynTreeImpl::Model
GameObjectModel Model
Definition
DynamicTree.cpp:52
DynTreeImpl::DynTreeImpl
DynTreeImpl()
Definition
DynamicTree.cpp:55
DynamicTreeIntersectionCallback_WithLogger::phase_mask
uint32 phase_mask
Definition
DynamicTree.cpp:150
DynamicTreeIntersectionCallback_WithLogger::operator()
bool operator()(const G3D::Ray &r, const GameObjectModel &obj, float &distance)
Definition
DynamicTree.cpp:155
DynamicTreeIntersectionCallback_WithLogger::didHit
bool didHit() const
Definition
DynamicTree.cpp:166
DynamicTreeIntersectionCallback_WithLogger::DynamicTreeIntersectionCallback_WithLogger
DynamicTreeIntersectionCallback_WithLogger(uint32 phasemask)
Definition
DynamicTree.cpp:151
DynamicTreeIntersectionCallback_WithLogger::did_hit
bool did_hit
Definition
DynamicTree.cpp:149
DynamicTreeIntersectionCallback
Definition
DynamicTree.cpp:135
DynamicTreeIntersectionCallback::DynamicTreeIntersectionCallback
DynamicTreeIntersectionCallback(uint32 phasemask)
Definition
DynamicTree.cpp:138
DynamicTreeIntersectionCallback::did_hit
bool did_hit
Definition
DynamicTree.cpp:136
DynamicTreeIntersectionCallback::didHit
bool didHit() const
Definition
DynamicTree.cpp:144
DynamicTreeIntersectionCallback::phase_mask
uint32 phase_mask
Definition
DynamicTree.cpp:137
DynamicTreeIntersectionCallback::operator()
bool operator()(const G3D::Ray &r, const GameObjectModel &obj, float &distance)
Definition
DynamicTree.cpp:139
HashTrait< GameObjectModel >::hashCode
static size_t hashCode(const GameObjectModel &g)
Definition
DynamicTree.cpp:30
PositionTrait< GameObjectModel >::getPosition
static void getPosition(const GameObjectModel &g, G3D::Vector3 &p)
Definition
DynamicTree.cpp:34
TimeTrackerSmall
Definition
Timer.h:105
src
server
collision
DynamicTree.cpp
Generated on
for Project SkyFire Core by
1.17.0