Skip to content

Commit b386fde

Browse files
committed
Переделал странный код
1 parent 37c4d0a commit b386fde

File tree

2 files changed

+20
-39
lines changed

2 files changed

+20
-39
lines changed

ogsr_engine/xrGame/WeaponBinocularsVision.cpp

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,6 @@
1818

1919
#define RECT_SIZE 16
2020

21-
struct FindVisObjByObject
22-
{
23-
const CObject* O;
24-
FindVisObjByObject(const CObject* o) : O(o) {}
25-
bool operator()(const SBinocVisibleObj* vis) { return (O == vis->m_object); }
26-
};
27-
2821
void SBinocVisibleObj::create_default(u32 color)
2922
{
3023
m_lt.Init("ui\\ui_enemy_frame", 0, 0, RECT_SIZE, RECT_SIZE);
@@ -155,7 +148,6 @@ CBinocularsVision::CBinocularsVision(CWeaponMagazined* parent)
155148
CBinocularsVision::~CBinocularsVision()
156149
{
157150
m_snd_found.destroy();
158-
delete_data(m_active_objects);
159151
}
160152

161153
void CBinocularsVision::Update()
@@ -170,9 +162,8 @@ void CBinocularsVision::Update()
170162

171163
const CVisualMemoryManager::VISIBLES& vVisibles = pActor->memory().visual().objects();
172164

173-
VIS_OBJECTS_IT it = m_active_objects.begin();
174-
for (; it != m_active_objects.end(); ++it)
175-
(*it)->m_flags.set(flVisObjNotValid, TRUE);
165+
for (auto& vis : m_active_objects)
166+
vis->m_flags.set(flVisObjNotValid, TRUE);
176167

177168
CVisualMemoryManager::VISIBLES::const_iterator v_it = vVisibles.begin();
178169
for (; v_it != vVisibles.end(); ++v_it)
@@ -190,18 +181,15 @@ void CBinocularsVision::Update()
190181
if (!EA || !EA->g_Alive())
191182
continue;
192183

193-
FindVisObjByObject f(object_);
194-
VIS_OBJECTS_IT found;
195-
found = std::find_if(m_active_objects.begin(), m_active_objects.end(), f);
184+
auto found = std::find_if(m_active_objects.begin(), m_active_objects.end(), [object_](const auto& vis) { return (object_ == vis->m_object); });
196185

197186
if (found != m_active_objects.end())
198187
{
199188
(*found)->m_flags.set(flVisObjNotValid, FALSE);
200189
}
201190
else
202191
{
203-
m_active_objects.push_back(xr_new<SBinocVisibleObj>());
204-
SBinocVisibleObj* new_vis_obj = m_active_objects.back();
192+
auto& new_vis_obj = m_active_objects.emplace_back(std::make_unique<SBinocVisibleObj>());
205193
new_vis_obj->m_flags.set(flVisObjNotValid, FALSE);
206194
new_vis_obj->m_object = object_;
207195
new_vis_obj->create_default(m_frame_color.get());
@@ -211,17 +199,18 @@ void CBinocularsVision::Update()
211199
m_snd_found.play_at_pos(0, Fvector().set(0, 0, 0), sm_2D);
212200
}
213201
}
214-
std::sort(m_active_objects.begin(), m_active_objects.end());
215-
216-
while (m_active_objects.size() && m_active_objects.back()->m_flags.test(flVisObjNotValid))
217-
{
218-
xr_delete(m_active_objects.back());
219-
m_active_objects.pop_back();
220-
}
221202

222-
it = m_active_objects.begin();
223-
for (; it != m_active_objects.end(); ++it)
224-
(*it)->Update();
203+
m_active_objects.erase(std::remove_if(m_active_objects.begin(), m_active_objects.end(),
204+
[](auto& vis) {
205+
if (vis->m_flags.test(flVisObjNotValid))
206+
return true;
207+
else
208+
{
209+
vis->Update();
210+
return false;
211+
}
212+
}),
213+
m_active_objects.end());
225214
}
226215

227216
void CBinocularsVision::Draw()
@@ -231,8 +220,8 @@ void CBinocularsVision::Draw()
231220
if (Device.m_SecondViewport.IsSVPActive())
232221
return;
233222

234-
for (auto* it : m_active_objects)
235-
it->Draw();
223+
for (auto& vis : m_active_objects)
224+
vis->Draw();
236225
}
237226

238227
void CBinocularsVision::Load(const shared_str& section)
@@ -246,11 +235,6 @@ void CBinocularsVision::Load(const shared_str& section)
246235

247236
void CBinocularsVision::remove_links(CObject* object)
248237
{
249-
#pragma todo("KRodin: во-первых, тут утечка, во-вторых, удалять принято через ремове_иф, в третьих - нечего вообще в m_active_objects хранить указатели.")
250-
251-
VIS_OBJECTS::iterator I = std::find_if(m_active_objects.begin(), m_active_objects.end(), FindVisObjByObject(object));
252-
if (I == m_active_objects.end())
253-
return;
254-
255-
m_active_objects.erase(I);
238+
m_active_objects.erase(std::remove_if(m_active_objects.begin(), m_active_objects.end(), [object](const auto& vis) { return (object == vis->m_object); }),
239+
m_active_objects.end());
256240
}

ogsr_engine/xrGame/WeaponBinocularsVision.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,12 @@ struct SBinocVisibleObj
2424
void create_default(u32 color);
2525
void Draw();
2626
void Update();
27-
bool operator<(const SBinocVisibleObj& other) const { return m_flags.test(flVisObjNotValid) < other.m_flags.test(flVisObjNotValid); } // move non-actual to tail
2827
};
2928

3029
class CWeaponMagazined;
3130
class CBinocularsVision
3231
{
33-
typedef xr_vector<SBinocVisibleObj*> VIS_OBJECTS;
34-
typedef VIS_OBJECTS::iterator VIS_OBJECTS_IT;
35-
VIS_OBJECTS m_active_objects;
32+
xr_vector<std::unique_ptr<SBinocVisibleObj>> m_active_objects;
3633

3734
public:
3835
CBinocularsVision(CWeaponMagazined* parent);

0 commit comments

Comments
 (0)