#include #include #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()) { const auto& gfxDevice = GameState::GetInstance().Gfx(); const auto& mesh = GameState::GetInstance().Renderer().GetMeshCache().getMesh(meshID); m_skinnedMesh = std::make_unique(); 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 && m_skinnedMesh) { const auto& mesh = ctx.renderer.GetMeshCache().getCPUMesh(meshID); const auto skeleton = GetGameObject()->GetComponent()->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); } }