diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a035ca6..81939a28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,6 +101,7 @@ add_library(miniwin STATIC EXCLUDE_FROM_ALL miniwin/miniwin/src/miniwin_d3drmframe.cpp miniwin/miniwin/src/miniwin_d3drmlight.cpp miniwin/miniwin/src/miniwin_d3drmmesh.cpp + miniwin/miniwin/src/miniwin_d3drmtexture.cpp miniwin/miniwin/src/miniwin_d3drmviewport.cpp ) # Force reported render mods from MiniWin diff --git a/LEGO1/tgl/d3drm/camera.cpp b/LEGO1/tgl/d3drm/camera.cpp index 9b64a25e..6b5fa2aa 100644 --- a/LEGO1/tgl/d3drm/camera.cpp +++ b/LEGO1/tgl/d3drm/camera.cpp @@ -22,10 +22,10 @@ Result CameraImpl::SetTransformation(FloatMatrix4& matrix) Result result; Result result2; - result2 = ResultVal(m_data->GetPosition(0, &position)); + result2 = ResultVal(m_data->GetPosition(NULL, &position)); result = ResultVal(m_data->AddTransform(D3DRMCOMBINE_REPLACE, *pTransformation)); // The did this second call just to assert on the return value - result2 = ResultVal(m_data->GetPosition(0, &position)); + result2 = ResultVal(m_data->GetPosition(NULL, &position)); return result; } diff --git a/miniwin/miniwin/include/miniwin_d3drm.h b/miniwin/miniwin/include/miniwin_d3drm.h index 95a4168c..691a17eb 100644 --- a/miniwin/miniwin/include/miniwin_d3drm.h +++ b/miniwin/miniwin/include/miniwin_d3drm.h @@ -129,10 +129,7 @@ typedef struct D3DRMIMAGE { DWORD format; } D3DRMIMAGE; -typedef struct D3DRMMATRIX4D { - double* operator[](size_t i) { abort(); } - const double* operator[](size_t i) const { abort(); } -} D3DRMMATRIX4D; +typedef D3DVALUE D3DRMMATRIX4D[4][4]; struct D3DRMBOX { D3DVECTOR min; @@ -229,7 +226,7 @@ struct IDirect3DRMFrame : public IDirect3DRMVisual { virtual HRESULT AddLight(IDirect3DRMLight* light) = 0; virtual HRESULT GetLights(IDirect3DRMLightArray** lightArray) = 0; virtual HRESULT AddTransform(D3DRMCOMBINETYPE combine, D3DRMMATRIX4D matrix) = 0; - virtual HRESULT GetPosition(int index, D3DVECTOR* position) = 0; + virtual HRESULT GetPosition(IDirect3DRMFrame* reference, D3DVECTOR* position) = 0; virtual HRESULT AddVisual(IDirect3DRMVisual* visual) = 0; virtual HRESULT DeleteVisual(IDirect3DRMVisual* visual) = 0; virtual HRESULT GetVisuals(IDirect3DRMVisualArray** visuals) = 0; diff --git a/miniwin/miniwin/src/include/miniwin_d3drm_p.h b/miniwin/miniwin/src/include/miniwin_d3drm_p.h index 03eef0c8..88b5bda0 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drm_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drm_p.h @@ -11,33 +11,34 @@ typedef struct PositionColorVertex { Uint8 r, g, b, a; } PositionColorVertex; -template +template class Direct3DRMArrayBase : public ArrayInterface { public: ~Direct3DRMArrayBase() override { - for (auto* item : items) { + for (auto* item : m_items) { if (item) { item->Release(); } } } - DWORD GetSize() override { return static_cast(items.size()); } + DWORD GetSize() override { return static_cast(m_items.size()); } HRESULT AddElement(InterfaceType* in) override { if (!in) { return DDERR_INVALIDPARAMS; } - in->AddRef(); - items.push_back(in); + auto inImpl = static_cast(in); + inImpl->AddRef(); + m_items.push_back(inImpl); return DD_OK; } HRESULT GetElement(DWORD index, InterfaceType** out) override { - if (index >= items.size()) { + if (index >= m_items.size()) { return DDERR_INVALIDPARAMS; } - *out = static_cast(items[index]); + *out = static_cast(m_items[index]); if (*out) { (*out)->AddRef(); } @@ -45,32 +46,16 @@ class Direct3DRMArrayBase : public ArrayInterface { } HRESULT DeleteElement(InterfaceType* element) override { - auto it = std::find(items.begin(), items.end(), element); - if (it == items.end()) { + auto it = std::find(m_items.begin(), m_items.end(), element); + if (it == m_items.end()) { return DDERR_INVALIDPARAMS; } (*it)->Release(); - items.erase(it); + m_items.erase(it); return DD_OK; } protected: - std::vector items; -}; - -struct Direct3DRMFrameArrayImpl : public Direct3DRMArrayBase { - using Direct3DRMArrayBase::Direct3DRMArrayBase; -}; - -struct Direct3DRMLightArrayImpl : public Direct3DRMArrayBase { - using Direct3DRMArrayBase::Direct3DRMArrayBase; -}; - -struct Direct3DRMViewportArrayImpl : public Direct3DRMArrayBase { - using Direct3DRMArrayBase::Direct3DRMArrayBase; -}; - -struct Direct3DRMVisualArrayImpl : public Direct3DRMArrayBase { - using Direct3DRMArrayBase::Direct3DRMArrayBase; + std::vector m_items; }; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h b/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h index a85f1666..7c13835e 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h @@ -1,10 +1,14 @@ #pragma once -#include "miniwin_d3drm_p.h" #include "miniwin_d3drmobject_p.h" +class Direct3DRMTextureImpl; +class Direct3DRMLightArrayImpl; +class Direct3DRMVisualArrayImpl; +class Direct3DRMFrameArrayImpl; + struct Direct3DRMFrameImpl : public Direct3DRMObjectBase { - Direct3DRMFrameImpl(); + Direct3DRMFrameImpl(Direct3DRMFrameImpl* parent = nullptr); ~Direct3DRMFrameImpl() override; HRESULT QueryInterface(const GUID& riid, void** ppvObject) override; HRESULT AddChild(IDirect3DRMFrame* child) override; @@ -13,7 +17,7 @@ struct Direct3DRMFrameImpl : public Direct3DRMObjectBase { HRESULT AddLight(IDirect3DRMLight* light) override; HRESULT GetLights(IDirect3DRMLightArray** lightArray) override; HRESULT AddTransform(D3DRMCOMBINETYPE combine, D3DRMMATRIX4D matrix) override; - HRESULT GetPosition(int index, D3DVECTOR* position) override; + HRESULT GetPosition(IDirect3DRMFrame* reference, D3DVECTOR* position) override; HRESULT AddVisual(IDirect3DRMVisual* visual) override; HRESULT DeleteVisual(IDirect3DRMVisual* visual) override; HRESULT GetVisuals(IDirect3DRMVisualArray** visuals) override; @@ -25,11 +29,24 @@ struct Direct3DRMFrameImpl : public Direct3DRMObjectBase { HRESULT SetMaterialMode(D3DRMMATERIALMODE mode) override; HRESULT GetChildren(IDirect3DRMFrameArray** children) override; - D3DCOLOR m_backgroundColor = 0xFF000000; - private: - IDirect3DRMFrameArray* m_children; - IDirect3DRMLightArray* m_lights; - IDirect3DRMVisualArray* m_visuals; - IDirect3DRMTexture* m_texture = nullptr; + Direct3DRMFrameImpl* m_parent{}; + Direct3DRMFrameArrayImpl* m_children{}; + Direct3DRMLightArrayImpl* m_lights{}; + Direct3DRMVisualArrayImpl* m_visuals{}; + Direct3DRMTextureImpl* m_texture{}; + D3DRMMATRIX4D m_transform = + {{1.f, 0.f, 0.f, 0.f}, {0.f, 1.f, 0.f, 0.f}, {0.f, 0.f, 1.f, 0.f}, {0.f, 0.f, 0.f, 1.f}}; + + D3DCOLOR m_backgroundColor = 0xFF000000; + D3DCOLOR m_color = 0xffffff; + + friend class Direct3DRMViewportImpl; +}; + +struct Direct3DRMFrameArrayImpl + : public Direct3DRMArrayBase { + using Direct3DRMArrayBase::Direct3DRMArrayBase; + + friend class Direct3DRMFrameImpl; }; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h b/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h index 5be46945..6bb68ace 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h @@ -1,6 +1,8 @@ #pragma once +#include "miniwin_d3drm_p.h" #include "miniwin_d3drmobject_p.h" +#include "miniwin_p.h" struct Direct3DRMLightImpl : public Direct3DRMObjectBase { Direct3DRMLightImpl(float r, float g, float b); @@ -9,3 +11,8 @@ struct Direct3DRMLightImpl : public Direct3DRMObjectBase { private: D3DCOLOR m_color = 0xFFFFFFFF; }; + +struct Direct3DRMLightArrayImpl + : public Direct3DRMArrayBase { + using Direct3DRMArrayBase::Direct3DRMArrayBase; +}; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmtexture_p.h b/miniwin/miniwin/src/include/miniwin_d3drmtexture_p.h new file mode 100644 index 00000000..55405e1d --- /dev/null +++ b/miniwin/miniwin/src/include/miniwin_d3drmtexture_p.h @@ -0,0 +1,8 @@ +#pragma once + +#include "miniwin_d3drmobject_p.h" + +struct Direct3DRMTextureImpl : public Direct3DRMObjectBase { + HRESULT QueryInterface(const GUID& riid, void** ppvObject) override; + HRESULT Changed(BOOL pixels, BOOL palette) override; +}; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h b/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h index 59870494..b4c16776 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h @@ -1,11 +1,13 @@ #pragma once #include "miniwin_d3drm.h" -#include "miniwin_d3drmdevice_p.h" #include "miniwin_d3drmobject_p.h" #include +class Direct3DRMDeviceImpl; +class Direct3DRMFrameImpl; + struct Direct3DRMViewportImpl : public Direct3DRMObjectBase { Direct3DRMViewportImpl( DWORD width, @@ -58,4 +60,12 @@ struct Direct3DRMViewportImpl : public Direct3DRMObjectBase SDL_GPUTransferBuffer* m_downloadTransferBuffer; SDL_GPUBuffer* m_vertexBuffer = nullptr; SDL_Surface* m_renderedImage = nullptr; + D3DVALUE m_front = 1.f; + D3DVALUE m_back = 10.f; + D3DVALUE m_field = 0.5f; +}; + +struct Direct3DRMViewportArrayImpl + : public Direct3DRMArrayBase { + using Direct3DRMArrayBase::Direct3DRMArrayBase; }; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmvisual_p.h b/miniwin/miniwin/src/include/miniwin_d3drmvisual_p.h new file mode 100644 index 00000000..89510645 --- /dev/null +++ b/miniwin/miniwin/src/include/miniwin_d3drmvisual_p.h @@ -0,0 +1,9 @@ +#pragma once + +#include "miniwin_d3drm.h" +#include "miniwin_d3drmobject_p.h" + +struct Direct3DRMVisualArrayImpl + : public Direct3DRMArrayBase { + using Direct3DRMArrayBase::Direct3DRMArrayBase; +}; diff --git a/miniwin/miniwin/src/include/miniwin_math_p.h b/miniwin/miniwin/src/include/miniwin_math_p.h new file mode 100644 index 00000000..6f70f09b --- /dev/null +++ b/miniwin/miniwin/src/include/miniwin_math_p.h @@ -0,0 +1 @@ +#pragma once diff --git a/miniwin/miniwin/src/miniwin_d3drm.cpp b/miniwin/miniwin/src/miniwin_d3drm.cpp index b99fad67..c659c6ba 100644 --- a/miniwin/miniwin/src/miniwin_d3drm.cpp +++ b/miniwin/miniwin/src/miniwin_d3drm.cpp @@ -2,10 +2,12 @@ #include "ShaderIndex.h" #include "miniwin_d3drm_p.h" +#include "miniwin_d3drmdevice_p.h" #include "miniwin_d3drmframe_p.h" #include "miniwin_d3drmlight_p.h" #include "miniwin_d3drmmesh_p.h" #include "miniwin_d3drmobject_p.h" +#include "miniwin_d3drmtexture_p.h" #include "miniwin_d3drmviewport_p.h" #include "miniwin_ddsurface_p.h" #include "miniwin_p.h" @@ -75,24 +77,6 @@ struct Direct3DRMWinDeviceImpl : public IDirect3DRMWinDevice { void HandlePaint(void* p_dc) override { MINIWIN_NOT_IMPLEMENTED(); } }; -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; - } - MINIWIN_NOT_IMPLEMENTED(); - return E_NOINTERFACE; - } - HRESULT Changed(BOOL pixels, BOOL palette) override - { - MINIWIN_NOT_IMPLEMENTED(); - return DD_OK; - } -}; - struct Direct3DRMMaterialImpl : public Direct3DRMObjectBase {}; SDL_GPUGraphicsPipeline* InitializeGraphicsPipeline(SDL_GPUDevice* device) @@ -241,11 +225,8 @@ struct Direct3DRMImpl : virtual public IDirect3DRM2 { } HRESULT CreateFrame(IDirect3DRMFrame* parent, IDirect3DRMFrame2** outFrame) override { - auto frame = new Direct3DRMFrameImpl; - *outFrame = static_cast(frame); - if (parent) { - parent->AddChild(static_cast(frame)); - } + auto parentImpl = static_cast(parent); + *outFrame = static_cast(new Direct3DRMFrameImpl{parentImpl}); return DD_OK; } HRESULT CreateViewport( diff --git a/miniwin/miniwin/src/miniwin_d3drmdevice.cpp b/miniwin/miniwin/src/miniwin_d3drmdevice.cpp index d97433b7..f03e10b1 100644 --- a/miniwin/miniwin/src/miniwin_d3drmdevice.cpp +++ b/miniwin/miniwin/src/miniwin_d3drmdevice.cpp @@ -1,5 +1,6 @@ #include "miniwin_d3drm.h" #include "miniwin_d3drm_p.h" +#include "miniwin_d3drmdevice_p.h" #include "miniwin_d3drmobject_p.h" #include "miniwin_d3drmviewport_p.h" #include "miniwin_p.h" diff --git a/miniwin/miniwin/src/miniwin_d3drmframe.cpp b/miniwin/miniwin/src/miniwin_d3drmframe.cpp index 5534ec32..b034a95e 100644 --- a/miniwin/miniwin/src/miniwin_d3drmframe.cpp +++ b/miniwin/miniwin/src/miniwin_d3drmframe.cpp @@ -1,7 +1,13 @@ +#include "miniwin_d3drm_p.h" #include "miniwin_d3drmframe_p.h" +#include "miniwin_d3drmlight_p.h" +#include "miniwin_d3drmtexture_p.h" +#include "miniwin_d3drmvisual_p.h" #include "miniwin_p.h" -Direct3DRMFrameImpl::Direct3DRMFrameImpl() +#include + +Direct3DRMFrameImpl::Direct3DRMFrameImpl(Direct3DRMFrameImpl* parent) { m_children = new Direct3DRMFrameArrayImpl; m_children->AddRef(); @@ -9,6 +15,9 @@ Direct3DRMFrameImpl::Direct3DRMFrameImpl() m_lights->AddRef(); m_visuals = new Direct3DRMVisualArrayImpl; m_visuals->AddRef(); + if (parent) { + parent->AddChild(this); + } } Direct3DRMFrameImpl::~Direct3DRMFrameImpl() @@ -37,12 +46,32 @@ HRESULT Direct3DRMFrameImpl::QueryInterface(const GUID& riid, void** ppvObject) HRESULT Direct3DRMFrameImpl::AddChild(IDirect3DRMFrame* child) { + if (!child) { + return DDERR_GENERIC; + } + Direct3DRMFrameImpl* childImpl = static_cast(child); + if (childImpl->m_parent) { + if (childImpl->m_parent == this) { + return DD_OK; + } + auto result = childImpl->m_parent->m_children->DeleteElement(childImpl); + SDL_assert(result == DD_OK); + } + childImpl->m_parent = this; return m_children->AddElement(child); } HRESULT Direct3DRMFrameImpl::DeleteChild(IDirect3DRMFrame* child) { - return m_children->DeleteElement(child); + Direct3DRMFrameImpl* childImpl = static_cast(child); + if (!childImpl) { + return DDERR_GENERIC; + } + HRESULT result = m_children->DeleteElement(childImpl); + if (result == DD_OK) { + childImpl->m_parent = nullptr; + } + return result; } HRESULT Direct3DRMFrameImpl::SetSceneBackgroundRGB(float r, float g, float b) @@ -66,18 +95,31 @@ HRESULT Direct3DRMFrameImpl::GetLights(IDirect3DRMLightArray** lightArray) HRESULT Direct3DRMFrameImpl::AddTransform(D3DRMCOMBINETYPE combine, D3DRMMATRIX4D matrix) { - MINIWIN_NOT_IMPLEMENTED(); - return DD_OK; + switch (combine) { + case D3DRMCOMBINETYPE::REPLACE: + std::memcpy(m_transform, matrix, sizeof(m_transform)); + return DD_OK; + default: + MINIWIN_NOT_IMPLEMENTED(); + return DDERR_GENERIC; + } } -HRESULT Direct3DRMFrameImpl::GetPosition(int index, D3DVECTOR* position) +HRESULT Direct3DRMFrameImpl::GetPosition(IDirect3DRMFrame* reference, D3DVECTOR* position) { - MINIWIN_NOT_IMPLEMENTED(); + if (reference) { + MINIWIN_NOT_IMPLEMENTED(); + return DDERR_GENERIC; + } + position->x = m_transform[3][0] / m_transform[3][3]; + position->y = m_transform[3][1] / m_transform[3][3]; + position->z = m_transform[3][2] / m_transform[3][3]; return DD_OK; } HRESULT Direct3DRMFrameImpl::AddVisual(IDirect3DRMVisual* visual) { + SDL_assert(false); // Is this actually used? return m_visuals->AddElement(visual); } @@ -95,11 +137,15 @@ HRESULT Direct3DRMFrameImpl::GetVisuals(IDirect3DRMVisualArray** visuals) HRESULT Direct3DRMFrameImpl::SetTexture(IDirect3DRMTexture* texture) { + if (!texture) { + return DDERR_GENERIC; + } + auto textureImpl = static_cast(texture); if (m_texture) { m_texture->Release(); } - m_texture = texture; + m_texture = textureImpl; m_texture->AddRef(); return DD_OK; } @@ -111,26 +157,28 @@ HRESULT Direct3DRMFrameImpl::GetTexture(IDirect3DRMTexture** texture) } *texture = m_texture; - m_texture->AddRef(); + if (m_texture) { + m_texture->AddRef(); + } return DD_OK; } HRESULT Direct3DRMFrameImpl::SetColor(float r, float g, float b, float a) { - MINIWIN_NOT_IMPLEMENTED(); + m_color = (static_cast(a * 255.0f) << 24) | (static_cast(r * 255.0f) << 16) | + (static_cast(g * 255.0f) << 8) | (static_cast(b * 255.0f)); return DD_OK; } -HRESULT Direct3DRMFrameImpl::SetColor(D3DCOLOR) +HRESULT Direct3DRMFrameImpl::SetColor(D3DCOLOR c) { - MINIWIN_NOT_IMPLEMENTED(); + m_color = c; return DD_OK; } HRESULT Direct3DRMFrameImpl::SetColorRGB(float r, float g, float b) { - MINIWIN_NOT_IMPLEMENTED(); - return DD_OK; + return SetColor(r, g, b, 1.f); } HRESULT Direct3DRMFrameImpl::SetMaterialMode(D3DRMMATERIALMODE mode) diff --git a/miniwin/miniwin/src/miniwin_d3drmtexture.cpp b/miniwin/miniwin/src/miniwin_d3drmtexture.cpp new file mode 100644 index 00000000..2ebebde2 --- /dev/null +++ b/miniwin/miniwin/src/miniwin_d3drmtexture.cpp @@ -0,0 +1,19 @@ +#include "miniwin_d3drmtexture_p.h" +#include "miniwin_p.h" + +HRESULT Direct3DRMTextureImpl::QueryInterface(const GUID& riid, void** ppvObject) +{ + if (SDL_memcmp(&riid, &IID_IDirect3DRMTexture2, sizeof(GUID)) == 0) { + this->IUnknown::AddRef(); + *ppvObject = static_cast(this); + return DD_OK; + } + MINIWIN_NOT_IMPLEMENTED(); + return E_NOINTERFACE; +} + +HRESULT Direct3DRMTextureImpl::Changed(BOOL pixels, BOOL palette) +{ + MINIWIN_NOT_IMPLEMENTED(); + return DD_OK; +}