summaryrefslogtreecommitdiff
path: root/engine/MaterialBuckets.h
diff options
context:
space:
mode:
Diffstat (limited to 'engine/MaterialBuckets.h')
-rw-r--r--engine/MaterialBuckets.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/engine/MaterialBuckets.h b/engine/MaterialBuckets.h
new file mode 100644
index 0000000..70b0153
--- /dev/null
+++ b/engine/MaterialBuckets.h
@@ -0,0 +1,153 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: This is a helper class for the situation where you want to build lists of
+// things that fall into buckets, and effeciently keep up with which buckets have
+// been used since flush.
+//
+//=============================================================================//
+
+#ifndef MATERIALBUCKETS_H
+#define MATERIALBUCKETS_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+// FLASHLIGHTFIXME: Make all of the buckets share the same m_Elements (ie. make m_Elements static)
+
+template <class Element_t>
+class CMaterialsBuckets
+{
+public:
+ typedef unsigned short SortIDHandle_t;
+ typedef unsigned short ElementHandle_t;
+ CMaterialsBuckets()
+ {
+ m_FlushCount = -1;
+ }
+
+ // Set the number of buckets that are needed. This should get called every time
+ // a level is loaded.
+ void SetNumMaterialSortIDs( int n )
+ {
+ m_MaterialSortInfoArray.Purge();
+ m_MaterialSortInfoArray.SetCount( n );
+ m_Elements.Purge();
+
+ m_UsedSortIDs.Purge();
+ }
+
+ // Clear out all buckets. This should get called once a frame.
+ void Flush( void )
+ {
+ m_FlushCount++;
+ m_Elements.RemoveAll();
+ m_UsedSortIDs.RemoveAll();
+ }
+
+ //
+ // These functions are used to get at the list of used buckets.
+ //
+ SortIDHandle_t GetFirstUsedSortID()
+ {
+ return m_UsedSortIDs.Head();
+ }
+
+ SortIDHandle_t GetNextUsedSortID( SortIDHandle_t prevSortID )
+ {
+ return m_UsedSortIDs.Next( prevSortID );
+ }
+
+ int GetSortID( SortIDHandle_t handle )
+ {
+ return m_UsedSortIDs[handle];
+ }
+
+ SortIDHandle_t InvalidSortIDHandle()
+ {
+ return m_UsedSortIDs.InvalidIndex();
+ }
+
+
+ //
+ // These functions are used to get at the list of elements for each sortID.
+ //
+ ElementHandle_t GetElementListHead( int sortID )
+ {
+ return m_MaterialSortInfoArray[sortID].m_Head;
+ }
+
+ ElementHandle_t GetElementListNext( ElementHandle_t h )
+ {
+ return m_Elements.Next( h );
+ }
+
+ Element_t GetElement( ElementHandle_t h )
+ {
+ return m_Elements[h];
+ }
+
+ ElementHandle_t InvalidElementHandle()
+ {
+ return m_Elements.InvalidIndex();
+ }
+
+
+ // Add an element to the the bucket specified by sortID
+ void AddElement( int sortID, Element_t elem )
+ {
+ // Allocate an element to stick this in.
+ unsigned short elemID = m_Elements.Alloc( true );
+ m_Elements[elemID] = elem;
+
+ if( m_MaterialSortInfoArray[sortID].m_FlushCount != m_FlushCount )
+ {
+ // This is the first element that has used this sort id since flush.
+ // FLASHLIGHTFIXME: need to sort these by vertex format when shoving
+ // them into this list!
+
+ // Mark this sortID as having been used since the last flush.
+ m_MaterialSortInfoArray[sortID].m_FlushCount = m_FlushCount;
+
+ // Add this sortID to the list of sortIDs used since flush.
+ m_UsedSortIDs.AddToTail( sortID );
+
+ // Set the head pointer for this sort id to this element.
+ m_MaterialSortInfoArray[sortID].m_Head = elemID;
+ }
+ else
+ {
+ // We already have an element in this sort id since flush, so chain
+ // into thelist of elements for this sort id.
+ m_Elements.LinkBefore( m_MaterialSortInfoArray[sortID].m_Head, elemID );
+ m_MaterialSortInfoArray[sortID].m_Head = elemID;
+ }
+ }
+
+private:
+
+ struct MaterialSortInfo_t
+ {
+ MaterialSortInfo_t() :
+ m_FlushCount( -1 ),
+ m_Head( (unsigned short)-1 ) // i.e., InvalidIndex()
+ {
+ }
+
+ int m_FlushCount;
+ unsigned short m_Head;
+ };
+
+ // This is a list of material sort info ids that have been used since flush.
+ CUtlLinkedList<unsigned short> m_UsedSortIDs;
+
+ // This is m_NumMaterialSortIDs big.
+ CUtlVector<MaterialSortInfo_t> m_MaterialSortInfoArray;
+
+ // This is used in multilist mode to make elements that belong in the multiple lists of
+ CUtlLinkedList<Element_t, unsigned short, true> m_Elements;
+
+ int m_FlushCount;
+
+};
+
+#endif // MATERIALBUCKETS_H