From 9b8bbc3e76c818e5b9be941d5da54f590fb99672 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 18 May 2025 01:39:35 +0200 Subject: [PATCH] Fix game startup bits (#102) --- .../legoomni/src/video/legomodelpresenter.cpp | 2 +- miniwin/miniwin/src/miniwin_d3drm.cpp | 26 +++++++++---- miniwin/miniwin/src/miniwin_ddsurface.cpp | 39 ++++++++++++------- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp index 84e0ab24..d64ec94d 100644 --- a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp @@ -97,7 +97,7 @@ MxResult LegoModelPresenter::CreateROI(MxDSChunk* p_chunk) SDL_strlwr(textureName); if (textureName[0] == '^') { - strcpy(textureName, textureName + 1); + memmove(textureName, textureName + 1, strlen(textureName)); if (g_modelPresenterConfig) { texture = new LegoTexture(); diff --git a/miniwin/miniwin/src/miniwin_d3drm.cpp b/miniwin/miniwin/src/miniwin_d3drm.cpp index 564f5e3c..7f779eca 100644 --- a/miniwin/miniwin/src/miniwin_d3drm.cpp +++ b/miniwin/miniwin/src/miniwin_d3drm.cpp @@ -197,7 +197,7 @@ struct Direct3DRMMeshImpl : public Direct3DRMObjectBase { { if (SDL_memcmp(&iid, &IID_IDirect3DRMMesh, sizeof(GUID)) == 0) { *object = static_cast(new Direct3DRMMeshImpl); - return S_OK; + return DD_OK; } return DDERR_GENERIC; @@ -206,8 +206,7 @@ struct Direct3DRMMeshImpl : public Direct3DRMObjectBase { HRESULT AddGroup(int vertexCount, int faceCount, int vertexPerFace, void* faceBuffer, D3DRMGROUPINDEX* groupIndex) override { - assert(false && "Unimplemented"); - return DDERR_GENERIC; + return DD_OK; } HRESULT GetGroup( int groupIndex, @@ -236,6 +235,7 @@ struct Direct3DRMMeshImpl : public Direct3DRMObjectBase { if (!m_groupTexture) { return DDERR_GENERIC; } + m_groupTexture->AddRef(); *texture = m_groupTexture; return DD_OK; } @@ -249,6 +249,16 @@ struct Direct3DRMMeshImpl : public Direct3DRMObjectBase { }; struct Direct3DRMTextureImpl : public Direct3DRMObjectBase { + HRESULT QueryInterface(const GUID& riid, void** ppvObject) override + { + if (SDL_memcmp(&riid, &IID_IDirect3DRMTexture2, sizeof(GUID)) == 0) { + this->IUnknown::AddRef(); + *ppvObject = static_cast(this); + return DD_OK; + } + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Direct3DRMTextureImpl does not implement guid"); + return E_NOINTERFACE; + } HRESULT Clone(void** ppObject) override { *ppObject = static_cast(new Direct3DRMTextureImpl); @@ -440,7 +450,7 @@ struct Direct3DRMImpl : virtual public IDirect3DRM2 { if (SDL_memcmp(&riid, &IID_IDirect3DRM2, sizeof(GUID)) == 0) { this->IUnknown::AddRef(); *ppvObject = static_cast(this); - return S_OK; + return DD_OK; } SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "DirectDrawImpl does not implement guid"); return E_NOINTERFACE; @@ -450,7 +460,7 @@ struct Direct3DRMImpl : virtual public IDirect3DRM2 { override { *outDevice = static_cast(new Direct3DRMDevice2Impl); - return S_OK; + return DD_OK; } HRESULT CreateDeviceFromSurface( const GUID* guid, @@ -460,17 +470,17 @@ struct Direct3DRMImpl : virtual public IDirect3DRM2 { ) override { *outDevice = static_cast(new Direct3DRMDevice2Impl); - return S_OK; + return DD_OK; } HRESULT CreateTexture(D3DRMIMAGE* image, IDirect3DRMTexture2** outTexture) override { *outTexture = static_cast(new Direct3DRMTextureImpl); - return S_OK; + return DD_OK; } HRESULT CreateTextureFromSurface(LPDIRECTDRAWSURFACE surface, IDirect3DRMTexture2** outTexture) override { *outTexture = static_cast(new Direct3DRMTextureImpl); - return S_OK; + return DD_OK; } HRESULT CreateMesh(IDirect3DRMMesh** outMesh) override { diff --git a/miniwin/miniwin/src/miniwin_ddsurface.cpp b/miniwin/miniwin/src/miniwin_ddsurface.cpp index 944c1e98..06dae67b 100644 --- a/miniwin/miniwin/src/miniwin_ddsurface.cpp +++ b/miniwin/miniwin/src/miniwin_ddsurface.cpp @@ -54,9 +54,21 @@ HRESULT DirectDrawSurfaceImpl::Blt( if (!renderer) { return DDERR_GENERIC; } - SDL_FRect srcRect = ConvertRect(lpSrcRect); - SDL_FRect dstRect = ConvertRect(lpDestRect); - SDL_RenderTexture(renderer, static_cast(lpDDSrcSurface)->m_texture, &srcRect, &dstRect); + auto srcSurface = static_cast(lpDDSrcSurface); + SDL_FRect srcRect, dstRect; + if (lpSrcRect) { + srcRect = ConvertRect(lpSrcRect); + } + else { + srcRect = {0, 0, (float) srcSurface->m_texture->w, (float) srcSurface->m_texture->h}; + } + if (lpDestRect) { + dstRect = ConvertRect(lpDestRect); + } + else { + dstRect = {0, 0, (float) m_texture->w, (float) m_texture->h}; + } + SDL_RenderTexture(renderer, srcSurface->m_texture, &srcRect, &dstRect); SDL_RenderPresent(renderer); return DD_OK; } @@ -72,14 +84,16 @@ HRESULT DirectDrawSurfaceImpl::BltFast( if (!renderer) { return DDERR_GENERIC; } - SDL_FRect dstRect = { - (float) dwX, - (float) dwY, - (float) (lpSrcRect->right - lpSrcRect->left), - (float) (lpSrcRect->bottom - lpSrcRect->top) - }; - SDL_FRect srcRect = ConvertRect(lpSrcRect); - SDL_RenderTexture(renderer, static_cast(lpDDSrcSurface)->m_texture, &srcRect, &dstRect); + auto srcSurface = static_cast(lpDDSrcSurface); + SDL_FRect srcRect; + if (lpSrcRect) { + srcRect = ConvertRect(lpSrcRect); + } + else { + srcRect = {0, 0, (float) srcSurface->m_texture->w, (float) srcSurface->m_texture->h}; + } + SDL_FRect dstRect = {(float) dwX, (float) dwY, srcRect.w, srcRect.h}; + SDL_RenderTexture(renderer, srcSurface->m_texture, &srcRect, &dstRect); SDL_RenderPresent(renderer); return DD_OK; } @@ -90,8 +104,7 @@ HRESULT DirectDrawSurfaceImpl::Flip(LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverrid return DDERR_GENERIC; } float width, height; - SDL_GetTextureSize(m_texture, &width, &height); - SDL_FRect rect{0, 0, width, height}; + SDL_FRect rect{0, 0, (float) m_texture->w, (float) m_texture->h}; SDL_RenderTexture(renderer, m_texture, &rect, &rect); SDL_RenderPresent(renderer); return DD_OK;