2023-06-29 04:10:08 -04:00
|
|
|
#include "legovideomanager.h"
|
2023-10-08 16:00:59 -04:00
|
|
|
|
2024-01-01 19:17:38 -05:00
|
|
|
#include "legoomni.h"
|
|
|
|
#include "legoroi.h"
|
|
|
|
#include "mxtimer.h"
|
|
|
|
#include "realtime/matrix.h"
|
|
|
|
#include "viewmanager/viewroi.h"
|
|
|
|
|
2023-10-08 16:00:59 -04:00
|
|
|
DECOMP_SIZE_ASSERT(LegoVideoManager, 0x590);
|
2024-01-01 19:17:38 -05:00
|
|
|
DECOMP_SIZE_ASSERT(MxStopWatch, 0x18);
|
2023-06-29 04:10:08 -04:00
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007aa20
|
2023-06-29 04:10:08 -04:00
|
|
|
LegoVideoManager::LegoVideoManager()
|
|
|
|
{
|
2024-01-01 19:17:38 -05:00
|
|
|
m_renderer = NULL;
|
2023-11-08 17:05:20 -05:00
|
|
|
m_3dManager = NULL;
|
2024-01-01 19:17:38 -05:00
|
|
|
m_viewROI = NULL;
|
2023-11-08 17:05:20 -05:00
|
|
|
m_direct3d = 0;
|
|
|
|
m_unk0xe6 = FALSE;
|
|
|
|
memset(m_unk0x78, 0, sizeof(m_unk0x78));
|
|
|
|
m_unk0x78[0] = 0x6c;
|
2024-01-01 19:17:38 -05:00
|
|
|
m_unk0x100d9d00 = NULL;
|
2023-11-08 17:05:20 -05:00
|
|
|
m_isFullscreenMovie = FALSE;
|
|
|
|
m_palette = NULL;
|
2024-01-01 19:17:38 -05:00
|
|
|
m_stopWatch = NULL;
|
2023-11-08 17:05:20 -05:00
|
|
|
m_cursorMoved = FALSE;
|
|
|
|
m_cursorX = m_cursorY;
|
|
|
|
m_cursorYCopy = m_cursorY;
|
|
|
|
m_cursorXCopy = m_cursorY;
|
|
|
|
m_unk0x514 = 0;
|
|
|
|
m_unk0x500 = FALSE;
|
|
|
|
m_drawFPS = FALSE;
|
|
|
|
m_unk0x528 = 0;
|
|
|
|
m_arialFont = NULL;
|
|
|
|
m_unk0xe5 = FALSE;
|
|
|
|
m_unk0x554 = 0;
|
|
|
|
m_initialized = FALSE;
|
2023-06-29 04:10:08 -04:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007ab40
|
2023-06-29 04:10:08 -04:00
|
|
|
LegoVideoManager::~LegoVideoManager()
|
|
|
|
{
|
2023-11-08 17:05:20 -05:00
|
|
|
Destroy();
|
|
|
|
delete m_palette;
|
|
|
|
}
|
|
|
|
|
2024-01-01 21:23:47 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007abb0
|
2024-01-01 19:17:38 -05:00
|
|
|
MxResult LegoVideoManager::CreateDirect3D()
|
|
|
|
{
|
2024-01-01 21:23:47 -05:00
|
|
|
if (!m_direct3d)
|
|
|
|
m_direct3d = new MxDirect3D;
|
|
|
|
|
|
|
|
return m_direct3d ? SUCCESS : FAILURE;
|
2024-01-01 19:17:38 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// FUNCTION: LEGO1 0x1007ac40
|
2023-12-26 17:20:20 -05:00
|
|
|
MxResult LegoVideoManager::Create(MxVideoParam& p_videoParam, MxU32 p_frequencyMS, MxBool p_createThread)
|
|
|
|
{
|
2024-01-01 19:17:38 -05:00
|
|
|
MxBool paletteCreated = FALSE;
|
2024-01-03 22:03:02 -05:00
|
|
|
MxDriver* driver = NULL;
|
|
|
|
MxDevice* device = NULL;
|
2024-01-01 19:17:38 -05:00
|
|
|
MxResult result = FAILURE;
|
|
|
|
|
2024-01-03 22:03:02 -05:00
|
|
|
MxDeviceEnumerate100d9cc8 deviceEnumerator;
|
2024-01-01 19:17:38 -05:00
|
|
|
Vector3Data posVec(0.0, 1.25, -50.0);
|
|
|
|
Vector3Data dirVec(0.0, 0.0, 1.0);
|
|
|
|
Vector3Data upVec(0.0, 1.0, 0.0);
|
|
|
|
Matrix4Data outMatrix;
|
|
|
|
HWND hwnd = MxOmni::GetInstance()->GetWindowHandle();
|
|
|
|
MxS32 bits = p_videoParam.Flags().Get16Bit() ? 16 : 8;
|
2024-01-03 22:03:02 -05:00
|
|
|
MxS32 deviceNum = -1;
|
2024-01-01 19:17:38 -05:00
|
|
|
|
|
|
|
if (!p_videoParam.GetPalette()) {
|
|
|
|
MxPalette* palette = new MxPalette;
|
|
|
|
p_videoParam.SetPalette(palette);
|
|
|
|
|
|
|
|
if (!palette)
|
|
|
|
goto done;
|
|
|
|
paletteCreated = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PALETTEENTRY paletteEntries[256];
|
|
|
|
p_videoParam.GetPalette()->GetEntries(paletteEntries);
|
|
|
|
|
|
|
|
if (CreateDirect3D() != SUCCESS)
|
|
|
|
goto done;
|
|
|
|
|
2024-01-03 22:03:02 -05:00
|
|
|
if (deviceEnumerator.DoEnumerate() != SUCCESS)
|
2024-01-01 19:17:38 -05:00
|
|
|
goto done;
|
|
|
|
|
|
|
|
if (p_videoParam.GetDeviceName()) {
|
2024-01-03 22:03:02 -05:00
|
|
|
deviceNum = deviceEnumerator.ParseDeviceName(p_videoParam.GetDeviceName());
|
|
|
|
if (deviceNum >= 0) {
|
|
|
|
if ((deviceNum = deviceEnumerator.GetDevice(deviceNum, driver, device)) != SUCCESS)
|
|
|
|
deviceNum = -1;
|
2024-01-01 19:17:38 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-03 22:03:02 -05:00
|
|
|
if (deviceNum < 0) {
|
|
|
|
deviceEnumerator.FUN_1009d210();
|
|
|
|
deviceNum = deviceEnumerator.FUN_1009d0d0();
|
|
|
|
deviceEnumerator.GetDevice(deviceNum, driver, device);
|
2024-01-01 19:17:38 -05:00
|
|
|
}
|
|
|
|
|
2024-01-03 22:03:02 -05:00
|
|
|
m_direct3d->FUN_1009b5f0(deviceEnumerator, driver, device);
|
2024-01-01 19:17:38 -05:00
|
|
|
|
2024-01-03 22:03:02 -05:00
|
|
|
if (!driver->m_ddCaps.dwCaps2 && driver->m_ddCaps.dwSVBRops[7] != 2)
|
2024-01-01 19:17:38 -05:00
|
|
|
p_videoParam.Flags().SetF2bit0(TRUE);
|
|
|
|
else
|
|
|
|
p_videoParam.Flags().SetF2bit0(FALSE);
|
|
|
|
|
|
|
|
ViewROI::SetUnk101013d8(p_videoParam.Flags().GetF2bit0() == FALSE);
|
|
|
|
|
|
|
|
if (!m_direct3d->Create(
|
|
|
|
hwnd,
|
|
|
|
p_videoParam.Flags().GetFullScreen(),
|
|
|
|
p_videoParam.Flags().GetFlipSurfaces(),
|
|
|
|
p_videoParam.Flags().GetBackBuffers() == FALSE,
|
|
|
|
p_videoParam.GetRect().GetWidth(),
|
|
|
|
p_videoParam.GetRect().GetHeight(),
|
|
|
|
bits,
|
|
|
|
paletteEntries,
|
|
|
|
sizeof(paletteEntries) / sizeof(paletteEntries[0])
|
|
|
|
))
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
if (MxVideoManager::VTable0x28(
|
|
|
|
p_videoParam,
|
|
|
|
m_direct3d->GetDirectDraw(),
|
|
|
|
m_direct3d->GetDirect3D(),
|
|
|
|
m_direct3d->GetFrontBuffer(),
|
|
|
|
m_direct3d->GetBackBuffer(),
|
|
|
|
m_direct3d->GetClipper(),
|
|
|
|
p_frequencyMS,
|
|
|
|
p_createThread
|
|
|
|
) != SUCCESS)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
m_renderer = Tgl::CreateRenderer();
|
|
|
|
|
|
|
|
if (!m_renderer)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
m_3dManager = new Lego3DManager;
|
|
|
|
|
|
|
|
if (!m_3dManager)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
Lego3DManager::CreateStruct createStruct;
|
|
|
|
memset(&createStruct, 0, sizeof(createStruct));
|
|
|
|
createStruct.m_hwnd = LegoOmni::GetInstance()->GetWindowHandle();
|
|
|
|
createStruct.m_directDraw = m_pDirectDraw;
|
|
|
|
createStruct.m_ddSurface1 = m_displaySurface->GetDirectDrawSurface1();
|
|
|
|
createStruct.m_ddSurface2 = m_displaySurface->GetDirectDrawSurface2();
|
|
|
|
createStruct.m_ddPalette = m_videoParam.GetPalette()->CreateNativePalette();
|
|
|
|
createStruct.m_isFullScreen = FALSE;
|
|
|
|
createStruct.m_flags = m_videoParam.Flags().GetWideViewAngle();
|
|
|
|
createStruct.m_direct3d = m_direct3d->GetDirect3D();
|
|
|
|
createStruct.m_d3dDevice = m_direct3d->GetDirect3DDevice();
|
|
|
|
|
|
|
|
if (!m_3dManager->Create(createStruct))
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
ViewLODList* pLODList;
|
|
|
|
|
|
|
|
if (FUN_1007c930() != SUCCESS)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
pLODList = m_3dManager->GetViewLODListManager()->Create("CameraROI", 1);
|
|
|
|
m_viewROI = new LegoROI(m_renderer, pLODList, Timer()->GetTime());
|
|
|
|
pLODList->Release();
|
|
|
|
|
|
|
|
CalcLocalTransform(posVec, dirVec, upVec, outMatrix);
|
|
|
|
m_viewROI->WrappedSetLocalTransform(outMatrix);
|
|
|
|
|
|
|
|
m_3dManager->GetLego3DView()->FUN_100ab100(m_viewROI);
|
|
|
|
m_3dManager->GetLego3DView()->FUN_100ab1b0(m_viewROI);
|
|
|
|
|
|
|
|
m_unk0x100d9d00 = new MxUnknown100d9d00;
|
|
|
|
m_unk0xe4 = FALSE;
|
|
|
|
m_stopWatch = new MxStopWatch;
|
|
|
|
m_stopWatch->Start();
|
|
|
|
|
|
|
|
result = SUCCESS;
|
|
|
|
|
|
|
|
done:
|
|
|
|
if (paletteCreated) {
|
|
|
|
delete p_videoParam.GetPalette();
|
|
|
|
p_videoParam.SetPalette(NULL);
|
|
|
|
}
|
|
|
|
|
2023-12-31 15:29:05 -05:00
|
|
|
return result;
|
2023-12-26 17:20:20 -05:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007b5e0
|
2023-11-08 17:05:20 -05:00
|
|
|
void LegoVideoManager::Destroy()
|
|
|
|
{
|
|
|
|
// todo: delete m_unk0x512
|
|
|
|
// todo: delete m_unk0x258
|
|
|
|
if (m_arialFont != NULL) {
|
|
|
|
DeleteObject(m_arialFont);
|
|
|
|
m_arialFont = NULL;
|
|
|
|
}
|
|
|
|
|
2023-12-13 05:48:14 -05:00
|
|
|
// delete m_unk0x64; //TODO: delete d3drm
|
2023-11-08 17:05:20 -05:00
|
|
|
|
|
|
|
delete m_3dManager;
|
|
|
|
MxVideoManager::Destroy();
|
2024-01-01 19:17:38 -05:00
|
|
|
delete m_stopWatch;
|
2023-06-29 04:10:08 -04:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007b6a0
|
2023-11-21 03:44:45 -05:00
|
|
|
void LegoVideoManager::MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY)
|
2023-06-29 04:10:08 -04:00
|
|
|
{
|
2023-11-21 03:44:45 -05:00
|
|
|
m_cursorX = p_cursorX;
|
|
|
|
m_cursorY = p_cursorY;
|
|
|
|
m_cursorMoved = TRUE;
|
2023-06-29 04:10:08 -04:00
|
|
|
|
2023-11-21 03:44:45 -05:00
|
|
|
if (623 < p_cursorX)
|
|
|
|
m_cursorX = 623;
|
|
|
|
|
|
|
|
if (463 < p_cursorY)
|
|
|
|
m_cursorY = 463;
|
2023-06-29 04:10:08 -04:00
|
|
|
}
|
|
|
|
|
2023-12-26 17:20:20 -05:00
|
|
|
// STUB: LEGO1 0x1007b770
|
|
|
|
MxResult LegoVideoManager::Tickle()
|
|
|
|
{
|
|
|
|
// TODO
|
2023-12-27 16:05:21 -05:00
|
|
|
return MxVideoManager::Tickle();
|
2023-12-26 17:20:20 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// STUB: LEGO1 0x1007c080
|
|
|
|
void LegoVideoManager::VTable0x38(undefined4, undefined4)
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
|
|
|
|
// FUNCTION: LEGO1 0x1007c290
|
|
|
|
MxResult LegoVideoManager::RealizePalette(MxPalette* p_pallete)
|
|
|
|
{
|
|
|
|
if (p_pallete && m_videoParam.GetPalette()) {
|
|
|
|
p_pallete->GetEntries(m_paletteEntries);
|
|
|
|
m_videoParam.GetPalette()->SetEntries(m_paletteEntries);
|
|
|
|
m_displaySurface->SetPalette(m_videoParam.GetPalette());
|
|
|
|
}
|
|
|
|
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007c300
|
2023-09-29 16:38:08 -04:00
|
|
|
void LegoVideoManager::EnableFullScreenMovie(MxBool p_enable)
|
|
|
|
{
|
2023-10-24 19:38:27 -04:00
|
|
|
EnableFullScreenMovie(p_enable, TRUE);
|
2023-09-29 16:38:08 -04:00
|
|
|
}
|
|
|
|
|
2023-12-21 10:44:54 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007c310
|
2023-09-29 16:38:08 -04:00
|
|
|
void LegoVideoManager::EnableFullScreenMovie(MxBool p_enable, MxBool p_scale)
|
2023-06-29 04:10:08 -04:00
|
|
|
{
|
2023-12-21 10:44:54 -05:00
|
|
|
if (m_isFullscreenMovie != p_enable) {
|
|
|
|
m_isFullscreenMovie = p_enable;
|
|
|
|
|
|
|
|
if (p_enable) {
|
|
|
|
m_palette = m_videoParam.GetPalette()->Clone();
|
|
|
|
OverrideSkyColor(FALSE);
|
|
|
|
|
|
|
|
m_displaySurface->GetVideoParam().Flags().SetF1bit3(p_scale);
|
|
|
|
|
|
|
|
m_unk0xe4 = FALSE;
|
|
|
|
m_unk0x500 = TRUE;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
m_displaySurface->FUN_100ba640();
|
|
|
|
m_displaySurface->GetVideoParam().Flags().SetF1bit3(FALSE);
|
|
|
|
|
|
|
|
// restore previous pallete
|
|
|
|
RealizePalette(m_palette);
|
|
|
|
delete m_palette;
|
|
|
|
m_palette = NULL;
|
|
|
|
|
|
|
|
// update region where video used to be
|
|
|
|
MxRect32 rect(
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
m_videoParam.GetRect().GetRight() - m_videoParam.GetRect().GetLeft(),
|
|
|
|
m_videoParam.GetRect().GetBottom() - m_videoParam.GetRect().GetTop()
|
|
|
|
);
|
|
|
|
|
|
|
|
InvalidateRect(rect);
|
|
|
|
UpdateRegion();
|
|
|
|
OverrideSkyColor(TRUE);
|
|
|
|
|
|
|
|
m_unk0xe4 = TRUE;
|
|
|
|
m_unk0x500 = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p_enable) {
|
|
|
|
m_displaySurface->GetVideoParam().Flags().SetF1bit3(p_scale);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
m_displaySurface->GetVideoParam().Flags().SetF1bit3(FALSE);
|
|
|
|
}
|
2023-06-29 04:10:08 -04:00
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007c440
|
2023-10-08 16:00:59 -04:00
|
|
|
void LegoVideoManager::SetSkyColor(float p_red, float p_green, float p_blue)
|
2023-06-30 19:33:59 -04:00
|
|
|
{
|
2023-10-24 19:38:27 -04:00
|
|
|
PALETTEENTRY colorStrucure;
|
2023-06-30 19:33:59 -04:00
|
|
|
|
2023-10-24 19:38:27 -04:00
|
|
|
colorStrucure.peRed = (p_red * 255.0f);
|
|
|
|
colorStrucure.peGreen = (p_green * 255.0f);
|
|
|
|
colorStrucure.peBlue = (p_blue * 255.0f);
|
|
|
|
colorStrucure.peFlags = -124;
|
|
|
|
m_videoParam.GetPalette()->SetSkyColor(&colorStrucure);
|
|
|
|
m_videoParam.GetPalette()->SetOverrideSkyColor(TRUE);
|
2023-12-26 17:20:20 -05:00
|
|
|
m_3dManager->GetLego3DView()->GetViewPort()->SetBackgroundColor(p_red, p_green, p_blue);
|
2023-06-30 19:33:59 -04:00
|
|
|
}
|
2023-11-21 03:44:45 -05:00
|
|
|
|
2023-12-21 10:44:54 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007c4c0
|
|
|
|
void LegoVideoManager::OverrideSkyColor(MxBool p_shouldOverride)
|
|
|
|
{
|
|
|
|
this->m_videoParam.GetPalette()->SetOverrideSkyColor(p_shouldOverride);
|
|
|
|
}
|
|
|
|
|
2023-12-26 17:20:20 -05:00
|
|
|
// FUNCTION: LEGO1 0x1007c4d0
|
|
|
|
void LegoVideoManager::VTable0x34(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height)
|
|
|
|
{
|
|
|
|
if (p_width == 0) {
|
|
|
|
p_width = m_videoParam.GetRect().GetWidth();
|
|
|
|
}
|
|
|
|
if (p_height == 0) {
|
|
|
|
p_height = m_videoParam.GetRect().GetHeight();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!m_initialized) {
|
|
|
|
m_3dManager->GetLego3DView()->GetViewPort()->ForceUpdate(p_x, p_y, p_width, p_height);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// STUB: LEGO1 0x1007c560
|
2023-11-21 03:44:45 -05:00
|
|
|
int LegoVideoManager::EnableRMDevice()
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2023-12-06 07:10:45 -05:00
|
|
|
// STUB: LEGO1 0x1007c740
|
2023-11-21 03:44:45 -05:00
|
|
|
int LegoVideoManager::DisableRMDevice()
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
return 0;
|
|
|
|
}
|
2024-01-01 19:17:38 -05:00
|
|
|
|
|
|
|
// STUB: LEGO1 0x1007c930
|
|
|
|
MxResult LegoVideoManager::FUN_1007c930()
|
|
|
|
{
|
|
|
|
return SUCCESS;
|
|
|
|
}
|