Refactored Index/Vertex Buffer

Now uses ComPtr
This commit is contained in:
Nils Gaitzsch 2020-06-16 15:11:30 +02:00
parent aff227e84a
commit a82a338795
20 changed files with 207 additions and 189 deletions

View file

@ -1,9 +1,20 @@
#pragma once
#include <SimpleMath.h>
namespace T5M {
namespace Renderer {
using DirectX::SimpleMath::Matrix;
struct alignas(16) CCameraMatrixBuffer
{
DirectX::SimpleMath::Matrix ViewProjection;
unsigned int Frame;
int CameraUnderwater;
Matrix ViewProjection;
Matrix View;
Matrix Projection;
Vector3 WorldPosition;
Vector3 WorldDirection;
Vector2 ViewSize;
Vector2 InvViewSize;
alignas(16) int Frame;
alignas(16) int CameraUnderwater;
};
}
}

View file

@ -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));
}

View file

@ -0,0 +1,12 @@
#pragma once
#include <d3d11.h>
#include "Utils.h"
#include <wrl/client.h>
class IndexBuffer
{
public:
Microsoft::WRL::ComPtr<ID3D11Buffer> Buffer;
IndexBuffer() {};
IndexBuffer(ID3D11Device* device, int numIndices, int* indices);
};

View file

@ -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<Vector4,9> colors)
{
array<Vector3, 9> 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<RendererVertex, barBorderVertices.size()> 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());
}

View file

@ -13,6 +13,8 @@
#include "items.h"
#include "effect.h"
#include <IndexBuffer.h>
#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<RendererRoom> m_rooms;
Matrix m_hairsMatrices[12];
short m_numHairVertices;

View file

@ -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<RendererVertex> 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);

View file

@ -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();

View file

@ -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);

View file

@ -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++)
{

View file

@ -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);

View file

@ -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;

View file

@ -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];

View file

@ -0,0 +1,9 @@
#include "framework.h"
#include "Utils.h"
#include <winerror.h>
void T5M::Renderer::Utils::throwIfFailed(const HRESULT& res)
{
if (FAILED(res))
throw std::exception("An error occured!");
}

9
TR5Main/Renderer/Utils.h Normal file
View file

@ -0,0 +1,9 @@
#pragma once
#include <winerror.h>
namespace T5M {
namespace Renderer {
namespace Utils {
void throwIfFailed(const HRESULT& res);
}
}
}

View file

@ -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));
}

View file

@ -0,0 +1,17 @@
#pragma once
#include <d3d11.h>
#include "Utils.h"
#include <wrl\client.h>
struct RendererVertex;
using Microsoft::WRL::ComPtr;
class VertexBuffer
{
public:
ComPtr<ID3D11Buffer> Buffer;
VertexBuffer() {};
VertexBuffer(ID3D11Device* device, int numVertices, RendererVertex* vertices);
};

View file

@ -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;
};

View file

@ -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;

View file

@ -265,6 +265,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClInclude Include="Objects\TR5\Entity\tr5_submarine.h" />
<ClInclude Include="Objects\TR5\Entity\tr5_willowwisp.h" />
<ClInclude Include="Objects\TR5\Shatter\tr5_smashobject.h" />
<ClInclude Include="Renderer\IndexBuffer.h" />
<ClInclude Include="Renderer\RenderEnums.h" />
<ClInclude Include="Libs\fixedpoint\fixed_point.hpp" />
<ClInclude Include="Objects\TR1\tr1_objects.h" />
@ -313,6 +314,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClInclude Include="Renderer\ShaderLight.h" />
<ClInclude Include="Renderer\ShadowLightBuffer.h" />
<ClInclude Include="Renderer\StaticBuffer.h" />
<ClInclude Include="Renderer\Utils.h" />
<ClInclude Include="Scripting\LanguageScript.h" />
<ClInclude Include="Renderer\Renderer11.h" />
<ClInclude Include="resource.h" />
@ -387,6 +389,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClInclude Include="Specific\winmain.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="Objects\TR5\Object\tr5_genslot.h" />
<ClInclude Include="Renderer\VertexBuffer.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="framework.cpp">
@ -534,6 +537,9 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClCompile Include="Objects\TR4\Entity\tr4_wildboar.cpp" />
<ClCompile Include="Objects\TR3\Vehicles\upv.cpp" />
<ClCompile Include="Renderer\Frustum.cpp" />
<ClCompile Include="Renderer\IndexBuffer.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="Renderer\Render11Helper.cpp" />
<ClCompile Include="Renderer\Renderer11Compatibility.cpp" />
<ClCompile Include="Renderer\Renderer11Debug.cpp" />
@ -546,6 +552,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClCompile Include="Renderer\Renderer11Settings.cpp" />
<ClCompile Include="Renderer\Renderer11String.cpp" />
<ClCompile Include="Renderer\Renderer11Frame.cpp" />
<ClCompile Include="Renderer\Utils.cpp" />
<ClCompile Include="Scripting\LanguageScript.cpp" />
<ClCompile Include="Objects\TR4\Entity\tr4_demigod.cpp" />
<ClCompile Include="Objects\TR4\Entity\tr4_guide.cpp" />
@ -613,6 +620,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClCompile Include="Specific\setup.cpp" />
<ClCompile Include="Specific\winmain.cpp" />
<ClCompile Include="Objects\TR5\Object\tr5_genslot.cpp" />
<ClCompile Include="Renderer\VertexBuffer.cpp" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Objects\Effects\tr4_bubbles.cpp" />

View file

@ -801,6 +801,15 @@
<ClInclude Include="Game\explosion.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Renderer\Utils.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Renderer\IndexBuffer.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Renderer\VertexBuffer.h">
<Filter>File di intestazione</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Game\box.cpp">
@ -1469,6 +1478,15 @@
<ClCompile Include="Game\explosion.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Renderer\Utils.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Renderer\IndexBuffer.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Renderer\VertexBuffer.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />