// 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(Matrix4f::Identity()), m_invViewProjMatrix(Matrix4f::Identity()), m_invViewMatrix(Matrix4f::Identity()), m_projectionMatrix(Matrix4f::Identity()), m_viewProjMatrix(Matrix4f::Identity()), m_viewMatrix(Matrix4f::Identity()), m_targetSize(Vector2f(0.f, 0.f)), m_dataInvalided(true) { PredefinedViewerData viewerUboOffsets = PredefinedViewerData::GetOffsets(); m_viewerDataBuffer = Graphics::Instance()->GetRenderDevice()->InstantiateBuffer(BufferType::Uniform); if (!m_viewerDataBuffer->Initialize(viewerUboOffsets.totalSize, BufferUsage::DeviceLocal | BufferUsage::Dynamic)) throw std::runtime_error("failed to initialize viewer data UBO"); } void ViewerInstance::UpdateBuffers(UploadPool& uploadPool, CommandBufferBuilder& builder) { if (m_dataInvalided) { PredefinedViewerData viewerDataOffsets = PredefinedViewerData::GetOffsets(); auto& allocation = uploadPool.Allocate(viewerDataOffsets.totalSize); AccessByOffset(allocation.mappedPtr, viewerDataOffsets.eyePositionOffset) = m_viewMatrix.GetTranslation(); AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invTargetSizeOffset) = 1.f / m_targetSize; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.targetSizeOffset) = m_targetSize; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invProjMatrixOffset) = m_invProjectionMatrix; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invViewMatrixOffset) = m_invViewMatrix; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.invViewProjMatrixOffset) = m_invViewProjMatrix; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.projMatrixOffset) = m_projectionMatrix; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.viewProjMatrixOffset) = m_viewProjMatrix; AccessByOffset(allocation.mappedPtr, viewerDataOffsets.viewMatrixOffset) = m_viewMatrix; builder.CopyBuffer(allocation, m_viewerDataBuffer.get()); m_dataInvalided = false; } } }