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;