Counter Strike : Global Offensive Source Code
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//========= Copyright � 1996-2005, 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
|