From f936dac6ad07ad6ea0012f1221ba05caaa284081 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 15:14:29 +0200 Subject: [PATCH 01/13] Fixed a terrible mistake in [Index|Vertex]Buffer::Reset Former-commit-id: 97daa00a60615e88fb8d015bd02281713c61807b --- src/Nazara/Utility/IndexBuffer.cpp | 4 ++-- src/Nazara/Utility/VertexBuffer.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Utility/IndexBuffer.cpp b/src/Nazara/Utility/IndexBuffer.cpp index 2f13fad5f..d1b3bfc1c 100644 --- a/src/Nazara/Utility/IndexBuffer.cpp +++ b/src/Nazara/Utility/IndexBuffer.cpp @@ -177,9 +177,9 @@ void NzIndexBuffer::Reset(bool largeIndices, NzBuffer* buffer, unsigned int star return; } - if (endOffset > startOffset) + if (startOffset > endOffset) { - NazaraError("End offset cannot be over start offset"); + NazaraError("Start offset cannot be over end offset"); return; } diff --git a/src/Nazara/Utility/VertexBuffer.cpp b/src/Nazara/Utility/VertexBuffer.cpp index 5bde1935b..c5b9f300f 100644 --- a/src/Nazara/Utility/VertexBuffer.cpp +++ b/src/Nazara/Utility/VertexBuffer.cpp @@ -189,9 +189,9 @@ void NzVertexBuffer::Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffe return; } - if (endOffset > startOffset) + if (startOffset > endOffset) { - NazaraError("End offset cannot be over start offset"); + NazaraError("Start offset cannot be over end offset"); return; } From df44d799c80a665378c359ef45adc9d03d84bb1e Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 15:39:44 +0200 Subject: [PATCH 02/13] Added [Index|Vertex]Buffer easy constructor Former-commit-id: 4536af8c833c15b49876c773defd3475a561df4b --- include/Nazara/Utility/IndexBuffer.hpp | 2 ++ include/Nazara/Utility/VertexBuffer.hpp | 2 ++ src/Nazara/Utility/IndexBuffer.cpp | 10 ++++++++++ src/Nazara/Utility/VertexBuffer.cpp | 10 ++++++++++ 4 files changed, 24 insertions(+) diff --git a/include/Nazara/Utility/IndexBuffer.hpp b/include/Nazara/Utility/IndexBuffer.hpp index ea7745c42..3088a0fd1 100644 --- a/include/Nazara/Utility/IndexBuffer.hpp +++ b/include/Nazara/Utility/IndexBuffer.hpp @@ -21,6 +21,7 @@ class NAZARA_API NzIndexBuffer : public NzResource { public: NzIndexBuffer() = default; + NzIndexBuffer(bool largeIndices, NzBuffer* buffer); NzIndexBuffer(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); NzIndexBuffer(bool largeIndices, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); NzIndexBuffer(const NzIndexBuffer& indexBuffer); @@ -51,6 +52,7 @@ class NAZARA_API NzIndexBuffer : public NzResource void Optimize(); void Reset(); + void Reset(bool largeIndices, NzBuffer* buffer); void Reset(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); void Reset(bool largeIndices, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); void Reset(const NzIndexBuffer& indexBuffer); diff --git a/include/Nazara/Utility/VertexBuffer.hpp b/include/Nazara/Utility/VertexBuffer.hpp index 0bbb8b68a..6b009561d 100644 --- a/include/Nazara/Utility/VertexBuffer.hpp +++ b/include/Nazara/Utility/VertexBuffer.hpp @@ -22,6 +22,7 @@ class NAZARA_API NzVertexBuffer : public NzResource { public: NzVertexBuffer() = default; + NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer); NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); NzVertexBuffer(const NzVertexBuffer& vertexBuffer); @@ -47,6 +48,7 @@ class NAZARA_API NzVertexBuffer : public NzResource void* MapRaw(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0) const; void Reset(); + void Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer); void Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); void Reset(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); void Reset(const NzVertexBuffer& vertexBuffer); diff --git a/src/Nazara/Utility/IndexBuffer.cpp b/src/Nazara/Utility/IndexBuffer.cpp index d1b3bfc1c..97744df60 100644 --- a/src/Nazara/Utility/IndexBuffer.cpp +++ b/src/Nazara/Utility/IndexBuffer.cpp @@ -11,6 +11,11 @@ #include #include +NzIndexBuffer::NzIndexBuffer(bool largeIndices, NzBuffer* buffer) +{ + Reset(largeIndices, buffer); +} + NzIndexBuffer::NzIndexBuffer(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { Reset(largeIndices, buffer, startOffset, endOffset); @@ -168,6 +173,11 @@ void NzIndexBuffer::Reset() m_buffer.Reset(); } +void NzIndexBuffer::Reset(bool largeIndices, NzBuffer* buffer) +{ + Reset(largeIndices, buffer, 0, buffer->GetSize()-1); +} + void NzIndexBuffer::Reset(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { #if NAZARA_UTILITY_SAFE diff --git a/src/Nazara/Utility/VertexBuffer.cpp b/src/Nazara/Utility/VertexBuffer.cpp index c5b9f300f..fd7a0883b 100644 --- a/src/Nazara/Utility/VertexBuffer.cpp +++ b/src/Nazara/Utility/VertexBuffer.cpp @@ -7,6 +7,11 @@ #include #include +NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer) +{ + Reset(vertexDeclaration, buffer); +} + NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { Reset(vertexDeclaration, buffer, startOffset, endOffset); @@ -180,6 +185,11 @@ void NzVertexBuffer::Reset() m_vertexDeclaration.Reset(); } +void NzVertexBuffer::Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer) +{ + Reset(vertexDeclaration, buffer, 0, buffer->GetSize()-1); +} + void NzVertexBuffer::Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { #if NAZARA_UTILITY_SAFE From 34af3c9bc979d72d79713209d01c989b42391f69 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 15:40:54 +0200 Subject: [PATCH 03/13] [Index|Vertex]Buffer constructor now throw an exception on error As it should do anyway Former-commit-id: af4589424c0009dfc40ebf5ae57172fb5df77dc0 --- src/Nazara/Utility/IndexBuffer.cpp | 4 ++++ src/Nazara/Utility/VertexBuffer.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/Nazara/Utility/IndexBuffer.cpp b/src/Nazara/Utility/IndexBuffer.cpp index 97744df60..f96c220b8 100644 --- a/src/Nazara/Utility/IndexBuffer.cpp +++ b/src/Nazara/Utility/IndexBuffer.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -13,16 +14,19 @@ NzIndexBuffer::NzIndexBuffer(bool largeIndices, NzBuffer* buffer) { + NzErrorFlags(nzErrorFlag_ThrowException, true); Reset(largeIndices, buffer); } NzIndexBuffer::NzIndexBuffer(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { + NzErrorFlags(nzErrorFlag_ThrowException, true); Reset(largeIndices, buffer, startOffset, endOffset); } NzIndexBuffer::NzIndexBuffer(bool largeIndices, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) { + NzErrorFlags(nzErrorFlag_ThrowException, true); Reset(largeIndices, length, storage, usage); } diff --git a/src/Nazara/Utility/VertexBuffer.cpp b/src/Nazara/Utility/VertexBuffer.cpp index fd7a0883b..45c572fea 100644 --- a/src/Nazara/Utility/VertexBuffer.cpp +++ b/src/Nazara/Utility/VertexBuffer.cpp @@ -4,21 +4,25 @@ #include #include +#include #include #include NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer) { + NzErrorFlags(nzErrorFlag_ThrowException, true); Reset(vertexDeclaration, buffer); } NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { + NzErrorFlags(nzErrorFlag_ThrowException, true); Reset(vertexDeclaration, buffer, startOffset, endOffset); } NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) { + NzErrorFlags(nzErrorFlag_ThrowException, true); Reset(vertexDeclaration, length, storage, usage); } From f154dbfb319c4e641a7e1b713f7fe1298afc193d Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 15:41:42 +0200 Subject: [PATCH 04/13] Fixed rare bug when initializing debug drawer Former-commit-id: 287d10c05a481a139449068014780aa7119096bb --- src/Nazara/Renderer/DebugDrawer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nazara/Renderer/DebugDrawer.cpp b/src/Nazara/Renderer/DebugDrawer.cpp index 1a2e96ee7..066566bc1 100644 --- a/src/Nazara/Renderer/DebugDrawer.cpp +++ b/src/Nazara/Renderer/DebugDrawer.cpp @@ -661,7 +661,7 @@ bool NzDebugDrawer::Initialize() // s_vertexBuffer try { - NzErrorFlags flags(nzErrorFlag_ThrowException); + NzErrorFlags flags(nzErrorFlag_ThrowException, true); s_vertexBuffer.Reset(NzVertexDeclaration::Get(nzVertexLayout_XYZ), 65365, nzBufferStorage_Hardware, nzBufferUsage_Dynamic); } catch (const std::exception& e) From 0d69da09b9933aa8ae4159a021ac1ba8603b9010 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 15:42:17 +0200 Subject: [PATCH 05/13] Fixed Renderer testing non-enabled vertex components Former-commit-id: d624d98b7b8a61fc3dc92d4c10441e759a50f310 --- src/Nazara/Renderer/Renderer.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 0fc62e782..cead125a6 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -1786,15 +1786,15 @@ bool NzRenderer::EnsureStateUpdate() unsigned int offset; vertexDeclaration->GetComponent(static_cast(j), &enabled, &type, &offset); - if (!IsComponentTypeSupported(type)) - { - NazaraError("Invalid vertex declaration " + NzString::Pointer(vertexDeclaration) + ": Vertex component 0x" + NzString::Number(j, 16) + " (type: 0x" + NzString::Number(type, 16) + ") is not supported"); - updateFailed = true; - break; - } - if (enabled) { + if (!IsComponentTypeSupported(type)) + { + NazaraError("Invalid vertex declaration " + NzString::Pointer(vertexDeclaration) + ": Vertex component 0x" + NzString::Number(j, 16) + " (type: 0x" + NzString::Number(type, 16) + ") is not supported"); + updateFailed = true; + break; + } + glEnableVertexAttribArray(NzOpenGL::VertexComponentIndex[j]); switch (type) From f56e0504e63db2de88f919e7f8df1c0d0b5af878 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 15:45:37 +0200 Subject: [PATCH 06/13] Buffer, [Render]Window now always throw on error Former-commit-id: a739cd4c7d96e7cf497338c525e9ab1b5d6a844a --- src/Nazara/Renderer/RenderWindow.cpp | 18 ++---------------- src/Nazara/Utility/Buffer.cpp | 10 ++-------- src/Nazara/Utility/Window.cpp | 18 ++---------------- 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/src/Nazara/Renderer/RenderWindow.cpp b/src/Nazara/Renderer/RenderWindow.cpp index 367399c09..736cadffb 100644 --- a/src/Nazara/Renderer/RenderWindow.cpp +++ b/src/Nazara/Renderer/RenderWindow.cpp @@ -14,28 +14,14 @@ NzRenderWindow::NzRenderWindow(NzVideoMode mode, const NzString& title, nzUInt32 style, const NzContextParameters& parameters) { + NzErrorFlags flags(nzErrorFlag_ThrowException, true); Create(mode, title, style, parameters); - - #ifdef NAZARA_DEBUG - if (!m_impl) - { - NazaraError("Failed to create render window"); - throw std::runtime_error("Constructor failed"); - } - #endif } NzRenderWindow::NzRenderWindow(NzWindowHandle handle, const NzContextParameters& parameters) { + NzErrorFlags flags(nzErrorFlag_ThrowException, true); Create(handle, parameters); - - #ifdef NAZARA_DEBUG - if (!m_impl) - { - NazaraError("Failed to create render window"); - throw std::runtime_error("Constructor failed"); - } - #endif } NzRenderWindow::~NzRenderWindow() diff --git a/src/Nazara/Utility/Buffer.cpp b/src/Nazara/Utility/Buffer.cpp index 6bf62d6d0..18d4e0583 100644 --- a/src/Nazara/Utility/Buffer.cpp +++ b/src/Nazara/Utility/Buffer.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -32,15 +33,8 @@ NzBuffer::NzBuffer(nzBufferType type, unsigned int size, nzBufferStorage storage m_type(type), m_impl(nullptr) { + NzErrorFlags flags(nzErrorFlag_ThrowException, true); Create(size, storage, usage); - - #ifdef NAZARA_DEBUG - if (!m_impl) - { - NazaraError("Failed to create buffer"); - throw std::runtime_error("Constructor failed"); - } - #endif } NzBuffer::~NzBuffer() diff --git a/src/Nazara/Utility/Window.cpp b/src/Nazara/Utility/Window.cpp index 00b01a0f5..d9780579e 100644 --- a/src/Nazara/Utility/Window.cpp +++ b/src/Nazara/Utility/Window.cpp @@ -45,15 +45,8 @@ m_waitForEvent(false) m_impl(nullptr) #endif { + NzErrorFlags flags(nzErrorFlag_ThrowException, true); Create(mode, title, style); - - #ifdef NAZARA_DEBUG - if (!m_impl) - { - NazaraError("Failed to create window"); - throw std::runtime_error("Constructor failed"); - } - #endif } NzWindow::NzWindow(NzWindowHandle handle) : @@ -65,15 +58,8 @@ m_waitForEvent(false) m_impl(nullptr) #endif { + NzErrorFlags flags(nzErrorFlag_ThrowException, true); Create(handle); - - #ifdef NAZARA_DEBUG - if (!m_impl) - { - NazaraError("Failed to create window"); - throw std::runtime_error("Constructor failed"); - } - #endif } NzWindow::~NzWindow() From e76b57e12002f163b8bdd4bd5169beccc77b157d Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 17:19:09 +0200 Subject: [PATCH 07/13] Fixed Image level computation Array depth will no longer be taked in consideration when computing level count Former-commit-id: 93bf114127b5e252c3f8a8cbf938fcd09534a9ca --- include/Nazara/Utility/Image.hpp | 1 + src/Nazara/Utility/Image.cpp | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/Nazara/Utility/Image.hpp b/include/Nazara/Utility/Image.hpp index 2234b7c3e..0b83022bc 100644 --- a/include/Nazara/Utility/Image.hpp +++ b/include/Nazara/Utility/Image.hpp @@ -109,6 +109,7 @@ class NAZARA_API NzImage : public NzResource 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); struct SharedImage { diff --git a/src/Nazara/Utility/Image.cpp b/src/Nazara/Utility/Image.cpp index a6ceaf41a..5eb826e6c 100644 --- a/src/Nazara/Utility/Image.cpp +++ b/src/Nazara/Utility/Image.cpp @@ -271,7 +271,7 @@ bool NzImage::Create(nzImageType type, nzPixelFormat format, unsigned int width, } #endif - levelCount = std::min(levelCount, GetMaxLevel(width, height, depth)); + levelCount = std::min(levelCount, GetMaxLevel(type, width, height, depth)); nzUInt8** levels = new nzUInt8*[levelCount]; @@ -673,7 +673,7 @@ nzUInt8 NzImage::GetLevelCount() const nzUInt8 NzImage::GetMaxLevel() const { - return GetMaxLevel(m_sharedImage->width, m_sharedImage->height, m_sharedImage->depth); + return GetMaxLevel(m_sharedImage->type, m_sharedImage->width, m_sharedImage->height, m_sharedImage->depth); } NzColor NzImage::GetPixelColor(unsigned int x, unsigned int y, unsigned int z) const @@ -1003,7 +1003,7 @@ void NzImage::SetLevelCount(nzUInt8 levelCount) } #endif - levelCount = std::min(levelCount, GetMaxLevel(m_sharedImage->width, m_sharedImage->height, m_sharedImage->depth)); + levelCount = std::min(levelCount, GetMaxLevel()); if (m_sharedImage->levelCount == levelCount) return; @@ -1287,6 +1287,29 @@ nzUInt8 NzImage::GetMaxLevel(unsigned int width, unsigned int height, unsigned i return std::max(std::max(std::max(widthLevel, heightLevel), depthLevel), 1U); } +nzUInt8 NzImage::GetMaxLevel(nzImageType type, unsigned int width, unsigned int height, unsigned int depth) +{ + // Pour éviter que la profondeur ne soit comptée dans le calcul des niveaux + switch (type) + { + case nzImageType_1D: + case nzImageType_1D_Array: + return GetMaxLevel(width, 1U, 1U); + + case nzImageType_2D: + case nzImageType_2D_Array: + case nzImageType_Cubemap: + return GetMaxLevel(width, height, 1U); + + case nzImageType_3D: + return GetMaxLevel(width, height, depth); + } + + NazaraError("Image type not handled (0x" + NzString::Number(type, 16) + ')'); + return 0; + +} + void NzImage::EnsureOwnership() { if (m_sharedImage == &emptyImage) From 726611183433e420878492fef98a08199d25982b Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 17:20:14 +0200 Subject: [PATCH 08/13] Fixed missing include Former-commit-id: c63f03fa2233f3d5ac0cd24cb796c48693c0ff39 --- src/Nazara/Renderer/RenderWindow.cpp | 3 +++ src/Nazara/Utility/Window.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/Nazara/Renderer/RenderWindow.cpp b/src/Nazara/Renderer/RenderWindow.cpp index 736cadffb..44e0fdf89 100644 --- a/src/Nazara/Renderer/RenderWindow.cpp +++ b/src/Nazara/Renderer/RenderWindow.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -12,6 +13,8 @@ #include #include +///TODO: Améliorer les méthode CopyTo* + NzRenderWindow::NzRenderWindow(NzVideoMode mode, const NzString& title, nzUInt32 style, const NzContextParameters& parameters) { NzErrorFlags flags(nzErrorFlag_ThrowException, true); diff --git a/src/Nazara/Utility/Window.cpp b/src/Nazara/Utility/Window.cpp index d9780579e..aa84c3607 100644 --- a/src/Nazara/Utility/Window.cpp +++ b/src/Nazara/Utility/Window.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include From ad0fa61cdfcf5cf3ce4ee3625946adb0e7461dbc Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 17:42:08 +0200 Subject: [PATCH 09/13] Added error check Also "fixed" some error messages Former-commit-id: 15be3887949e9bafab49c3f4e16ffc732f352c65 --- src/Nazara/Utility/Image.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Utility/Image.cpp b/src/Nazara/Utility/Image.cpp index 5eb826e6c..d9ba58cb7 100644 --- a/src/Nazara/Utility/Image.cpp +++ b/src/Nazara/Utility/Image.cpp @@ -227,13 +227,13 @@ bool NzImage::Create(nzImageType type, nzPixelFormat format, unsigned int width, case nzImageType_1D: if (height > 1) { - NazaraError("1D textures must be 1 height"); + NazaraError("1D textures must be 1 tall"); return false; } if (depth > 1) { - NazaraError("1D textures must be 1 depth"); + NazaraError("1D textures must be 1 deep"); return false; } break; @@ -242,7 +242,7 @@ bool NzImage::Create(nzImageType type, nzPixelFormat format, unsigned int width, case nzImageType_2D: if (depth > 1) { - NazaraError("2D textures must be 1 depth"); + NazaraError("2D textures must be 1 deep"); return false; } break; @@ -254,7 +254,7 @@ bool NzImage::Create(nzImageType type, nzPixelFormat format, unsigned int width, case nzImageType_Cubemap: if (depth > 1) { - NazaraError("Cubemaps must be 1 depth"); + NazaraError("Cubemaps must be 1 deep"); return false; } @@ -883,6 +883,13 @@ bool NzImage::LoadCubemapFromImage(const NzImage& image, const NzCubemapParams& NazaraError("Image must be valid"); return false; } + + nzImageType type = image.GetType(); + if (type != nzImageType_2D) + { + NazaraError("Image type not handled (0x" + NzString::Number(type, 16) + ')'); + return false; + } #endif unsigned int width = image.GetWidth(); From 2a29dcf6e94fd37113f5e313a0661ff52d7e3d06 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 17:59:06 +0200 Subject: [PATCH 10/13] Improved Texture class code Removed some code duplication Former-commit-id: affa0bf18ea317b3276a7e8d0a6351f28037dfba --- src/Nazara/Renderer/Texture.cpp | 106 +++++--------------------------- 1 file changed, 16 insertions(+), 90 deletions(-) diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index c534f5cdd..3bce66404 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -661,122 +661,50 @@ bool NzTexture::LoadFromStream(NzInputStream& stream, const NzImageParams& param bool NzTexture::LoadCubemapFromFile(const NzString& filePath, const NzImageParams& imageParams, bool generateMipmaps, const NzCubemapParams& cubemapParams) { - NzImage image; - if (!image.LoadFromFile(filePath, imageParams)) + NzImage cubemap; + if (!cubemap.LoadCubemapFromFile(filePath, imageParams, cubemapParams)) { - NazaraError("Failed to load image"); + NazaraError("Failed to load cubemap"); return false; } - return LoadCubemapFromImage(image, generateMipmaps, cubemapParams); + return LoadFromImage(cubemap, generateMipmaps); } bool NzTexture::LoadCubemapFromImage(const NzImage& image, bool generateMipmaps, const NzCubemapParams& params) { - // Implémentation presque identique à celle de Image::LoadCubemapFromImage - #if NAZARA_UTILITY_SAFE - if (!image.IsValid()) + NzImage cubemap; + if (!cubemap.LoadCubemapFromImage(image, params)) { - NazaraError("Image must be valid"); - return false; - } - #endif - - unsigned int width = image.GetWidth(); - unsigned int height = image.GetHeight(); - unsigned int faceSize = (params.faceSize == 0) ? std::max(width, height)/4 : params.faceSize; - - // Sans cette vérification, celles des rectangles pourrait réussir via un overflow - if (width < faceSize || height < faceSize) - { - NazaraError("Image is too small for this face size"); + NazaraError("Failed to load cubemap"); return false; } - // Calcul et vérification des surfaces - unsigned limitX = width - faceSize; - unsigned limitY = height - faceSize; - - NzVector2ui backPos = params.backPosition * faceSize; - if (backPos.x > limitX || backPos.y > limitY) - { - NazaraError("Back rectangle is out of image"); - return false; - } - - NzVector2ui downPos = params.downPosition * faceSize; - if (downPos.x > limitX || downPos.y > limitY) - { - NazaraError("Down rectangle is out of image"); - return false; - } - - NzVector2ui forwardPos = params.forwardPosition * faceSize; - if (forwardPos.x > limitX || forwardPos.y > limitY) - { - NazaraError("Forward rectangle is out of image"); - return false; - } - - NzVector2ui leftPos = params.leftPosition * faceSize; - if (leftPos.x > limitX || leftPos.y > limitY) - { - NazaraError("Left rectangle is out of image"); - return false; - } - - NzVector2ui rightPos = params.rightPosition * faceSize; - if (rightPos.x > limitX || rightPos.y > limitY) - { - NazaraError("Right rectangle is out of image"); - return false; - } - - NzVector2ui upPos = params.upPosition * faceSize; - if (upPos.x > limitX || upPos.y > limitY) - { - NazaraError("Up rectangle is out of image"); - return false; - } - - if (!Create(nzImageType_Cubemap, image.GetFormat(), faceSize, faceSize, 1, (generateMipmaps) ? 0xFF : 1)) - { - NazaraError("Failed to create texture"); - return false; - } - - UpdateFace(nzCubemapFace_NegativeX, image.GetConstPixels(leftPos.x, leftPos.y), width, height); - UpdateFace(nzCubemapFace_NegativeY, image.GetConstPixels(downPos.x, downPos.y), width, height); - UpdateFace(nzCubemapFace_NegativeZ, image.GetConstPixels(backPos.x, backPos.y), width, height); - UpdateFace(nzCubemapFace_PositiveX, image.GetConstPixels(rightPos.x, rightPos.y), width, height); - UpdateFace(nzCubemapFace_PositiveY, image.GetConstPixels(upPos.x, upPos.y), width, height); - UpdateFace(nzCubemapFace_PositiveZ, image.GetConstPixels(forwardPos.x, forwardPos.y), width, height); - - return true; + return LoadFromImage(cubemap, generateMipmaps); } bool NzTexture::LoadCubemapFromMemory(const void* data, std::size_t size, const NzImageParams& imageParams, bool generateMipmaps, const NzCubemapParams& cubemapParams) { - NzImage image; - if (!image.LoadFromMemory(data, size, imageParams)) + NzImage cubemap; + if (!cubemap.LoadCubemapFromMemory(data, size, imageParams, cubemapParams)) { - NazaraError("Failed to load image"); + NazaraError("Failed to load cubemap"); return false; } - return LoadCubemapFromImage(image, generateMipmaps, cubemapParams); + return LoadFromImage(cubemap, generateMipmaps); } bool NzTexture::LoadCubemapFromStream(NzInputStream& stream, const NzImageParams& imageParams, bool generateMipmaps, const NzCubemapParams& cubemapParams) { - NzImage image; - if (!image.LoadFromStream(stream, imageParams)) + NzImage cubemap; + if (!cubemap.LoadCubemapFromStream(stream, imageParams, cubemapParams)) { - NazaraError("Failed to load image"); + NazaraError("Failed to load cubemap"); return false; } - return LoadCubemapFromImage(image, generateMipmaps, cubemapParams); + return LoadFromImage(cubemap, generateMipmaps); } bool NzTexture::LoadFaceFromFile(nzCubemapFace face, const NzString& filePath, const NzImageParams& params) @@ -809,7 +737,6 @@ bool NzTexture::LoadFaceFromFile(nzCubemapFace face, const NzString& filePath, c } unsigned int faceSize = m_impl->width; - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); @@ -849,7 +776,6 @@ bool NzTexture::LoadFaceFromMemory(nzCubemapFace face, const void* data, std::si } unsigned int faceSize = m_impl->width; - if (image.GetWidth() != faceSize || image.GetHeight() != faceSize) { NazaraError("Image size must match texture face size"); From 8640f86f445725dee6558275bffe84b1e8d7b068 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 18:02:36 +0200 Subject: [PATCH 11/13] Added TODO Former-commit-id: f655a6d2bb7788480536503b9370019454961e27 --- src/Nazara/Renderer/Texture.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index 3bce66404..5038ccab8 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -11,6 +11,8 @@ #include #include +///TODO: Virer les méthodes faisant référence aux faces et gérer ces dernières comme de simples niveaux de profondeurs (malgré OpenGL) + struct NzTextureImpl { GLuint id; From 0d692679922034080858d845f00cb47b3f86a9c3 Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 18:13:30 +0200 Subject: [PATCH 12/13] Added Image::LoadArrayFrom* (convert an atlas to an array) Also added Texture::LoadArrayFrom* shortcuts Former-commit-id: f3cde12d5b634c75de8745fa800c30749e0fe662 --- include/Nazara/Renderer/Texture.hpp | 6 ++ include/Nazara/Utility/Image.hpp | 6 ++ src/Nazara/Renderer/Texture.cpp | 48 ++++++++++++++ src/Nazara/Utility/Image.cpp | 97 +++++++++++++++++++++++++++++ 4 files changed, 157 insertions(+) diff --git a/include/Nazara/Renderer/Texture.hpp b/include/Nazara/Renderer/Texture.hpp index 53cb9e442..024216d70 100644 --- a/include/Nazara/Renderer/Texture.hpp +++ b/include/Nazara/Renderer/Texture.hpp @@ -62,6 +62,12 @@ class NAZARA_API NzTexture : public NzResource, NzNonCopyable bool LoadFromMemory(const void* data, std::size_t size, const NzImageParams& params = NzImageParams(), bool generateMipmaps = true); bool LoadFromStream(NzInputStream& stream, const NzImageParams& params = NzImageParams(), bool generateMipmaps = true); + // LoadArray + bool LoadArrayFromFile(const NzString& filePath, const NzImageParams& imageParams = NzImageParams(), bool generateMipmaps = true, const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + bool LoadArrayFromImage(const NzImage& image, bool generateMipmaps = true, const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + bool LoadArrayFromMemory(const void* data, std::size_t size, const NzImageParams& imageParams = NzImageParams(), bool generateMipmaps = true, const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + bool LoadArrayFromStream(NzInputStream& stream, const NzImageParams& imageParams = NzImageParams(), bool generateMipmaps = true, const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + // LoadCubemap bool LoadCubemapFromFile(const NzString& filePath, const NzImageParams& imageParams = NzImageParams(), bool generateMipmaps = true, const NzCubemapParams& cubemapParams = NzCubemapParams()); bool LoadCubemapFromImage(const NzImage& image, bool generateMipmaps = true, const NzCubemapParams& params = NzCubemapParams()); diff --git a/include/Nazara/Utility/Image.hpp b/include/Nazara/Utility/Image.hpp index 0b83022bc..21cefa6b3 100644 --- a/include/Nazara/Utility/Image.hpp +++ b/include/Nazara/Utility/Image.hpp @@ -91,6 +91,12 @@ class NAZARA_API NzImage : public NzResource bool LoadFromMemory(const void* data, std::size_t size, const NzImageParams& params = NzImageParams()); bool LoadFromStream(NzInputStream& stream, const NzImageParams& params = NzImageParams()); + // LoadArray + bool LoadArrayFromFile(const NzString& filePath, const NzImageParams& imageParams = NzImageParams(), const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + bool LoadArrayFromImage(const NzImage& image, const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + bool LoadArrayFromMemory(const void* data, std::size_t size, const NzImageParams& imageParams = NzImageParams(), const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + bool LoadArrayFromStream(NzInputStream& stream, const NzImageParams& imageParams = NzImageParams(), const NzVector2ui& atlasSize = NzVector2ui(2, 2)); + // LoadCubemap bool LoadCubemapFromFile(const NzString& filePath, const NzImageParams& imageParams = NzImageParams(), const NzCubemapParams& cubemapParams = NzCubemapParams()); bool LoadCubemapFromImage(const NzImage& image, const NzCubemapParams& params = NzCubemapParams()); diff --git a/src/Nazara/Renderer/Texture.cpp b/src/Nazara/Renderer/Texture.cpp index 5038ccab8..4a5996e4e 100644 --- a/src/Nazara/Renderer/Texture.cpp +++ b/src/Nazara/Renderer/Texture.cpp @@ -661,6 +661,54 @@ bool NzTexture::LoadFromStream(NzInputStream& stream, const NzImageParams& param return LoadFromImage(image, generateMipmaps); } +bool NzTexture::LoadArrayFromFile(const NzString& filePath, const NzImageParams& imageParams, bool generateMipmaps, const NzVector2ui& atlasSize) +{ + NzImage cubemap; + if (!cubemap.LoadArrayFromFile(filePath, imageParams, atlasSize)) + { + NazaraError("Failed to load cubemap"); + return false; + } + + return LoadFromImage(cubemap, generateMipmaps); +} + +bool NzTexture::LoadArrayFromImage(const NzImage& image, bool generateMipmaps, const NzVector2ui& atlasSize) +{ + NzImage cubemap; + if (!cubemap.LoadArrayFromImage(image, atlasSize)) + { + NazaraError("Failed to load cubemap"); + return false; + } + + return LoadFromImage(cubemap, generateMipmaps); +} + +bool NzTexture::LoadArrayFromMemory(const void* data, std::size_t size, const NzImageParams& imageParams, bool generateMipmaps, const NzVector2ui& atlasSize) +{ + NzImage cubemap; + if (!cubemap.LoadArrayFromMemory(data, size, imageParams, atlasSize)) + { + NazaraError("Failed to load cubemap"); + return false; + } + + return LoadFromImage(cubemap, generateMipmaps); +} + +bool NzTexture::LoadArrayFromStream(NzInputStream& stream, const NzImageParams& imageParams, bool generateMipmaps, const NzVector2ui& atlasSize) +{ + NzImage cubemap; + if (!cubemap.LoadArrayFromStream(stream, imageParams, atlasSize)) + { + NazaraError("Failed to load cubemap"); + return false; + } + + return LoadFromImage(cubemap, generateMipmaps); +} + bool NzTexture::LoadCubemapFromFile(const NzString& filePath, const NzImageParams& imageParams, bool generateMipmaps, const NzCubemapParams& cubemapParams) { NzImage cubemap; diff --git a/src/Nazara/Utility/Image.cpp b/src/Nazara/Utility/Image.cpp index d9ba58cb7..7b963e30d 100644 --- a/src/Nazara/Utility/Image.cpp +++ b/src/Nazara/Utility/Image.cpp @@ -863,6 +863,103 @@ bool NzImage::LoadFromStream(NzInputStream& stream, const NzImageParams& params) return NzImageLoader::LoadFromStream(this, stream, params); } +// LoadArray +bool NzImage::LoadArrayFromFile(const NzString& filePath, const NzImageParams& imageParams, const NzVector2ui& atlasSize) +{ + NzImage image; + if (!image.LoadFromFile(filePath, imageParams)) + { + NazaraError("Failed to load image"); + return false; + } + + return LoadArrayFromImage(image, atlasSize); +} + +bool NzImage::LoadArrayFromImage(const NzImage& image, const NzVector2ui& atlasSize) +{ + #if NAZARA_UTILITY_SAFE + if (!image.IsValid()) + { + NazaraError("Image must be valid"); + return false; + } + + if (atlasSize.x == 0) + { + NazaraError("Atlas width must be over zero"); + return false; + } + + if (atlasSize.y == 0) + { + NazaraError("Atlas height must be over zero"); + return false; + } + #endif + + nzImageType type = image.GetType(); + + #if NAZARA_UTILITY_SAFE + if (type != nzImageType_1D && type != nzImageType_2D) + { + NazaraError("Image type not handled (0x" + NzString::Number(type, 16) + ')'); + return false; + } + #endif + + NzVector2ui imageSize(image.GetWidth(), image.GetHeight()); + + if (imageSize.x % atlasSize.x != 0) + { + NazaraWarning("Image width is not divisible by atlas width (" + NzString::Number(imageSize.x) + " mod " + NzString::Number(atlasSize.x) + " != 0)"); + } + + if (imageSize.y % atlasSize.y != 0) + { + NazaraWarning("Image height is not divisible by atlas height (" + NzString::Number(imageSize.y) + " mod " + NzString::Number(atlasSize.y) + " != 0)"); + } + + NzVector2ui faceSize = imageSize/atlasSize; + + // Selon le type de l'image de base, on va créer un array d'images 2D ou 1D + if (type == nzImageType_2D) + Create(nzImageType_2D_Array, image.GetFormat(), faceSize.x, faceSize.y); + else + Create(nzImageType_1D_Array, image.GetFormat(), faceSize.x, 1); + + unsigned int layer = 0; + for (unsigned int i = 0; i < atlasSize.x; ++i) + for (unsigned int j = 0; j < atlasSize.y; ++j) + Copy(image, NzRectui(i*faceSize.x, j*faceSize.y, faceSize.x, faceSize.y), NzVector3ui(0, 0, layer++)); + + return true; +} + +bool NzImage::LoadArrayFromMemory(const void* data, std::size_t size, const NzImageParams& imageParams, const NzVector2ui& atlasSize) +{ + NzImage image; + if (!image.LoadFromMemory(data, size, imageParams)) + { + NazaraError("Failed to load image"); + return false; + } + + return LoadArrayFromImage(image, atlasSize); +} + +bool NzImage::LoadArrayFromStream(NzInputStream& stream, const NzImageParams& imageParams, const NzVector2ui& atlasSize) +{ + NzImage image; + if (!image.LoadFromStream(stream, imageParams)) + { + NazaraError("Failed to load image"); + return false; + } + + return LoadArrayFromImage(image, atlasSize); +} + bool NzImage::LoadCubemapFromFile(const NzString& filePath, const NzImageParams& imageParams, const NzCubemapParams& cubemapParams) { NzImage image; From b3351037c7591851c7892cb1cacb5c67b0298e7a Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 18 Aug 2014 18:15:19 +0200 Subject: [PATCH 13/13] Changed some error messages Former-commit-id: e578d813dd7a8691506af080b79bc1ec99b65e3c --- src/Nazara/Graphics/Model.cpp | 2 +- src/Nazara/Renderer/Renderer.cpp | 4 ++-- src/Nazara/Utility/Animation.cpp | 2 +- src/Nazara/Utility/Skeleton.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index 8f9b85122..54e9b964f 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -396,7 +396,7 @@ void NzModel::SetSkinCount(unsigned int skinCount) #if NAZARA_GRAPHICS_SAFE if (skinCount == 0) { - NazaraError("Skin count must be over 0"); + NazaraError("Skin count must be over zero"); return; } #endif diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index cead125a6..c219f9c62 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -375,7 +375,7 @@ void NzRenderer::DrawIndexedPrimitivesInstanced(unsigned int instanceCount, nzPr if (instanceCount == 0) { - NazaraError("Instance count must be over 0"); + NazaraError("Instance count must be over zero"); return; } @@ -470,7 +470,7 @@ void NzRenderer::DrawPrimitivesInstanced(unsigned int instanceCount, nzPrimitive if (instanceCount == 0) { - NazaraError("Instance count must be over 0"); + NazaraError("Instance count must be over zero"); return; } diff --git a/src/Nazara/Utility/Animation.cpp b/src/Nazara/Utility/Animation.cpp index e3fb1704e..61e325f76 100644 --- a/src/Nazara/Utility/Animation.cpp +++ b/src/Nazara/Utility/Animation.cpp @@ -48,7 +48,7 @@ bool NzAnimation::AddSequence(const NzSequence& sequence) if (sequence.frameCount == 0) { - NazaraError("Sequence frame count must be over 0"); + NazaraError("Sequence frame count must be over zero"); return false; } #endif diff --git a/src/Nazara/Utility/Skeleton.cpp b/src/Nazara/Utility/Skeleton.cpp index a58ba6a92..eeefc7d98 100644 --- a/src/Nazara/Utility/Skeleton.cpp +++ b/src/Nazara/Utility/Skeleton.cpp @@ -32,7 +32,7 @@ bool NzSkeleton::Create(unsigned int jointCount) #if NAZARA_UTILITY_SAFE if (jointCount == 0) { - NazaraError("Joint count must be over 0"); + NazaraError("Joint count must be over zero"); return false; } #endif