Graphics: Add ViewerInstance class

This commit is contained in:
Jérôme Leclercq
2021-06-05 19:06:02 +02:00
parent 743f8eeb24
commit e26c1f8e68
4 changed files with 199 additions and 26 deletions

View File

@@ -0,0 +1,57 @@
// 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
#pragma once
#ifndef NAZARA_VIEWERINSTANCE_HPP
#define NAZARA_VIEWERINSTANCE_HPP
#include <Nazara/Prerequisites.hpp>
#include <Nazara/Math/Matrix4.hpp>
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Renderer/ShaderBinding.hpp>
#include <memory>
namespace Nz
{
class AbstractBuffer;
class CommandBufferBuilder;
class MaterialSettings;
class UploadPool;
class NAZARA_GRAPHICS_API ViewerInstance
{
public:
ViewerInstance();
ViewerInstance(const ViewerInstance&) = delete;
ViewerInstance(ViewerInstance&&) noexcept = default;
~ViewerInstance() = default;
void UpdateViewBuffer(UploadPool& uploadPool, CommandBufferBuilder& builder);
inline void UpdateProjectionMatrix(const Matrix4f& projectionMatrix);
inline void UpdateProjectionMatrix(const Matrix4f& projectionMatrix, const Matrix4f& invProjectionMatrix);
inline void UpdateProjViewMatrices(const Matrix4f& projectionMatrix, const Matrix4f& viewMatrix);
inline void UpdateProjViewMatrices(const Matrix4f& projectionMatrix, const Matrix4f& invProjectionMatrix, const Matrix4f& viewMatrix, const Matrix4f& invViewMatrix);
inline void UpdateProjViewMatrices(const Matrix4f& projectionMatrix, const Matrix4f& invProjectionMatrix, const Matrix4f& viewMatrix, const Matrix4f& invViewMatrix, const Matrix4f& viewProjMatrix, const Matrix4f& invViewProjMatrix);
inline void UpdateTargetSize(const Vector2f& targetSize);
inline void UpdateViewMatrix(const Matrix4f& viewMatrix);
inline void UpdateViewMatrix(const Matrix4f& viewMatrix, const Matrix4f& invViewMatrix);
ViewerInstance& operator=(const ViewerInstance&) = delete;
ViewerInstance& operator=(ViewerInstance&&) noexcept = default;
private:
Matrix4f m_invProjectionMatrix;
Matrix4f m_invViewProjMatrix;
Matrix4f m_invViewMatrix;
Matrix4f m_projectionMatrix;
Matrix4f m_viewProjMatrix;
Matrix4f m_viewMatrix;
Vector2f m_targetSize;
};
}
#include <Nazara/Graphics/ViewerInstance.inl>
#endif // NAZARA_VIEWERINSTANCE_HPP

View File

@@ -0,0 +1,82 @@
// 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 <Nazara/Graphics/ViewerInstance.hpp>
#include <Nazara/Core/Error.hpp>
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
inline void ViewerInstance::UpdateProjectionMatrix(const Matrix4f& projectionMatrix)
{
m_projectionMatrix = projectionMatrix;
if (!m_projectionMatrix.GetInverse(&m_invProjectionMatrix))
NazaraError("failed to inverse projection matrix");
}
inline void ViewerInstance::UpdateProjectionMatrix(const Matrix4f& projectionMatrix, const Matrix4f& invProjectionMatrix)
{
m_projectionMatrix = projectionMatrix;
m_invProjectionMatrix = invProjectionMatrix;
}
inline void ViewerInstance::UpdateProjViewMatrices(const Matrix4f& projectionMatrix, const Matrix4f& viewMatrix)
{
m_projectionMatrix = projectionMatrix;
if (!m_projectionMatrix.GetInverse(&m_invProjectionMatrix))
NazaraError("failed to inverse projection matrix");
m_viewMatrix = viewMatrix;
if (!m_viewMatrix.GetInverseAffine(&m_invViewMatrix))
NazaraError("failed to inverse view matrix");
}
inline void ViewerInstance::UpdateProjViewMatrices(const Matrix4f& projectionMatrix, const Matrix4f& invProjectionMatrix, const Matrix4f& viewMatrix, const Matrix4f& invViewMatrix)
{
m_projectionMatrix = projectionMatrix;
m_viewMatrix = viewMatrix;
m_invProjectionMatrix = invProjectionMatrix;
m_invViewMatrix = invViewMatrix;
m_viewProjMatrix = m_viewMatrix * m_projectionMatrix;
m_invViewProjMatrix = m_invProjectionMatrix * m_invViewMatrix;
}
inline void ViewerInstance::UpdateProjViewMatrices(const Matrix4f& projectionMatrix, const Matrix4f& invProjectionMatrix, const Matrix4f& viewMatrix, const Matrix4f& invViewMatrix, const Matrix4f& viewProjMatrix, const Matrix4f& invViewProjMatrix)
{
m_projectionMatrix = projectionMatrix;
m_viewMatrix = viewMatrix;
m_invProjectionMatrix = invProjectionMatrix;
m_invViewMatrix = invViewMatrix;
m_viewProjMatrix = viewProjMatrix;
m_invViewProjMatrix = invViewProjMatrix;
}
inline void ViewerInstance::UpdateTargetSize(const Vector2f& targetSize)
{
m_targetSize = targetSize;
}
inline void ViewerInstance::UpdateViewMatrix(const Matrix4f& viewMatrix)
{
m_viewMatrix = viewMatrix;
if (!m_viewMatrix.GetInverseAffine(&m_invViewMatrix))
NazaraError("failed to inverse view matrix");
m_viewProjMatrix = m_viewMatrix * m_projectionMatrix;
m_invViewProjMatrix = m_invProjectionMatrix * m_invViewMatrix;
}
inline void ViewerInstance::UpdateViewMatrix(const Matrix4f& viewMatrix, const Matrix4f& invViewMatrix)
{
m_viewMatrix = viewMatrix;
m_invViewMatrix = invViewMatrix;
m_viewProjMatrix = m_viewMatrix * m_projectionMatrix;
m_invViewProjMatrix = m_invProjectionMatrix * m_invViewMatrix;
}
}
#include <Nazara/Graphics/DebugOff.hpp>