[DEV] regactor the EPA triangle store

This commit is contained in:
Edouard DUPIN 2018-06-19 21:24:54 +02:00
parent a353893266
commit cccb93fd34
4 changed files with 49 additions and 44 deletions

View File

@ -6,6 +6,7 @@
#include <ephysics/collision/narrowphase/EPA/EdgeEPA.hpp> #include <ephysics/collision/narrowphase/EPA/EdgeEPA.hpp>
#include <ephysics/collision/narrowphase/EPA/TriangleEPA.hpp> #include <ephysics/collision/narrowphase/EPA/TriangleEPA.hpp>
#include <ephysics/collision/narrowphase/EPA/TrianglesStore.hpp> #include <ephysics/collision/narrowphase/EPA/TrianglesStore.hpp>
#include <etk/types.hpp>
using namespace ephysics; using namespace ephysics;
@ -14,18 +15,22 @@ EdgeEPA::EdgeEPA() {
} }
EdgeEPA::EdgeEPA(TriangleEPA* ownerTriangle, int32_t index) EdgeEPA::EdgeEPA(TriangleEPA* ownerTriangle, int32_t index):
: m_ownerTriangle(ownerTriangle), m_index(index) { m_ownerTriangle(ownerTriangle),
m_index(index) {
assert(index >= 0 && index < 3); assert(index >= 0 && index < 3);
} }
EdgeEPA::EdgeEPA(const EdgeEPA& edge) { EdgeEPA::EdgeEPA(const EdgeEPA& _obj):
m_ownerTriangle = edge.m_ownerTriangle; m_ownerTriangle(_obj.m_ownerTriangle),
m_index = edge.m_index; 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 { uint32_t EdgeEPA::getSourceVertexIndex() const {
@ -72,7 +77,7 @@ bool EdgeEPA::computeSilhouette(const vec3* _vertices, uint32_t _indexNewVertex,
_indexNewVertex, _indexNewVertex,
_triangleStore)) { _triangleStore)) {
m_ownerTriangle->setIsObsolete(false); m_ownerTriangle->setIsObsolete(false);
_triangleStore.setNbTriangles(backup); _triangleStore.resize(backup);
TriangleEPA* triangle = _triangleStore.newTriangle(_vertices, _indexNewVertex, TriangleEPA* triangle = _triangleStore.newTriangle(_vertices, _indexNewVertex,
getTargetVertexIndex(), getTargetVertexIndex(),
getSourceVertexIndex()); getSourceVertexIndex());

View File

@ -26,9 +26,9 @@ class EdgeEPA {
/// Constructor /// Constructor
EdgeEPA(TriangleEPA* ownerTriangle, int32_t index); EdgeEPA(TriangleEPA* ownerTriangle, int32_t index);
/// Copy-constructor /// Copy-constructor
EdgeEPA(const EdgeEPA& edge); EdgeEPA(const EdgeEPA& _obj);
/// Destructor /// Move-constructor
~EdgeEPA(); EdgeEPA(EdgeEPA&& _obj);
/// Return the pointer to the owner triangle /// Return the pointer to the owner triangle
TriangleEPA* getOwnerTriangle() const { TriangleEPA* getOwnerTriangle() const {
return m_ownerTriangle; return m_ownerTriangle;
@ -44,9 +44,15 @@ class EdgeEPA {
/// Execute the recursive silhouette algorithm from this edge /// Execute the recursive silhouette algorithm from this edge
bool computeSilhouette(const vec3* vertices, uint32_t index, TrianglesStore& triangleStore); bool computeSilhouette(const vec3* vertices, uint32_t index, TrianglesStore& triangleStore);
/// Assignment operator /// Assignment operator
EdgeEPA& operator=(const EdgeEPA& edge) { EdgeEPA& operator=(const EdgeEPA& _obj) {
m_ownerTriangle = edge.m_ownerTriangle; m_ownerTriangle = _obj.m_ownerTriangle;
m_index = edge.m_index; 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; return *this;
} }
}; };

View File

@ -6,10 +6,3 @@
#include <ephysics/collision/narrowphase/EPA/TrianglesStore.hpp> #include <ephysics/collision/narrowphase/EPA/TrianglesStore.hpp>
ephysics::TrianglesStore::TrianglesStore() : m_numberTriangles(0) {
}
ephysics::TrianglesStore::~TrianglesStore() {
}

View File

@ -5,6 +5,9 @@
*/ */
#pragma once #pragma once
#include <ephysics/collision/narrowphase/EPA/TriangleEPA.hpp> #include <ephysics/collision/narrowphase/EPA/TriangleEPA.hpp>
#include <ephysics/debug.hpp>
#include <etk/Array.hpp>
namespace ephysics { namespace ephysics {
const uint32_t MAX_TRIANGLES = 200; // Maximum number of triangles const uint32_t MAX_TRIANGLES = 200; // Maximum number of triangles
/** /**
@ -12,48 +15,46 @@ namespace ephysics {
*/ */
class TrianglesStore { class TrianglesStore {
private: private:
TriangleEPA m_triangles[MAX_TRIANGLES]; //!< Triangles etk::Array<TriangleEPA, MAX_TRIANGLES> m_triangles; //!< Triangles
int32_t m_numberTriangles; //!< Number of triangles
/// Private copy-constructor /// Private copy-constructor
TrianglesStore(const TrianglesStore& triangleStore); TrianglesStore(const TrianglesStore& triangleStore) = delete;
/// Private assignment operator /// Private assignment operator
TrianglesStore& operator=(const TrianglesStore& triangleStore); TrianglesStore& operator=(const TrianglesStore& triangleStore) = delete;
public: public:
/// Constructor /// Constructor
TrianglesStore(); TrianglesStore() = default;
/// Destructor
~TrianglesStore();
/// Clear all the storage /// Clear all the storage
void clear() { void clear() {
m_numberTriangles = 0; m_triangles.clear();
} }
/// Return the number of triangles /// Return the number of triangles
int32_t getNbTriangles() const { size_t getNbTriangles() const {
return m_numberTriangles; return m_triangles.size();
} }
/// Set the number of triangles /// Set the number of triangles
void setNbTriangles(int32_t _backup) { void resize(int32_t _backup) {
m_numberTriangles = _backup; if (_backup > m_triangles.size()) {
EPHY_ERROR("RESIZE BIGGER : " << _backup << " > " << m_triangles.size());
}
m_triangles.resize(_backup);
} }
/// Return the last triangle /// Return the last triangle
TriangleEPA& last() { TriangleEPA& last() {
assert(m_numberTriangles > 0); return m_triangles.back();
return m_triangles[m_numberTriangles - 1];
} }
/// Create a new triangle /// Create a new triangle
TriangleEPA* newTriangle(const vec3* _vertices, uint32_t _v0, uint32_t _v1, uint32_t _v2) { 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 we have not reached the maximum number of triangles
if (m_numberTriangles != MAX_TRIANGLES) { if (m_triangles.size() < MAX_TRIANGLES) {
newTriangle = &m_triangles[m_numberTriangles++]; TriangleEPA tmp(_v0, _v1, _v2);
newTriangle->set(_v0, _v1, _v2); if (!tmp.computeClosestPoint(_vertices)) {
if (!newTriangle->computeClosestPoint(_vertices)) { return null;
m_numberTriangles--;
newTriangle = nullptr;
} }
m_triangles.pushBack(etk::move(tmp));
return &m_triangles.back();
} }
// Return the new triangle // We are at the limit (internal)
return newTriangle; return null;
} }
/// Access operator /// Access operator
TriangleEPA& operator[](int32_t _id) { TriangleEPA& operator[](int32_t _id) {