Implement/match LegoLoopingAnimPresenter (#924)

This commit is contained in:
Christian Semmler
2024-05-15 14:34:36 -04:00
committed by GitHub
parent 29a0e32739
commit 9a05edd0a7
16 changed files with 111 additions and 39 deletions

View File

@@ -192,8 +192,9 @@ void MxWavePresenter::StreamingTickle()
if (!(m_action->GetFlags() & MxDSAction::c_looping)) {
MxStreamChunk* chunk = CurrentChunk();
if (chunk && chunk->GetFlags() & MxDSChunk::c_end && !(chunk->GetFlags() & MxDSChunk::c_bit16)) {
chunk->SetFlags(chunk->GetFlags() | MxDSChunk::c_bit16);
if (chunk && chunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM &&
!(chunk->GetChunkFlags() & DS_CHUNK_BIT16)) {
chunk->SetChunkFlags(chunk->GetChunkFlags() | DS_CHUNK_BIT16);
m_currentChunk = new MxStreamChunk;
MxU8* data = new MxU8[m_chunkLength];
@@ -203,7 +204,7 @@ void MxWavePresenter::StreamingTickle()
m_currentChunk->SetLength(m_chunkLength);
m_currentChunk->SetData(data);
m_currentChunk->SetTime(chunk->GetTime() + 1000);
m_currentChunk->SetFlags(MxDSChunk::c_bit1);
m_currentChunk->SetChunkFlags(DS_CHUNK_BIT1);
}
}

View File

@@ -67,7 +67,7 @@ MxStreamChunk* MxMediaPresenter::CurrentChunk()
if (m_subscriber) {
chunk = m_subscriber->PeekData();
if (chunk && chunk->GetFlags() & MxDSChunk::c_bit3) {
if (chunk && chunk->GetChunkFlags() & DS_CHUNK_BIT3) {
m_action->SetFlags(m_action->GetFlags() | MxDSAction::c_bit7);
m_subscriber->PopData();
m_subscriber->FreeDataChunk(chunk);
@@ -87,7 +87,7 @@ MxStreamChunk* MxMediaPresenter::NextChunk()
if (m_subscriber) {
chunk = m_subscriber->PopData();
if (chunk && chunk->GetFlags() & MxDSChunk::c_bit3) {
if (chunk && chunk->GetChunkFlags() & DS_CHUNK_BIT3) {
m_action->SetFlags(m_action->GetFlags() | MxDSAction::c_bit7);
m_subscriber->FreeDataChunk(chunk);
chunk = NULL;
@@ -180,7 +180,7 @@ void MxMediaPresenter::StreamingTickle()
m_currentChunk = NextChunk();
if (m_currentChunk) {
if (m_currentChunk->GetFlags() & MxDSChunk::c_end) {
if (m_currentChunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
m_subscriber->FreeDataChunk(m_currentChunk);
m_currentChunk = NULL;
ProgressTickleState(e_repeating);

View File

@@ -242,7 +242,7 @@ MxResult MxDSBuffer::ParseChunk(
p_header->SetTime(p_header->GetTime() + m_unk0x30->GetUnknowna8());
if (p_header->GetFlags() & MxDSChunk::c_split) {
if (p_header->GetChunkFlags() & DS_CHUNK_SPLIT) {
MxU32 length = p_header->GetLength() + MxDSChunk::GetHeaderSize() + 8;
MxDSBuffer* buffer = new MxDSBuffer();
@@ -252,7 +252,7 @@ MxResult MxDSBuffer::ParseChunk(
if (*p_streamingAction) {
MxU16* flags = MxStreamChunk::IntoFlags(buffer->GetBuffer());
*flags = p_header->GetFlags() & ~MxDSChunk::c_split;
*flags = p_header->GetChunkFlags() & ~DS_CHUNK_SPLIT;
delete p_header;
(*p_streamingAction)->SetUnknowna0(buffer);
@@ -268,7 +268,7 @@ MxResult MxDSBuffer::ParseChunk(
return FAILURE;
}
else {
if (p_header->GetFlags() & MxDSChunk::c_end) {
if (p_header->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
if (m_unk0x30->HasId(p_header->GetObjectId())) {
if (m_unk0x30->GetFlags() & MxDSAction::c_bit3 &&
(m_unk0x30->GetLoopCount() > 1 || m_unk0x30->GetDuration() == -1)) {

View File

@@ -15,7 +15,7 @@ MxDSChunk::MxDSChunk()
// FUNCTION: LEGO1 0x100be170
MxDSChunk::~MxDSChunk()
{
if (m_flags & c_bit1) {
if (m_flags & DS_CHUNK_BIT1) {
delete[] m_data;
}
}

View File

@@ -130,7 +130,7 @@ void MxDSSubscriber::FreeDataChunk(MxStreamChunk* p_chunk)
delete p_chunk;
}
}
else if (p_chunk->GetFlags() & MxDSChunk::c_bit1 && p_chunk) {
else if (p_chunk->GetChunkFlags() & DS_CHUNK_BIT1 && p_chunk) {
delete p_chunk;
}
}

View File

@@ -126,15 +126,15 @@ MxU32 ReadData(MxU8* p_buffer, MxU32 p_size)
data += MxDSChunk::Size(*psize);
if ((*MxDSChunk::IntoType(data2) == FOURCC('M', 'x', 'C', 'h')) &&
(*MxStreamChunk::IntoFlags(data2) & MxDSChunk::c_split)) {
(*MxStreamChunk::IntoFlags(data2) & DS_CHUNK_SPLIT)) {
if (*MxStreamChunk::IntoObjectId(data2) == *MxStreamChunk::IntoObjectId(data3) &&
(*MxStreamChunk::IntoFlags(data3) & MxDSChunk::c_split) &&
(*MxStreamChunk::IntoFlags(data3) & DS_CHUNK_SPLIT) &&
*MxStreamChunk::IntoTime(data2) == *MxStreamChunk::IntoTime(data3)) {
MxDSBuffer::Append(data2, data3);
continue;
}
else {
*MxStreamChunk::IntoFlags(data2) &= ~MxDSChunk::c_split;
*MxStreamChunk::IntoFlags(data2) &= ~DS_CHUNK_SPLIT;
}
}
@@ -142,7 +142,7 @@ MxU32 ReadData(MxU8* p_buffer, MxU32 p_size)
memcpy(data2, data3, MxDSChunk::Size(*psize));
if (*MxStreamChunk::IntoObjectId(data2) == id &&
(*MxStreamChunk::IntoFlags(data2) & MxDSChunk::c_end)) {
(*MxStreamChunk::IntoFlags(data2) & DS_CHUNK_END_OF_STREAM)) {
break;
}
}
@@ -157,6 +157,6 @@ MxU32 ReadData(MxU8* p_buffer, MxU32 p_size)
} while (data < end);
}
*MxStreamChunk::IntoFlags(data2) &= ~MxDSChunk::c_split;
*MxStreamChunk::IntoFlags(data2) &= ~DS_CHUNK_SPLIT;
return MxDSChunk::End(data2) - p_buffer;
}

View File

@@ -61,7 +61,7 @@ MxResult MxStreamChunk::SendChunk(MxStreamListMxDSSubscriber& p_subscriberList,
{
for (MxStreamListMxDSSubscriber::iterator it = p_subscriberList.begin(); it != p_subscriberList.end(); it++) {
if ((*it)->GetObjectId() == m_objectId && (*it)->GetUnknown48() == p_obj24val) {
if (m_flags & MxDSChunk::c_end && m_buffer) {
if (m_flags & DS_CHUNK_END_OF_STREAM && m_buffer) {
m_buffer->ReleaseRef(this);
m_buffer = NULL;
}

View File

@@ -284,7 +284,7 @@ MxResult MxStreamController::FUN_100c1f00(MxDSAction* p_action)
return FAILURE;
}
chunk->SetFlags(MxDSChunk::c_bit3);
chunk->SetChunkFlags(DS_CHUNK_BIT3);
chunk->SetObjectId(objectId);
if (chunk->SendChunk(m_subscriberList, FALSE, p_action->GetUnknown24()) != SUCCESS) {

View File

@@ -43,7 +43,7 @@ void MxLoopingFlcPresenter::NextFrame()
{
MxStreamChunk* chunk = NextChunk();
if (chunk->GetFlags() & MxDSChunk::c_end) {
if (chunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
ProgressTickleState(e_repeating);
}
else {

View File

@@ -53,7 +53,7 @@ void MxLoopingSmkPresenter::NextFrame()
{
MxStreamChunk* chunk = NextChunk();
if (chunk->GetFlags() & MxDSChunk::c_end) {
if (chunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
ProgressTickleState(e_repeating);
}
else {

View File

@@ -180,7 +180,7 @@ void MxVideoPresenter::NextFrame()
{
MxStreamChunk* chunk = NextChunk();
if (chunk->GetFlags() & MxDSChunk::c_end) {
if (chunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
m_subscriber->FreeDataChunk(chunk);
ProgressTickleState(e_repeating);
}