Wildvine Engine
Referencia Doxygen del codigo propio de Wildvine Engine.
Cargando...
Buscando...
Nada coincide
Actor.cpp
Ir a la documentación de este archivo.
1
6#include "ECS/Actor.h"
7#include "MeshComponent.h"
8#include "Device.h"
9#include "DeviceContext.h"
10
12 // Setup Default Components
13 EU::TSharedPointer<Transform> transform = EU::MakeShared<Transform>();
14 addComponent(transform);
15 EU::TSharedPointer<MeshComponent> meshComponent = EU::MakeShared<MeshComponent>();
16 addComponent(meshComponent);
17
18 HRESULT hr;
19 std::string classNameType = "Actor -> " + m_name;
20 hr = m_modelBuffer.init(device, sizeof(CBChangesEveryFrame));
21 if (FAILED(hr)) {
22 ERROR("Actor", classNameType.c_str(), "Failed to create new CBChangesEveryFrame");
23 }
24
25 // Awake
26 awake();
27
28 hr = m_sampler.init(device);
29 if (FAILED(hr)) {
30 ERROR("Actor", classNameType.c_str(), "Failed to create new SamplerState");
31 }
32
33 //hr = m_rasterizer.init(device);
34 //if (FAILED(hr)) {
35 // ERROR("Actor", classNameType.c_str(), "Failed to create new Rasterizer");
36 //}
37
38 //hr = m_blendstate.init(device);
39 //if (FAILED(hr)) {
40 // ERROR("Actor", classNameType.c_str(), "Failed to create new BlendState");
41 //}
42
43 //hr = m_shaderShadow.CreateShader(device, PIXEL_SHADER, "HybridEngine.fx");
44 //
45 //if (FAILED(hr)) {
46 // ERROR("Main", "InitDevice",
47 // ("Failed to initialize Shadow Shader. HRESULT: " + std::to_string(hr)).c_str());
48 //}
49 //
50 //hr = m_shaderBuffer.init(device, sizeof(CBChangesEveryFrame));
51 //if (FAILED(hr)) {
52 // ERROR("Main", "InitDevice",
53 // ("Failed to initialize Shadow Buffer. HRESULT: " + std::to_string(hr)).c_str());
54 //
55 //}
56 //
57 //hr = m_shadowBlendState.init(device);
58 //if (FAILED(hr)) {
59 // ERROR("Main", "InitDevice",
60 // ("Failed to initialize Shadow Blend State. HRESULT: " + std::to_string(hr)).c_str());
61 //
62 //}
63
64 //hr = m_shadowDepthStencilState.init(device, true, false);
65 //
66 //if (FAILED(hr)) {
67 // ERROR("Main", "InitDevice",
68 // ("Failed to initialize Depth Stencil State. HRESULT: " + std::to_string(hr)).c_str());
69 //
70 //}
71 //
72 //m_LightPos = XMFLOAT4(2.0f, 4.0f, -2.0f, 1.0f);
73}
74
75void
76Actor::update(float deltaTime, DeviceContext& deviceContext) {
77 // Update all components
78 for (auto& component : m_components) {
79 if (component) {
80 component->update(deltaTime);
81 }
82 }
83
84 // Update the model buffer
85 m_model.mWorld = XMMatrixTranspose(getComponent<Transform>()->matrix);
86 m_model.vMeshColor = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
87 // Update the constant buffer
88 m_modelBuffer.update(deviceContext, nullptr, 0, nullptr, &m_model, 0, 0);
89}
90
91void
93 m_sampler.render(deviceContext, 0, 1);
94
95 deviceContext.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
96 // Update buffer and render all components
97 for (unsigned int i = 0; i < m_meshes.size(); i++)
98 {
99 m_vertexBuffers[i].render(deviceContext, 0, 1);
100 m_indexBuffers[i].render(deviceContext, 0, 1, false, DXGI_FORMAT_R32_UINT);
101 m_modelBuffer.render(deviceContext, 1, 1, true);
102
103 // Limpieza por mesh (evita herencias)
104 ID3D11ShaderResourceView* nullSRV[1] = { nullptr };
105 deviceContext.m_deviceContext->PSSetShaderResources(0, 1, nullSRV);
106
107 // Bind correcto por mesh
108 if (i < m_textures.size()) {
109 for (int k = 0; k < m_textures.size(); k++) {
110 m_textures[k].render(deviceContext, k, 1); // albedo mesh i
111 }
112 }
113 // else: se queda null
114 deviceContext.DrawIndexed(m_meshes[i].m_numIndex, 0, 0);
115 }
116}
117
118void
120 deviceContext.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
121 // Update buffer and render all components
122 for (unsigned int i = 0; i < m_meshes.size(); i++) {
123 m_vertexBuffers[i].render(deviceContext, 0, 1);
124 m_indexBuffers[i].render(deviceContext, 0, 1, false, DXGI_FORMAT_R32_UINT);
125
126 deviceContext.DrawIndexed(m_meshes[i].m_numIndex, 0, 0);
127 }
128}
129
130
131void
133 for (auto& vertexBuffer : m_vertexBuffers) {
134 vertexBuffer.destroy();
135 }
136
137 for (auto& indexBuffer : m_indexBuffers) {
138 indexBuffer.destroy();
139 }
140
141 for (auto& tex : m_textures) {
142 tex.destroy();
143 }
145
146 //m_rasterizer.destroy();
147 //m_blendstate.destroy();
149}
150
151void
152Actor::setMesh(Device& device, std::vector<MeshComponent> meshes) {
153 m_meshes = meshes;
154 HRESULT hr;
155 for (auto& mesh : m_meshes) {
156 // Crear vertex buffer
157 Buffer vertexBuffer;
158 hr = vertexBuffer.init(device, mesh, D3D11_BIND_VERTEX_BUFFER);
159 if (FAILED(hr)) {
160 ERROR("Actor", "setMesh", "Failed to create new vertexBuffer");
161 }
162 else {
163 m_vertexBuffers.push_back(vertexBuffer);
164 }
165
166 // Crear index buffer
167 Buffer indexBuffer;
168 hr = indexBuffer.init(device, mesh, D3D11_BIND_INDEX_BUFFER);
169 if (FAILED(hr)) {
170 ERROR("Actor", "setMesh", "Failed to create new indexBuffer");
171 }
172 else {
173 m_indexBuffers.push_back(indexBuffer);
174 }
175 }
176}
177
178
Declara la API de Actor dentro del subsistema ECS.
Declara la API de DeviceContext dentro del subsistema Core.
Declara la API de Device dentro del subsistema Core.
Declara la API de MeshComponent dentro del subsistema Core.
#define ERROR(classObj, method, errorMSG)
std::string m_name
Nombre identificador del actor.
Definition Actor.h:171
std::vector< Buffer > m_indexBuffers
Buffers de índices asociados a las mallas.
Definition Actor.h:155
std::vector< Buffer > m_vertexBuffers
Buffers de vértices asociados a las mallas.
Definition Actor.h:154
void awake() override
Definition Actor.h:52
std::vector< Texture > m_textures
Texturas aplicadas al actor.
Definition Actor.h:153
void destroy()
Libera todos los recursos asociados al actor.
Definition Actor.cpp:132
CBChangesEveryFrame m_model
Constante de buffer para transformaciones por frame.
Definition Actor.h:160
std::vector< MeshComponent > m_meshes
Conjunto de componentes de malla del actor.
Definition Actor.h:152
Buffer m_modelBuffer
Constant buffer que contiene m_model.
Definition Actor.h:161
void setMesh(Device &device, std::vector< MeshComponent > meshes)
Establece las mallas del actor.
Definition Actor.cpp:152
void render(DeviceContext &deviceContext) override
Renderiza el actor en la escena.
Definition Actor.cpp:92
void renderForSkybox(DeviceContext &deviceContext)
Definition Actor.cpp:119
SamplerState m_sampler
Estado de muestreo de texturas.
Definition Actor.h:159
void update(float deltaTime, DeviceContext &deviceContext) override
Actualiza el actor en cada frame.
Definition Actor.cpp:76
Actor()=default
Constructor por defecto.
Encapsula un ID3D11Buffer para vértices, índices o constantes, incluyendo creación, actualización y enlace.
Definition Buffer.h:28
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 init(Device &device, const MeshComponent &mesh, unsigned int bindFlag)
Inicializa el buffer como Vertex o Index Buffer usando un MeshComponent.
Definition Buffer.cpp:11
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
void destroy()
Libera el ID3D11Buffer y resetea los metadatos internos.
Definition Buffer.cpp:136
void DrawIndexed(unsigned int IndexCount, unsigned int StartIndexLocation, int BaseVertexLocation)
Envía un comando de dibujado de primitivas indexadas.
void IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY Topology)
Define la topología de primitivas a renderizar.
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
Clase TSharedPointer para manejar la gestión de memoria compartida.
std::vector< EU::TSharedPointer< Component > > m_components
Definition Entity.h:86
void addComponent(EU::TSharedPointer< T > component)
Agrega un componente a la entidad.
Definition Entity.h:61
HRESULT init(Device &device)
Inicializa el Sampler State con una configuración predeterminada.
void render(DeviceContext &deviceContext, unsigned int StartSlot, unsigned int NumSamplers)
Asigna el Sampler State a la etapa de Pixel Shader.
void destroy()
Libera el recurso ID3D11SamplerState.