From 3ee981867eea613c2575516a888d57a54ba8fd06 Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 May 2015 00:08:24 +0200 Subject: [PATCH] Graphics: Add Renderable class WIP Former-commit-id: b9ea2a443cf2e5f8b90360e1f47466b0c3ce69fa --- include/Nazara/Graphics/Renderable.hpp | 60 ++++++++++++++++++++++++++ include/Nazara/Graphics/Renderable.inl | 20 +++++++++ src/Nazara/Graphics/Renderable.cpp | 24 +++++++++++ 3 files changed, 104 insertions(+) create mode 100644 include/Nazara/Graphics/Renderable.hpp create mode 100644 include/Nazara/Graphics/Renderable.inl create mode 100644 src/Nazara/Graphics/Renderable.cpp diff --git a/include/Nazara/Graphics/Renderable.hpp b/include/Nazara/Graphics/Renderable.hpp new file mode 100644 index 000000000..29f00d538 --- /dev/null +++ b/include/Nazara/Graphics/Renderable.hpp @@ -0,0 +1,60 @@ +// Copyright (C) 2015 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_RENDERABLE_HPP +#define NAZARA_RENDERABLE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class NzAbstractRenderQueue; +class NzRenderable; + +using NzRenderableConstListener = NzObjectListenerWrapper; +using NzRenderableConstRef = NzObjectRef; +using NzRenderableLibrary = NzObjectLibrary; +using NzRenderableListener = NzObjectListenerWrapper; +using NzRenderableRef = NzObjectRef; + +class NAZARA_API NzRenderable : public NzRefCounted +{ + public: + NzRenderable() = default; + NzRenderable(const NzRenderable& renderable) = default; + virtual ~NzRenderable(); + + void EnsureBoundingVolumeUpdated() const; + + virtual void AddToRenderQueue(NzAbstractRenderQueue* renderQueue, const NzMatrix4f& transformMatrix) const = 0; + virtual void Cull(const NzFrustumf& frustum, const NzBoundingVolumef& volume, const NzMatrix4f& transformMatrix) const = 0; + virtual const NzBoundingVolumef& GetBoundingVolume() const; + virtual void UpdateBoundingVolume(NzBoundingVolumef* boundingVolume, const NzMatrix4f& transformMatrix) const; + + NzRenderable& operator=(const NzRenderable& renderable) = default; + + protected: + virtual void MakeBoundingVolume() const = 0; + void InvalidateBoundingVolume(); + void UpdateBoundingVolume() const; + + mutable NzBoundingVolumef m_boundingVolume; + + private: + mutable bool m_boundingVolumeUpdated; + + static NzRenderableLibrary::LibraryMap s_library; +}; + +#include + +#endif // NAZARA_RENDERABLE_HPP diff --git a/include/Nazara/Graphics/Renderable.inl b/include/Nazara/Graphics/Renderable.inl new file mode 100644 index 000000000..eb5a70b20 --- /dev/null +++ b/include/Nazara/Graphics/Renderable.inl @@ -0,0 +1,20 @@ +// Copyright (C) 2015 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 + +void NzRenderable::EnsureBoundingVolumeUpdated() const +{ + if (!m_boundingVolumeUpdated) + UpdateBoundingVolume(); +} + +void NzRenderable::InvalidateBoundingVolume() +{ + m_boundingVolumeUpdated = false; +} + +void NzRenderable::UpdateBoundingVolume() const +{ + MakeBoundingVolume(); + m_boundingVolumeUpdated = true; +} diff --git a/src/Nazara/Graphics/Renderable.cpp b/src/Nazara/Graphics/Renderable.cpp new file mode 100644 index 000000000..c084dbbf8 --- /dev/null +++ b/src/Nazara/Graphics/Renderable.cpp @@ -0,0 +1,24 @@ +// Copyright (C) 2015 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 + +NzRenderable::~NzRenderable() = default; + +const NzBoundingVolumef& NzRenderable::GetBoundingVolume() const +{ + EnsureBoundingVolumeUpdated(); + + return m_boundingVolume; +} + +void NzRenderable::UpdateBoundingVolume(NzBoundingVolumef* boundingVolume, const NzMatrix4f& transformMatrix) const +{ + NazaraAssert(boundingVolume, "Invalid bounding volume"); + + boundingVolume->Update(transformMatrix); +} + +NzRenderableLibrary::LibraryMap NzRenderable::s_library;