From cccb93fd34a5ad018d2ed370acb5f8f1a2cf6837 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 19 Jun 2018 21:24:54 +0200 Subject: [PATCH] [DEV] regactor the EPA triangle store --- .../collision/narrowphase/EPA/EdgeEPA.cpp | 21 +++++---- .../collision/narrowphase/EPA/EdgeEPA.hpp | 18 ++++--- .../narrowphase/EPA/TrianglesStore.cpp | 7 --- .../narrowphase/EPA/TrianglesStore.hpp | 47 ++++++++++--------- 4 files changed, 49 insertions(+), 44 deletions(-) diff --git a/ephysics/collision/narrowphase/EPA/EdgeEPA.cpp b/ephysics/collision/narrowphase/EPA/EdgeEPA.cpp index ef36ece..73cf2fa 100644 --- a/ephysics/collision/narrowphase/EPA/EdgeEPA.cpp +++ b/ephysics/collision/narrowphase/EPA/EdgeEPA.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace ephysics; @@ -14,18 +15,22 @@ EdgeEPA::EdgeEPA() { } -EdgeEPA::EdgeEPA(TriangleEPA* ownerTriangle, int32_t index) - : m_ownerTriangle(ownerTriangle), m_index(index) { +EdgeEPA::EdgeEPA(TriangleEPA* ownerTriangle, int32_t index): + m_ownerTriangle(ownerTriangle), + m_index(index) { assert(index >= 0 && index < 3); } -EdgeEPA::EdgeEPA(const EdgeEPA& edge) { - m_ownerTriangle = edge.m_ownerTriangle; - m_index = edge.m_index; +EdgeEPA::EdgeEPA(const EdgeEPA& _obj): + m_ownerTriangle(_obj.m_ownerTriangle), + m_index(_obj.m_index) { + } -EdgeEPA::~EdgeEPA() { - +EdgeEPA::EdgeEPA(EdgeEPA&& _obj): + m_ownerTriangle(null) { + etk::swap(m_ownerTriangle, _obj.m_ownerTriangle); + etk::swap(m_index, _obj.m_index); } uint32_t EdgeEPA::getSourceVertexIndex() const { @@ -72,7 +77,7 @@ bool EdgeEPA::computeSilhouette(const vec3* _vertices, uint32_t _indexNewVertex, _indexNewVertex, _triangleStore)) { m_ownerTriangle->setIsObsolete(false); - _triangleStore.setNbTriangles(backup); + _triangleStore.resize(backup); TriangleEPA* triangle = _triangleStore.newTriangle(_vertices, _indexNewVertex, getTargetVertexIndex(), getSourceVertexIndex()); diff --git a/ephysics/collision/narrowphase/EPA/EdgeEPA.hpp b/ephysics/collision/narrowphase/EPA/EdgeEPA.hpp index f0373f0..c09e157 100644 --- a/ephysics/collision/narrowphase/EPA/EdgeEPA.hpp +++ b/ephysics/collision/narrowphase/EPA/EdgeEPA.hpp @@ -26,9 +26,9 @@ class EdgeEPA { /// Constructor EdgeEPA(TriangleEPA* ownerTriangle, int32_t index); /// Copy-constructor - EdgeEPA(const EdgeEPA& edge); - /// Destructor - ~EdgeEPA(); + EdgeEPA(const EdgeEPA& _obj); + /// Move-constructor + EdgeEPA(EdgeEPA&& _obj); /// Return the pointer to the owner triangle TriangleEPA* getOwnerTriangle() const { return m_ownerTriangle; @@ -44,9 +44,15 @@ class EdgeEPA { /// Execute the recursive silhouette algorithm from this edge bool computeSilhouette(const vec3* vertices, uint32_t index, TrianglesStore& triangleStore); /// Assignment operator - EdgeEPA& operator=(const EdgeEPA& edge) { - m_ownerTriangle = edge.m_ownerTriangle; - m_index = edge.m_index; + EdgeEPA& operator=(const EdgeEPA& _obj) { + m_ownerTriangle = _obj.m_ownerTriangle; + m_index = _obj.m_index; + return *this; + } + /// Move operator + EdgeEPA& operator=(EdgeEPA&& _obj) { + etk::swap(m_ownerTriangle, _obj.m_ownerTriangle); + etk::swap(m_index, _obj.m_index); return *this; } }; diff --git a/ephysics/collision/narrowphase/EPA/TrianglesStore.cpp b/ephysics/collision/narrowphase/EPA/TrianglesStore.cpp index 28fb2ca..92ea806 100644 --- a/ephysics/collision/narrowphase/EPA/TrianglesStore.cpp +++ b/ephysics/collision/narrowphase/EPA/TrianglesStore.cpp @@ -6,10 +6,3 @@ #include -ephysics::TrianglesStore::TrianglesStore() : m_numberTriangles(0) { - -} - -ephysics::TrianglesStore::~TrianglesStore() { - -} diff --git a/ephysics/collision/narrowphase/EPA/TrianglesStore.hpp b/ephysics/collision/narrowphase/EPA/TrianglesStore.hpp index f12ae1d..9c85491 100644 --- a/ephysics/collision/narrowphase/EPA/TrianglesStore.hpp +++ b/ephysics/collision/narrowphase/EPA/TrianglesStore.hpp @@ -5,6 +5,9 @@ */ #pragma once #include +#include +#include + namespace ephysics { const uint32_t MAX_TRIANGLES = 200; // Maximum number of triangles /** @@ -12,48 +15,46 @@ namespace ephysics { */ class TrianglesStore { private: - TriangleEPA m_triangles[MAX_TRIANGLES]; //!< Triangles - int32_t m_numberTriangles; //!< Number of triangles + etk::Array m_triangles; //!< Triangles /// Private copy-constructor - TrianglesStore(const TrianglesStore& triangleStore); + TrianglesStore(const TrianglesStore& triangleStore) = delete; /// Private assignment operator - TrianglesStore& operator=(const TrianglesStore& triangleStore); + TrianglesStore& operator=(const TrianglesStore& triangleStore) = delete; public: /// Constructor - TrianglesStore(); - /// Destructor - ~TrianglesStore(); + TrianglesStore() = default; /// Clear all the storage void clear() { - m_numberTriangles = 0; + m_triangles.clear(); } /// Return the number of triangles - int32_t getNbTriangles() const { - return m_numberTriangles; + size_t getNbTriangles() const { + return m_triangles.size(); } /// Set the number of triangles - void setNbTriangles(int32_t _backup) { - m_numberTriangles = _backup; + void resize(int32_t _backup) { + if (_backup > m_triangles.size()) { + EPHY_ERROR("RESIZE BIGGER : " << _backup << " > " << m_triangles.size()); + } + m_triangles.resize(_backup); } /// Return the last triangle TriangleEPA& last() { - assert(m_numberTriangles > 0); - return m_triangles[m_numberTriangles - 1]; + return m_triangles.back(); } /// Create a new triangle TriangleEPA* newTriangle(const vec3* _vertices, uint32_t _v0, uint32_t _v1, uint32_t _v2) { - TriangleEPA* newTriangle = nullptr; // If we have not reached the maximum number of triangles - if (m_numberTriangles != MAX_TRIANGLES) { - newTriangle = &m_triangles[m_numberTriangles++]; - newTriangle->set(_v0, _v1, _v2); - if (!newTriangle->computeClosestPoint(_vertices)) { - m_numberTriangles--; - newTriangle = nullptr; + if (m_triangles.size() < MAX_TRIANGLES) { + TriangleEPA tmp(_v0, _v1, _v2); + if (!tmp.computeClosestPoint(_vertices)) { + return null; } + m_triangles.pushBack(etk::move(tmp)); + return &m_triangles.back(); } - // Return the new triangle - return newTriangle; + // We are at the limit (internal) + return null; } /// Access operator TriangleEPA& operator[](int32_t _id) {