Skip to content

Commit 984db42

Browse files
refactor(sortingrenderer): Replace custom doubly linked list with std::list in SortingNodeStruct (#2810)
1 parent a585917 commit 984db42

2 files changed

Lines changed: 44 additions & 54 deletions

File tree

Core/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp

Lines changed: 43 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#include "statistics.h"
5050
#include <wwprofile.h>
5151
#include <algorithm>
52+
#include <list>
5253

5354

5455
bool SortingRendererClass::_EnableTriangleDraw=true;
@@ -150,7 +151,7 @@ void Sort(TempIndexStruct *begin, TempIndexStruct *end)
150151

151152
// ----------------------------------------------------------------------------
152153

153-
class SortingNodeStruct : public DLNodeClass<SortingNodeStruct>
154+
class SortingNodeStruct
154155
{
155156
W3DMPO_CODE(SortingNodeStruct)
156157

@@ -166,20 +167,19 @@ class SortingNodeStruct : public DLNodeClass<SortingNodeStruct>
166167
unsigned short vertex_count; // Number of vertices used in vb
167168
};
168169

169-
static DLListClass<SortingNodeStruct> sorted_list;
170-
static DLListClass<SortingNodeStruct> clean_list;
170+
typedef std::list<SortingNodeStruct*> SortingNodeStructList;
171+
static SortingNodeStructList sorted_list;
172+
static SortingNodeStructList clean_list;
171173
static unsigned total_sorting_vertices;
172174

173175
static SortingNodeStruct* Get_Sorting_Struct()
174176
{
175-
176-
SortingNodeStruct* state=clean_list.Head();
177-
if (state) {
178-
state->Remove();
177+
if (!clean_list.empty()) {
178+
SortingNodeStruct* state = clean_list.front();
179+
clean_list.pop_front();
179180
return state;
180181
}
181-
state=W3DNEW SortingNodeStruct();
182-
return state;
182+
return W3DNEW SortingNodeStruct();
183183
}
184184

185185
// ----------------------------------------------------------------------------
@@ -242,10 +242,6 @@ void SortingRendererClass::Insert_Triangles(
242242
state->min_vertex_index=min_vertex_index;
243243
state->vertex_count=vertex_count;
244244

245-
SortingVertexBufferClass* vertex_buffer=static_cast<SortingVertexBufferClass*>(state->sorting_state.vertex_buffers[0]);
246-
WWASSERT(vertex_buffer);
247-
WWASSERT(state->vertex_count<=vertex_buffer->Get_Vertex_Count());
248-
249245
D3DXMATRIX mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view;
250246
D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center;
251247
D3DXVECTOR4 transformed_vec;
@@ -255,23 +251,13 @@ void SortingRendererClass::Insert_Triangles(
255251
&mtx);
256252
state->transformed_center=Vector3(transformed_vec[0],transformed_vec[1],transformed_vec[2]);
257253

258-
259-
/// @todo lorenzen sez use a bucket sort here... and stop copying so much data so many times
260-
261-
SortingNodeStruct* node=sorted_list.Head();
262-
while (node) {
263-
if (state->transformed_center.Z>node->transformed_center.Z) {
264-
if (sorted_list.Head()==sorted_list.Tail())
265-
sorted_list.Add_Head(state);
266-
else
267-
state->Insert_Before(node);
268-
break;
269-
}
270-
node=node->Succ();
271-
}
272-
if (!node) sorted_list.Add_Tail(state);
254+
Insert_To_Sorted_List(state);
273255

274256
#ifdef WWDEBUG
257+
SortingVertexBufferClass* vertex_buffer=static_cast<SortingVertexBufferClass*>(state->sorting_state.vertex_buffers[0]);
258+
WWASSERT(vertex_buffer);
259+
WWASSERT(state->vertex_count<=vertex_buffer->Get_Vertex_Count());
260+
275261
unsigned short* indices=nullptr;
276262
SortingIndexBufferClass* index_buffer=static_cast<SortingIndexBufferClass*>(state->sorting_state.index_buffer);
277263
WWASSERT(index_buffer);
@@ -335,6 +321,23 @@ static SortingNodeStruct* overlapping_nodes[MAX_OVERLAPPING_NODES];
335321

336322
// ----------------------------------------------------------------------------
337323

324+
void SortingRendererClass::Insert_To_Sorted_List(SortingNodeStruct *state)
325+
{
326+
/// @todo lorenzen sez use a bucket sort here... and stop copying so much data so many times
327+
328+
for (SortingNodeStructList::iterator node = sorted_list.begin(); node != sorted_list.end(); ++node)
329+
{
330+
if (state->transformed_center.Z > (*node)->transformed_center.Z) {
331+
sorted_list.insert(node, state);
332+
return;
333+
}
334+
}
335+
336+
sorted_list.push_back(state);
337+
}
338+
339+
// ----------------------------------------------------------------------------
340+
338341
void SortingRendererClass::Insert_To_Sorting_Pool(SortingNodeStruct* state)
339342
{
340343
if (overlapping_node_count>=MAX_OVERLAPPING_NODES) {
@@ -577,7 +580,7 @@ void SortingRendererClass::Flush_Sorting_Pool()
577580
for (unsigned node_id=0;node_id<overlapping_node_count;++node_id) {
578581
SortingNodeStruct* state=overlapping_nodes[node_id];
579582
Release_Refs(state);
580-
clean_list.Add_Head(state);
583+
clean_list.push_front(state);
581584
}
582585
overlapping_node_count=0;
583586
overlapping_polygon_count=0;
@@ -597,8 +600,9 @@ void SortingRendererClass::Flush()
597600
DX8Wrapper::Get_Transform(D3DTS_VIEW,old_view);
598601
DX8Wrapper::Get_Transform(D3DTS_WORLD,old_world);
599602

600-
while (SortingNodeStruct* state=sorted_list.Head()) {
601-
state->Remove();
603+
while (!sorted_list.empty()) {
604+
SortingNodeStruct* state = sorted_list.front();
605+
sorted_list.pop_front();
602606

603607
if ((state->sorting_state.index_buffer_type==BUFFER_TYPE_SORTING || state->sorting_state.index_buffer_type==BUFFER_TYPE_DYNAMIC_SORTING) &&
604608
(state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_SORTING || state->sorting_state.vertex_buffer_types[0]==BUFFER_TYPE_DYNAMIC_SORTING)) {
@@ -609,7 +613,7 @@ void SortingRendererClass::Flush()
609613
DX8Wrapper::Draw_Triangles(state->start_index,state->polygon_count,state->min_vertex_index,state->vertex_count);
610614
DX8Wrapper::Release_Render_State();
611615
Release_Refs(state);
612-
clean_list.Add_Head(state);
616+
clean_list.push_front(state);
613617
}
614618
}
615619

@@ -635,22 +639,20 @@ void SortingRendererClass::Flush()
635639

636640
void SortingRendererClass::Deinit()
637641
{
638-
SortingNodeStruct *head = nullptr;
639-
640642
//
641643
// Flush the sorted list
642644
//
643-
while ((head = sorted_list.Head ()) != nullptr) {
644-
sorted_list.Remove_Head ();
645-
delete head;
645+
while (!sorted_list.empty()) {
646+
delete sorted_list.front();
647+
sorted_list.pop_front();
646648
}
647649

648650
//
649651
// Flush the clean list
650652
//
651-
while ((head = clean_list.Head ()) != nullptr) {
652-
clean_list.Remove_Head ();
653-
delete head;
653+
while (!clean_list.empty()) {
654+
delete clean_list.front();
655+
clean_list.pop_front();
654656
}
655657

656658
delete[] temp_index_array;
@@ -715,18 +717,5 @@ void SortingRendererClass::Insert_VolumeParticle(
715717

716718
//THE TRANSFORMED CENTER[2] IS THE ZBUFFER DEPTH
717719

718-
/// @todo lorenzen sez use a bucket sort here... and stop copying so much data so many times
719-
720-
SortingNodeStruct* node=sorted_list.Head();
721-
while (node) {
722-
if (state->transformed_center.Z>node->transformed_center.Z) {
723-
if (sorted_list.Head()==sorted_list.Tail())
724-
sorted_list.Add_Head(state);
725-
else
726-
state->Insert_Before(node);
727-
break;
728-
}
729-
node=node->Succ();
730-
}
731-
if (!node) sorted_list.Add_Tail(state);
720+
Insert_To_Sorted_List(state);
732721
}

Core/Libraries/Source/WWVegas/WW3D2/sortingrenderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class SortingRendererClass
2828
static bool _EnableTriangleDraw;
2929

3030
static void Flush_Sorting_Pool();
31+
static void Insert_To_Sorted_List(SortingNodeStruct* state);
3132
static void Insert_To_Sorting_Pool(SortingNodeStruct* state);
3233

3334
public:

0 commit comments

Comments
 (0)