From 0db92e671d054d1d14e07fff6891725b690d9ca7 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 25 Jan 2015 23:41:09 +0100 Subject: [PATCH] Added a static New method to RefCounted-derived classes Former-commit-id: efd9e68e050fb6cc7e0df7a7c222ca759c502dc5 --- include/Nazara/Audio/SoundBuffer.hpp | 3 + include/Nazara/Audio/SoundBuffer.inl | 17 ++++ include/Nazara/Core/ObjectRef.hpp | 1 + include/Nazara/Core/ObjectRef.inl | 6 ++ include/Nazara/Graphics/Material.hpp | 5 +- include/Nazara/Graphics/Material.inl | 17 ++++ include/Nazara/Renderer/RenderBuffer.hpp | 3 + include/Nazara/Renderer/RenderBuffer.inl | 17 ++++ include/Nazara/Renderer/Shader.hpp | 3 + include/Nazara/Renderer/Shader.inl | 17 ++++ include/Nazara/Renderer/Texture.hpp | 3 + include/Nazara/Renderer/Texture.inl | 17 ++++ .../Renderer/UberShaderPreprocessor.hpp | 12 +++ .../Renderer/UberShaderPreprocessor.inl | 17 ++++ include/Nazara/Utility/Animation.hpp | 4 + include/Nazara/Utility/Animation.inl | 17 ++++ include/Nazara/Utility/Buffer.hpp | 3 + include/Nazara/Utility/Buffer.inl | 17 ++++ include/Nazara/Utility/Font.hpp | 6 +- include/Nazara/Utility/Font.inl | 17 ++++ include/Nazara/Utility/Image.hpp | 3 + include/Nazara/Utility/Image.inl | 17 ++++ include/Nazara/Utility/IndexBuffer.hpp | 4 + include/Nazara/Utility/IndexBuffer.inl | 17 ++++ include/Nazara/Utility/Mesh.hpp | 4 + include/Nazara/Utility/Mesh.inl | 17 ++++ include/Nazara/Utility/SkeletalMesh.hpp | 4 + include/Nazara/Utility/SkeletalMesh.inl | 17 ++++ include/Nazara/Utility/Skeleton.hpp | 4 + include/Nazara/Utility/Skeleton.inl | 17 ++++ include/Nazara/Utility/StaticMesh.hpp | 4 + include/Nazara/Utility/StaticMesh.inl | 17 ++++ include/Nazara/Utility/VertexBuffer.hpp | 4 + include/Nazara/Utility/VertexBuffer.inl | 17 ++++ include/Nazara/Utility/VertexDeclaration.hpp | 3 + include/Nazara/Utility/VertexDeclaration.inl | 17 ++++ include/Nazara/Utility/VertexMapper.inl | 2 +- src/Nazara/Audio/Sound.cpp | 24 ++---- src/Nazara/Graphics/DeferredBloomPass.cpp | 5 +- src/Nazara/Graphics/DeferredDOFPass.cpp | 13 +-- src/Nazara/Graphics/DeferredFogPass.cpp | 8 +- .../Graphics/DeferredPhongLightingPass.cpp | 6 +- .../Graphics/DeferredRenderTechnique.cpp | 23 ++--- src/Nazara/Graphics/Loaders/Mesh/Loader.cpp | 41 +++------ src/Nazara/Graphics/Loaders/OBJ/Loader.cpp | 66 +++++---------- .../Graphics/Loaders/Texture/Loader.cpp | 8 +- src/Nazara/Graphics/Material.cpp | 70 +++++----------- src/Nazara/Graphics/SkinningManager.cpp | 10 +-- src/Nazara/Graphics/Sprite.cpp | 12 +-- src/Nazara/Graphics/TextSprite.cpp | 7 +- src/Nazara/Renderer/RenderTexture.cpp | 7 +- src/Nazara/Renderer/Renderer.cpp | 15 ++-- .../Renderer/UberShaderPreprocessor.cpp | 8 +- src/Nazara/Utility/Font.cpp | 16 +--- src/Nazara/Utility/IndexBuffer.cpp | 3 +- src/Nazara/Utility/Loaders/MD2/Loader.cpp | 30 +++---- src/Nazara/Utility/Loaders/MD5Mesh/Loader.cpp | 58 +++++-------- src/Nazara/Utility/Mesh.cpp | 83 +++++++------------ src/Nazara/Utility/VertexBuffer.cpp | 3 +- 59 files changed, 532 insertions(+), 354 deletions(-) create mode 100644 include/Nazara/Audio/SoundBuffer.inl create mode 100644 include/Nazara/Graphics/Material.inl create mode 100644 include/Nazara/Renderer/RenderBuffer.inl create mode 100644 include/Nazara/Renderer/Shader.inl create mode 100644 include/Nazara/Renderer/Texture.inl create mode 100644 include/Nazara/Renderer/UberShaderPreprocessor.inl create mode 100644 include/Nazara/Utility/Animation.inl create mode 100644 include/Nazara/Utility/Buffer.inl create mode 100644 include/Nazara/Utility/Font.inl create mode 100644 include/Nazara/Utility/Image.inl create mode 100644 include/Nazara/Utility/IndexBuffer.inl create mode 100644 include/Nazara/Utility/Mesh.inl create mode 100644 include/Nazara/Utility/SkeletalMesh.inl create mode 100644 include/Nazara/Utility/Skeleton.inl create mode 100644 include/Nazara/Utility/StaticMesh.inl create mode 100644 include/Nazara/Utility/VertexBuffer.inl create mode 100644 include/Nazara/Utility/VertexDeclaration.inl diff --git a/include/Nazara/Audio/SoundBuffer.hpp b/include/Nazara/Audio/SoundBuffer.hpp index d2f09e904..90804e900 100644 --- a/include/Nazara/Audio/SoundBuffer.hpp +++ b/include/Nazara/Audio/SoundBuffer.hpp @@ -61,6 +61,7 @@ class NAZARA_API NzSoundBuffer : public NzRefCounted, public NzResource, NzNonCo bool LoadFromStream(NzInputStream& stream, const NzSoundBufferParams& params = NzSoundBufferParams()); static bool IsFormatSupported(nzAudioFormat format); + template static NzSoundBufferRef New(Args&&... args); private: unsigned int GetOpenALBuffer() const; @@ -70,4 +71,6 @@ class NAZARA_API NzSoundBuffer : public NzRefCounted, public NzResource, NzNonCo static NzSoundBufferLoader::LoaderList s_loaders; }; +#include + #endif // NAZARA_SOUNDBUFFER_HPP diff --git a/include/Nazara/Audio/SoundBuffer.inl b/include/Nazara/Audio/SoundBuffer.inl new file mode 100644 index 000000000..ca95239ea --- /dev/null +++ b/include/Nazara/Audio/SoundBuffer.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Audio module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzSoundBufferRef NzSoundBuffer::New(Args&&... args) +{ + std::unique_ptr object(new NzSoundBuffer(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Core/ObjectRef.hpp b/include/Nazara/Core/ObjectRef.hpp index 246cdb8e3..715b56fdd 100644 --- a/include/Nazara/Core/ObjectRef.hpp +++ b/include/Nazara/Core/ObjectRef.hpp @@ -23,6 +23,7 @@ class NzObjectRef NzObjectRef(NzObjectRef&& ref) noexcept; ~NzObjectRef(); + T* Get() const; bool IsValid() const; T* Release(); bool Reset(T* object = nullptr); diff --git a/include/Nazara/Core/ObjectRef.inl b/include/Nazara/Core/ObjectRef.inl index e78a4a1e4..fed88a6fb 100644 --- a/include/Nazara/Core/ObjectRef.inl +++ b/include/Nazara/Core/ObjectRef.inl @@ -41,6 +41,12 @@ NzObjectRef::~NzObjectRef() m_object->RemoveReference(); } +template +T* NzObjectRef::Get() const +{ + return m_object; +} + template bool NzObjectRef::IsValid() const { diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index b692e704e..cf2b807fe 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -134,6 +134,7 @@ class NAZARA_API NzMaterial : public NzRefCounted, public NzResource NzMaterial& operator=(const NzMaterial& material); static NzMaterial* GetDefault(); + template static NzMaterialRef New(Args&&... args); private: struct ShaderInstance @@ -172,8 +173,10 @@ class NAZARA_API NzMaterial : public NzRefCounted, public NzResource float m_alphaThreshold; float m_shininess; - static NzMaterial* s_defaultMaterial; + static NzMaterialRef s_defaultMaterial; static NzMaterialLoader::LoaderList s_loaders; }; +#include + #endif // NAZARA_MATERIAL_HPP diff --git a/include/Nazara/Graphics/Material.inl b/include/Nazara/Graphics/Material.inl new file mode 100644 index 000000000..08c3d9b2d --- /dev/null +++ b/include/Nazara/Graphics/Material.inl @@ -0,0 +1,17 @@ +// 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 + +template +NzMaterialRef NzMaterial::New(Args&&... args) +{ + std::unique_ptr object(new NzMaterial(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Renderer/RenderBuffer.hpp b/include/Nazara/Renderer/RenderBuffer.hpp index 48947f927..09f98f9e0 100644 --- a/include/Nazara/Renderer/RenderBuffer.hpp +++ b/include/Nazara/Renderer/RenderBuffer.hpp @@ -40,6 +40,7 @@ class NAZARA_API NzRenderBuffer : public NzRefCounted, NzNonCopyable bool IsValid() const; static bool IsSupported(); + template static NzRenderBufferRef New(Args&&... args); private: nzPixelFormat m_pixelFormat; @@ -48,4 +49,6 @@ class NAZARA_API NzRenderBuffer : public NzRefCounted, NzNonCopyable unsigned int m_width; }; +#include + #endif // NAZARA_RENDERBUFFER_HPP diff --git a/include/Nazara/Renderer/RenderBuffer.inl b/include/Nazara/Renderer/RenderBuffer.inl new file mode 100644 index 000000000..bf79eb6e9 --- /dev/null +++ b/include/Nazara/Renderer/RenderBuffer.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzRenderBufferRef NzRenderBuffer::New(Args&&... args) +{ + std::unique_ptr object(new NzRenderBuffer(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Renderer/Shader.hpp b/include/Nazara/Renderer/Shader.hpp index ecdc0b3e6..aae8c8854 100644 --- a/include/Nazara/Renderer/Shader.hpp +++ b/include/Nazara/Renderer/Shader.hpp @@ -97,6 +97,7 @@ class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable unsigned int GetOpenGLID() const; static bool IsStageSupported(nzShaderStage stage); + template static NzShaderRef New(Args&&... args); private: bool PostLinkage(); @@ -107,4 +108,6 @@ class NAZARA_API NzShader : public NzRefCounted, NzNonCopyable unsigned int m_program; }; +#include + #endif // NAZARA_SHADER_HPP diff --git a/include/Nazara/Renderer/Shader.inl b/include/Nazara/Renderer/Shader.inl new file mode 100644 index 000000000..655c30655 --- /dev/null +++ b/include/Nazara/Renderer/Shader.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzShaderRef NzShader::New(Args&&... args) +{ + std::unique_ptr object(new NzShader(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index 29a4d6762..48df60331 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -101,6 +101,7 @@ class NAZARA_API NzTexture : public NzAbstractImage, public NzRefCounted, public static bool IsFormatSupported(nzPixelFormat format); static bool IsMipmappingSupported(); static bool IsTypeSupported(nzImageType type); + template static NzTextureRef New(Args&&... args); private: bool CreateTexture(bool proxy); @@ -108,4 +109,6 @@ class NAZARA_API NzTexture : public NzAbstractImage, public NzRefCounted, public NzTextureImpl* m_impl = nullptr; }; +#include + #endif // NAZARA_TEXTURE_HPP diff --git a/include/Nazara/Renderer/Texture.inl b/include/Nazara/Renderer/Texture.inl new file mode 100644 index 000000000..bb4ed4c23 --- /dev/null +++ b/include/Nazara/Renderer/Texture.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzTextureRef NzTexture::New(Args&&... args) +{ + std::unique_ptr object(new NzTexture(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Renderer/UberShaderPreprocessor.hpp b/include/Nazara/Renderer/UberShaderPreprocessor.hpp index 83ae69b3d..8e8c47af1 100644 --- a/include/Nazara/Renderer/UberShaderPreprocessor.hpp +++ b/include/Nazara/Renderer/UberShaderPreprocessor.hpp @@ -9,12 +9,21 @@ #include #include +#include +#include #include #include #include #include #include +class NzUberShaderPreprocessor; + +using NzUberShaderPreprocessorConstListener = NzObjectListenerWrapper; +using NzUberShaderPreprocessorConstRef = NzObjectRef; +using NzUberShaderPreprocessorListener = NzObjectListenerWrapper; +using NzUberShaderPreprocessorRef = NzObjectRef; + class NAZARA_API NzUberShaderPreprocessor : public NzUberShader { public: @@ -27,6 +36,7 @@ class NAZARA_API NzUberShaderPreprocessor : public NzUberShader bool SetShaderFromFile(nzShaderStage stage, const NzString& filePath, const NzString& shaderFlags, const NzString& requiredFlags = NzString()); static bool IsSupported(); + template static NzUberShaderPreprocessorRef New(Args&&... args); private: struct Shader @@ -43,4 +53,6 @@ class NAZARA_API NzUberShaderPreprocessor : public NzUberShader Shader m_shaders[nzShaderStage_Max+1]; }; +#include + #endif // NAZARA_UBERSHADERPREPROCESSOR_HPP diff --git a/include/Nazara/Renderer/UberShaderPreprocessor.inl b/include/Nazara/Renderer/UberShaderPreprocessor.inl new file mode 100644 index 000000000..f5c9cb603 --- /dev/null +++ b/include/Nazara/Renderer/UberShaderPreprocessor.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Renderer module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzUberShaderPreprocessorRef NzUberShaderPreprocessor::New(Args&&... args) +{ + std::unique_ptr object(new NzUberShaderPreprocessor(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/Animation.hpp b/include/Nazara/Utility/Animation.hpp index 1deae6222..430ac07f6 100644 --- a/include/Nazara/Utility/Animation.hpp +++ b/include/Nazara/Utility/Animation.hpp @@ -80,10 +80,14 @@ class NAZARA_API NzAnimation : public NzRefCounted, public NzResource void RemoveSequence(const NzString& sequenceName); void RemoveSequence(unsigned int index); + template static NzAnimationRef New(Args&&... args); + private: NzAnimationImpl* m_impl = nullptr; static NzAnimationLoader::LoaderList s_loaders; }; +#include + #endif // NAZARA_ANIMATION_HPP diff --git a/include/Nazara/Utility/Animation.inl b/include/Nazara/Utility/Animation.inl new file mode 100644 index 000000000..77f60c01c --- /dev/null +++ b/include/Nazara/Utility/Animation.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzAnimationRef NzAnimation::New(Args&&... args) +{ + std::unique_ptr object(new NzAnimation(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/Buffer.hpp b/include/Nazara/Utility/Buffer.hpp index 9642c2b91..bd994cb0c 100644 --- a/include/Nazara/Utility/Buffer.hpp +++ b/include/Nazara/Utility/Buffer.hpp @@ -58,6 +58,7 @@ class NAZARA_API NzBuffer : public NzRefCounted, NzNonCopyable void Unmap() const; static bool IsStorageSupported(nzUInt32 storage); + template static NzBufferRef New(Args&&... args); static void SetBufferFactory(nzUInt32 storage, BufferFactory func); private: @@ -73,4 +74,6 @@ class NAZARA_API NzBuffer : public NzRefCounted, NzNonCopyable static BufferFactory s_bufferFactories[nzDataStorage_Max+1]; }; +#include + #endif // NAZARA_BUFFER_HPP diff --git a/include/Nazara/Utility/Buffer.inl b/include/Nazara/Utility/Buffer.inl new file mode 100644 index 000000000..89d8f679e --- /dev/null +++ b/include/Nazara/Utility/Buffer.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzBufferRef NzBuffer::New(Args&&... args) +{ + std::unique_ptr object(new NzBuffer(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index f812bc047..3ef5411a5 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -85,6 +85,8 @@ class NAZARA_API NzFont : public NzRefCounted, public NzResource, NzAbstractAtla static bool Initialize(); + template static NzFontRef New(Args&&... args); + static void SetDefaultAtlas(const std::shared_ptr& atlas); static void SetDefaultGlyphBorder(unsigned int borderSize); static void SetDefaultMinimumStepSize(unsigned int minimumStepSize); @@ -138,10 +140,12 @@ class NAZARA_API NzFont : public NzRefCounted, public NzResource, NzAbstractAtla unsigned int m_minimumStepSize; static std::shared_ptr s_defaultAtlas; - static NzFont* s_defaultFont; + static NzFontRef s_defaultFont; static NzFontLoader::LoaderList s_loaders; static unsigned int s_defaultGlyphBorder; static unsigned int s_defaultMinimumStepSize; }; +#include + #endif // NAZARA_FONT_HPP diff --git a/include/Nazara/Utility/Font.inl b/include/Nazara/Utility/Font.inl new file mode 100644 index 000000000..904da2075 --- /dev/null +++ b/include/Nazara/Utility/Font.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzFontRef NzFont::New(Args&&... args) +{ + std::unique_ptr object(new NzFont(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/Image.hpp b/include/Nazara/Utility/Image.hpp index 210ad340b..c62b62eaf 100644 --- a/include/Nazara/Utility/Image.hpp +++ b/include/Nazara/Utility/Image.hpp @@ -112,6 +112,7 @@ class NAZARA_API NzImage : public NzAbstractImage, public NzRefCounted, public N static void Copy(nzUInt8* destination, const nzUInt8* source, nzUInt8 bpp, unsigned int width, unsigned int height, unsigned int depth = 1, unsigned int dstWidth = 0, unsigned int dstHeight = 0, unsigned int srcWidth = 0, unsigned int srcHeight = 0); static nzUInt8 GetMaxLevel(unsigned int width, unsigned int height, unsigned int depth = 1); static nzUInt8 GetMaxLevel(nzImageType type, unsigned int width, unsigned int height, unsigned int depth = 1); + template static NzImageRef New(Args&&... args); struct SharedImage { @@ -149,4 +150,6 @@ class NAZARA_API NzImage : public NzAbstractImage, public NzRefCounted, public N static NzImageLoader::LoaderList s_loaders; }; +#include + #endif // NAZARA_IMAGE_HPP diff --git a/include/Nazara/Utility/Image.inl b/include/Nazara/Utility/Image.inl new file mode 100644 index 000000000..dfe6934a7 --- /dev/null +++ b/include/Nazara/Utility/Image.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzImageRef NzImage::New(Args&&... args) +{ + std::unique_ptr object(new NzImage(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/IndexBuffer.hpp b/include/Nazara/Utility/IndexBuffer.hpp index 52eb5730f..54c7348e1 100644 --- a/include/Nazara/Utility/IndexBuffer.hpp +++ b/include/Nazara/Utility/IndexBuffer.hpp @@ -64,6 +64,8 @@ class NAZARA_API NzIndexBuffer : public NzRefCounted NzIndexBuffer& operator=(const NzIndexBuffer& indexBuffer); + template static NzIndexBufferRef New(Args&&... args); + private: NzBufferRef m_buffer; bool m_largeIndices; @@ -72,4 +74,6 @@ class NAZARA_API NzIndexBuffer : public NzRefCounted unsigned int m_startOffset; }; +#include + #endif // NAZARA_INDEXBUFFER_HPP diff --git a/include/Nazara/Utility/IndexBuffer.inl b/include/Nazara/Utility/IndexBuffer.inl new file mode 100644 index 000000000..e9f8d8874 --- /dev/null +++ b/include/Nazara/Utility/IndexBuffer.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzIndexBufferRef NzIndexBuffer::New(Args&&... args) +{ + std::unique_ptr object(new NzIndexBuffer(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index 900dc013e..e4f3d553e 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -123,10 +123,14 @@ class NAZARA_API NzMesh : public NzRefCounted, public NzResource void Transform(const NzMatrix4f& matrix); + template static NzMeshRef New(Args&&... args); + private: NzMeshImpl* m_impl = nullptr; static NzMeshLoader::LoaderList s_loaders; }; +#include + #endif // NAZARA_MESH_HPP diff --git a/include/Nazara/Utility/Mesh.inl b/include/Nazara/Utility/Mesh.inl new file mode 100644 index 000000000..73252c536 --- /dev/null +++ b/include/Nazara/Utility/Mesh.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzMeshRef NzMesh::New(Args&&... args) +{ + std::unique_ptr object(new NzMesh(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/SkeletalMesh.hpp b/include/Nazara/Utility/SkeletalMesh.hpp index 51dc5e0c3..3d3ade40b 100644 --- a/include/Nazara/Utility/SkeletalMesh.hpp +++ b/include/Nazara/Utility/SkeletalMesh.hpp @@ -41,10 +41,14 @@ class NAZARA_API NzSkeletalMesh final : public NzSubMesh void SetAABB(const NzBoxf& aabb); void SetIndexBuffer(const NzIndexBuffer* indexBuffer); + template static NzSkeletalMeshRef New(Args&&... args); + private: NzBoxf m_aabb; NzIndexBufferConstRef m_indexBuffer = nullptr; NzVertexBufferRef m_vertexBuffer = nullptr; }; +#include + #endif // NAZARA_SKELETALMESH_HPP diff --git a/include/Nazara/Utility/SkeletalMesh.inl b/include/Nazara/Utility/SkeletalMesh.inl new file mode 100644 index 000000000..e6675058d --- /dev/null +++ b/include/Nazara/Utility/SkeletalMesh.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzSkeletalMeshRef NzSkeletalMesh::New(Args&&... args) +{ + std::unique_ptr object(new NzSkeletalMesh(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/Skeleton.hpp b/include/Nazara/Utility/Skeleton.hpp index 465dcf9c8..a247ece16 100644 --- a/include/Nazara/Utility/Skeleton.hpp +++ b/include/Nazara/Utility/Skeleton.hpp @@ -53,6 +53,8 @@ class NAZARA_API NzSkeleton : public NzRefCounted NzSkeleton& operator=(const NzSkeleton& skeleton); + template static NzSkeletonRef New(Args&&... args); + private: void InvalidateJoints(); void InvalidateJointMap(); @@ -61,4 +63,6 @@ class NAZARA_API NzSkeleton : public NzRefCounted NzSkeletonImpl* m_impl = nullptr; }; +#include + #endif // NAZARA_SKELETON_HPP diff --git a/include/Nazara/Utility/Skeleton.inl b/include/Nazara/Utility/Skeleton.inl new file mode 100644 index 000000000..b91f59822 --- /dev/null +++ b/include/Nazara/Utility/Skeleton.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzSkeletonRef NzSkeleton::New(Args&&... args) +{ + std::unique_ptr object(new NzSkeleton(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/StaticMesh.hpp b/include/Nazara/Utility/StaticMesh.hpp index d94986df2..b991507cd 100644 --- a/include/Nazara/Utility/StaticMesh.hpp +++ b/include/Nazara/Utility/StaticMesh.hpp @@ -45,10 +45,14 @@ class NAZARA_API NzStaticMesh final : public NzSubMesh void SetAABB(const NzBoxf& aabb); void SetIndexBuffer(const NzIndexBuffer* indexBuffer); + template static NzStaticMeshRef New(Args&&... args); + private: NzBoxf m_aabb; NzIndexBufferConstRef m_indexBuffer = nullptr; NzVertexBufferRef m_vertexBuffer = nullptr; }; +#include + #endif // NAZARA_STATICMESH_HPP diff --git a/include/Nazara/Utility/StaticMesh.inl b/include/Nazara/Utility/StaticMesh.inl new file mode 100644 index 000000000..51ea2bcc7 --- /dev/null +++ b/include/Nazara/Utility/StaticMesh.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzStaticMeshRef NzStaticMesh::New(Args&&... args) +{ + std::unique_ptr object(new NzStaticMesh(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/VertexBuffer.hpp b/include/Nazara/Utility/VertexBuffer.hpp index 5e15d6125..2b6e956f4 100644 --- a/include/Nazara/Utility/VertexBuffer.hpp +++ b/include/Nazara/Utility/VertexBuffer.hpp @@ -62,6 +62,8 @@ class NAZARA_API NzVertexBuffer : public NzRefCounted NzVertexBuffer& operator=(const NzVertexBuffer& vertexBuffer); + template static NzVertexBufferRef New(Args&&... args); + private: NzBufferRef m_buffer; NzVertexDeclarationConstRef m_vertexDeclaration; @@ -70,4 +72,6 @@ class NAZARA_API NzVertexBuffer : public NzRefCounted unsigned int m_vertexCount; }; +#include + #endif // NAZARA_VERTEXBUFFER_HPP diff --git a/include/Nazara/Utility/VertexBuffer.inl b/include/Nazara/Utility/VertexBuffer.inl new file mode 100644 index 000000000..59429b31e --- /dev/null +++ b/include/Nazara/Utility/VertexBuffer.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzVertexBufferRef NzVertexBuffer::New(Args&&... args) +{ + std::unique_ptr object(new NzVertexBuffer(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/VertexDeclaration.hpp b/include/Nazara/Utility/VertexDeclaration.hpp index c8c086f56..2b1146a9f 100644 --- a/include/Nazara/Utility/VertexDeclaration.hpp +++ b/include/Nazara/Utility/VertexDeclaration.hpp @@ -41,6 +41,7 @@ class NAZARA_API NzVertexDeclaration : public NzRefCounted static NzVertexDeclaration* Get(nzVertexLayout layout); static bool IsTypeSupported(nzComponentType type); + template static NzVertexDeclarationRef New(Args&&... args); private: static bool Initialize(); @@ -67,4 +68,6 @@ class NAZARA_API NzVertexDeclaration : public NzRefCounted static NzVertexDeclaration s_declarations[nzVertexLayout_Max+1]; }; +#include + #endif // NAZARA_VERTEXDECLARATION_HPP diff --git a/include/Nazara/Utility/VertexDeclaration.inl b/include/Nazara/Utility/VertexDeclaration.inl new file mode 100644 index 000000000..d0bf546f7 --- /dev/null +++ b/include/Nazara/Utility/VertexDeclaration.inl @@ -0,0 +1,17 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +template +NzVertexDeclarationRef NzVertexDeclaration::New(Args&&... args) +{ + std::unique_ptr object(new NzVertexDeclaration(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); +} + +#include diff --git a/include/Nazara/Utility/VertexMapper.inl b/include/Nazara/Utility/VertexMapper.inl index 34270b084..c2b46a3c9 100644 --- a/include/Nazara/Utility/VertexMapper.inl +++ b/include/Nazara/Utility/VertexMapper.inl @@ -2,8 +2,8 @@ // This file is part of the "Nazara Engine - Utility module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include #include +#include template NzSparsePtr NzVertexMapper::GetComponentPtr(nzVertexComponent component) diff --git a/src/Nazara/Audio/Sound.cpp b/src/Nazara/Audio/Sound.cpp index da0e9a959..4e702a8d5 100644 --- a/src/Nazara/Audio/Sound.cpp +++ b/src/Nazara/Audio/Sound.cpp @@ -84,52 +84,40 @@ bool NzSound::IsPlaying() const bool NzSound::LoadFromFile(const NzString& filePath, const NzSoundBufferParams& params) { - std::unique_ptr buffer(new NzSoundBuffer); - buffer->SetPersistent(false); - + NzSoundBufferRef buffer = NzSoundBuffer::New(); if (!buffer->LoadFromFile(filePath, params)) { NazaraError("Failed to load buffer from file (" + filePath + ')'); return false; } - SetBuffer(buffer.get()); - buffer.release(); - + SetBuffer(buffer); return true; } bool NzSound::LoadFromMemory(const void* data, std::size_t size, const NzSoundBufferParams& params) { - std::unique_ptr buffer(new NzSoundBuffer); - buffer->SetPersistent(false); - + NzSoundBufferRef buffer = NzSoundBuffer::New(); if (!buffer->LoadFromMemory(data, size, params)) { NazaraError("Failed to load buffer from memory (" + NzString::Pointer(data) + ')'); return false; } - SetBuffer(buffer.get()); - buffer.release(); - + SetBuffer(buffer); return true; } bool NzSound::LoadFromStream(NzInputStream& stream, const NzSoundBufferParams& params) { - std::unique_ptr buffer(new NzSoundBuffer); - buffer->SetPersistent(false); - + NzSoundBufferRef buffer = NzSoundBuffer::New(); if (!buffer->LoadFromStream(stream, params)) { NazaraError("Failed to load buffer from stream"); return false; } - SetBuffer(buffer.get()); - buffer.release(); - + SetBuffer(buffer); return true; } diff --git a/src/Nazara/Graphics/DeferredBloomPass.cpp b/src/Nazara/Graphics/DeferredBloomPass.cpp index 29e875d3c..bae3ae973 100644 --- a/src/Nazara/Graphics/DeferredBloomPass.cpp +++ b/src/Nazara/Graphics/DeferredBloomPass.cpp @@ -26,10 +26,7 @@ m_blurPassCount(5) m_gaussianBlurShaderFilterLocation = m_gaussianBlurShader->GetUniformLocation("Filter"); for (unsigned int i = 0; i < 2; ++i) - { - m_bloomTextures[i] = new NzTexture; - m_bloomTextures[i]->SetPersistent(false); - } + m_bloomTextures[i] = NzTexture::New(); } NzDeferredBloomPass::~NzDeferredBloomPass() = default; diff --git a/src/Nazara/Graphics/DeferredDOFPass.cpp b/src/Nazara/Graphics/DeferredDOFPass.cpp index 541181411..d898cd66d 100644 --- a/src/Nazara/Graphics/DeferredDOFPass.cpp +++ b/src/Nazara/Graphics/DeferredDOFPass.cpp @@ -14,7 +14,7 @@ namespace { // http://digitalerr0r.wordpress.com/2009/05/16/xna-shader-programming-tutorial-20-depth-of-field/ - NzShader* BuildDepthOfFieldShader() + NzShaderRef BuildDepthOfFieldShader() { const char* fragmentSource = "#version 140\n" @@ -63,9 +63,7 @@ namespace "}\n"; ///TODO: Remplacer ça par des ShaderNode - std::unique_ptr shader(new NzShader); - shader->SetPersistent(false); - + NzShaderRef shader = NzShader::New(); if (!shader->Create()) { NazaraError("Failed to load create shader"); @@ -90,7 +88,7 @@ namespace return nullptr; } - return shader.release(); + return shader; } } @@ -105,10 +103,7 @@ NzDeferredDOFPass::NzDeferredDOFPass() m_gaussianBlurShaderFilterLocation = m_gaussianBlurShader->GetUniformLocation("Filter"); for (unsigned int i = 0; i < 2; ++i) - { - m_dofTextures[i] = new NzTexture; - m_dofTextures[i]->SetPersistent(false); - } + m_dofTextures[i] = NzTexture::New(); m_bilinearSampler.SetAnisotropyLevel(1); m_bilinearSampler.SetFilterMode(nzSamplerFilter_Bilinear); diff --git a/src/Nazara/Graphics/DeferredFogPass.cpp b/src/Nazara/Graphics/DeferredFogPass.cpp index 01f20f95b..143c05248 100644 --- a/src/Nazara/Graphics/DeferredFogPass.cpp +++ b/src/Nazara/Graphics/DeferredFogPass.cpp @@ -12,7 +12,7 @@ namespace { - NzShader* BuildFogShader() + NzShaderRef BuildFogShader() { /*const nzUInt8 fragmentSource[] = { #include @@ -84,9 +84,7 @@ namespace "}\n"; ///TODO: Remplacer ça par des ShaderNode - std::unique_ptr shader(new NzShader); - shader->SetPersistent(false); - + NzShaderRef shader = NzShader::New(); if (!shader->Create()) { NazaraError("Failed to load create shader"); @@ -114,7 +112,7 @@ namespace shader->SendInteger(shader->GetUniformLocation("ColorTexture"), 0); shader->SendInteger(shader->GetUniformLocation("GBuffer2"), 1); - return shader.release(); + return shader; } } diff --git a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp index 6208edbd5..cddb54917 100644 --- a/src/Nazara/Graphics/DeferredPhongLightingPass.cpp +++ b/src/Nazara/Graphics/DeferredPhongLightingPass.cpp @@ -45,13 +45,11 @@ m_lightMeshesDrawing(false) m_pointSampler.SetFilterMode(nzSamplerFilter_Nearest); m_pointSampler.SetWrapMode(nzSamplerWrap_Clamp); - m_cone = new NzMesh; - m_cone->SetPersistent(false); + m_cone = NzMesh::New(); m_cone->CreateStatic(); m_coneMesh = static_cast(m_cone->BuildSubMesh(NzPrimitive::Cone(1.f, 1.f, 16, NzMatrix4f::Rotate(NzEulerAnglesf(90.f, 0.f, 0.f))))); - m_sphere = new NzMesh; - m_sphere->SetPersistent(false); + m_sphere = NzMesh::New(); m_sphere->CreateStatic(); m_sphereMesh = static_cast(m_sphere->BuildSubMesh(NzPrimitive::IcoSphere(1.f, 1))); } diff --git a/src/Nazara/Graphics/DeferredRenderTechnique.cpp b/src/Nazara/Graphics/DeferredRenderTechnique.cpp index 2b9a30aa6..73c887fe8 100644 --- a/src/Nazara/Graphics/DeferredRenderTechnique.cpp +++ b/src/Nazara/Graphics/DeferredRenderTechnique.cpp @@ -79,13 +79,11 @@ namespace static_assert(sizeof(RenderPassPriority)/sizeof(unsigned int) == nzRenderPassType_Max+1, "Render pass priority array is incomplete"); - inline NzShader* RegisterDeferredShader(const NzString& name, const nzUInt8* fragmentSource, unsigned int fragmentSourceLength, const NzShaderStage& vertexStage, NzString* err) + inline NzShaderRef RegisterDeferredShader(const NzString& name, const nzUInt8* fragmentSource, unsigned int fragmentSourceLength, const NzShaderStage& vertexStage, NzString* err) { NzErrorFlags errFlags(nzErrorFlag_Silent | nzErrorFlag_ThrowExceptionDisabled); - std::unique_ptr shader(new NzShader); - shader->SetPersistent(false); - + NzShaderRef shader = NzShader::New(); if (!shader->Create()) { err->Set("Failed to create shader: " + NzError::GetLastError()); @@ -106,8 +104,8 @@ namespace return nullptr; } - NzShaderLibrary::Register(name, shader.get()); - return shader.release(); + NzShaderLibrary::Register(name, shader); + return shader; } } @@ -115,20 +113,13 @@ NzDeferredRenderTechnique::NzDeferredRenderTechnique() : m_renderQueue(static_cast(m_forwardTechnique.GetRenderQueue())), m_GBufferSize(0U) { - m_depthStencilBuffer = new NzRenderBuffer; - m_depthStencilBuffer->SetPersistent(false); + m_depthStencilBuffer = NzRenderBuffer::New(); for (unsigned int i = 0; i < 2; ++i) - { - m_workTextures[i] = new NzTexture; - m_workTextures[i]->SetPersistent(false); - } + m_workTextures[i] = NzTexture::New(); for (unsigned int i = 0; i < 3; ++i) - { - m_GBuffer[i] = new NzTexture; - m_GBuffer[i]->SetPersistent(false); - } + m_GBuffer[i] = NzTexture::New(); try { diff --git a/src/Nazara/Graphics/Loaders/Mesh/Loader.cpp b/src/Nazara/Graphics/Loaders/Mesh/Loader.cpp index ad973f77e..9c5a83d80 100644 --- a/src/Nazara/Graphics/Loaders/Mesh/Loader.cpp +++ b/src/Nazara/Graphics/Loaders/Mesh/Loader.cpp @@ -24,8 +24,7 @@ namespace { NazaraUnused(parameters); - std::unique_ptr mesh(new NzMesh); - mesh->SetPersistent(false); + NzMeshRef mesh = NzMesh::New(); if (!mesh->LoadFromStream(stream, parameters.mesh)) { NazaraError("Failed to load model mesh"); @@ -38,12 +37,8 @@ namespace return false; } - // Nous ne pouvons plus avoir recours au smart pointeur à partir d'ici si nous voulons être exception-safe - NzMesh* meshPtr = mesh.get(); - model->Reset(); - model->SetMesh(meshPtr); - mesh.release(); + model->SetMesh(mesh); if (parameters.loadMaterials) { @@ -51,17 +46,12 @@ namespace for (unsigned int i = 0; i < matCount; ++i) { - NzString mat = meshPtr->GetMaterial(i); + NzString mat = mesh->GetMaterial(i); if (!mat.IsEmpty()) { - std::unique_ptr material(new NzMaterial); - material->SetPersistent(false); - + NzMaterialRef material = NzMaterial::New(); if (material->LoadFromFile(mat, parameters.material)) - { - model->SetMaterial(i, material.get()); - material.release(); - } + model->SetMaterial(i, material); else NazaraWarning("Failed to load material #" + NzString::Number(i)); } @@ -83,8 +73,7 @@ namespace { NazaraUnused(parameters); - std::unique_ptr mesh(new NzMesh); - mesh->SetPersistent(false); + NzMeshRef mesh = NzMesh::New(); if (!mesh->LoadFromStream(stream, parameters.mesh)) { NazaraError("Failed to load model mesh"); @@ -97,13 +86,8 @@ namespace return false; } - - // Nous ne pouvons plus avoir recours au smart pointeur à partir d'ici si nous voulons être exception-safe - NzMesh* meshPtr = mesh.get(); - model->Reset(); - model->SetMesh(meshPtr); - mesh.release(); + model->SetMesh(mesh); if (parameters.loadMaterials) { @@ -111,17 +95,12 @@ namespace for (unsigned int i = 0; i < matCount; ++i) { - NzString mat = meshPtr->GetMaterial(i); + NzString mat = mesh->GetMaterial(i); if (!mat.IsEmpty()) { - std::unique_ptr material(new NzMaterial); - material->SetPersistent(false); - + NzMaterialRef material = NzMaterial::New(); if (material->LoadFromFile(mat, parameters.material)) - { - model->SetMaterial(i, material.get()); - material.release(); - } + model->SetMaterial(i, material); else NazaraWarning("Failed to load material #" + NzString::Number(i)); } diff --git a/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp b/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp index d848ef052..8ce0a0d83 100644 --- a/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp +++ b/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp @@ -41,8 +41,7 @@ namespace return false; } - std::unique_ptr mesh(new NzMesh); - mesh->SetPersistent(false); + NzMeshRef mesh = NzMesh::New(); if (!mesh->CreateStatic()) // Ne devrait jamais échouer { NazaraInternalError("Failed to create mesh"); @@ -100,14 +99,11 @@ namespace } // Création des buffers - std::unique_ptr indexBuffer(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indices.size(), parameters.mesh.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); - - std::unique_ptr vertexBuffer(new NzVertexBuffer(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), vertexCount, parameters.mesh.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); + NzIndexBufferRef indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indices.size(), parameters.mesh.storage, nzBufferUsage_Static); + NzVertexBufferRef vertexBuffer = NzVertexBuffer::New(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), vertexCount, parameters.mesh.storage, nzBufferUsage_Static); // Remplissage des indices - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); for (unsigned int j = 0; j < indices.size(); ++j) indexMapper.Set(j, indices[j]); @@ -116,7 +112,7 @@ namespace // Remplissage des vertices bool hasNormals = true; bool hasTexCoords = true; - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); NzMeshVertex* meshVertices = static_cast(vertexMapper.GetPointer()); for (auto& uvIt : vertices) { @@ -152,21 +148,18 @@ namespace vertexMapper.Unmap(); - std::unique_ptr subMesh(new NzStaticMesh(mesh.get())); - if (!subMesh->Create(vertexBuffer.get())) + NzStaticMeshRef subMesh = NzStaticMesh::New(mesh); + if (!subMesh->Create(vertexBuffer)) { NazaraError("Failed to create StaticMesh"); continue; } - vertexBuffer.release(); if (parameters.mesh.optimizeIndexBuffers) indexBuffer->Optimize(); - subMesh->SetIndexBuffer(indexBuffer.get()); - indexBuffer.release(); - subMesh->GenerateAABB(); + subMesh->SetIndexBuffer(indexBuffer); subMesh->SetMaterialIndex(meshes[i].material); subMesh->SetPrimitiveMode(nzPrimitiveMode_TriangleList); @@ -178,8 +171,7 @@ namespace else subMesh->GenerateNormals(); - mesh->AddSubMesh(meshes[i].name + '_' + materials[meshes[i].material], subMesh.get()); - subMesh.release(); + mesh->AddSubMesh(meshes[i].name + '_' + materials[meshes[i].material], subMesh); } if (parameters.mesh.center) @@ -196,8 +188,7 @@ namespace mesh->SetMaterialCount(parser.GetMaterialCount()); - model->SetMesh(mesh.get()); - mesh.release(); + model->SetMesh(mesh); // On charge les matériaux si demandé NzString mtlLib = parser.GetMtlLib(); @@ -209,7 +200,7 @@ namespace NzMTLParser materialParser(file); if (materialParser.Parse()) { - std::unordered_map materialCache; + std::unordered_map materialCache; NzString baseDir = file.GetDirectory(); for (unsigned int i = 0; i < meshCount; ++i) { @@ -222,9 +213,7 @@ namespace model->SetMaterial(meshes[i].material, it->second); else { - std::unique_ptr material(new NzMaterial); - material->SetPersistent(false); - + NzMaterialRef material = NzMaterial::New(); material->SetShader(parameters.material.shaderName); nzUInt8 alphaValue = static_cast(mtlMat->alpha*255.f); @@ -246,15 +235,11 @@ namespace bool hasAlphaMap = false;; if (parameters.material.loadAlphaMap && !mtlMat->alphaMap.IsEmpty()) { - std::unique_ptr alphaMap(new NzTexture); - alphaMap->SetPersistent(false); - + NzTextureRef alphaMap = NzTexture::New(); if (alphaMap->LoadFromFile(baseDir + mtlMat->alphaMap)) { hasAlphaMap = true; - - material->SetAlphaMap(alphaMap.get()); - alphaMap.release(); + material->SetAlphaMap(alphaMap); } else NazaraWarning("Failed to load alpha map (" + mtlMat->alphaMap + ')'); @@ -262,28 +247,18 @@ namespace if (parameters.material.loadDiffuseMap && !mtlMat->diffuseMap.IsEmpty()) { - std::unique_ptr diffuseMap(new NzTexture); - diffuseMap->SetPersistent(false); - + NzTextureRef diffuseMap = NzTexture::New(); if (diffuseMap->LoadFromFile(baseDir + mtlMat->diffuseMap)) - { - material->SetDiffuseMap(diffuseMap.get()); - diffuseMap.release(); - } + material->SetDiffuseMap(diffuseMap); else NazaraWarning("Failed to load diffuse map (" + mtlMat->diffuseMap + ')'); } if (parameters.material.loadSpecularMap && !mtlMat->specularMap.IsEmpty()) { - std::unique_ptr specularMap(new NzTexture); - specularMap->SetPersistent(false); - + NzTextureRef specularMap = NzTexture::New(); if (specularMap->LoadFromFile(baseDir + mtlMat->specularMap)) - { - material->SetSpecularMap(specularMap.get()); - specularMap.release(); - } + material->SetSpecularMap(specularMap); else NazaraWarning("Failed to load specular map (" + mtlMat->specularMap + ')'); } @@ -299,10 +274,9 @@ namespace material->SetSrcBlend(nzBlendFunc_SrcAlpha); } - materialCache[matName] = material.get(); + materialCache[matName] = material; - model->SetMaterial(meshes[i].material, material.get()); - material.release(); + model->SetMaterial(meshes[i].material, material); } } else diff --git a/src/Nazara/Graphics/Loaders/Texture/Loader.cpp b/src/Nazara/Graphics/Loaders/Texture/Loader.cpp index 8412e2ca5..07629ceb3 100644 --- a/src/Nazara/Graphics/Loaders/Texture/Loader.cpp +++ b/src/Nazara/Graphics/Loaders/Texture/Loader.cpp @@ -22,9 +22,7 @@ namespace { NazaraUnused(parameters); - std::unique_ptr texture(new NzTexture); - texture->SetPersistent(false); - + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromStream(stream)) { NazaraError("Failed to load diffuse map"); @@ -32,9 +30,7 @@ namespace } material->Reset(); - material->SetDiffuseMap(texture.get()); - texture.release(); - + material->SetDiffuseMap(texture); material->SetShader(parameters.shaderName); return true; diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index 42a4653e7..f5b606a23 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -409,18 +409,14 @@ void NzMaterial::Reset() bool NzMaterial::SetAlphaMap(const NzString& texturePath) { - std::unique_ptr texture(new NzTexture); + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromFile(texturePath)) { NazaraError("Failed to load texture from \"" + texturePath + '"'); return false; } - texture->SetPersistent(false); - - SetAlphaMap(texture.get()); - texture.release(); - + SetAlphaMap(texture); return true; } @@ -453,18 +449,14 @@ void NzMaterial::SetDiffuseColor(const NzColor& diffuse) bool NzMaterial::SetDiffuseMap(const NzString& texturePath) { - std::unique_ptr texture(new NzTexture); + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromFile(texturePath)) { NazaraError("Failed to load texture from \"" + texturePath + '"'); return false; } - texture->SetPersistent(false); - - SetDiffuseMap(texture.get()); - texture.release(); - + SetDiffuseMap(texture); return true; } @@ -487,18 +479,14 @@ void NzMaterial::SetDstBlend(nzBlendFunc func) bool NzMaterial::SetEmissiveMap(const NzString& texturePath) { - std::unique_ptr texture(new NzTexture); + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromFile(texturePath)) { NazaraError("Failed to load texture from \"" + texturePath + '"'); return false; } - texture->SetPersistent(false); - - SetEmissiveMap(texture.get()); - texture.release(); - + SetEmissiveMap(texture); return true; } @@ -521,18 +509,14 @@ void NzMaterial::SetFaceFilling(nzFaceFilling filling) bool NzMaterial::SetHeightMap(const NzString& texturePath) { - std::unique_ptr texture(new NzTexture); + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromFile(texturePath)) { NazaraError("Failed to load texture from \"" + texturePath + '"'); return false; } - texture->SetPersistent(false); - - SetHeightMap(texture.get()); - texture.release(); - + SetHeightMap(texture); return true; } @@ -545,18 +529,14 @@ void NzMaterial::SetHeightMap(NzTexture* map) bool NzMaterial::SetNormalMap(const NzString& texturePath) { - std::unique_ptr texture(new NzTexture); + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromFile(texturePath)) { NazaraError("Failed to load texture from \"" + texturePath + '"'); return false; } - texture->SetPersistent(false); - - SetNormalMap(texture.get()); - texture.release(); - + SetNormalMap(texture); return true; } @@ -601,18 +581,14 @@ void NzMaterial::SetSpecularColor(const NzColor& specular) bool NzMaterial::SetSpecularMap(const NzString& texturePath) { - std::unique_ptr texture(new NzTexture); + NzTextureRef texture = NzTexture::New(); if (!texture->LoadFromFile(texturePath)) { NazaraError("Failed to load texture from \"" + texturePath + '"'); return false; } - texture->SetPersistent(false); - - SetSpecularMap(texture.get()); - texture.release(); - + SetSpecularMap(texture); return true; } @@ -734,8 +710,7 @@ bool NzMaterial::Initialize() // Basic shader { - std::unique_ptr uberShader(new NzUberShaderPreprocessor); - uberShader->SetPersistent(false); + NzUberShaderPreprocessorRef uberShader = NzUberShaderPreprocessor::New(); NzString fragmentShader; NzString vertexShader; @@ -753,14 +728,12 @@ bool NzMaterial::Initialize() uberShader->SetShader(nzShaderStage_Fragment, fragmentShader, "FLAG_TEXTUREOVERLAY ALPHA_MAPPING ALPHA_TEST AUTO_TEXCOORDS DIFFUSE_MAPPING"); uberShader->SetShader(nzShaderStage_Vertex, vertexShader, "FLAG_BILLBOARD FLAG_INSTANCING FLAG_VERTEXCOLOR TEXTURE_MAPPING TRANSFORM UNIFORM_VERTEX_DEPTH"); - NzUberShaderLibrary::Register("Basic", uberShader.get()); - uberShader.release(); + NzUberShaderLibrary::Register("Basic", uberShader); } // PhongLighting shader { - std::unique_ptr uberShader(new NzUberShaderPreprocessor); - uberShader->SetPersistent(false); + NzUberShaderPreprocessorRef uberShader = NzUberShaderPreprocessor::New(); NzString fragmentShader; NzString vertexShader; @@ -794,13 +767,10 @@ bool NzMaterial::Initialize() uberShader->SetShader(nzShaderStage_Fragment, fragmentShader, "FLAG_DEFERRED FLAG_TEXTUREOVERLAY ALPHA_MAPPING ALPHA_TEST AUTO_TEXCOORDS DIFFUSE_MAPPING EMISSIVE_MAPPING LIGHTING NORMAL_MAPPING PARALLAX_MAPPING SPECULAR_MAPPING"); uberShader->SetShader(nzShaderStage_Vertex, vertexShader, "FLAG_BILLBOARD FLAG_DEFERRED FLAG_INSTANCING FLAG_VERTEXCOLOR COMPUTE_TBNMATRIX LIGHTING PARALLAX_MAPPING TEXTURE_MAPPING TRANSFORM UNIFORM_VERTEX_DEPTH"); - NzUberShaderLibrary::Register("PhongLighting", uberShader.get()); - uberShader.release(); + NzUberShaderLibrary::Register("PhongLighting", uberShader); } - s_defaultMaterial = new NzMaterial; - s_defaultMaterial->SetPersistent(true); - + s_defaultMaterial = NzMaterial::New(); s_defaultMaterial->Enable(nzRendererParameter_FaceCulling, false); s_defaultMaterial->SetFaceFilling(nzFaceFilling_Line); @@ -809,12 +779,10 @@ bool NzMaterial::Initialize() void NzMaterial::Uninitialize() { + s_defaultMaterial.Reset(); NzUberShaderLibrary::Unregister("PhongLighting"); NzUberShaderLibrary::Unregister("Basic"); - - s_defaultMaterial->SetPersistent(false, true); - s_defaultMaterial = nullptr; } -NzMaterial* NzMaterial::s_defaultMaterial = nullptr; +NzMaterialRef NzMaterial::s_defaultMaterial = nullptr; NzMaterialLoader::LoaderList NzMaterial::s_loaders; diff --git a/src/Nazara/Graphics/SkinningManager.cpp b/src/Nazara/Graphics/SkinningManager.cpp index 5aed6f248..a7022b85c 100644 --- a/src/Nazara/Graphics/SkinningManager.cpp +++ b/src/Nazara/Graphics/SkinningManager.cpp @@ -172,16 +172,14 @@ NzVertexBuffer* NzSkinningManager::GetBuffer(const NzSkeletalMesh* mesh, const N MeshMap::iterator it2 = meshMap.find(mesh); if (it2 == meshMap.end()) { - std::unique_ptr vertexBuffer(new NzVertexBuffer); - vertexBuffer->SetPersistent(false); - vertexBuffer->Reset(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), mesh->GetVertexCount(), nzDataStorage_Hardware, nzBufferUsage_Dynamic); + NzVertexBufferRef vertexBuffer = NzVertexBuffer::New(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), mesh->GetVertexCount(), nzDataStorage_Hardware, nzBufferUsage_Dynamic); - BufferData data({vertexBuffer.get(), true}); + BufferData data({vertexBuffer, true}); meshMap.insert(std::make_pair(mesh, std::make_pair(NzSkeletalMeshConstListener(&listener, ObjectType_SkeletalMesh, mesh), data))); - s_skinningQueue.push_back(SkinningData{mesh, skeleton, vertexBuffer.get()}); + s_skinningQueue.push_back(SkinningData{mesh, skeleton, vertexBuffer}); - buffer = vertexBuffer.release(); + buffer = vertexBuffer; } else { diff --git a/src/Nazara/Graphics/Sprite.cpp b/src/Nazara/Graphics/Sprite.cpp index f5f28d00a..3e3bdfb00 100644 --- a/src/Nazara/Graphics/Sprite.cpp +++ b/src/Nazara/Graphics/Sprite.cpp @@ -96,14 +96,11 @@ void NzSprite::SetColor(const NzColor& color) void NzSprite::SetDefaultMaterial() { - std::unique_ptr material(new NzMaterial); + NzMaterialRef material = NzMaterial::New(); material->Enable(nzRendererParameter_FaceCulling, false); material->EnableLighting(false); - SetMaterial(material.get()); - - material->SetPersistent(false); - material.release(); + SetMaterial(material); } void NzSprite::SetMaterial(NzMaterial* material, bool resizeSprite) @@ -137,10 +134,7 @@ void NzSprite::SetTexture(NzTexture* texture, bool resizeSprite) if (!m_material) SetDefaultMaterial(); else if (m_material->GetReferenceCount() > 1) - { - m_material = new NzMaterial(*m_material); - m_material->SetPersistent(false); - } + m_material = NzMaterial::New(*m_material); // Copie m_material->SetDiffuseMap(texture); if (resizeSprite && texture && texture->IsValid()) diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 099709dd8..9361aabc4 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -108,7 +108,7 @@ void NzTextSprite::SetColor(const NzColor& color) void NzTextSprite::SetDefaultMaterial() { - std::unique_ptr material(new NzMaterial); + NzMaterialRef material = NzMaterial::New(); material->Enable(nzRendererParameter_Blend, true); material->Enable(nzRendererParameter_DepthWrite, false); material->Enable(nzRendererParameter_FaceCulling, false); @@ -116,10 +116,7 @@ void NzTextSprite::SetDefaultMaterial() material->SetDstBlend(nzBlendFunc_InvSrcAlpha); material->SetSrcBlend(nzBlendFunc_SrcAlpha); - SetMaterial(material.get()); - - material->SetPersistent(false); - material.release(); + SetMaterial(material); } void NzTextSprite::SetMaterial(NzMaterial* material) diff --git a/src/Nazara/Renderer/RenderTexture.cpp b/src/Nazara/Renderer/RenderTexture.cpp index 2cb238fcf..4f1b53962 100644 --- a/src/Nazara/Renderer/RenderTexture.cpp +++ b/src/Nazara/Renderer/RenderTexture.cpp @@ -184,22 +184,19 @@ bool NzRenderTexture::AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 in bool NzRenderTexture::AttachBuffer(nzAttachmentPoint attachmentPoint, nzUInt8 index, nzPixelFormat format, unsigned int width, unsigned int height) { - std::unique_ptr renderBuffer(new NzRenderBuffer); - renderBuffer->SetPersistent(false); - + NzRenderBufferRef renderBuffer = NzRenderBuffer::New(); if (!renderBuffer->Create(format, width, height)) { NazaraError("Failed to create RenderBuffer"); return false; } - if (!AttachBuffer(attachmentPoint, index, renderBuffer.get())) + if (!AttachBuffer(attachmentPoint, index, renderBuffer)) { NazaraError("Failed to attach buffer"); return false; } - renderBuffer.release(); return true; } diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 343de29cc..b3ea8f080 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -884,10 +884,8 @@ bool NzRenderer::Initialize() } // Création du shader de Debug - std::unique_ptr shader(new NzShader); - shader->SetPersistent(false); - - if (!shader->Create()) + NzShaderRef debugShader = NzShader::New(); + if (!debugShader->Create()) { NazaraError("Failed to create debug shader"); return false; @@ -912,26 +910,25 @@ bool NzRenderer::Initialize() vertexShaderLength = sizeof(r_compatibilityVertexShader); } - if (!shader->AttachStageFromSource(nzShaderStage_Fragment, fragmentShader, fragmentShaderLength)) + if (!debugShader->AttachStageFromSource(nzShaderStage_Fragment, fragmentShader, fragmentShaderLength)) { NazaraError("Failed to attach fragment stage"); return false; } - if (!shader->AttachStageFromSource(nzShaderStage_Vertex, vertexShader, vertexShaderLength)) + if (!debugShader->AttachStageFromSource(nzShaderStage_Vertex, vertexShader, vertexShaderLength)) { NazaraError("Failed to attach vertex stage"); return false; } - if (!shader->Link()) + if (!debugShader->Link()) { NazaraError("Failed to link shader"); return false; } - NzShaderLibrary::Register("DebugSimple", shader.get()); - shader.release(); + NzShaderLibrary::Register("DebugSimple", debugShader); onExit.Reset(); diff --git a/src/Nazara/Renderer/UberShaderPreprocessor.cpp b/src/Nazara/Renderer/UberShaderPreprocessor.cpp index 7bac973d1..9654a9ee8 100644 --- a/src/Nazara/Renderer/UberShaderPreprocessor.cpp +++ b/src/Nazara/Renderer/UberShaderPreprocessor.cpp @@ -35,10 +35,9 @@ NzUberShaderInstance* NzUberShaderPreprocessor::Get(const NzParameterList& param // Une exception sera lancée à la moindre erreur et celle-ci ne sera pas enregistrée dans le log (car traitée dans le bloc catch) NzErrorFlags errFlags(nzErrorFlag_Silent | nzErrorFlag_ThrowException, true); - std::unique_ptr shader(new NzShader); - shader->SetPersistent(false); - + NzShaderRef shader = NzShader::New(); shader->Create(); + for (unsigned int i = 0; i <= nzShaderStage_Max; ++i) { const Shader& shaderStage = m_shaders[i]; @@ -91,8 +90,7 @@ NzUberShaderInstance* NzUberShaderPreprocessor::Get(const NzParameterList& param shader->Link(); // On construit l'instant - shaderIt = m_cache.emplace(flags, shader.get()).first; - shader.release(); + shaderIt = m_cache.emplace(flags, shader.Get()).first; } catch (const std::exception& e) { diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index 6fe5bcd2c..552c57cea 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -340,16 +340,14 @@ NzFont* NzFont::GetDefault() if (!s_defaultFont) { - std::unique_ptr cabin(new NzFont); - cabin->SetPersistent(true); - + NzFontRef cabin = NzFont::New(); if (!cabin->OpenFromMemory(r_cabinRegular, sizeof(r_cabinRegular))) { NazaraError("Failed to open default font"); return nullptr; } - s_defaultFont = cabin.release(); + s_defaultFont = cabin; } return s_defaultFont; @@ -400,13 +398,7 @@ void NzFont::SetDefaultMinimumStepSize(unsigned int minimumStepSize) void NzFont::Uninitialize() { s_defaultAtlas.reset(); - - // On rend la police non-persistente et on demande la vérification du compteur (pouvant entraîner la libération de la ressource) - if (s_defaultFont) - { - s_defaultFont->SetPersistent(false, true); - s_defaultFont = nullptr; - } + s_defaultFont.Reset(); } nzUInt64 NzFont::ComputeKey(unsigned int characterSize, nzUInt32 style) const @@ -582,7 +574,7 @@ const NzFont::Glyph& NzFont::PrecacheGlyph(GlyphMap& glyphMap, unsigned int char } std::shared_ptr NzFont::s_defaultAtlas; -NzFont* NzFont::s_defaultFont; +NzFontRef NzFont::s_defaultFont; NzFontLoader::LoaderList NzFont::s_loaders; unsigned int NzFont::s_defaultGlyphBorder; unsigned int NzFont::s_defaultMinimumStepSize; diff --git a/src/Nazara/Utility/IndexBuffer.cpp b/src/Nazara/Utility/IndexBuffer.cpp index 27347b237..a6c693820 100644 --- a/src/Nazara/Utility/IndexBuffer.cpp +++ b/src/Nazara/Utility/IndexBuffer.cpp @@ -219,8 +219,7 @@ void NzIndexBuffer::Reset(bool largeIndices, unsigned int length, nzUInt32 stora m_largeIndices = largeIndices; m_startOffset = 0; - m_buffer = new NzBuffer(nzBufferType_Index, m_endOffset, storage, usage); - m_buffer->SetPersistent(false); + m_buffer = NzBuffer::New(nzBufferType_Index, m_endOffset, storage, usage); } void NzIndexBuffer::Reset(const NzIndexBuffer& indexBuffer) diff --git a/src/Nazara/Utility/Loaders/MD2/Loader.cpp b/src/Nazara/Utility/Loaders/MD2/Loader.cpp index 0483e2dac..614df0921 100644 --- a/src/Nazara/Utility/Loaders/MD2/Loader.cpp +++ b/src/Nazara/Utility/Loaders/MD2/Loader.cpp @@ -102,8 +102,7 @@ namespace /// Chargement des submesh // Actuellement le loader ne charge qu'un submesh - std::unique_ptr indexBuffer(new NzIndexBuffer(false, header.num_tris * 3, parameters.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + NzIndexBufferRef indexBuffer = NzIndexBuffer::New(false, header.num_tris*3, parameters.storage, nzBufferUsage_Static); /// Lecture des triangles std::vector triangles(header.num_tris); @@ -111,7 +110,7 @@ namespace stream.SetCursorPos(header.offset_tris); stream.Read(&triangles[0], header.num_tris*sizeof(MD2_Triangle)); - NzBufferMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); + NzBufferMapper indexMapper(indexBuffer, nzBufferAccess_DiscardAndWrite); nzUInt16* index = reinterpret_cast(indexMapper.GetPointer()); for (unsigned int i = 0; i < header.num_tris; ++i) @@ -127,7 +126,7 @@ namespace NzByteSwap(&triangles[i].texCoords[2], sizeof(nzUInt16)); #endif - // On respécifie le triangle dans le bon ordre + // On respécifie le triangle dans l'ordre attendu *index++ = triangles[i].vertices[0]; *index++ = triangles[i].vertices[2]; *index++ = triangles[i].vertices[1]; @@ -135,6 +134,9 @@ namespace indexMapper.Unmap(); + if (parameters.optimizeIndexBuffers) + indexBuffer->Optimize(); + /// Lecture des coordonnées de texture std::vector texCoords(header.num_st); @@ -149,20 +151,14 @@ namespace } #endif - std::unique_ptr vertexBuffer(new NzVertexBuffer(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), header.num_vertices, parameters.storage, nzBufferUsage_Static)); - std::unique_ptr subMesh(new NzStaticMesh(mesh)); - if (!subMesh->Create(vertexBuffer.get())) + NzVertexBufferRef vertexBuffer = NzVertexBuffer::New(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), header.num_vertices, parameters.storage, nzBufferUsage_Static); + NzStaticMeshRef subMesh = NzStaticMesh::New(mesh); + if (!subMesh->Create(vertexBuffer)) { NazaraError("Failed to create SubMesh"); return false; } - if (parameters.optimizeIndexBuffers) - indexBuffer->Optimize(); - - subMesh->SetIndexBuffer(indexBuffer.get()); - indexBuffer.release(); - /// Chargement des vertices stream.SetCursorPos(header.offset_frames); @@ -189,7 +185,7 @@ namespace scale *= s; translate *= s; - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_DiscardAndWrite); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_DiscardAndWrite); NzMeshVertex* vertex = reinterpret_cast(vertexMapper.GetPointer()); /// Chargement des coordonnées de texture @@ -224,17 +220,15 @@ namespace vertexMapper.Unmap(); - vertexBuffer->SetPersistent(false); - vertexBuffer.release(); - subMesh->GenerateAABB(); subMesh->GenerateTangents(); + subMesh->SetIndexBuffer(indexBuffer); subMesh->SetMaterialIndex(0); if (parameters.center) subMesh->Center(); - mesh->AddSubMesh(subMesh.release()); + mesh->AddSubMesh(subMesh); return true; } diff --git a/src/Nazara/Utility/Loaders/MD5Mesh/Loader.cpp b/src/Nazara/Utility/Loaders/MD5Mesh/Loader.cpp index 925c589ab..e9a96ca31 100644 --- a/src/Nazara/Utility/Loaders/MD5Mesh/Loader.cpp +++ b/src/Nazara/Utility/Loaders/MD5Mesh/Loader.cpp @@ -85,14 +85,11 @@ namespace bool largeIndices = (vertexCount > std::numeric_limits::max()); - std::unique_ptr indexBuffer(new NzIndexBuffer(largeIndices, indexCount, parameters.storage)); - indexBuffer->SetPersistent(false); - - std::unique_ptr vertexBuffer(new NzVertexBuffer(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent_Skinning), vertexCount, parameters.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); + NzIndexBufferRef indexBuffer = NzIndexBuffer::New(largeIndices, indexCount, parameters.storage); + NzVertexBufferRef vertexBuffer = NzVertexBuffer::New(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent_Skinning), vertexCount, parameters.storage, nzBufferUsage_Static); // Index buffer - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_DiscardAndWrite); // Le format définit un set de triangles nous permettant de retrouver facilement les indices // Cependant les sommets des triangles ne sont pas spécifiés dans le même ordre que ceux du moteur @@ -108,6 +105,9 @@ namespace indexMapper.Unmap(); + if (parameters.optimizeIndexBuffers) + indexBuffer->Optimize(); + // Vertex buffer struct Weight { @@ -117,7 +117,7 @@ namespace std::vector tempWeights; - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); NzSkeletalMeshVertex* vertices = static_cast(vertexMapper.GetPointer()); for (const NzMD5MeshParser::Vertex& vertex : md5Mesh.vertices) { @@ -188,22 +188,15 @@ namespace mesh->SetMaterial(i, baseDir + md5Mesh.shader); // Submesh - std::unique_ptr subMesh(new NzSkeletalMesh(mesh)); - subMesh->Create(vertexBuffer.get()); - vertexBuffer.release(); - - if (parameters.optimizeIndexBuffers) - indexBuffer->Optimize(); - - subMesh->SetIndexBuffer(indexBuffer.get()); - indexBuffer.release(); + NzSkeletalMeshRef subMesh = NzSkeletalMesh::New(mesh); + subMesh->Create(vertexBuffer); + subMesh->SetIndexBuffer(indexBuffer); subMesh->GenerateNormalsAndTangents(); subMesh->SetMaterialIndex(i); subMesh->SetPrimitiveMode(nzPrimitiveMode_TriangleList); - mesh->AddSubMesh(subMesh.get()); - subMesh.release(); + mesh->AddSubMesh(subMesh); // Animation // Il est peut-être éventuellement possible que la probabilité que l'animation ait le même nom soit non-nulle. @@ -234,10 +227,9 @@ namespace // Index buffer bool largeIndices = (vertexCount > std::numeric_limits::max()); - std::unique_ptr indexBuffer(new NzIndexBuffer(largeIndices, indexCount, parameters.storage)); - indexBuffer->SetPersistent(false); + NzIndexBufferRef indexBuffer = NzIndexBuffer::New(largeIndices, indexCount, parameters.storage); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_DiscardAndWrite); NzIndexIterator index = indexMapper.begin(); for (const NzMD5MeshParser::Triangle& triangle : md5Mesh.triangles) @@ -250,8 +242,8 @@ namespace indexMapper.Unmap(); // Vertex buffer - std::unique_ptr vertexBuffer(new NzVertexBuffer(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), vertexCount, parameters.storage)); - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); + NzVertexBufferRef vertexBuffer = NzVertexBuffer::New(NzVertexDeclaration::Get(nzVertexLayout_XYZ_Normal_UV_Tangent), vertexCount, parameters.storage); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); NzMeshVertex* vertex = reinterpret_cast(vertexMapper.GetPointer()); for (const NzMD5MeshParser::Vertex& md5Vertex : md5Mesh.vertices) @@ -275,27 +267,21 @@ namespace vertexMapper.Unmap(); // Submesh - std::unique_ptr subMesh(new NzStaticMesh(mesh)); - subMesh->Create(vertexBuffer.get()); - - vertexBuffer->SetPersistent(false); - vertexBuffer.release(); + NzStaticMeshRef subMesh = NzStaticMesh::New(mesh); + subMesh->Create(vertexBuffer); if (parameters.optimizeIndexBuffers) indexBuffer->Optimize(); - subMesh->SetIndexBuffer(indexBuffer.get()); - indexBuffer.release(); - - // Material - mesh->SetMaterial(i, baseDir + md5Mesh.shader); - + subMesh->SetIndexBuffer(indexBuffer); subMesh->GenerateAABB(); subMesh->GenerateNormalsAndTangents(); subMesh->SetMaterialIndex(i); - mesh->AddSubMesh(subMesh.get()); - subMesh.release(); + mesh->AddSubMesh(subMesh); + + // Material + mesh->SetMaterial(i, baseDir + md5Mesh.shader); } if (parameters.center) diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index c0edd3a00..06626f142 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -160,8 +160,8 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams #endif NzBoxf aabb; - std::unique_ptr indexBuffer; - std::unique_ptr vertexBuffer; + NzIndexBufferRef indexBuffer; + NzVertexBufferRef vertexBuffer; NzMatrix4f matrix(primitive.matrix); matrix.ApplyScale(params.scale); @@ -176,14 +176,11 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams unsigned int vertexCount; NzComputeBoxIndexVertexCount(primitive.box.subdivision, &indexCount, &vertexCount); - indexBuffer.reset(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static); + vertexBuffer = NzVertexBuffer::New(declaration, vertexCount, params.storage, nzBufferUsage_Static); - vertexBuffer.reset(new NzVertexBuffer(declaration, vertexCount, params.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); - - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); NzGenerateBox(primitive.box.lengths, primitive.box.subdivision, matrix, primitive.textureCoords, static_cast(vertexMapper.GetPointer()), indexMapper.begin(), &aabb); break; @@ -195,14 +192,11 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams unsigned int vertexCount; NzComputeConeIndexVertexCount(primitive.cone.subdivision, &indexCount, &vertexCount); - indexBuffer.reset(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static); + vertexBuffer = NzVertexBuffer::New(declaration, vertexCount, params.storage, nzBufferUsage_Static); - vertexBuffer.reset(new NzVertexBuffer(declaration, vertexCount, params.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); - - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); NzGenerateCone(primitive.cone.length, primitive.cone.radius, primitive.cone.subdivision, matrix, primitive.textureCoords, static_cast(vertexMapper.GetPointer()), indexMapper.begin(), &aabb); break; @@ -214,14 +208,11 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams unsigned int vertexCount; NzComputePlaneIndexVertexCount(primitive.plane.subdivision, &indexCount, &vertexCount); - indexBuffer.reset(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static); + vertexBuffer = NzVertexBuffer::New(declaration, vertexCount, params.storage, nzBufferUsage_Static); - vertexBuffer.reset(new NzVertexBuffer(declaration, vertexCount, params.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); - - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); NzGeneratePlane(primitive.plane.subdivision, primitive.plane.size, matrix, primitive.textureCoords, static_cast(vertexMapper.GetPointer()), indexMapper.begin(), &aabb); break; @@ -237,14 +228,11 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams unsigned int vertexCount; NzComputeCubicSphereIndexVertexCount(primitive.sphere.cubic.subdivision, &indexCount, &vertexCount); - indexBuffer.reset(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static); + vertexBuffer = NzVertexBuffer::New(declaration, vertexCount, params.storage, nzBufferUsage_Static); - vertexBuffer.reset(new NzVertexBuffer(declaration, vertexCount, params.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); - - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); NzGenerateCubicSphere(primitive.sphere.size, primitive.sphere.cubic.subdivision, matrix, primitive.textureCoords, static_cast(vertexMapper.GetPointer()), indexMapper.begin(), &aabb); break; @@ -256,14 +244,11 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams unsigned int vertexCount; NzComputeIcoSphereIndexVertexCount(primitive.sphere.ico.recursionLevel, &indexCount, &vertexCount); - indexBuffer.reset(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static); + vertexBuffer = NzVertexBuffer::New(declaration, vertexCount, params.storage, nzBufferUsage_Static); - vertexBuffer.reset(new NzVertexBuffer(declaration, vertexCount, params.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); - - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); NzGenerateIcoSphere(primitive.sphere.size, primitive.sphere.ico.recursionLevel, matrix, primitive.textureCoords, static_cast(vertexMapper.GetPointer()), indexMapper.begin(), &aabb); break; @@ -275,14 +260,11 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams unsigned int vertexCount; NzComputeUvSphereIndexVertexCount(primitive.sphere.uv.sliceCount, primitive.sphere.uv.stackCount, &indexCount, &vertexCount); - indexBuffer.reset(new NzIndexBuffer(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static)); - indexBuffer->SetPersistent(false); + indexBuffer = NzIndexBuffer::New(vertexCount > std::numeric_limits::max(), indexCount, params.storage, nzBufferUsage_Static); + vertexBuffer = NzVertexBuffer::New(declaration, vertexCount, params.storage, nzBufferUsage_Static); - vertexBuffer.reset(new NzVertexBuffer(declaration, vertexCount, params.storage, nzBufferUsage_Static)); - vertexBuffer->SetPersistent(false); - - NzBufferMapper vertexMapper(vertexBuffer.get(), nzBufferAccess_WriteOnly); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_WriteOnly); + NzBufferMapper vertexMapper(vertexBuffer, nzBufferAccess_WriteOnly); + NzIndexMapper indexMapper(indexBuffer, nzBufferAccess_WriteOnly); NzGenerateUvSphere(primitive.sphere.size, primitive.sphere.uv.sliceCount, primitive.sphere.uv.stackCount, matrix, primitive.textureCoords, static_cast(vertexMapper.GetPointer()), indexMapper.begin(), &aabb); break; @@ -292,24 +274,21 @@ NzSubMesh* NzMesh::BuildSubMesh(const NzPrimitive& primitive, const NzMeshParams } } - std::unique_ptr subMesh(new NzStaticMesh(this)); - if (!subMesh->Create(vertexBuffer.get())) + NzStaticMeshRef subMesh = NzStaticMesh::New(this); + if (!subMesh->Create(vertexBuffer)) { NazaraError("Failed to create StaticMesh"); return nullptr; } - vertexBuffer.release(); if (params.optimizeIndexBuffers) indexBuffer->Optimize(); - subMesh->SetIndexBuffer(indexBuffer.get()); - indexBuffer.release(); - subMesh->SetAABB(aabb); - AddSubMesh(subMesh.get()); + subMesh->SetIndexBuffer(indexBuffer); - return subMesh.release(); + AddSubMesh(subMesh); + return subMesh; } void NzMesh::BuildSubMeshes(const NzPrimitiveList& list, const NzMeshParams& params) diff --git a/src/Nazara/Utility/VertexBuffer.cpp b/src/Nazara/Utility/VertexBuffer.cpp index ffdf4a42c..463917e17 100644 --- a/src/Nazara/Utility/VertexBuffer.cpp +++ b/src/Nazara/Utility/VertexBuffer.cpp @@ -227,8 +227,7 @@ void NzVertexBuffer::Reset(const NzVertexDeclaration* vertexDeclaration, unsigne m_startOffset = 0; m_vertexCount = length; - m_buffer = new NzBuffer(nzBufferType_Vertex, m_endOffset, storage, usage); - m_buffer->SetPersistent(false); + m_buffer = NzBuffer::New(nzBufferType_Vertex, m_endOffset, storage, usage); m_vertexDeclaration = vertexDeclaration; }