Project SkyFire Core
SkyFire 5.4.8 server core API documentation
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
25
26ObjectPosSelector::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
43void 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
62
64{
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
74{
78 {
79 // calculate next possible angle
80 if (NextPosibleAngle(angle))
81 return true;
82 }
83
84 return false;
85}
86
88{
91 {
92 // calculate next possible angle
93 if (!NextPosibleAngle(angle))
94 return true;
95 }
96
97 return false;
98}
99
101{
102 // ++ direction less updated
105 {
106 bool ok;
108 ok = NextSmallStepAngle(1.0f, USED_POS_PLUS, angle);
109 else
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
118 {
119 bool ok;
121 ok = NextSmallStepAngle(-1.0f, USED_POS_MINUS, angle);
122 else
124
125 if (!ok)
127 return ok;
128 }
129 else // both list empty
130 {
132 return NextSmallStepAngle(1.0f, USED_POS_PLUS, angle);
133 // -- direction less updated
135 return NextSmallStepAngle(-1.0f, USED_POS_MINUS, angle);
136 }
137
138 // no angles
139 return false;
140}
UsedPosType
@ USED_POS_PLUS
@ USED_POS_MINUS
bool NextAngleFor(UsedPosList::value_type const &usedPos, float sign, UsedPosType uptype, float &angle)
bool FirstAngle(float &angle)
ObjectPosSelector(float x, float y, float size, float dist)
bool NextPosibleAngle(float &angle)
UsedPosList::const_iterator m_nextUsedPos[2]
bool NextUsedAngle(float &angle)
bool NextSmallStepAngle(float sign, UsedPosType uptype, float &angle)
UsedPosList::value_type const * nextUsedPos(UsedPosType uptype)
UsedPosList::value_type const * m_smallStepNextUsedPos[2]
void AddUsedPos(float size, float angle, float dist)
bool NextAngle(float &angle)
UsedPosList m_UsedPosLists[2]