diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index b8bfba02..57398b42 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -72,54 +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[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 - DWORD m_rendermode_0x584; // 0x584 - BOOL m_dither_0x588; // 0x588 - DWORD m_buffer_count_0x58c; // 0x58c + 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 + D3DVALUE m_front; // 0x55c + float m_cameraWidth; // 0x560 + float m_cameraHeight; // 0x564 + D3DVALUE m_fov; // 0x55c + IDirect3DRMFrame* m_camera; // 0x56c + D3DRMPROJECTIONTYPE m_projection; // 0x570 + ViewportAppData* m_appdata; // 0x574 + D3DRMRENDERQUALITY m_quality; // 0x578 + DWORD m_shades; // 0x57c + D3DRMTEXTUREQUALITY m_textureQuality; // 0x580 + DWORD m_rendermode; // 0x584 + BOOL m_dither; // 0x588 + DWORD m_bufferCount; // 0x58c }; // SYNTHETIC: LEGO1 0x1007ab20 diff --git a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp index ca1b4a6c..7340544e 100644 --- a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp +++ b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp @@ -567,50 +567,48 @@ extern void ViewportDestroyCallback(IDirect3DRMObject* pObject, void* pArg); int LegoVideoManager::EnableRMDevice() { 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(); + + TglImpl::DeviceImpl* deviceImpl = (TglImpl::DeviceImpl*) m_3dManager->GetLego3DView()->GetDevice(); + IDirect3DRMDevice2* d3drmDev2 = NULL; IDirect3D2* d3d2 = m_direct3d->Direct3D(); - IDirect3DDevice2* d3d_dev2 = m_direct3d->Direct3DDevice(); + IDirect3DDevice2* d3dDev2 = m_direct3d->Direct3DDevice(); + + int result = -1; + IDirect3DRM2* d3drm2 = ((TglImpl::RendererImpl*) m_renderer)->ImplementationData(); + m_direct3d->RestoreSurfaces(); - IDirect3DRMDevice2* d3drm_dev2 = NULL; - HRESULT res = d3drm2->CreateDeviceFromD3D(d3d2, d3d_dev2, &d3drm_dev2); - if (res == D3DRM_OK) { + + if (d3drm2->CreateDeviceFromD3D(d3d2, d3dDev2, &d3drmDev2) == 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) { + deviceImpl->SetImplementationData(d3drmDev2); + + if (d3drm2->CreateViewport(d3drmDev2, m_camera, 0, 0, m_cameraWidth, m_cameraHeight, &viewport) == D3DRM_OK) { + viewport->SetBack(m_back); + viewport->SetFront(m_front); + viewport->SetField(m_fov); + viewport->SetCamera(m_camera); + viewport->SetProjection(m_projection); + viewport->SetAppData((DWORD) m_appdata); + d3drmDev2->SetQuality(m_quality); + d3drmDev2->SetShades(m_shades); + d3drmDev2->SetTextureQuality(m_textureQuality); + d3drmDev2->SetRenderMode(m_rendermode); + d3drmDev2->SetDither(m_dither); + d3drmDev2->SetBufferCount(m_bufferCount); + m_camera->Release(); + + if (viewport->AddDestroyCallback(ViewportDestroyCallback, m_appdata) == D3DRM_OK) { ((TglImpl::ViewImpl*) m_3dManager->GetLego3DView()->GetView())->SetImplementationData(viewport); m_paused = 0; result = 0; } } } + return result; } @@ -620,43 +618,49 @@ int LegoVideoManager::DisableRMDevice() if (m_paused) { return -1; } - IDirect3DRMDevice2* d3drm_dev2 = + + IDirect3DRMDevice2* d3drmDev2 = ((TglImpl::DeviceImpl*) m_3dManager->GetLego3DView()->GetDevice())->ImplementationData(); - if (d3drm_dev2 != NULL) { - IDirect3DRMViewportArray* viewport_array = NULL; - if (d3drm_dev2->GetViewports(&viewport_array) == D3DRM_OK && viewport_array != NULL) { - if (viewport_array->GetSize() == 1) { + + if (d3drmDev2 != NULL) { + IDirect3DRMViewportArray* viewportArray = NULL; + + if (d3drmDev2->GetViewports(&viewportArray) == D3DRM_OK && viewportArray != NULL) { + if (viewportArray->GetSize() == 1) { IDirect3DRMViewport* viewport = NULL; - if (viewport_array->GetElement(0, &viewport) == D3DRM_OK) { - m_back_0x558 = viewport->GetBack(); - m_front_0x55c = viewport->GetFront(); - m_camera_width_0x560 = viewport->GetWidth(); - m_camera_height_0x564 = viewport->GetHeight(); - m_fov_0x568 = viewport->GetField(); - viewport->GetCamera(&m_camera_0x56c); - m_projection_0x570 = viewport->GetProjection(); - m_appdata_0x574 = (ViewportAppData*) viewport->GetAppData(); - viewport_array->Release(); + + if (viewportArray->GetElement(0, &viewport) == D3DRM_OK) { + m_back = viewport->GetBack(); + m_front = viewport->GetFront(); + m_cameraWidth = viewport->GetWidth(); + m_cameraHeight = viewport->GetHeight(); + m_fov = viewport->GetField(); + viewport->GetCamera(&m_camera); + m_projection = viewport->GetProjection(); + m_appdata = (ViewportAppData*) viewport->GetAppData(); + viewportArray->Release(); viewport->Release(); - viewport->DeleteDestroyCallback(ViewportDestroyCallback, this->m_appdata_0x574); + viewport->DeleteDestroyCallback(ViewportDestroyCallback, this->m_appdata); viewport->Release(); m_paused = 1; m_direct3d->Direct3D()->AddRef(); m_direct3d->Direct3DDevice()->AddRef(); } else { - viewport_array->Release(); + viewportArray->Release(); } } } - m_quality_0x578 = d3drm_dev2->GetQuality(); - m_shades_0x57c = d3drm_dev2->GetShades(); - m_texture_quality_0x580 = d3drm_dev2->GetTextureQuality(); - m_rendermode_0x584 = d3drm_dev2->GetRenderMode(); - m_dither_0x588 = d3drm_dev2->GetDither(); - m_buffer_count_0x58c = d3drm_dev2->GetBufferCount(); - d3drm_dev2->Release(); + + m_quality = d3drmDev2->GetQuality(); + m_shades = d3drmDev2->GetShades(); + m_textureQuality = d3drmDev2->GetTextureQuality(); + m_rendermode = d3drmDev2->GetRenderMode(); + m_dither = d3drmDev2->GetDither(); + m_bufferCount = d3drmDev2->GetBufferCount(); + d3drmDev2->Release(); } + if (m_paused) { return 0; } diff --git a/LEGO1/tgl/d3drm/texture.cpp b/LEGO1/tgl/d3drm/texture.cpp index 637a2059..d02b8840 100644 --- a/LEGO1/tgl/d3drm/texture.cpp +++ b/LEGO1/tgl/d3drm/texture.cpp @@ -89,10 +89,12 @@ void TglD3DRMIMAGE::Destroy() inline static int IsPowerOfTwo(int v) { int m = 0; + while (v > 2 && m == 0) { m = v % 2; v /= 2; } + return v == 2 && m == 0; } @@ -102,14 +104,17 @@ Result TglD3DRMIMAGE::CreateBuffer(int width, int height, int depth, void* pBuff if (!(IsPowerOfTwo(width) && IsPowerOfTwo(height) && width % 4 == 0)) { return Error; } + m_image.width = width; m_image.height = height; m_image.depth = depth; m_image.bytes_per_line = width; + if (!m_texelsAllocatedByClient) { delete[] m_image.buffer1; m_image.buffer1 = NULL; } + if (useBuffer) { m_texelsAllocatedByClient = 1; m_image.buffer1 = (char*) pBuffer; @@ -119,6 +124,7 @@ Result TglD3DRMIMAGE::CreateBuffer(int width, int height, int depth, void* pBuff memcpy(m_image.buffer1, pBuffer, width * height); m_texelsAllocatedByClient = 0; } + return Success; }