From a82a338795a7bc281b746d4b85525c8fa0206b51 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Tue, 16 Jun 2020 15:11:30 +0200 Subject: [PATCH] Refactored Index/Vertex Buffer Now uses ComPtr --- TR5Main/Renderer/CameraMatrixBuffer.h | 23 +++- TR5Main/Renderer/IndexBuffer.cpp | 19 +++ TR5Main/Renderer/IndexBuffer.h | 12 ++ TR5Main/Renderer/Renderer11.cpp | 43 ++----- TR5Main/Renderer/Renderer11.h | 129 ++----------------- TR5Main/Renderer/Renderer11Compatibility.cpp | 12 +- TR5Main/Renderer/Renderer11Draw.cpp | 38 +++--- TR5Main/Renderer/Renderer11Draw2D.cpp | 8 +- TR5Main/Renderer/Renderer11DrawEffect.cpp | 5 +- TR5Main/Renderer/Renderer11Frame.cpp | 8 ++ TR5Main/Renderer/Renderer11Init.cpp | 1 + TR5Main/Renderer/Renderer11Lara.cpp | 5 +- TR5Main/Renderer/Utils.cpp | 9 ++ TR5Main/Renderer/Utils.h | 9 ++ TR5Main/Renderer/VertexBuffer.cpp | 18 +++ TR5Main/Renderer/VertexBuffer.h | 17 +++ TR5Main/Shaders/CameraMatrixBuffer.hlsli | 10 +- TR5Main/Shaders/DX11_Rooms.fx | 4 +- TR5Main/TR5Main.vcxproj | 8 ++ TR5Main/TR5Main.vcxproj.filters | 18 +++ 20 files changed, 207 insertions(+), 189 deletions(-) create mode 100644 TR5Main/Renderer/IndexBuffer.cpp create mode 100644 TR5Main/Renderer/IndexBuffer.h create mode 100644 TR5Main/Renderer/Utils.cpp create mode 100644 TR5Main/Renderer/Utils.h create mode 100644 TR5Main/Renderer/VertexBuffer.cpp create mode 100644 TR5Main/Renderer/VertexBuffer.h diff --git a/TR5Main/Renderer/CameraMatrixBuffer.h b/TR5Main/Renderer/CameraMatrixBuffer.h index b036ce745..c151bc95f 100644 --- a/TR5Main/Renderer/CameraMatrixBuffer.h +++ b/TR5Main/Renderer/CameraMatrixBuffer.h @@ -1,9 +1,20 @@ #pragma once #include -struct alignas(16) CCameraMatrixBuffer -{ - DirectX::SimpleMath::Matrix ViewProjection; - unsigned int Frame; - int CameraUnderwater; -}; +namespace T5M { + namespace Renderer { + using DirectX::SimpleMath::Matrix; + struct alignas(16) CCameraMatrixBuffer + { + Matrix ViewProjection; + Matrix View; + Matrix Projection; + Vector3 WorldPosition; + Vector3 WorldDirection; + Vector2 ViewSize; + Vector2 InvViewSize; + alignas(16) int Frame; + alignas(16) int CameraUnderwater; + }; + } +} diff --git a/TR5Main/Renderer/IndexBuffer.cpp b/TR5Main/Renderer/IndexBuffer.cpp new file mode 100644 index 000000000..1673de715 --- /dev/null +++ b/TR5Main/Renderer/IndexBuffer.cpp @@ -0,0 +1,19 @@ +#include "IndexBuffer.h" + +using Microsoft::WRL::ComPtr; +using T5M::Renderer::Utils::throwIfFailed; + +IndexBuffer::IndexBuffer(ID3D11Device* device, int numIndices, int* indices) +{ + HRESULT res; + D3D11_BUFFER_DESC desc = {}; + + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = sizeof(int) * numIndices; + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = indices; + initData.SysMemPitch = sizeof(int) * numIndices; + throwIfFailed(device->CreateBuffer(&desc, &initData, &Buffer)); +} diff --git a/TR5Main/Renderer/IndexBuffer.h b/TR5Main/Renderer/IndexBuffer.h new file mode 100644 index 000000000..47c5d1587 --- /dev/null +++ b/TR5Main/Renderer/IndexBuffer.h @@ -0,0 +1,12 @@ +#pragma once +#include +#include "Utils.h" +#include + +class IndexBuffer +{ +public: + Microsoft::WRL::ComPtr Buffer; + IndexBuffer() {}; + IndexBuffer(ID3D11Device* device, int numIndices, int* indices); +}; diff --git a/TR5Main/Renderer/Renderer11.cpp b/TR5Main/Renderer/Renderer11.cpp index ad559b50a..42798bb41 100644 --- a/TR5Main/Renderer/Renderer11.cpp +++ b/TR5Main/Renderer/Renderer11.cpp @@ -18,6 +18,9 @@ #include "misc.h" #include "footprint.h" #include "setup.h" +#include "Utils.h" +#include "VertexBuffer.h" +using namespace T5M::Renderer::Utils; Renderer11* g_Renderer; Renderer11::Renderer11() { @@ -102,12 +105,6 @@ void Renderer11::FreeRendererData() DX11_DELETE(m_textureAtlas); DX11_DELETE(m_skyTexture); - DX11_DELETE(m_roomsVertexBuffer); - DX11_DELETE(m_roomsIndexBuffer); - DX11_DELETE(m_moveablesVertexBuffer); - DX11_DELETE(m_moveablesIndexBuffer); - DX11_DELETE(m_staticsVertexBuffer); - DX11_DELETE(m_staticsIndexBuffer); } void Renderer11::clearSceneItems() @@ -150,18 +147,13 @@ ID3D11VertexShader* Renderer11::compileVertexShader(const wchar_t * fileName, co printf("Compiling vertex shader: %s\n", fileName); UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR; - res = D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, function, model, flags, 0, bytecode, &errors); - if (FAILED(res)) - { - printf("Compilation failed: %s\n", errors->GetBufferPointer()); - return NULL; - } + throwIfFailed(res); + ID3D11VertexShader* shader = NULL; res = m_device->CreateVertexShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), NULL, &shader); - if (FAILED(res)) - return NULL; + throwIfFailed(res); return shader; } @@ -175,18 +167,10 @@ ID3D11PixelShader* Renderer11::compilePixelShader(const wchar_t * fileName, cons printf("Compiling pixel shader: %s\n", fileName); UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR; - res = D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, function, model, flags, 0, bytecode, &errors); - if (FAILED(res)) - { - printf("Compilation failed: %s\n", errors->GetBufferPointer()); - return NULL; - } + throwIfFailed(D3DCompileFromFile(fileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, function, model, flags, 0, bytecode, &errors)) ; ID3D11PixelShader* shader = NULL; - res = m_device->CreatePixelShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), NULL, &shader); - if (FAILED(res)) - return NULL; - + throwIfFailed(m_device->CreatePixelShader((*bytecode)->GetBufferPointer(), (*bytecode)->GetBufferSize(), NULL, &shader)) ; return shader; } @@ -253,9 +237,6 @@ ID3D11Buffer* Renderer11::createConstantBuffer(size_t size) return buffer; } - - - RendererHUDBar::RendererHUDBar(ID3D11Device* m_device,int x, int y, int w, int h, int borderSize, array colors) { array barVertices = { @@ -367,8 +348,8 @@ RendererHUDBar::RendererHUDBar(ID3D11Device* m_device,int x, int y, int w, int h vertices[i].Normal = Vector3(0, 0, 0); vertices[i].Bone = 0.0f; } - vertexBuffer = VertexBuffer::Create(m_device, vertices.size(), vertices.data()); - indexBuffer = IndexBuffer::Create(m_device, barIndices.size(), barIndices.data()); + vertexBuffer = VertexBuffer(m_device, vertices.size(), vertices.data()); + indexBuffer = IndexBuffer(m_device, barIndices.size(), barIndices.data()); array verticesBorder; for (int i = 0; i < barBorderVertices.size(); i++) { @@ -378,7 +359,7 @@ RendererHUDBar::RendererHUDBar(ID3D11Device* m_device,int x, int y, int w, int h verticesBorder[i].Normal = Vector3(0, 0, 0); verticesBorder[i].Bone = 0.0f; } - vertexBufferBorder = VertexBuffer::Create(m_device, verticesBorder.size(), verticesBorder.data()); - indexBufferBorder = IndexBuffer::Create(m_device, barBorderIndices.size(), barBorderIndices.data()); + vertexBufferBorder = VertexBuffer(m_device, verticesBorder.size(), verticesBorder.data()); + indexBufferBorder = IndexBuffer(m_device, barBorderIndices.size(), barBorderIndices.data()); } diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index ba50cc9c0..79d01560e 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -13,6 +13,8 @@ #include "items.h" #include "effect.h" +#include +#include "VertexBuffer.h" #define MESH_BITS(x) (1 << x) #define DX11_RELEASE(x) if (x != NULL) x->Release() @@ -231,118 +233,13 @@ public: } }; -class VertexBuffer -{ -public: - ID3D11Buffer* Buffer; - - VertexBuffer() - { - - } - - ~VertexBuffer() - { - DX11_RELEASE(Buffer); - } - - static VertexBuffer* Create(ID3D11Device* device, int numVertices, RendererVertex* vertices) - { - HRESULT res; - - VertexBuffer* vb = new VertexBuffer(); - - D3D11_BUFFER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = sizeof(RendererVertex) * numVertices; - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - res = device->CreateBuffer(&desc, NULL, &vb->Buffer); - if (FAILED(res)) - return NULL; - - if (vertices != NULL) - { - ID3D11DeviceContext* context = NULL; - device->GetImmediateContext(&context); - - D3D11_MAPPED_SUBRESOURCE ms; - - res = context->Map(vb->Buffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); - if (FAILED(res)) - return NULL; - - memcpy(ms.pData, vertices, sizeof(RendererVertex) * numVertices); - - context->Unmap(vb->Buffer, NULL); - } - - return vb; - } -}; - -class IndexBuffer -{ -public: - ID3D11Buffer* Buffer; - - IndexBuffer() - { - - } - - ~IndexBuffer() - { - DX11_RELEASE(Buffer); - } - - static IndexBuffer* Create(ID3D11Device* device, int numIndices, int* indices) - { - HRESULT res; - - IndexBuffer* ib = new IndexBuffer(); - - D3D11_BUFFER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = sizeof(int) * numIndices; - desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - res = device->CreateBuffer(&desc, NULL, &ib->Buffer); - if (FAILED(res)) - return NULL; - - if (indices != NULL) - { - ID3D11DeviceContext* context = NULL; - device->GetImmediateContext(&context); - - D3D11_MAPPED_SUBRESOURCE ms; - - res = context->Map(ib->Buffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); - if (FAILED(res)) - return NULL; - - memcpy(ms.pData, indices, sizeof(int) * numIndices); - - context->Unmap(ib->Buffer, NULL); - } - - return ib; - } -}; typedef struct RendererHUDBar { - VertexBuffer* vertexBufferBorder; - IndexBuffer* indexBufferBorder; - VertexBuffer* vertexBuffer; - IndexBuffer* indexBuffer; + VertexBuffer vertexBufferBorder; + IndexBuffer indexBufferBorder; + VertexBuffer vertexBuffer; + IndexBuffer indexBuffer; /* Initialises a new Bar for rendering. the Coordinates are set in the Reference Resolution (default 800x600). The colors are setup like this @@ -677,7 +574,7 @@ private: // Constant buffers - CCameraMatrixBuffer m_stCameraMatrices; + T5M::Renderer::CCameraMatrixBuffer m_stCameraMatrices; ID3D11Buffer* m_cbCameraMatrices; CItemBuffer m_stItem; ID3D11Buffer* m_cbItem; @@ -715,12 +612,12 @@ private: Texture2D* m_textureAtlas; Texture2D* m_skyTexture; Texture2D* m_logo; - VertexBuffer* m_roomsVertexBuffer; - IndexBuffer* m_roomsIndexBuffer; - VertexBuffer* m_moveablesVertexBuffer; - IndexBuffer* m_moveablesIndexBuffer; - VertexBuffer* m_staticsVertexBuffer; - IndexBuffer* m_staticsIndexBuffer; + VertexBuffer m_roomsVertexBuffer; + IndexBuffer m_roomsIndexBuffer; + VertexBuffer m_moveablesVertexBuffer; + IndexBuffer m_moveablesIndexBuffer; + VertexBuffer m_staticsVertexBuffer; + IndexBuffer m_staticsIndexBuffer; vector m_rooms; Matrix m_hairsMatrices[12]; short m_numHairVertices; diff --git a/TR5Main/Renderer/Renderer11Compatibility.cpp b/TR5Main/Renderer/Renderer11Compatibility.cpp index 16d9b3863..f3452919e 100644 --- a/TR5Main/Renderer/Renderer11Compatibility.cpp +++ b/TR5Main/Renderer/Renderer11Compatibility.cpp @@ -445,8 +445,8 @@ bool Renderer11::PrepareDataForTheRenderer() // Create a single vertex buffer and a single index buffer for all rooms // NOTICE: in theory, a 1,000,000 vertices scene should have a VB of 52 MB and an IB of 4 MB - m_roomsVertexBuffer = VertexBuffer::Create(m_device, roomVertices.size(), roomVertices.data()); - m_roomsIndexBuffer = IndexBuffer::Create(m_device, roomIndices.size(), roomIndices.data()); + m_roomsVertexBuffer = VertexBuffer(m_device, roomVertices.size(), roomVertices.data()); + m_roomsIndexBuffer = IndexBuffer(m_device, roomIndices.size(), roomIndices.data()); m_numHairVertices = 0; m_numHairIndices = 0; @@ -707,8 +707,8 @@ bool Renderer11::PrepareDataForTheRenderer() } // Create a single vertex buffer and a single index buffer for all moveables - m_moveablesVertexBuffer = VertexBuffer::Create(m_device, moveablesVertices.size(), moveablesVertices.data()); - m_moveablesIndexBuffer = IndexBuffer::Create(m_device, moveablesIndices.size(), moveablesIndices.data()); + m_moveablesVertexBuffer = VertexBuffer(m_device, moveablesVertices.size(), moveablesVertices.data()); + m_moveablesIndexBuffer = IndexBuffer(m_device, moveablesIndices.size(), moveablesIndices.data()); // Step 4: prepare static meshes vector staticsVertices; @@ -751,8 +751,8 @@ bool Renderer11::PrepareDataForTheRenderer() } // Create a single vertex buffer and a single index buffer for all statics - m_staticsVertexBuffer = VertexBuffer::Create(m_device, staticsVertices.size(), staticsVertices.data()); - m_staticsIndexBuffer = IndexBuffer::Create(m_device, staticsIndices.size(), staticsIndices.data()); + m_staticsVertexBuffer = VertexBuffer(m_device, staticsVertices.size(), staticsVertices.data()); + m_staticsIndexBuffer = IndexBuffer(m_device, staticsIndices.size(), staticsIndices.data()); // Step 5: prepare sprites m_sprites = (RendererSprite * *)malloc(sizeof(RendererSprite*) * g_NumSprites); diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 442679400..9d8be6da0 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -18,6 +18,8 @@ #include "tr5_rats_emitter.h" #include "tr5_bats_emitter.h" #include "tr5_spider_emitter.h" +#include "CameraMatrixBuffer.h" +using namespace T5M::Renderer; extern GUNSHELL_STRUCT Gunshells[MAX_GUNSHELL]; extern RendererHUDBar* g_DashBar; @@ -63,10 +65,10 @@ bool Renderer11::drawObjectOn2DPosition(short x, short y, short objectNum, short m_context->ClearDepthStencilView(m_currentRenderTarget->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); // Set vertex buffer - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set shaders m_context->VSSetShader(m_vsInventory, NULL, 0); @@ -232,10 +234,10 @@ bool Renderer11::drawShadowMap() m_context->VSSetShader(m_vsShadowMap, NULL, 0); m_context->PSSetShader(m_psShadowMap, NULL, 0); - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set texture m_context->PSSetShaderResources(0, 1, &m_textureAtlas->ShaderResourceView); @@ -491,10 +493,10 @@ int Renderer11::drawInventoryScene() UINT offset = 0; // Set vertex buffer - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set shaders m_context->VSSetShader(m_vsInventory, NULL, 0); @@ -1460,10 +1462,10 @@ bool Renderer11::drawRats() UINT stride = sizeof(RendererVertex); UINT offset = 0; - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); if (Objects[ID_RATS_EMITTER].loaded) { @@ -1512,10 +1514,10 @@ bool Renderer11::drawBats() UINT stride = sizeof(RendererVertex); UINT offset = 0; - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1,m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); if (Objects[ID_BATS_EMITTER].loaded) { @@ -2114,10 +2116,10 @@ bool Renderer11::drawItems(bool transparent, bool animated) int firstBucket = (transparent ? 2 : 0); int lastBucket = (transparent ? 4 : 2); - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); RendererItem * item = &m_items[Lara.itemNumber]; @@ -2257,10 +2259,10 @@ bool Renderer11::drawStatics(bool transparent) int firstBucket = (transparent ? 2 : 0); int lastBucket = (transparent ? 4 : 2); - m_context->IASetVertexBuffers(0, 1, &m_staticsVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_staticsVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_staticsIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_staticsIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); // Set shaders m_context->VSSetShader(m_vsStatics, NULL, 0); @@ -2324,10 +2326,10 @@ bool Renderer11::drawRooms(bool transparent, bool animated) if (!animated) { // Set vertex buffer - m_context->IASetVertexBuffers(0, 1, &m_roomsVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_roomsVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_roomsIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_roomsIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); } // Set shaders @@ -2551,10 +2553,10 @@ bool Renderer11::drawHorizonAndSky() // Draw horizon if (m_moveableObjects[ID_HORIZON] != NULL) { - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_context->PSSetShaderResources(0, 1, &m_textureAtlas->ShaderResourceView); sampler = m_states->AnisotropicClamp(); diff --git a/TR5Main/Renderer/Renderer11Draw2D.cpp b/TR5Main/Renderer/Renderer11Draw2D.cpp index c3e37ae68..c67c33846 100644 --- a/TR5Main/Renderer/Renderer11Draw2D.cpp +++ b/TR5Main/Renderer/Renderer11Draw2D.cpp @@ -83,9 +83,9 @@ bool Renderer11::DrawBar(float percent,const RendererHUDBar* const bar) float color[] = { 0,0,0,1.0f }; m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.0f, 0xFF); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetVertexBuffers(0, 1, &bar->vertexBufferBorder->Buffer, &strides, &offset); + m_context->IASetVertexBuffers(0, 1, bar->vertexBufferBorder.Buffer.GetAddressOf(), &strides, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetIndexBuffer(bar->indexBufferBorder->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(bar->indexBufferBorder.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_context->VSSetConstantBuffers(0, 1, &m_cbHUD); m_context->VSSetShader(m_vsHUD, NULL, 0); m_context->PSSetShaderResources(0, 1, &m_HUDBarBorderTexture->ShaderResourceView); @@ -100,9 +100,9 @@ bool Renderer11::DrawBar(float percent,const RendererHUDBar* const bar) m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 0.0f, 0xFF); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetVertexBuffers(0, 1, &bar->vertexBuffer->Buffer, &strides, &offset); + m_context->IASetVertexBuffers(0, 1, bar->vertexBuffer.Buffer.GetAddressOf(), &strides, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - m_context->IASetIndexBuffer(bar->indexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(bar->indexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); m_stHUDBar.Percent = percent; updateConstantBuffer(m_cbHUDBar, &m_stHUDBar, sizeof(CHUDBarBuffer)); m_context->VSSetConstantBuffers(0, 1, &m_cbHUD); diff --git a/TR5Main/Renderer/Renderer11DrawEffect.cpp b/TR5Main/Renderer/Renderer11DrawEffect.cpp index ea24a917e..760be6180 100644 --- a/TR5Main/Renderer/Renderer11DrawEffect.cpp +++ b/TR5Main/Renderer/Renderer11DrawEffect.cpp @@ -16,6 +16,7 @@ #include "spark.h" #include "drip.h" #include "explosion.h" +using namespace T5M::Renderer; using namespace T5M::Effects::Footprints; extern BLOOD_STRUCT Blood[MAX_SPARKS_BLOOD]; extern FIRE_SPARKS FireSparks[MAX_SPARKS_FIRE]; @@ -1072,10 +1073,10 @@ bool Renderer11::drawEffects(bool transparent) int firstBucket = (transparent ? 2 : 0); int lastBucket = (transparent ? 4 : 2); - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); for (int i = 0; i < m_effectsToDraw.size(); i++) { diff --git a/TR5Main/Renderer/Renderer11Frame.cpp b/TR5Main/Renderer/Renderer11Frame.cpp index 0b17dd503..4f619427d 100644 --- a/TR5Main/Renderer/Renderer11Frame.cpp +++ b/TR5Main/Renderer/Renderer11Frame.cpp @@ -6,6 +6,7 @@ #include "camera.h" #include "level.h" #include "setup.h" +using namespace T5M::Renderer; void Renderer11::collectRooms() { @@ -464,6 +465,13 @@ void Renderer11::prepareCameraForFrame() m_stCameraMatrices.ViewProjection = ViewProjection; m_stCameraMatrices.Frame = GnFrameCounter; m_stCameraMatrices.CameraUnderwater = (Rooms[Camera.pos.roomNumber].flags & ENV_FLAG_WATER) != 0 ? 1: 0; + m_stCameraMatrices.Projection = Projection; + m_stCameraMatrices.View = View; + m_stCameraMatrices.WorldPosition = Vector3(Camera.pos.x, Camera.pos.y, Camera.pos.z); + m_stCameraMatrices.ViewSize = Vector2(ScreenWidth, ScreenHeight); + m_stCameraMatrices.InvViewSize = Vector2(1 / ScreenWidth, 1 / ScreenHeight); + m_stCameraMatrices.WorldDirection = Vector3(Camera.target.x, Camera.target.y, Camera.target.z) - Vector3(Camera.pos.x, Camera.pos.y, Camera.pos.z); + m_stCameraMatrices.WorldDirection.Normalize(); updateConstantBuffer(m_cbCameraMatrices, &m_stCameraMatrices, sizeof(CCameraMatrixBuffer)); m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices); frustum.Update(View,Projection); diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index 0b7304553..a61e38531 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -3,6 +3,7 @@ #include "configuration.h" #include "winmain.h" #include "GameFlowScript.h" +using namespace T5M::Renderer; extern GameConfiguration g_Configuration; extern GameFlow* g_GameFlow; diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 91c06034c..f38665340 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -9,6 +9,7 @@ #include "sphere.h" #include "level.h" #include "GameFlowScript.h" +using namespace T5M::Renderer; extern GameFlow* g_GameFlow; @@ -278,10 +279,10 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap) int firstBucket = (transparent ? 2 : 0); int lastBucket = (transparent ? 4 : 2); - m_context->IASetVertexBuffers(0, 1, &m_moveablesVertexBuffer->Buffer, &stride, &offset); + m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_context->IASetInputLayout(m_inputLayout); - m_context->IASetIndexBuffer(m_moveablesIndexBuffer->Buffer, DXGI_FORMAT_R32_UINT, 0); + m_context->IASetIndexBuffer(m_moveablesIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); RendererItem * item = &m_items[Lara.itemNumber]; diff --git a/TR5Main/Renderer/Utils.cpp b/TR5Main/Renderer/Utils.cpp new file mode 100644 index 000000000..451db1d82 --- /dev/null +++ b/TR5Main/Renderer/Utils.cpp @@ -0,0 +1,9 @@ +#include "framework.h" +#include "Utils.h" +#include + +void T5M::Renderer::Utils::throwIfFailed(const HRESULT& res) +{ + if (FAILED(res)) + throw std::exception("An error occured!"); +} diff --git a/TR5Main/Renderer/Utils.h b/TR5Main/Renderer/Utils.h new file mode 100644 index 000000000..7850a2927 --- /dev/null +++ b/TR5Main/Renderer/Utils.h @@ -0,0 +1,9 @@ +#pragma once +#include +namespace T5M { + namespace Renderer { + namespace Utils { + void throwIfFailed(const HRESULT& res); + } + } +} \ No newline at end of file diff --git a/TR5Main/Renderer/VertexBuffer.cpp b/TR5Main/Renderer/VertexBuffer.cpp new file mode 100644 index 000000000..a85c6bb21 --- /dev/null +++ b/TR5Main/Renderer/VertexBuffer.cpp @@ -0,0 +1,18 @@ +#include "framework.h" +#include "VertexBuffer.h" +#include "Renderer11.h" +using namespace T5M::Renderer::Utils; +VertexBuffer::VertexBuffer(ID3D11Device* device, int numVertices, RendererVertex* vertices) +{ + HRESULT res; + D3D11_BUFFER_DESC desc = {}; + + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = sizeof(RendererVertex) * numVertices; + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + D3D11_SUBRESOURCE_DATA initData = {}; + initData.pSysMem = vertices; + initData.SysMemPitch = sizeof(RendererVertex) * numVertices; + throwIfFailed(device->CreateBuffer(&desc, &initData, &Buffer)); +} diff --git a/TR5Main/Renderer/VertexBuffer.h b/TR5Main/Renderer/VertexBuffer.h new file mode 100644 index 000000000..faab41eec --- /dev/null +++ b/TR5Main/Renderer/VertexBuffer.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include "Utils.h" +#include + +struct RendererVertex; +using Microsoft::WRL::ComPtr; +class VertexBuffer +{ +public: + ComPtr Buffer; + VertexBuffer() {}; + VertexBuffer(ID3D11Device* device, int numVertices, RendererVertex* vertices); +}; + + + diff --git a/TR5Main/Shaders/CameraMatrixBuffer.hlsli b/TR5Main/Shaders/CameraMatrixBuffer.hlsli index b1b0a1783..95492ba18 100644 --- a/TR5Main/Shaders/CameraMatrixBuffer.hlsli +++ b/TR5Main/Shaders/CameraMatrixBuffer.hlsli @@ -1,6 +1,12 @@ cbuffer CameraMatrixBuffer : register(b0) { float4x4 ViewProjection; - uint Frame; - int cameraUnderwater; + float4x4 View; + float4x4 Projection; + float3 WorldPosition; + float3 WorldDirection; + float2 ViewSize; + float2 InvViewSize; + unsigned int Frame; + int CameraUnderwater; }; \ No newline at end of file diff --git a/TR5Main/Shaders/DX11_Rooms.fx b/TR5Main/Shaders/DX11_Rooms.fx index bbedc6651..cd764c00a 100644 --- a/TR5Main/Shaders/DX11_Rooms.fx +++ b/TR5Main/Shaders/DX11_Rooms.fx @@ -1,4 +1,4 @@ -#include "./CameraMatrixBuffer.hlsli" +#include "CameraMatrixBuffer.hlsli" struct RendererLight { float4 Position; @@ -68,7 +68,7 @@ PixelShaderInput VS(VertexShaderInput input) PixelShaderInput output; float4 screenPos = mul(float4(input.Position, 1.0f), ViewProjection); float2 clipPos = screenPos.xy / screenPos.w; - if (cameraUnderwater != water) { + if (CameraUnderwater != water) { static const float PI = 3.14159265f; float factor = (Frame + clipPos.x*320); float xOffset = (sin(factor * PI/20.0f)) * (screenPos.z/1024)*5; diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index b978a067e..008e740db 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -265,6 +265,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -313,6 +314,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -387,6 +389,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -534,6 +537,9 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + + NotUsing + @@ -546,6 +552,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -613,6 +620,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index e4ed6263c..7218c16b0 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -801,6 +801,15 @@ File di intestazione + + File di intestazione + + + File di intestazione + + + File di intestazione + @@ -1469,6 +1478,15 @@ File di origine + + File di origine + + + File di origine + + + File di origine +