60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================
|
|
|
|
#ifndef BONETOWORLDARRAY_H
|
|
#define BONETOWORLDARRAY_H
|
|
|
|
#include "tier0/tslist.h"
|
|
|
|
#if defined(_WIN32)
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tier0/memdbgon.h" // for _aligned_malloc usage below
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
template <int NUM_ARRAYS>
|
|
class CBoneToWorldArrays {
|
|
public:
|
|
enum {
|
|
ALIGNMENT = 128,
|
|
};
|
|
|
|
CBoneToWorldArrays() {
|
|
const int SIZE_ARRAY =
|
|
AlignValue(sizeof(matrix3x4_t) * MAXSTUDIOBONES, ALIGNMENT);
|
|
m_pBase =
|
|
(matrix3x4_t *)_aligned_malloc(SIZE_ARRAY * NUM_ARRAYS, ALIGNMENT);
|
|
for (int i = 0; i < NUM_ARRAYS; i++) {
|
|
matrix3x4_t *pArray =
|
|
(matrix3x4_t *)((byte *)m_pBase + SIZE_ARRAY * i);
|
|
Assert((size_t)pArray % ALIGNMENT == 0);
|
|
Free(pArray);
|
|
}
|
|
}
|
|
|
|
~CBoneToWorldArrays() { _aligned_free(m_pBase); }
|
|
|
|
int NumArrays() { return NUM_ARRAYS; }
|
|
|
|
matrix3x4_t *Alloc(bool bBlock = true) {
|
|
TSLNodeBase_t *p;
|
|
while ((p = m_Free.Pop()) == NULL && bBlock) {
|
|
ThreadPause();
|
|
}
|
|
return (matrix3x4_t *)p;
|
|
}
|
|
|
|
void Free(matrix3x4_t *p) { m_Free.Push((TSLNodeBase_t *)p); }
|
|
|
|
private:
|
|
CTSListBase m_Free;
|
|
matrix3x4_t *m_pBase;
|
|
};
|
|
|
|
#endif // BONETOWORLDARRAY_H
|