diff --git a/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h b/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h index f74e796e..1860a2c6 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drmframe_p.h @@ -28,6 +28,8 @@ 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; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h b/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h index c29507ec..7ed00d5b 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drmlight_p.h @@ -4,4 +4,7 @@ struct Direct3DRMLightImpl : public Direct3DRMObjectBase { HRESULT SetColorRGB(float r, float g, float b) override; + +private: + D3DCOLOR m_color = 0xFFFFFFFF; }; diff --git a/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h b/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h index db3faf9c..fab3655b 100644 --- a/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h +++ b/miniwin/miniwin/src/include/miniwin_d3drmviewport_p.h @@ -38,13 +38,14 @@ struct Direct3DRMViewportImpl : public Direct3DRMObjectBase HRESULT InverseTransform(D3DVECTOR* world, D3DRMVECTOR4D* screen) override; HRESULT Pick(float x, float y, LPDIRECT3DRMPICKEDARRAY* pickedArray) override; void CloseDevice(); - void Update(); + void CollectSceneData(IDirect3DRMFrame* group); + void PushVertices(const PositionColorVertex* vertices, size_t count); private: void FreeDeviceResources(); int m_vertexBufferCount = 0; int m_vertexCount; - bool m_updated = false; + D3DCOLOR m_backgroundColor = 0xFF000000; DWORD m_width; DWORD m_height; IDirect3DRMFrame* m_camera = nullptr; diff --git a/miniwin/miniwin/src/miniwin_d3drmdevice.cpp b/miniwin/miniwin/src/miniwin_d3drmdevice.cpp index 9303b0e6..b9125cc8 100644 --- a/miniwin/miniwin/src/miniwin_d3drmdevice.cpp +++ b/miniwin/miniwin/src/miniwin_d3drmdevice.cpp @@ -105,12 +105,7 @@ D3DRMRENDERMODE Direct3DRMDevice2Impl::GetRenderMode() HRESULT Direct3DRMDevice2Impl::Update() { - for (int i = 0; i < m_viewports->GetSize(); i++) { - IDirect3DRMViewport* viewport; - m_viewports->GetElement(i, &viewport); - static_cast(viewport)->Update(); - } - + MINIWIN_NOT_IMPLEMENTED(); return DD_OK; } diff --git a/miniwin/miniwin/src/miniwin_d3drmframe.cpp b/miniwin/miniwin/src/miniwin_d3drmframe.cpp index b28ee162..948ed96d 100644 --- a/miniwin/miniwin/src/miniwin_d3drmframe.cpp +++ b/miniwin/miniwin/src/miniwin_d3drmframe.cpp @@ -33,7 +33,8 @@ HRESULT Direct3DRMFrameImpl::DeleteChild(IDirect3DRMFrame* child) HRESULT Direct3DRMFrameImpl::SetSceneBackgroundRGB(float r, float g, float b) { - MINIWIN_NOT_IMPLEMENTED(); + m_backgroundColor = (0xFF << 24) | (static_cast(r * 255.0f) << 16) | (static_cast(g * 255.0f) << 8) | + (static_cast(b * 255.0f)); return DD_OK; } diff --git a/miniwin/miniwin/src/miniwin_d3drmlight.cpp b/miniwin/miniwin/src/miniwin_d3drmlight.cpp index 4ee1491d..b764dd59 100644 --- a/miniwin/miniwin/src/miniwin_d3drmlight.cpp +++ b/miniwin/miniwin/src/miniwin_d3drmlight.cpp @@ -3,6 +3,7 @@ HRESULT Direct3DRMLightImpl::SetColorRGB(float r, float g, float b) { - MINIWIN_NOT_IMPLEMENTED(); + m_color = (0xFF << 24) | (static_cast(r * 255.0f) << 16) | (static_cast(g * 255.0f) << 8) | + (static_cast(b * 255.0f)); return DD_OK; } diff --git a/miniwin/miniwin/src/miniwin_d3drmviewport.cpp b/miniwin/miniwin/src/miniwin_d3drmviewport.cpp index 8f6da35b..27905bb1 100644 --- a/miniwin/miniwin/src/miniwin_d3drmviewport.cpp +++ b/miniwin/miniwin/src/miniwin_d3drmviewport.cpp @@ -1,4 +1,5 @@ #include "miniwin_d3drm_p.h" +#include "miniwin_d3drmframe_p.h" #include "miniwin_d3drmviewport_p.h" #include "miniwin_p.h" @@ -28,22 +29,30 @@ Direct3DRMViewportImpl::~Direct3DRMViewportImpl() FreeDeviceResources(); } -void Direct3DRMViewportImpl::Update() +void Direct3DRMViewportImpl::CollectSceneData(IDirect3DRMFrame* group) { - int newVertexCount = 3; + m_backgroundColor = static_cast(group)->m_backgroundColor; - if (newVertexCount > m_vertexBufferCount) { + std::vector vertices = + {{-1, -1, 0, 0, 255, 0, 255}, {1, -1, 0, 0, 0, 255, 255}, {0, 1, 0, 255, 0, 0, 128}}; + + PushVertices(vertices.data(), vertices.size()); +} + +void Direct3DRMViewportImpl::PushVertices(const PositionColorVertex* vertices, size_t count) +{ + if (count > m_vertexBufferCount) { if (m_vertexBuffer) { SDL_ReleaseGPUBuffer(m_device, m_vertexBuffer); } SDL_GPUBufferCreateInfo bufferCreateInfo = {}; bufferCreateInfo.usage = SDL_GPU_BUFFERUSAGE_VERTEX; - bufferCreateInfo.size = static_cast(sizeof(PositionColorVertex) * newVertexCount); + bufferCreateInfo.size = static_cast(sizeof(PositionColorVertex) * count); m_vertexBuffer = SDL_CreateGPUBuffer(m_device, &bufferCreateInfo); - m_vertexBufferCount = newVertexCount; + m_vertexBufferCount = count; } - m_vertexCount = newVertexCount; + m_vertexCount = count; MINIWIN_NOT_IMPLEMENTED(); SDL_GPUTransferBufferCreateInfo transferCreateInfo = {}; @@ -54,9 +63,7 @@ void Direct3DRMViewportImpl::Update() PositionColorVertex* transferData = (PositionColorVertex*) SDL_MapGPUTransferBuffer(m_device, transferBuffer, false); - transferData[0] = {-1, -1, 0, 255, 0, 0, 255}; - transferData[1] = {1, -1, 0, 0, 0, 255, 255}; - transferData[2] = {0, 1, 0, 0, 255, 0, 128}; + memcpy(transferData, vertices, m_vertexCount * sizeof(PositionColorVertex)); SDL_UnmapGPUTransferBuffer(m_device, transferBuffer); @@ -77,20 +84,16 @@ void Direct3DRMViewportImpl::Update() SDL_EndGPUCopyPass(copyPass); SDL_SubmitGPUCommandBuffer(uploadCmdBuf); SDL_ReleaseGPUTransferBuffer(m_device, transferBuffer); - - m_updated = true; } HRESULT Direct3DRMViewportImpl::Render(IDirect3DRMFrame* group) { - if (!m_updated) { - return DDERR_GENERIC; - } - if (!m_device) { return DDERR_GENERIC; } + CollectSceneData(group); + SDL_GPUCommandBuffer* cmdbuf = SDL_AcquireGPUCommandBuffer(m_device); if (cmdbuf == NULL) { return DDERR_GENERIC; @@ -133,8 +136,6 @@ HRESULT Direct3DRMViewportImpl::Render(IDirect3DRMFrame* group) return DDERR_GENERIC; } - m_updated = false; - SDL_DestroySurface(m_renderedImage); m_renderedImage = SDL_CreateSurfaceFrom( DDBackBuffer->w, @@ -188,7 +189,16 @@ HRESULT Direct3DRMViewportImpl::ForceUpdate(int x, int y, int w, int h) HRESULT Direct3DRMViewportImpl::Clear() { - MINIWIN_NOT_IMPLEMENTED(); + if (!DDBackBuffer) { + return DDERR_GENERIC; + } + + uint8_t r = (m_backgroundColor >> 16) & 0xFF; + uint8_t g = (m_backgroundColor >> 8) & 0xFF; + uint8_t b = m_backgroundColor & 0xFF; + + Uint32 color = SDL_MapRGB(SDL_GetPixelFormatDetails(DDBackBuffer->format), nullptr, r, g, b); + SDL_FillSurfaceRect(DDBackBuffer, NULL, color); return DD_OK; }