add staticvertexbuffer and use for spinnycube

This commit is contained in:
Adam Jensen 2022-05-05 00:47:27 +01:00
parent fed637a4e0
commit bca3a05b51
6 changed files with 81 additions and 4 deletions

View File

@ -0,0 +1,10 @@
#pragma once
namespace cdc {
class CommonVertexBuffer {
public:
virtual ~CommonVertexBuffer() = default;
};
}

View File

@ -1,6 +1,7 @@
#include <d3d11_1.h>
#include "PCDX11StateManager.h"
#include "PCDX11PixelShader.h"
#include "PCDX11VertexBuffer.h"
namespace cdc {
@ -18,6 +19,21 @@ void PCDX11StateManager::setIndexBuffer(PCDX11IndexBuffer *indexBuffer) {
}
}
void PCDX11StateManager::setVertexBuffer(PCDX11VertexBuffer *vertexBuffer) {
if (vertexBuffer == nullptr)
return;
ID3D11Buffer *buffer = vertexBuffer->getD3DBuffer();
uint32_t stride = vertexBuffer->getStride();
uint32_t offset = 0;
if (buffer != m_vertexBufferD3D && stride != m_vertexStride) {
vertexBuffer->method14();
m_deviceContext->IASetVertexBuffers(0, 1, &buffer, &stride, &offset);
m_vertexBufferD3D = buffer;
m_vertexStride = stride;
}
}
void PCDX11StateManager::setPixelShader(PCDX11PixelShader *pixelShader) {
if (pixelShader != m_pixelShader) {
if (pixelShader) {

View File

@ -6,6 +6,8 @@
namespace cdc {
class PCDX11VertexBuffer;
class PCDX11StateManager : public PCDX11InternalResource {
ID3D11DeviceContext *m_deviceContext; // 10
bool m_dirtyRasterizerState; // 19
@ -24,6 +26,8 @@ class PCDX11StateManager : public PCDX11InternalResource {
uint8_t m_dirtySamplersLast; // 187
ID3D11Buffer *m_indexBufferD3D; // 188
ID3D11Buffer *m_vertexBufferD3D; // 18C
uint32_t m_vertexStride; // 190
PCDX11PixelShader *m_pixelShader; // 198
public:
PCDX11StateManager();
@ -34,6 +38,7 @@ public:
{}
void setIndexBuffer(PCDX11IndexBuffer *indexBuffer);
void setVertexBuffer(PCDX11VertexBuffer *vertexBuffer);
void setPixelShader(PCDX11PixelShader *pixelShader);
void setPrimitiveTopology(int topology);

View File

@ -0,0 +1,28 @@
#pragma once
#include "PCDX11VertexBuffer.h"
namespace cdc {
class PCDX11StaticVertexBuffer :
public PCDX11VertexBuffer
// public PCDX11DeferredUpdate
{
public:
PCDX11StaticVertexBuffer(ID3D11Buffer* buffer, uint32_t stride) : // hack
stride(stride),
buffer(buffer)
{}
uint32_t stride;
uint32_t dword10;
uint32_t baseVertex;
ID3D11Buffer *buffer;
uint32_t getBaseVertex() { return baseVertex; }
ID3D11Buffer *getD3DBuffer() { return buffer; }
uint32_t method0C() { return dword10; }
uint32_t getStride() { return stride; }
void method14() {}
};
}

View File

@ -0,0 +1,15 @@
#pragma once
#include "CommonVertexBuffer.h"
namespace cdc {
class PCDX11VertexBuffer : public CommonVertexBuffer {
public:
virtual uint32_t getBaseVertex() = 0;
virtual ID3D11Buffer *getD3DBuffer() = 0;
virtual uint32_t method0C() = 0;
virtual uint32_t getStride() = 0;
virtual void method14() = 0;
};
}

View File

@ -13,6 +13,7 @@
#include "rendering/PCDX11StateManager.h"
#include "rendering/PCDX11IndexBuffer.h"
#include "rendering/PCDX11Texture.h"
#include "rendering/PCDX11StaticVertexBuffer.h"
#include "drm/ResolveReceiver.h"
#include "drm/sections/RenderResourceSection.h"
@ -409,6 +410,10 @@ int spinnyCube(HWND window,
device->CreateBuffer(&vertexBufferDesc, &vertexData, &vertexBuffer);
UINT stride = 11 * 4; // vertex size (11 floats: float3 position, float3 normal, float2 texcoord, float3 color)
UINT offset = 0;
cdc::PCDX11StaticVertexBuffer cdcVertexBuffer(vertexBuffer, stride);
///////////////////////////////////////////////////////////////////////////////////////////////
D3D11_BUFFER_DESC indexBufferDesc = {};
@ -473,9 +478,6 @@ int spinnyCube(HWND window,
FLOAT backgroundColor[4] = { 0.025f, 0.025f, 0.025f, 1.0f };
UINT stride = 11 * 4; // vertex size (11 floats: float3 position, float3 normal, float2 texcoord, float3 color)
UINT offset = 0;
D3D11_VIEWPORT viewport = { 0.0f, 0.0f, static_cast<float>(depthBufferDesc.Width), static_cast<float>(depthBufferDesc.Height), 0.0f, 1.0f };
///////////////////////////////////////////////////////////////////////////////////////////////
@ -543,7 +545,8 @@ int spinnyCube(HWND window,
stateManager.setPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
deviceContext->IASetInputLayout(inputLayout);
deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
stateManager.setVertexBuffer(&cdcVertexBuffer);
//deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
stateManager.setIndexBuffer(&cdcIndexBuffer);
//deviceContext->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);