tahoma2d/toonz/sources/include/tcg/face.h

105 lines
2.5 KiB
C
Raw Normal View History

2016-05-17 03:04:11 +12:00
#pragma once
2016-03-19 06:57:51 +13:00
#ifndef TCG_FACE_H
#define TCG_FACE_H
// STD includes
#include "assert.h"
2016-06-15 18:43:10 +12:00
namespace tcg {
2016-03-19 06:57:51 +13:00
template <typename F>
struct face_traits {
2016-06-15 18:43:10 +12:00
typedef typename F::edges_const_iterator edges_const_iterator;
typedef typename F::edges_iterator edges_iterator;
2016-03-19 06:57:51 +13:00
};
//-------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
class Face {
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
int m_index;
tcg::list<int> m_edges;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
typedef tcg::list<int>::const_iterator edges_const_iterator;
typedef tcg::list<int>::iterator edges_iterator;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
Face() : m_index(-1) {}
~Face() {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void setIndex(int idx) { m_index = idx; }
int getIndex() const { return m_index; }
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
int edge(int e) const { return m_edges[e]; }
int &edge(int e) { return m_edges[e]; }
int edgesCount() const { return (int)m_edges.size(); }
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void addEdge(int idx) { m_edges.push_back(idx); }
edges_iterator eraseEdge(const edges_iterator &it) {
return m_edges.erase(it);
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
edges_const_iterator edgesBegin() const { return m_edges.begin(); }
edges_const_iterator edgesEnd() const { return m_edges.end(); }
edges_iterator edgesBegin() { return m_edges.begin(); }
edges_iterator edgesEnd() { return m_edges.end(); }
2016-03-19 06:57:51 +13:00
};
//-------------------------------------------------------------------------------
template <int N>
2016-06-15 18:43:10 +12:00
class FaceN {
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
typedef const int *edges_const_iterator;
typedef int *edges_iterator;
2016-03-19 06:57:51 +13:00
protected:
2016-06-15 18:43:10 +12:00
int m_e[N], m_count;
int m_index;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
FaceN() : m_index(-1), m_count(0) { std::fill(m_e, m_e + N, -1); }
FaceN(int (&edges)[N]) : m_index(-1), m_count(0) {
std::copy(edges, edges + N, m_e), m_count = N;
}
~FaceN() {}
void setIndex(int idx) { m_index = idx; }
int getIndex() const { return m_index; }
int edge(int e) const {
assert(e < m_count);
return m_e[e];
}
int &edge(int e) {
assert(e < m_count);
return m_e[e];
}
int edgesCount() const { return m_count; }
void addEdge(int idx) {
assert(m_count < N);
m_e[m_count++] = idx;
}
void setEdge(int e, int idx) {
assert(e < m_count);
m_e[e] = idx;
}
edges_iterator eraseEdge(const edges_iterator &it) {
std::copy(it + 1, edgesEnd(), it);
m_e[--m_count] = -1;
return it;
}
edges_const_iterator edgesBegin() const { return m_e; }
edges_const_iterator edgesEnd() const { return m_e + m_count; }
edges_iterator edgesBegin() { return m_e; }
edges_iterator edgesEnd() { return m_e + m_count; }
2016-03-19 06:57:51 +13:00
};
2016-06-15 18:43:10 +12:00
} // namespace tcg
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
#endif // TCG_FACE_H