57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
#include <destrum/Components/MeshRendererComponent.h>
|
|
#include <destrum/ObjectModel/Transform.h>
|
|
|
|
#include "destrum/Components/Animator.h"
|
|
#include "destrum/ObjectModel/GameObject.h"
|
|
#include "destrum/Util/GameState.h"
|
|
|
|
|
|
MeshRendererComponent::MeshRendererComponent(GameObject& parent): Component(parent, "MeshRendererComponent") {
|
|
|
|
}
|
|
|
|
void MeshRendererComponent::Start() {
|
|
Component::Start();
|
|
if (auto* animator = GetGameObject()->GetComponent<Animator>()) {
|
|
const auto& gfxDevice = GameState::GetInstance().Gfx();
|
|
const auto& mesh = GameState::GetInstance().Renderer().GetMeshCache().getMesh(meshID);
|
|
|
|
m_skinnedMesh = std::make_unique<SkinnedMesh>();
|
|
m_skinnedMesh->skinnedVertexBuffer = gfxDevice.createBuffer(
|
|
mesh.numVertices * sizeof(CPUMesh::Vertex),
|
|
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
|
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
|
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
|
|
);
|
|
}
|
|
}
|
|
|
|
void MeshRendererComponent::Update() {
|
|
}
|
|
|
|
void MeshRendererComponent::Render(const RenderContext& ctx) {
|
|
if (meshID == NULL_MESH_ID || materialID == NULL_MATERIAL_ID) return;
|
|
|
|
if (auto* animator = GetGameObject()->GetComponent<Animator>(); animator && m_skinnedMesh) {
|
|
const auto& mesh = ctx.renderer.GetMeshCache().getCPUMesh(meshID);
|
|
const auto skeleton = GetGameObject()->GetComponent<Animator>()->getSkeleton();
|
|
std::uint32_t frameIdx = GameState::GetInstance().Gfx().getCurrentFrameIndex();
|
|
|
|
const std::size_t jointMatricesStartIndex = animator->uploadJointMatrices(
|
|
ctx.renderer.getSkinningPipeline(),
|
|
*skeleton, // skeleton stored on GPUMesh (or pass from CPUMesh)
|
|
frameIdx
|
|
);
|
|
|
|
ctx.renderer.drawSkinnedMesh(
|
|
meshID,
|
|
GetTransform().GetWorldMatrix(),
|
|
materialID,
|
|
m_skinnedMesh.get(),
|
|
jointMatricesStartIndex
|
|
);
|
|
} else {
|
|
ctx.renderer.drawMesh(meshID, GetTransform().GetWorldMatrix(), materialID);
|
|
}
|
|
}
|