From 215f3b0bc8ac53d0378130484d1f7b74590c6957 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 19 Dec 2024 19:51:21 +0100 Subject: [PATCH] Implement LegoVideoManager::EnableRMDevice --- .../lego/legoomni/include/legovideomanager.h | 84 +++++++++++-------- .../legoomni/src/video/legovideomanager.cpp | 44 +++++++++- LEGO1/tgl/d3drm/impl.h | 2 + LEGO1/tgl/d3drm/view.cpp | 2 + 4 files changed, 95 insertions(+), 37 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index 605d0626..f5eea4df 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -6,11 +6,13 @@ #include "mxvideomanager.h" #include +#include class Lego3DManager; class LegoROI; class MxDirect3D; class MxStopWatch; +struct ViewportAppData; namespace Tgl { @@ -70,40 +72,54 @@ class LegoVideoManager : public MxVideoManager { inline void DrawCursor(); - Tgl::Renderer* m_renderer; // 0x64 - Lego3DManager* m_3dManager; // 0x68 - LegoROI* m_viewROI; // 0x6c - undefined4 m_unk0x70; // 0x70 - MxDirect3D* m_direct3d; // 0x74 - undefined4 m_unk0x78[27]; // 0x78 - MxBool m_render3d; // 0xe4 - MxBool m_unk0xe5; // 0xe5 - MxBool m_unk0xe6; // 0xe6 - PALETTEENTRY m_paletteEntries[256]; // 0xe7 - undefined m_padding0x4e7; // 0x4e7 - LegoPhonemeList* m_phonemeRefList; // 0x4e8 - MxBool m_isFullscreenMovie; // 0x4ec - MxPalette* m_palette; // 0x4f0 - MxStopWatch* m_stopWatch; // 0x4f4 - double m_elapsedSeconds; // 0x4f8 - MxBool m_fullScreenMovie; // 0x500 - MxBool m_drawCursor; // 0x501 - MxS32 m_cursorXCopy; // 0x504 - MxS32 m_cursorYCopy; // 0x508 - MxS32 m_cursorX; // 0x50c - MxS32 m_cursorY; // 0x510 - LPDIRECTDRAWSURFACE m_cursorSurface; // 0x514 - RECT m_cursorRect; // 0x518 - LPDIRECTDRAWSURFACE m_unk0x528; // 0x528 - MxBool m_drawFPS; // 0x52c - RECT m_fpsRect; // 0x530 - HFONT m_arialFont; // 0x540 - SIZE m_fpsSize; // 0x544 - MxFloat m_unk0x54c; // 0x54c - MxFloat m_unk0x550; // 0x550 - MxBool m_unk0x554; // 0x554 - MxBool m_paused; // 0x555 - undefined m_pad0x556[0x39]; // 0x556 + Tgl::Renderer* m_renderer; // 0x64 + Lego3DManager* m_3dManager; // 0x68 + LegoROI* m_viewROI; // 0x6c + undefined4 m_unk0x70; // 0x70 + MxDirect3D* m_direct3d; // 0x74 + undefined4 m_unk0x78[27]; // 0x78 + MxBool m_render3d; // 0xe4 + MxBool m_unk0xe5; // 0xe5 + MxBool m_unk0xe6; // 0xe6 + PALETTEENTRY m_paletteEntries[256]; // 0xe7 + undefined m_padding0x4e7; // 0x4e7 + LegoPhonemeList* m_phonemeRefList; // 0x4e8 + MxBool m_isFullscreenMovie; // 0x4ec + MxPalette* m_palette; // 0x4f0 + MxStopWatch* m_stopWatch; // 0x4f4 + double m_elapsedSeconds; // 0x4f8 + MxBool m_fullScreenMovie; // 0x500 + MxBool m_drawCursor; // 0x501 + MxS32 m_cursorXCopy; // 0x504 + MxS32 m_cursorYCopy; // 0x508 + MxS32 m_cursorX; // 0x50c + MxS32 m_cursorY; // 0x510 + LPDIRECTDRAWSURFACE m_cursorSurface; // 0x514 + RECT m_cursorRect; // 0x518 + LPDIRECTDRAWSURFACE m_unk0x528; // 0x528 + MxBool m_drawFPS; // 0x52c + RECT m_fpsRect; // 0x530 + HFONT m_arialFont; // 0x540 + SIZE m_fpsSize; // 0x544 + MxFloat m_unk0x54c; // 0x54c + MxFloat m_unk0x550; // 0x550 + MxBool m_unk0x554; // 0x554 + MxBool m_paused; // 0x555 + undefined m_pad0x556[0x2]; // 0x556 + D3DVALUE m_back_0x558; // 0x558 + D3DVALUE m_front_0x55c; // 0x55c + float m_camera_width_0x560; // 0x560 + float m_camera_height_0x564; // 0x564 + D3DVALUE m_fov_0x568; // 0x55c + IDirect3DRMFrame *m_camera_0x56c; // 0x56c + D3DRMPROJECTIONTYPE m_projection_0x570; // 0x570 + ViewportAppData *m_appdata_0x574; // 0x574 + D3DRMRENDERQUALITY m_quality_0x578; // 0x578 + DWORD m_shades_0x57c; // 0x57c + D3DRMTEXTUREQUALITY m_texture_quality_0x580; // 0x580 + D3DRMTEXTUREQUALITY m_rendermode_0x584; // 0x584 + BOOL m_dither_0x588; // 0x588 + DWORD m_buffer_count_0x58c; // 0x58c }; // SYNTHETIC: LEGO1 0x1007ab20 diff --git a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp index 70fae9aa..1b502d9b 100644 --- a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp +++ b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp @@ -561,11 +561,49 @@ void LegoVideoManager::FUN_1007c520() InputManager()->SetUnknown335(TRUE); } -// STUB: LEGO1 0x1007c560 +extern void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg); + +// FUNCTION: LEGO1 0x1007c560 int LegoVideoManager::EnableRMDevice() { - // TODO - return 0; + IDirect3DRMViewport *viewport; + if (!m_paused) { + return -1; + } + int result = -1; + TglImpl::DeviceImpl *device_impl = (TglImpl::DeviceImpl*)m_3dManager->GetLego3DView()->GetDevice(); + IDirect3DRM2 *d3drm2 = ((TglImpl::RendererImpl*)m_renderer)->ImplementationData(); + IDirect3D2 *d3d2 = m_direct3d->Direct3D(); + IDirect3DDevice2 *d3d_dev2 = m_direct3d->Direct3DDevice(); + m_direct3d->RestoreSurfaces(); + IDirect3DRMDevice2 *d3drm_dev2 = NULL; + HRESULT res = d3drm2->CreateDeviceFromD3D(d3d2, d3d_dev2, &d3drm_dev2); + if (res == D3DRM_OK) { + viewport = NULL; + device_impl->SetImplementationData(d3drm_dev2); + res = d3drm2->CreateViewport(d3drm_dev2, m_camera_0x56c, 0, 0, m_camera_width_0x560, m_camera_height_0x564, &viewport); + if (res == D3DRM_OK) { + viewport->SetBack(m_back_0x558); + viewport->SetFront(m_front_0x55c); + viewport->SetField(m_fov_0x568); + viewport->SetCamera(m_camera_0x56c); + viewport->SetProjection(m_projection_0x570); + viewport->SetAppData((DWORD)m_appdata_0x574); + d3drm_dev2->SetQuality(m_quality_0x578); + d3drm_dev2->SetShades(m_shades_0x57c); + d3drm_dev2->SetTextureQuality(m_texture_quality_0x580); + d3drm_dev2->SetRenderMode(m_rendermode_0x584); + d3drm_dev2->SetDither(m_dither_0x588); + d3drm_dev2->SetBufferCount(m_buffer_count_0x58c); + m_camera_0x56c->Release(); + if (viewport->AddDestroyCallback(ViewportDestroyCallback, m_appdata_0x574) == D3DRM_OK) { + ((TglImpl::ViewImpl*)m_3dManager->GetLego3DView()->GetView())->SetImplementationData(viewport); + m_paused = 0; + result = 0; + } + } + } + return result; } // STUB: LEGO1 0x1007c740 diff --git a/LEGO1/tgl/d3drm/impl.h b/LEGO1/tgl/d3drm/impl.h index 652ecef2..14acce2a 100644 --- a/LEGO1/tgl/d3drm/impl.h +++ b/LEGO1/tgl/d3drm/impl.h @@ -149,6 +149,7 @@ class DeviceImpl : public Device { void InitFromWindowsDevice(Device*) override; IDirect3DRMDevice2* ImplementationData() const { return m_data; } + void SetImplementationData(IDirect3DRMDevice2* device) { m_data = device; } friend class RendererImpl; @@ -199,6 +200,7 @@ class ViewImpl : public View { ) override; IDirect3DRMViewport* ImplementationData() const { return m_data; } + void SetImplementationData(IDirect3DRMViewport* viewport) { m_data = viewport; } static Result ViewportCreateAppData(IDirect3DRM2*, IDirect3DRMViewport*, IDirect3DRMFrame2*); diff --git a/LEGO1/tgl/d3drm/view.cpp b/LEGO1/tgl/d3drm/view.cpp index b9fca8e9..3c2ea1d9 100644 --- a/LEGO1/tgl/d3drm/view.cpp +++ b/LEGO1/tgl/d3drm/view.cpp @@ -80,6 +80,8 @@ inline Result ViewRestoreFrameAfterRender( return result; } +// FIXME: from LEGO1/tgl/d3drm/view.cpp + // FUNCTION: LEGO1 0x100a1240 void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg) {