1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-06-27 23:14:05 +00:00
GLideN64/src/CombinerKey.cpp
Sergey Lipskiy 955c2f3b17 Add isHWLSupported bit to CombinerKey.
A game may use several microcodes, where some microcodes support HW lighting and others are not.
The same combiner can be used for both cases. isHWLSupported bit helps to resolve that problem.
2020-12-28 16:18:18 +07:00

85 lines
1.7 KiB
C++

#include "Combiner.h"
#include "CombinerKey.h"
/*---------------CombinerKey-------------*/
CombinerKey::CombinerKey(u64 _mux, bool _setModeBits)
{
m_key.mux = _mux;
if (!_setModeBits)
return;
// High byte of muxs0 is zero. We can use it for addtional combiner flags:
// [0 - 0] polygon type: 0 - triangle, 1 - rect
// [1 - 2] cycle type
// [3 - 3] bi_lerp1
// [4 - 4] bi_lerp0
// [5 - 5] is HWL supported
u32 flags = CombinerInfo::get().isRectMode() ? 1U : 0U;
const u32 cycleType = gDP.otherMode.cycleType;
const u32 bilerp = (gDP.otherMode.h >> 10) & 3;
const u32 isHWLSupported = static_cast<u32>(GBI.isHWLSupported());
flags |= (cycleType << 1);
flags |= (bilerp << 3);
flags |= (isHWLSupported << 5);
m_key.muxs0 |= (flags << 24);
}
CombinerKey::CombinerKey(const CombinerKey & _other)
{
m_key.mux = _other.m_key.mux;
}
void CombinerKey::operator=(u64 _mux)
{
m_key.mux = _mux;
}
void CombinerKey::operator=(const CombinerKey & _other)
{
m_key.mux = _other.m_key.mux;
}
bool CombinerKey::operator==(const CombinerKey & _other) const
{
return m_key.mux == _other.m_key.mux;
}
bool CombinerKey::operator<(const CombinerKey & _other) const
{
return m_key.mux < _other.m_key.mux;
}
u32 CombinerKey::getCycleType() const
{
return (m_key.muxs0 >> 25) & 3;
}
u32 CombinerKey::getBilerp() const
{
return (m_key.muxs0 >> 27) & 3;
}
bool CombinerKey::isRectKey() const
{
return ((m_key.muxs0 >> 24) & 1) != 0;
}
bool CombinerKey::isHWLSupported() const
{
return ((m_key.muxs0 >> 29) & 1) != 0;
}
void CombinerKey::read(std::istream & _is)
{
_is.read(reinterpret_cast<char*>(&m_key.mux), sizeof(m_key.mux));
}
const CombinerKey & CombinerKey::getEmpty()
{
static CombinerKey emptyKey;
return emptyKey;
}