diff --git a/ChangeLog.md b/ChangeLog.md index c85fe2fc5..d753cd450 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -109,6 +109,8 @@ Nazara Engine: - Fixed SocketPoller not be able to recover from some errors (like invalid sockets and such) - ⚠️ Replaced currentBitPos and currentByte fields by [read|write][BitPos][Byte] to handle properly bit reading/writing. - InstancedRenderable::SetMaterial methods are now public. +- Fixed Model copy constructor not copying materials +- ⚠️ Added InstancedRenderable::Clone() method Nazara Development Kit: - Added ImageWidget (#139) diff --git a/SDK/src/NDK/Systems/DebugSystem.cpp b/SDK/src/NDK/Systems/DebugSystem.cpp index 182191f7d..0da17c352 100644 --- a/SDK/src/NDK/Systems/DebugSystem.cpp +++ b/SDK/src/NDK/Systems/DebugSystem.cpp @@ -70,6 +70,11 @@ namespace Ndk renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); } + + std::unique_ptr Clone() const override + { + return nullptr; + } }; class OBBDebugRenderable : public DebugRenderable @@ -94,6 +99,11 @@ namespace Ndk renderQueue->AddMesh(0, m_material, m_meshData, Nz::Boxf::Zero(), transformMatrix, scissorRect); } + + std::unique_ptr Clone() const override + { + return nullptr; + } }; } diff --git a/include/Nazara/Graphics/Billboard.hpp b/include/Nazara/Graphics/Billboard.hpp index 62f872f39..f875bc23e 100644 --- a/include/Nazara/Graphics/Billboard.hpp +++ b/include/Nazara/Graphics/Billboard.hpp @@ -31,6 +31,8 @@ namespace Nz void AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const override; + std::unique_ptr Clone() const override; + inline const Color& GetColor() const; inline float GetRotation() const; inline const Vector2f& GetSize() const; diff --git a/include/Nazara/Graphics/InstancedRenderable.hpp b/include/Nazara/Graphics/InstancedRenderable.hpp index 9bd74bfea..9ec0d973f 100644 --- a/include/Nazara/Graphics/InstancedRenderable.hpp +++ b/include/Nazara/Graphics/InstancedRenderable.hpp @@ -39,6 +39,8 @@ namespace Nz virtual void AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const = 0; + virtual std::unique_ptr Clone() const = 0; + virtual bool Cull(const Frustumf& frustum, const InstanceData& instanceData) const; inline void EnsureBoundingVolumeUpdated() const; diff --git a/include/Nazara/Graphics/Model.hpp b/include/Nazara/Graphics/Model.hpp index 072494edf..dd2258e26 100644 --- a/include/Nazara/Graphics/Model.hpp +++ b/include/Nazara/Graphics/Model.hpp @@ -56,6 +56,8 @@ namespace Nz void AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const override; inline void AddToRenderQueue(AbstractRenderQueue* renderQueue, const Matrix4f& transformMatrix, int renderOrder = 0, const Recti& scissorRect = Recti(-1, -1, -1, -1)) const; + std::unique_ptr Clone() const override; + using InstancedRenderable::GetMaterial; const MaterialRef& GetMaterial(const String& subMeshName) const; const MaterialRef& GetMaterial(std::size_t skinIndex, const String& subMeshName) const; diff --git a/include/Nazara/Graphics/Model.inl b/include/Nazara/Graphics/Model.inl index 9078b6de3..1b0055cf3 100644 --- a/include/Nazara/Graphics/Model.inl +++ b/include/Nazara/Graphics/Model.inl @@ -21,7 +21,8 @@ namespace Nz * * \param model Model to copy */ - inline Model::Model(const Model& model) + inline Model::Model(const Model& model) : + InstancedRenderable(model) { SetMesh(model.m_mesh); } diff --git a/include/Nazara/Graphics/SkeletalModel.hpp b/include/Nazara/Graphics/SkeletalModel.hpp index 86943b676..a36082619 100644 --- a/include/Nazara/Graphics/SkeletalModel.hpp +++ b/include/Nazara/Graphics/SkeletalModel.hpp @@ -41,7 +41,7 @@ namespace Nz void AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const override; void AdvanceAnimation(float elapsedTime); - SkeletalModel* Clone() const; + std::unique_ptr Clone() const override; SkeletalModel* Create() const; void EnableAnimation(bool animation); diff --git a/include/Nazara/Graphics/Sprite.hpp b/include/Nazara/Graphics/Sprite.hpp index bf9edc0d1..6548f461a 100644 --- a/include/Nazara/Graphics/Sprite.hpp +++ b/include/Nazara/Graphics/Sprite.hpp @@ -35,6 +35,8 @@ namespace Nz void AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const override; + std::unique_ptr Clone() const override; + inline const Color& GetColor() const; inline const Color& GetCornerColor(RectCorner corner) const; inline const Vector3f& GetOrigin() const; diff --git a/include/Nazara/Graphics/TextSprite.hpp b/include/Nazara/Graphics/TextSprite.hpp index 355d17fe4..d86d999ad 100644 --- a/include/Nazara/Graphics/TextSprite.hpp +++ b/include/Nazara/Graphics/TextSprite.hpp @@ -34,11 +34,14 @@ namespace Nz inline void Clear(); + std::unique_ptr Clone() const override; + inline const Color& GetColor() const; inline float GetScale() const; inline void SetColor(const Color& color); inline void SetDefaultMaterial(); + using InstancedRenderable::SetMaterial; inline void SetMaterial(MaterialRef material); inline void SetMaterial(std::size_t skinIndex, MaterialRef material); inline void SetScale(float scale); diff --git a/include/Nazara/Graphics/TileMap.hpp b/include/Nazara/Graphics/TileMap.hpp index 3692eb3c2..6648a6598 100644 --- a/include/Nazara/Graphics/TileMap.hpp +++ b/include/Nazara/Graphics/TileMap.hpp @@ -35,6 +35,8 @@ namespace Nz void AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const override; + std::unique_ptr Clone() const override; + inline void DisableTile(const Vector2ui& tilePos); inline void DisableTiles(); inline void DisableTiles(const Vector2ui* tilesPos, std::size_t tileCount); diff --git a/src/Nazara/Graphics/Billboard.cpp b/src/Nazara/Graphics/Billboard.cpp index 9cc79acce..35021ef8d 100644 --- a/src/Nazara/Graphics/Billboard.cpp +++ b/src/Nazara/Graphics/Billboard.cpp @@ -27,6 +27,14 @@ namespace Nz renderQueue->AddBillboards(instanceData.renderOrder, GetMaterial(), 1, scissorRect, &position, &m_size, &m_sinCos, &m_color); } + /*! + * \brief Clones this billboard + */ + std::unique_ptr Billboard::Clone() const + { + return std::make_unique(*this); + } + /* * \brief Makes the bounding volume of this billboard */ diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index 00c347b8a..b725caef8 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -51,7 +51,6 @@ namespace Nz * \param renderQueue Queue to be added * \param instanceData Data used for this instance */ - void Model::AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const { unsigned int submeshCount = m_mesh->GetSubMeshCount(); @@ -69,6 +68,14 @@ namespace Nz } } + /*! + * \brief Clones this model + */ + std::unique_ptr Model::Clone() const + { + return std::make_unique(*this); + } + /*! * \brief Gets the material of the named submesh * \return Pointer to the current material diff --git a/src/Nazara/Graphics/SkeletalModel.cpp b/src/Nazara/Graphics/SkeletalModel.cpp index c42b63a83..03d22f648 100644 --- a/src/Nazara/Graphics/SkeletalModel.cpp +++ b/src/Nazara/Graphics/SkeletalModel.cpp @@ -126,10 +126,9 @@ namespace Nz * \brief Clones this skeletal model * \return Pointer to newly allocated SkeletalModel */ - - SkeletalModel* SkeletalModel::Clone() const + std::unique_ptr SkeletalModel::Clone() const { - return new SkeletalModel(*this); + return std::make_unique(*this); } /*! diff --git a/src/Nazara/Graphics/Sprite.cpp b/src/Nazara/Graphics/Sprite.cpp index 70ba21926..0c16de174 100644 --- a/src/Nazara/Graphics/Sprite.cpp +++ b/src/Nazara/Graphics/Sprite.cpp @@ -21,17 +21,23 @@ namespace Nz * \param renderQueue Queue to be added * \param instanceData Data for the instance */ - void Sprite::AddToRenderQueue(AbstractRenderQueue* renderQueue, const InstanceData& instanceData, const Recti& scissorRect) const { const VertexStruct_XYZ_Color_UV* vertices = reinterpret_cast(instanceData.data.data()); renderQueue->AddSprites(instanceData.renderOrder, GetMaterial(), vertices, 1, scissorRect); } + /*! + * \brief Clones this sprite + */ + std::unique_ptr Sprite::Clone() const + { + return std::make_unique(*this); + } + /*! * \brief Makes the bounding volume of this text */ - void Sprite::MakeBoundingVolume() const { Vector3f origin(m_origin.x, -m_origin.y, m_origin.z); diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 883268963..8cc4961cf 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -41,6 +41,14 @@ namespace Nz } } + /*! + * \brief Clones this text sprite + */ + std::unique_ptr TextSprite::Clone() const + { + return std::make_unique(*this); + } + /*! * \brief Updates the text * diff --git a/src/Nazara/Graphics/TileMap.cpp b/src/Nazara/Graphics/TileMap.cpp index 26a146f88..6a30496c3 100644 --- a/src/Nazara/Graphics/TileMap.cpp +++ b/src/Nazara/Graphics/TileMap.cpp @@ -37,6 +37,14 @@ namespace Nz } } + /*! + * \brief Clones this tilemap + */ + std::unique_ptr TileMap::Clone() const + { + return std::make_unique(*this); + } + void TileMap::MakeBoundingVolume() const { Nz::Vector2f size = GetSize();