Wildvine Engine
Referencia Doxygen del codigo propio de Wildvine Engine.
Cargando...
Buscando...
Nada coincide
Buffer.cpp
Ir a la documentación de este archivo.
1
6#include "Buffer.h"
7#include "Device.h"
8#include "DeviceContext.h"
9
10HRESULT
11Buffer::init(Device& device, const MeshComponent& mesh, unsigned int bindFlag) {
12 if (!device.m_device) {
13 ERROR("ShaderProgram", "init", "Device is null.");
14 return E_POINTER;
15 }
16 if ((bindFlag & D3D11_BIND_VERTEX_BUFFER) && mesh.m_vertex.empty() && mesh.m_skyVertex.empty()) {
17 ERROR("Buffer", "init", "Vertex buffer is empty");
18 return E_INVALIDARG;
19 }
20 if ((bindFlag & D3D11_BIND_INDEX_BUFFER) && mesh.m_index.empty()) {
21 ERROR("Buffer", "init", "Index buffer is empty");
22 return E_INVALIDARG;
23 }
24
25 D3D11_BUFFER_DESC desc = {};
26 D3D11_SUBRESOURCE_DATA data = {};
27
28 desc.Usage = D3D11_USAGE_DEFAULT;
29 desc.CPUAccessFlags = 0;
30 m_bindFlag = bindFlag;
31 desc.BindFlags = (D3D11_BIND_FLAG)bindFlag;
32
33 if (bindFlag & D3D11_BIND_VERTEX_BUFFER) {
34 if (mesh.m_skyVertex.size() > 0 && mesh.m_vertex.size() == 0) {
35 m_stride = sizeof(SkyboxVertex);
36 desc.ByteWidth = m_stride * static_cast<unsigned int>(mesh.m_skyVertex.size());
37 data.pSysMem = mesh.m_skyVertex.data();
38 }
39 else {
40 m_stride = sizeof(SimpleVertex);
41 desc.ByteWidth = m_stride * static_cast<unsigned int>(mesh.m_vertex.size());
42 data.pSysMem = mesh.m_vertex.data();
43 }
44 }
45 else if (bindFlag & D3D11_BIND_INDEX_BUFFER) {
46 m_stride = sizeof(unsigned int);
47 desc.ByteWidth = m_stride * static_cast<unsigned int>(mesh.m_index.size());
48 desc.BindFlags = (D3D11_BIND_FLAG)bindFlag;
49 data.pSysMem = mesh.m_index.data();
50 }
51 return createBuffer(device, desc, &data);
52}
53
54HRESULT
55Buffer::init(Device& device, unsigned int ByteWidth) {
56 if (!device.m_device) {
57 ERROR("ShaderProgram", "init", "Device is null.");
58 return E_POINTER;
59 }
60 if (ByteWidth == 0) {
61 ERROR("Buffer", "init", "ByteWidth is zero");
62 return E_INVALIDARG;
63 }
64 m_stride = ByteWidth;
65
66 D3D11_BUFFER_DESC desc = {};
67 desc.Usage = D3D11_USAGE_DEFAULT;
68 desc.ByteWidth = ByteWidth;
69 desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
70 m_bindFlag = desc.BindFlags;
71
72 return createBuffer(device, desc, nullptr);
73}
74
75void
77 ID3D11Resource* pDstResource,
78 unsigned int DstSubresource,
79 const D3D11_BOX* pDstBox,
80 const void* pSrcData,
81 unsigned int SrcRowPitch,
82 unsigned int SrcDepthPitch) {
83 if (!m_buffer) {
84 ERROR("ShaderProgram", "update", "m_buffer is null.");
85 return;
86 }
87 if (!pSrcData) {
88 ERROR("ShaderProgram", "update", "pSrcData is null.");
89 return;
90 }
91 deviceContext.m_deviceContext->UpdateSubresource(m_buffer,
92 DstSubresource,
93 pDstBox,
94 pSrcData,
95 SrcRowPitch,
96 SrcDepthPitch);
97
98
99}
100
101void
103 unsigned int StartSlot,
104 unsigned int NumBuffers,
105 bool setPixelShader,
106 DXGI_FORMAT format) {
107 if (!deviceContext.m_deviceContext) {
108 ERROR("RenderTargetView", "render", "DeviceContext is nullptr.");
109 return;
110 }
111 if (!m_buffer) {
112 ERROR("Buffer", "render", "m_buffer is null.");
113 return;
114 }
115
116 switch (m_bindFlag) {
117 case D3D11_BIND_VERTEX_BUFFER:
118 deviceContext.m_deviceContext->IASetVertexBuffers(StartSlot, NumBuffers, &m_buffer, &m_stride, &m_offset);
119 break;
120 case D3D11_BIND_CONSTANT_BUFFER:
121 deviceContext.m_deviceContext->VSSetConstantBuffers(StartSlot, NumBuffers, &m_buffer);
122 if (setPixelShader) {
123 deviceContext.m_deviceContext->PSSetConstantBuffers(StartSlot, NumBuffers, &m_buffer);
124 }
125 break;
126 case D3D11_BIND_INDEX_BUFFER:
127 deviceContext.m_deviceContext->IASetIndexBuffer(m_buffer, format, m_offset);
128 break;
129 default:
130 ERROR("Buffer", "render", "Unsupported BindFlag");
131 break;
132 }
133}
134
135void
139
140HRESULT
142 D3D11_BUFFER_DESC& desc,
143 D3D11_SUBRESOURCE_DATA* initData) {
144 if (!device.m_device) {
145 ERROR("Buffer", "createBuffer", "Device is nullptr");
146 return E_POINTER;
147 }
148
149 HRESULT hr = device.CreateBuffer(&desc, initData, &m_buffer);
150 if (FAILED(hr)) {
151 ERROR("Buffer", "createBuffer", "Failed to create buffer");
152 return hr;
153 }
154 return S_OK;
155}
156
Declara la API de Buffer dentro del subsistema Core.
Declara la API de DeviceContext dentro del subsistema Core.
Declara la API de Device dentro del subsistema Core.
#define SAFE_RELEASE(x)
#define ERROR(classObj, method, errorMSG)
unsigned int m_offset
Desplazamiento inicial en bytes (para Vertex Buffer).
Definition Buffer.h:164
void update(DeviceContext &deviceContext, ID3D11Resource *pDstResource, unsigned int DstSubresource, const D3D11_BOX *pDstBox, const void *pSrcData, unsigned int SrcRowPitch, unsigned int SrcDepthPitch)
Actualiza el contenido del buffer (típicamente mediante UpdateSubresource).
Definition Buffer.cpp:76
HRESULT createBuffer(Device &device, D3D11_BUFFER_DESC &desc, D3D11_SUBRESOURCE_DATA *initData)
Crea un buffer genérico con una D3D11_BUFFER_DESC y datos iniciales opcionales.
Definition Buffer.cpp:141
HRESULT init(Device &device, const MeshComponent &mesh, unsigned int bindFlag)
Inicializa el buffer como Vertex o Index Buffer usando un MeshComponent.
Definition Buffer.cpp:11
unsigned int m_bindFlag
Bandera de enlace (D3D11_BIND_* ) que define el rol del buffer.
Definition Buffer.h:169
ID3D11Buffer * m_buffer
Definition Buffer.h:148
void render(DeviceContext &deviceContext, unsigned int StartSlot, unsigned int NumBuffers, bool setPixelShader=false, DXGI_FORMAT format=DXGI_FORMAT_UNKNOWN)
Enlaza el buffer a la etapa correspondiente del pipeline para el frame de render.
Definition Buffer.cpp:102
unsigned int m_stride
Recurso COM de D3D11 administrado por la clase.
Definition Buffer.h:158
void destroy()
Libera el ID3D11Buffer y resetea los metadatos internos.
Definition Buffer.cpp:136
ID3D11DeviceContext * m_deviceContext
Puntero al contexto inmediato de Direct3D 11.
Encapsula un ID3D11Device y facilita la creación de recursos gráficos en Direct3D 11.
Definition Device.h:21
HRESULT CreateBuffer(const D3D11_BUFFER_DESC *pDesc, const D3D11_SUBRESOURCE_DATA *pInitialData, ID3D11Buffer **ppBuffer)
Crea un Buffer genérico (vertex, index, constant, etc.).
Definition Device.cpp:229
ID3D11Device * m_device
Puntero al dispositivo Direct3D 11.
Definition Device.h:146
Componente ECS que almacena la información de geometría (malla) de un actor.
std::vector< unsigned int > m_index
Lista de índices que definen las primitivas de la malla.
std::vector< SimpleVertex > m_vertex
Lista de vértices de la malla.
std::vector< SkyboxVertex > m_skyVertex