// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include #include #include #include namespace Nz { ViewerInstance::ViewerInstance() : m_invProjectionMatrix(Nz::Matrix4f::Identity()), m_invViewProjMatrix(Nz::Matrix4f::Identity()), m_invViewMatrix(Nz::Matrix4f::Identity()), m_projectionMatrix(Nz::Matrix4f::Identity()), m_viewProjMatrix(Nz::Matrix4f::Identity()), m_viewMatrix(Nz::Matrix4f::Identity()), m_targetSize(Nz::Vector2f(0.f, 0.f)), m_dataInvalided(true) { Nz::PredefinedViewerData viewerUboOffsets = Nz::PredefinedViewerData::GetOffsets(); m_viewerDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform); if (!m_viewerDataBuffer->Initialize(viewerUboOffsets.totalSize, Nz::BufferUsage::DeviceLocal | Nz::BufferUsage::Dynamic)) throw std::runtime_error("failed to initialize viewer data UBO"); m_shaderBinding = Graphics::Instance()->GetReferencePipelineLayout()->AllocateShaderBinding(Graphics::ViewerBindingSet); m_shaderBinding->Update({ { 0, ShaderBinding::UniformBufferBinding { m_viewerDataBuffer.get(), 0, m_viewerDataBuffer->GetSize() } } }); } void ViewerInstance::UpdateBuffers(UploadPool& uploadPool, CommandBufferBuilder& builder) { if (m_dataInvalided) { Nz::PredefinedViewerData viewerDataOffsets = Nz::PredefinedViewerData::GetOffsets(); auto& allocation = uploadPool.Allocate(viewerDataOffsets.totalSize); Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_viewMatrix.GetTranslation(); Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invTargetSizeOffset) = 1.f / m_targetSize; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.targetSizeOffset) = m_targetSize; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invProjMatrixOffset) = m_invProjectionMatrix; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invViewMatrixOffset) = m_invViewMatrix; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invViewProjMatrixOffset) = m_invViewProjMatrix; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.projMatrixOffset) = m_projectionMatrix; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.viewProjMatrixOffset) = m_viewProjMatrix; Nz::AccessByOffset(allocation.mappedPtr, viewerDataOffsets.viewMatrixOffset) = m_viewMatrix; builder.CopyBuffer(allocation, m_viewerDataBuffer.get()); m_dataInvalided = false; } } }