Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
ObjectPosSelector.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 "
ObjectPosSelector.h
"
7
8
ObjectPosSelector::ObjectPosSelector
(
float
x,
float
y,
float
size,
float
dist)
9
:
m_center_x
(x),
m_center_y
(y),
m_size
(size),
m_dist
(dist)
10
{
11
m_anglestep
= acos(
m_dist
/ (
m_dist
+ 2 *
m_size
));
12
13
m_nextUsedPos
[
USED_POS_PLUS
] =
m_UsedPosLists
[
USED_POS_PLUS
].end();
14
m_nextUsedPos
[
USED_POS_MINUS
] =
m_UsedPosLists
[
USED_POS_MINUS
].end();
15
16
m_smallStepAngle
[
USED_POS_PLUS
] = 0;
17
m_smallStepAngle
[
USED_POS_MINUS
] = 0;
18
19
m_smallStepOk
[
USED_POS_PLUS
] =
false
;
20
m_smallStepOk
[
USED_POS_MINUS
] =
false
;
21
22
m_smallStepNextUsedPos
[
USED_POS_PLUS
] = NULL;
23
m_smallStepNextUsedPos
[
USED_POS_MINUS
] = NULL;
24
}
25
26
ObjectPosSelector::UsedPosList::value_type
const
*
ObjectPosSelector::nextUsedPos
(
UsedPosType
uptype)
27
{
28
UsedPosList::const_iterator itr =
m_nextUsedPos
[uptype];
29
if
(itr !=
m_UsedPosLists
[uptype].end())
30
++itr;
31
32
if
(itr ==
m_UsedPosLists
[uptype].end())
33
{
34
if
(!
m_UsedPosLists
[~uptype].empty())
35
return
&*
m_UsedPosLists
[~uptype].rbegin();
36
else
37
return
NULL;
38
}
39
else
40
return
&*itr;
41
}
42
43
void
ObjectPosSelector::AddUsedPos
(
float
size,
float
angle,
float
dist)
44
{
45
if
(angle >= 0)
46
m_UsedPosLists
[
USED_POS_PLUS
].insert(UsedPosList::value_type(angle,
UsedPos
(1.0f, size, dist)));
47
else
48
m_UsedPosLists
[
USED_POS_MINUS
].insert(UsedPosList::value_type(-angle,
UsedPos
(-1.0f, size, dist)));
49
}
50
51
void
ObjectPosSelector::InitializeAngle
()
52
{
53
m_nextUsedPos
[
USED_POS_PLUS
] =
m_UsedPosLists
[
USED_POS_PLUS
].begin();
54
m_nextUsedPos
[
USED_POS_MINUS
] =
m_UsedPosLists
[
USED_POS_MINUS
].begin();
55
56
m_smallStepAngle
[
USED_POS_PLUS
] = 0;
57
m_smallStepAngle
[
USED_POS_MINUS
] = 0;
58
59
m_smallStepOk
[
USED_POS_PLUS
] =
true
;
60
m_smallStepOk
[
USED_POS_MINUS
] =
true
;
61
}
62
63
bool
ObjectPosSelector::FirstAngle
(
float
& angle)
64
{
65
if
(
m_UsedPosLists
[
USED_POS_PLUS
].empty() && !
m_UsedPosLists
[
USED_POS_MINUS
].empty())
66
return
NextAngleFor
(*
m_UsedPosLists
[
USED_POS_MINUS
].begin(), 1.0f,
USED_POS_PLUS
, angle);
67
else
if
(
m_UsedPosLists
[
USED_POS_MINUS
].empty() && !
m_UsedPosLists
[
USED_POS_PLUS
].empty())
68
return
NextAngleFor
(*
m_UsedPosLists
[
USED_POS_PLUS
].begin(), -1.0f,
USED_POS_MINUS
, angle);
69
70
return
false
;
71
}
72
73
bool
ObjectPosSelector::NextAngle
(
float
& angle)
74
{
75
while
(
m_nextUsedPos
[
USED_POS_PLUS
] !=
m_UsedPosLists
[
USED_POS_PLUS
].end() ||
76
m_nextUsedPos
[
USED_POS_MINUS
] !=
m_UsedPosLists
[
USED_POS_MINUS
].end() ||
77
m_smallStepOk
[
USED_POS_PLUS
] ||
m_smallStepOk
[
USED_POS_MINUS
])
78
{
79
// calculate next possible angle
80
if
(
NextPosibleAngle
(angle))
81
return
true
;
82
}
83
84
return
false
;
85
}
86
87
bool
ObjectPosSelector::NextUsedAngle
(
float
& angle)
88
{
89
while
(
m_nextUsedPos
[
USED_POS_PLUS
] !=
m_UsedPosLists
[
USED_POS_PLUS
].end() ||
90
m_nextUsedPos
[
USED_POS_MINUS
] !=
m_UsedPosLists
[
USED_POS_MINUS
].end())
91
{
92
// calculate next possible angle
93
if
(!
NextPosibleAngle
(angle))
94
return
true
;
95
}
96
97
return
false
;
98
}
99
100
bool
ObjectPosSelector::NextPosibleAngle
(
float
& angle)
101
{
102
// ++ direction less updated
103
if
(
m_nextUsedPos
[
USED_POS_PLUS
] !=
m_UsedPosLists
[
USED_POS_PLUS
].end() &&
104
(
m_nextUsedPos
[
USED_POS_MINUS
] ==
m_UsedPosLists
[
USED_POS_MINUS
].end() ||
m_nextUsedPos
[
USED_POS_PLUS
]->first <=
m_nextUsedPos
[
USED_POS_MINUS
]->first))
105
{
106
bool
ok;
107
if
(
m_smallStepOk
[
USED_POS_PLUS
])
108
ok =
NextSmallStepAngle
(1.0f,
USED_POS_PLUS
, angle);
109
else
110
ok =
NextAngleFor
(*
m_nextUsedPos
[
USED_POS_PLUS
], 1.0f,
USED_POS_PLUS
, angle);
111
112
if
(!ok)
113
++
m_nextUsedPos
[
USED_POS_PLUS
];
// increase. only at fail (original or checked)
114
return
ok;
115
}
116
// -- direction less updated
117
else
if
(
m_nextUsedPos
[
USED_POS_MINUS
] !=
m_UsedPosLists
[
USED_POS_MINUS
].end())
118
{
119
bool
ok;
120
if
(
m_smallStepOk
[
USED_POS_MINUS
])
121
ok =
NextSmallStepAngle
(-1.0f,
USED_POS_MINUS
, angle);
122
else
123
ok =
NextAngleFor
(*
m_nextUsedPos
[
USED_POS_MINUS
], -1.0f,
USED_POS_MINUS
, angle);
124
125
if
(!ok)
126
++
m_nextUsedPos
[
USED_POS_MINUS
];
127
return
ok;
128
}
129
else
// both list empty
130
{
131
if
(
m_smallStepOk
[
USED_POS_PLUS
] && (!
m_smallStepOk
[
USED_POS_MINUS
] ||
m_smallStepAngle
[
USED_POS_PLUS
] <=
m_smallStepAngle
[
USED_POS_MINUS
]))
132
return
NextSmallStepAngle
(1.0f,
USED_POS_PLUS
, angle);
133
// -- direction less updated
134
else
if
(
m_smallStepOk
[
USED_POS_MINUS
])
135
return
NextSmallStepAngle
(-1.0f,
USED_POS_MINUS
, angle);
136
}
137
138
// no angles
139
return
false
;
140
}
ObjectPosSelector.h
UsedPosType
UsedPosType
Definition
ObjectPosSelector.h:13
USED_POS_PLUS
@ USED_POS_PLUS
Definition
ObjectPosSelector.h:13
USED_POS_MINUS
@ USED_POS_MINUS
Definition
ObjectPosSelector.h:13
ObjectPosSelector::UsedPos
Definition
ObjectPosSelector.h:23
ObjectPosSelector::NextAngleFor
bool NextAngleFor(UsedPosList::value_type const &usedPos, float sign, UsedPosType uptype, float &angle)
Definition
ObjectPosSelector.h:64
ObjectPosSelector::m_center_x
float m_center_x
Definition
ObjectPosSelector.h:128
ObjectPosSelector::FirstAngle
bool FirstAngle(float &angle)
Definition
ObjectPosSelector.cpp:63
ObjectPosSelector::ObjectPosSelector
ObjectPosSelector(float x, float y, float size, float dist)
Definition
ObjectPosSelector.cpp:8
ObjectPosSelector::m_smallStepAngle
float m_smallStepAngle[2]
Definition
ObjectPosSelector.h:138
ObjectPosSelector::m_size
float m_size
Definition
ObjectPosSelector.h:130
ObjectPosSelector::NextPosibleAngle
bool NextPosibleAngle(float &angle)
Definition
ObjectPosSelector.cpp:100
ObjectPosSelector::m_nextUsedPos
UsedPosList::const_iterator m_nextUsedPos[2]
Definition
ObjectPosSelector.h:135
ObjectPosSelector::NextUsedAngle
bool NextUsedAngle(float &angle)
Definition
ObjectPosSelector.cpp:87
ObjectPosSelector::m_dist
float m_dist
Definition
ObjectPosSelector.h:131
ObjectPosSelector::m_smallStepOk
bool m_smallStepOk[2]
Definition
ObjectPosSelector.h:139
ObjectPosSelector::NextSmallStepAngle
bool NextSmallStepAngle(float sign, UsedPosType uptype, float &angle)
Definition
ObjectPosSelector.h:90
ObjectPosSelector::nextUsedPos
UsedPosList::value_type const * nextUsedPos(UsedPosType uptype)
Definition
ObjectPosSelector.cpp:26
ObjectPosSelector::m_center_y
float m_center_y
Definition
ObjectPosSelector.h:129
ObjectPosSelector::m_smallStepNextUsedPos
UsedPosList::value_type const * m_smallStepNextUsedPos[2]
Definition
ObjectPosSelector.h:140
ObjectPosSelector::AddUsedPos
void AddUsedPos(float size, float angle, float dist)
Definition
ObjectPosSelector.cpp:43
ObjectPosSelector::InitializeAngle
void InitializeAngle()
Definition
ObjectPosSelector.cpp:51
ObjectPosSelector::m_anglestep
float m_anglestep
Definition
ObjectPosSelector.h:132
ObjectPosSelector::NextAngle
bool NextAngle(float &angle)
Definition
ObjectPosSelector.cpp:73
ObjectPosSelector::m_UsedPosLists
UsedPosList m_UsedPosLists[2]
Definition
ObjectPosSelector.h:134
src
server
game
Entities
Object
ObjectPosSelector.cpp
Generated on
for Project SkyFire Core by
1.17.0