4949#include " statistics.h"
5050#include < wwprofile.h>
5151#include < algorithm>
52+ #include < list>
5253
5354
5455bool 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;
171173static unsigned total_sorting_vertices;
172174
173175static 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+
338341void 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
636640void 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}
0 commit comments