tge/engine/interior/lightUpdateGrouper.cc
2025-02-17 23:17:30 -06:00

76 lines
1.9 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "interior/lightUpdateGrouper.h"
LightUpdateGrouper::LightUpdateGrouper(const U32 bitStart, const U32 bitEnd)
{
AssertFatal(bitEnd >= bitStart, "Error, bitend must be greater than bit start");
AssertFatal(bitEnd < 32, "Error, bitend too large. must be in the range 0..31");
mBitStart = bitStart;
mBitEnd = bitEnd;
}
LightUpdateGrouper::~LightUpdateGrouper()
{
mBitStart = 0xFFFFFFFF;
mBitEnd = 0xFFFFFFFF;
}
void LightUpdateGrouper::addKey(const U32 key)
{
#ifdef TORQUE_DEBUG
for (U32 i = 0; i < mKeys.size(); i++)
AssertFatal(mKeys[i] != key, "Error, key already in the array!");
#endif
mKeys.push_back(key);
}
U32 LightUpdateGrouper::getKeyMask(const U32 key) const
{
U32 numBits = mBitEnd - mBitStart + 1;
for (U32 i = 0; i < mKeys.size(); i++) {
if (mKeys[i] == key) {
U32 idx = i % numBits;
return (1 << (idx + mBitStart));
}
}
AssertFatal(false, "Error, key not in the array!");
return 0;
}
LightUpdateGrouper::BitIterator LightUpdateGrouper::begin()
{
BitIterator itr;
itr.mGrouper = this;
itr.mCurrBit = mBitStart;
itr.resetKeyArray();
return itr;
}
void LightUpdateGrouper::BitIterator::resetKeyArray()
{
mKeyArray.clear();
if (valid() == false)
return;
// Ok, we need to select out every (mBitEnd - mBitStart - 1)th key,
// starting at mCurrBit.
U32 numBits = mGrouper->mBitEnd - mGrouper->mBitStart + 1;
U32 numKeys = mGrouper->mKeys.size();
for (U32 i = mCurrBit - mGrouper->mBitStart; i < numKeys; i += numBits) {
mKeyArray.push_back(mGrouper->mKeys[i]);
}
}