mirror of
https://github.com/isledecomp/isle-portable.git
synced 2025-09-28 23:21:48 -04:00
Implement/match most of MxVideoPresenter (#280)
* Bootstrap MxMediaPresenter * Implement/match MxMediaPresenter::Tickle and related * Implement AppendChunk and Enable * Implement/match most of MxVideoPresenter * Add missing offset
This commit is contained in:
parent
c626f18b03
commit
d8bf4aebf4
@ -70,26 +70,20 @@ public:
|
|||||||
inline MxBool IsLooping() const { return m_flags & Flag_Looping; }
|
inline MxBool IsLooping() const { return m_flags & Flag_Looping; }
|
||||||
inline MxBool IsBit3() const { return m_flags & Flag_Bit3; }
|
inline MxBool IsBit3() const { return m_flags & Flag_Bit3; }
|
||||||
|
|
||||||
private:
|
|
||||||
MxU32 m_sizeOnDisk;
|
|
||||||
MxU32 m_flags;
|
|
||||||
MxLong m_startTime;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
MxLong m_duration;
|
|
||||||
MxS32 m_loopCount;
|
|
||||||
|
|
||||||
private:
|
|
||||||
MxVector3Data m_location;
|
|
||||||
MxVector3Data m_direction;
|
|
||||||
MxVector3Data m_up;
|
|
||||||
char* m_extraData;
|
|
||||||
MxU16 m_extraLength;
|
|
||||||
MxCore* m_unk84;
|
|
||||||
undefined4 m_unk88;
|
|
||||||
MxCore* m_unk8c;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
MxU32 m_sizeOnDisk; // 0x2c
|
||||||
|
MxU32 m_flags; // 0x30
|
||||||
|
MxLong m_startTime; // 0x34
|
||||||
|
MxLong m_duration; // 0x38
|
||||||
|
MxS32 m_loopCount; // 0x3c
|
||||||
|
MxVector3Data m_location; // 0x40
|
||||||
|
MxVector3Data m_direction; // 0x54
|
||||||
|
MxVector3Data m_up; // 0x68
|
||||||
|
char* m_extraData; // 0x7c
|
||||||
|
MxU16 m_extraLength; // 0x80
|
||||||
|
MxCore* m_unk84; // 0x84
|
||||||
|
undefined4 m_unk88; // 0x88
|
||||||
|
MxCore* m_unk8c; // 0x8c
|
||||||
MxLong m_unkTimingField; // 0x90
|
MxLong m_unkTimingField; // 0x90
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,17 +37,17 @@ public:
|
|||||||
inline MxLong GetSustainTime() const { return this->m_sustainTime; }
|
inline MxLong GetSustainTime() const { return this->m_sustainTime; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MxU32 m_sizeOnDisk;
|
MxU32 m_sizeOnDisk; // 0x94
|
||||||
char* m_mediaSrcPath;
|
char* m_mediaSrcPath; // 0x98
|
||||||
struct {
|
struct {
|
||||||
undefined4 m_unk00;
|
undefined4 m_unk00;
|
||||||
undefined4 m_unk04;
|
undefined4 m_unk04;
|
||||||
} m_unk9c;
|
} m_unk9c; // 0x9c
|
||||||
MxS32 m_framesPerSecond;
|
MxS32 m_framesPerSecond; // 0xa4
|
||||||
MxS32 m_mediaFormat;
|
MxS32 m_mediaFormat; // 0xa8
|
||||||
MxS32 m_paletteManagement;
|
MxS32 m_paletteManagement; // 0xac
|
||||||
MxLong m_sustainTime;
|
MxLong m_sustainTime; // 0xb0
|
||||||
undefined4 m_unkb4;
|
undefined4 m_unkb4; // 0xb4
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXDSMEDIAACTION_H
|
#endif // MXDSMEDIAACTION_H
|
||||||
|
@ -129,7 +129,7 @@ void MxMediaPresenter::StreamingTickle()
|
|||||||
else if (m_action->GetFlags() & MxDSAction::Flag_Looping) {
|
else if (m_action->GetFlags() & MxDSAction::Flag_Looping) {
|
||||||
AppendChunk(m_currentChunk);
|
AppendChunk(m_currentChunk);
|
||||||
|
|
||||||
if (!MxPresenter::IsEnabled()) {
|
if (!IsEnabled()) {
|
||||||
m_subscriber->FUN_100b8390(m_currentChunk);
|
m_subscriber->FUN_100b8390(m_currentChunk);
|
||||||
m_currentChunk = NULL;
|
m_currentChunk = NULL;
|
||||||
}
|
}
|
||||||
@ -141,7 +141,7 @@ void MxMediaPresenter::StreamingTickle()
|
|||||||
// OFFSET: LEGO1 0x100b5e10
|
// OFFSET: LEGO1 0x100b5e10
|
||||||
void MxMediaPresenter::RepeatingTickle()
|
void MxMediaPresenter::RepeatingTickle()
|
||||||
{
|
{
|
||||||
if (MxPresenter::IsEnabled() && !m_currentChunk) {
|
if (IsEnabled() && !m_currentChunk) {
|
||||||
if (m_cursor)
|
if (m_cursor)
|
||||||
if (!m_cursor->Next(m_currentChunk))
|
if (!m_cursor->Next(m_currentChunk))
|
||||||
m_cursor->Next(m_currentChunk);
|
m_cursor->Next(m_currentChunk);
|
||||||
@ -173,7 +173,7 @@ void MxMediaPresenter::DoneTickle()
|
|||||||
// OFFSET: LEGO1 0x100b6030
|
// OFFSET: LEGO1 0x100b6030
|
||||||
void MxMediaPresenter::Enable(MxBool p_enable)
|
void MxMediaPresenter::Enable(MxBool p_enable)
|
||||||
{
|
{
|
||||||
if (MxPresenter::IsEnabled() != p_enable) {
|
if (IsEnabled() != p_enable) {
|
||||||
MxPresenter::Enable(p_enable);
|
MxPresenter::Enable(p_enable);
|
||||||
|
|
||||||
if (p_enable) {
|
if (p_enable) {
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
#include "mxvideopresenter.h"
|
#include "mxvideopresenter.h"
|
||||||
|
|
||||||
|
#include "mxautolocker.h"
|
||||||
|
#include "mxdsmediaaction.h"
|
||||||
#include "mxvideomanager.h"
|
#include "mxvideomanager.h"
|
||||||
|
|
||||||
DECOMP_SIZE_ASSERT(MxVideoPresenter, 0x64);
|
DECOMP_SIZE_ASSERT(MxVideoPresenter, 0x64);
|
||||||
DECOMP_SIZE_ASSERT(MxVideoPresenter::AlphaMask, 0xc);
|
DECOMP_SIZE_ASSERT(MxVideoPresenter::AlphaMask, 0xc);
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x1000c700
|
// OFFSET: LEGO1 0x1000c700
|
||||||
void MxVideoPresenter::VTable0x5c(undefined4 p_unknown1)
|
void MxVideoPresenter::VTable0x5c(MxStreamChunk* p_chunk)
|
||||||
{
|
{
|
||||||
// Empty
|
// Empty
|
||||||
}
|
}
|
||||||
@ -18,7 +20,7 @@ void MxVideoPresenter::VTable0x60()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x1000c720
|
// OFFSET: LEGO1 0x1000c720
|
||||||
void MxVideoPresenter::VTable0x68(undefined4 p_unknown1)
|
void MxVideoPresenter::VTable0x68(MxStreamChunk* p_chunk)
|
||||||
{
|
{
|
||||||
// Empty
|
// Empty
|
||||||
}
|
}
|
||||||
@ -232,10 +234,20 @@ void MxVideoPresenter::Destroy(MxBool p_fromDestructor)
|
|||||||
MxMediaPresenter::Destroy(FALSE);
|
MxMediaPresenter::Destroy(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100b28b0 STUB
|
// OFFSET: LEGO1 0x100b28b0
|
||||||
void MxVideoPresenter::VTable0x64()
|
void MxVideoPresenter::VTable0x64()
|
||||||
{
|
{
|
||||||
// TODO
|
MxStreamChunk* chunk = NextChunk();
|
||||||
|
|
||||||
|
if (chunk->GetFlags() & MxStreamChunk::Flag_Bit2) {
|
||||||
|
m_subscriber->FUN_100b8390(chunk);
|
||||||
|
m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
|
||||||
|
m_currentTickleState = TickleState_Repeating;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
VTable0x68(chunk);
|
||||||
|
m_subscriber->FUN_100b8390(chunk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100b2900
|
// OFFSET: LEGO1 0x100b2900
|
||||||
@ -306,6 +318,175 @@ void MxVideoPresenter::VTable0x6c()
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b2f60
|
||||||
|
void MxVideoPresenter::ReadyTickle()
|
||||||
|
{
|
||||||
|
MxStreamChunk* chunk = NextChunk();
|
||||||
|
|
||||||
|
if (chunk) {
|
||||||
|
VTable0x5c(chunk);
|
||||||
|
m_subscriber->FUN_100b8390(chunk);
|
||||||
|
ParseExtra();
|
||||||
|
m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
|
||||||
|
m_currentTickleState = TickleState_Starting;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b2fa0
|
||||||
|
void MxVideoPresenter::StartingTickle()
|
||||||
|
{
|
||||||
|
MxStreamChunk* chunk = FUN_100b5650();
|
||||||
|
|
||||||
|
if (chunk && m_action->GetElapsedTime() >= chunk->GetTime()) {
|
||||||
|
VTable0x60();
|
||||||
|
m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
|
||||||
|
m_currentTickleState = TickleState_Streaming;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b2fe0
|
||||||
|
void MxVideoPresenter::StreamingTickle()
|
||||||
|
{
|
||||||
|
if (m_action->GetFlags() & MxDSAction::Flag_Bit9) {
|
||||||
|
if (!m_currentChunk)
|
||||||
|
MxMediaPresenter::StreamingTickle();
|
||||||
|
|
||||||
|
if (m_currentChunk) {
|
||||||
|
VTable0x68(m_currentChunk);
|
||||||
|
m_currentChunk = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (MxS16 i = 0; i < m_unk5c; i++) {
|
||||||
|
if (!m_currentChunk) {
|
||||||
|
MxMediaPresenter::StreamingTickle();
|
||||||
|
|
||||||
|
if (!m_currentChunk)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_action->GetElapsedTime() < m_currentChunk->GetTime())
|
||||||
|
break;
|
||||||
|
|
||||||
|
VTable0x68(m_currentChunk);
|
||||||
|
m_subscriber->FUN_100b8390(m_currentChunk);
|
||||||
|
m_currentChunk = NULL;
|
||||||
|
m_flags |= Flag_Bit1;
|
||||||
|
|
||||||
|
if (m_currentTickleState != TickleState_Streaming)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_flags & Flag_Bit1)
|
||||||
|
m_unk5c = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b3080
|
||||||
|
void MxVideoPresenter::RepeatingTickle()
|
||||||
|
{
|
||||||
|
if (IsEnabled()) {
|
||||||
|
if (m_action->GetFlags() & MxDSAction::Flag_Bit9) {
|
||||||
|
if (!m_currentChunk)
|
||||||
|
MxMediaPresenter::RepeatingTickle();
|
||||||
|
|
||||||
|
if (m_currentChunk) {
|
||||||
|
VTable0x68(m_currentChunk);
|
||||||
|
m_currentChunk = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (MxS16 i = 0; i < m_unk5c; i++) {
|
||||||
|
if (!m_currentChunk) {
|
||||||
|
MxMediaPresenter::RepeatingTickle();
|
||||||
|
|
||||||
|
if (!m_currentChunk)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_action->GetElapsedTime() % m_action->GetLoopCount() < m_currentChunk->GetTime())
|
||||||
|
break;
|
||||||
|
|
||||||
|
VTable0x68(m_currentChunk);
|
||||||
|
m_currentChunk = NULL;
|
||||||
|
m_flags |= Flag_Bit1;
|
||||||
|
|
||||||
|
if (m_currentTickleState != TickleState_Repeating)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_flags & Flag_Bit1)
|
||||||
|
m_unk5c = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b3130
|
||||||
|
void MxVideoPresenter::Unk5Tickle()
|
||||||
|
{
|
||||||
|
MxLong sustainTime = ((MxDSMediaAction*) m_action)->GetSustainTime();
|
||||||
|
|
||||||
|
if (sustainTime != -1) {
|
||||||
|
if (sustainTime) {
|
||||||
|
if (m_unk60 == -1)
|
||||||
|
m_unk60 = m_action->GetElapsedTime();
|
||||||
|
|
||||||
|
if (m_action->GetElapsedTime() >= m_unk60 + ((MxDSMediaAction*) m_action)->GetSustainTime()) {
|
||||||
|
m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
|
||||||
|
m_currentTickleState = TickleState_Done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
|
||||||
|
m_currentTickleState = TickleState_Done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b31a0
|
||||||
|
MxResult MxVideoPresenter::AddToManager()
|
||||||
|
{
|
||||||
|
MxResult result = FAILURE;
|
||||||
|
|
||||||
|
if (MVideoManager()) {
|
||||||
|
result = SUCCESS;
|
||||||
|
MVideoManager()->AddPresenter(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b31d0
|
||||||
|
void MxVideoPresenter::EndAction()
|
||||||
|
{
|
||||||
|
if (m_action) {
|
||||||
|
MxMediaPresenter::EndAction();
|
||||||
|
MxAutoLocker lock(&m_criticalSection);
|
||||||
|
|
||||||
|
if (m_bitmap) {
|
||||||
|
MxLong height = m_bitmap->GetBmiHeightAbs();
|
||||||
|
MxLong width = m_bitmap->GetBmiWidth();
|
||||||
|
MxS32 x = m_location.m_x;
|
||||||
|
MxS32 y = m_location.m_y;
|
||||||
|
|
||||||
|
MxRect32 rect(x, y, x + width, y + height);
|
||||||
|
|
||||||
|
MVideoManager()->InvalidateRect(rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100b3280
|
||||||
|
undefined4 MxVideoPresenter::PutData()
|
||||||
|
{
|
||||||
|
MxAutoLocker lock(&m_criticalSection);
|
||||||
|
|
||||||
|
if (IsEnabled() && m_currentTickleState >= TickleState_Streaming && m_currentTickleState <= TickleState_unk5)
|
||||||
|
VTable0x6c();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100b3300
|
// OFFSET: LEGO1 0x100b3300
|
||||||
undefined MxVideoPresenter::VTable0x74()
|
undefined MxVideoPresenter::VTable0x74()
|
||||||
{
|
{
|
||||||
|
@ -6,10 +6,14 @@
|
|||||||
#include "mxmediapresenter.h"
|
#include "mxmediapresenter.h"
|
||||||
|
|
||||||
// VTABLE 0x100d4be8
|
// VTABLE 0x100d4be8
|
||||||
|
// SIZE 0x64
|
||||||
class MxVideoPresenter : public MxMediaPresenter {
|
class MxVideoPresenter : public MxMediaPresenter {
|
||||||
public:
|
public:
|
||||||
MxVideoPresenter() { Init(); }
|
enum {
|
||||||
|
Flag_Bit1 = 0x01,
|
||||||
|
};
|
||||||
|
|
||||||
|
MxVideoPresenter() { Init(); }
|
||||||
virtual ~MxVideoPresenter() override; // vtable+0x0
|
virtual ~MxVideoPresenter() override; // vtable+0x0
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x1000c820
|
// OFFSET: LEGO1 0x1000c820
|
||||||
@ -28,13 +32,20 @@ public:
|
|||||||
void Init();
|
void Init();
|
||||||
void Destroy(MxBool p_fromDestructor);
|
void Destroy(MxBool p_fromDestructor);
|
||||||
|
|
||||||
|
virtual void ReadyTickle() override; // vtable+0x18
|
||||||
|
virtual void StartingTickle() override; // vtable+0x1c
|
||||||
|
virtual void StreamingTickle() override; // vtable+0x20
|
||||||
|
virtual void RepeatingTickle() override; // vtable+0x24
|
||||||
|
virtual void Unk5Tickle() override; // vtable+0x28
|
||||||
|
virtual MxResult AddToManager() override; // vtable+0x34
|
||||||
virtual void Destroy() override; // vtable+0x38
|
virtual void Destroy() override; // vtable+0x38
|
||||||
|
virtual void EndAction() override; // vtable+0x40
|
||||||
|
virtual undefined4 PutData() override; // vtable+0x4c
|
||||||
virtual MxBool IsHit(MxS32 p_x, MxS32 p_y) override; // vtable+0x50
|
virtual MxBool IsHit(MxS32 p_x, MxS32 p_y) override; // vtable+0x50
|
||||||
virtual void VTable0x5c(undefined4 p_unknown1); // vtable+0x5c
|
virtual void VTable0x5c(MxStreamChunk* p_chunk); // vtable+0x5c
|
||||||
virtual void VTable0x60(); // vtable+0x60
|
virtual void VTable0x60(); // vtable+0x60
|
||||||
virtual void VTable0x64(); // vtable+0x64
|
virtual void VTable0x64(); // vtable+0x64
|
||||||
virtual void VTable0x68(undefined4 p_unknown1); // vtable+0x68
|
virtual void VTable0x68(MxStreamChunk* p_chunk); // vtable+0x68
|
||||||
virtual void VTable0x6c(); // vtable+0x6c
|
virtual void VTable0x6c(); // vtable+0x6c
|
||||||
virtual void VTable0x70(); // vtable+0x70
|
virtual void VTable0x70(); // vtable+0x70
|
||||||
virtual undefined VTable0x74(); // vtable+0x74
|
virtual undefined VTable0x74(); // vtable+0x74
|
||||||
@ -56,12 +67,12 @@ public:
|
|||||||
MxS32 IsHit(MxU32 p_x, MxU32 p_y);
|
MxS32 IsHit(MxU32 p_x, MxU32 p_y);
|
||||||
};
|
};
|
||||||
|
|
||||||
MxBitmap* m_bitmap;
|
MxBitmap* m_bitmap; // 0x50
|
||||||
AlphaMask* m_alpha;
|
AlphaMask* m_alpha; // 0x54
|
||||||
LPDIRECTDRAWSURFACE m_unk58;
|
LPDIRECTDRAWSURFACE m_unk58; // 0x58
|
||||||
undefined2 m_unk5c;
|
MxS16 m_unk5c; // 0x5c
|
||||||
unsigned char m_flags; // 0x5e
|
MxU8 m_flags; // 0x5e
|
||||||
MxLong m_unk60;
|
MxLong m_unk60; // 0x60
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MXVIDEOPRESENTER_H
|
#endif // MXVIDEOPRESENTER_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user