66 lines
1.9 KiB
C++

/** @file
* @author Daniel Chappuis
* @copyright 2010-2016 Daniel Chappuis
* @license BSD 3 clauses (see license file)
*/
#pragma once
#include <ephysics/collision/narrowphase/EPA/TriangleEPA.hpp>
#include <ephysics/debug.hpp>
#include <etk/Array.hpp>
namespace ephysics {
const uint32_t MAX_TRIANGLES = 200; // Maximum number of triangles
/**
* @brief This class stores several triangles of the polytope in the EPA algorithm.
*/
class TrianglesStore {
private:
etk::Array<TriangleEPA, MAX_TRIANGLES> m_triangles; //!< Triangles
/// Private copy-constructor
TrianglesStore(const TrianglesStore& triangleStore) = delete;
/// Private assignment operator
TrianglesStore& operator=(const TrianglesStore& triangleStore) = delete;
public:
/// Constructor
TrianglesStore() = default;
/// Clear all the storage
void clear() {
m_triangles.clear();
}
/// Return the number of triangles
size_t getNbTriangles() const {
return m_triangles.size();
}
/// Set the number of triangles
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() {
return m_triangles.back();
}
/// Create a new triangle
TriangleEPA* newTriangle(const vec3* _vertices, uint32_t _v0, uint32_t _v1, uint32_t _v2) {
// If we have not reached the maximum number of triangles
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();
}
// We are at the limit (internal)
return null;
}
/// Access operator
TriangleEPA& operator[](int32_t _id) {
return m_triangles[_id];
}
};
}