#pragma once #include "d3drmrenderer.h" #include "d3drmtexture_impl.h" #include "ddraw_impl.h" #include #include #include DEFINE_GUID(SOFTWARE_GUID, 0x682656F3, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02); struct TextureCache { Direct3DRMTextureImpl* texture; Uint8 version; SDL_Surface* cached; }; class Direct3DRMSoftwareRenderer : public Direct3DRMRenderer { public: Direct3DRMSoftwareRenderer(DWORD width, DWORD height); void SetBackbuffer(SDL_Surface* backbuffer) override; void PushVertices(const PositionColorVertex* vertices, size_t count) override; void PushLights(const SceneLight* vertices, size_t count) override; Uint32 GetTextureId(IDirect3DRMTexture* texture) override; void SetProjection(D3DRMMATRIX4D perspective, D3DVALUE front, D3DVALUE back) override; DWORD GetWidth() override; DWORD GetHeight() override; void GetDesc(D3DDEVICEDESC* halDesc, D3DDEVICEDESC* helDesc) override; const char* GetName() override; HRESULT Render() override; private: void ClearZBuffer(); void DrawTriangleProjected(const PositionColorVertex&, const PositionColorVertex&, const PositionColorVertex&); void DrawTriangleClipped( const PositionColorVertex& v0, const PositionColorVertex& v1, const PositionColorVertex& v2 ); void ProjectVertex(const PositionColorVertex& v, D3DRMVECTOR4D& p) const; void BlendPixel(Uint8* pixelAddr, Uint8 r, Uint8 g, Uint8 b, Uint8 a); SDL_Color ApplyLighting(const PositionColorVertex& vertex); void AddTextureDestroyCallback(Uint32 id, IDirect3DRMTexture* texture); DWORD m_width; DWORD m_height; SDL_Surface* m_backbuffer = nullptr; SDL_Palette* m_palette; const SDL_PixelFormatDetails* m_format; int m_bytesPerPixel; std::vector m_lights; std::vector m_textures; D3DVALUE m_front; D3DVALUE m_back; std::vector m_vertexBuffer; float proj[4][4] = {0}; std::vector m_zBuffer; }; inline static void Direct3DRMSoftware_EnumDevice(LPD3DENUMDEVICESCALLBACK cb, void* ctx) { Direct3DRMRenderer* device = nullptr; device = new Direct3DRMSoftwareRenderer(640, 480); EnumDevice(cb, ctx, device, SOFTWARE_GUID); delete device; }