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

136 lines
4 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_MESH_BGL_H
#define TCG_MESH_BGL_H
// TCG includes
#include "mesh.h"
// Boost includes
#include <boost/graph/graph_traits.hpp>
/*
\file tcg_mesh_bgl.h
\brief This file contains TCG adapters to Boost's Graph Library (BGL).
*/
//************************************************************************************
// boost::graph_traits to tcg::Mesh concept type
//************************************************************************************
2016-06-15 18:43:10 +12:00
namespace boost {
2016-03-19 06:57:51 +13:00
template <typename V, typename E, typename F>
struct graph_traits<typename tcg::Mesh<V, E, F>> {
2016-06-15 18:43:10 +12:00
// Preliminar typedefs
typedef typename tcg::Mesh<V, E, F> mesh_type;
typedef typename mesh_type::vertex_type vertex_type;
typedef typename mesh_type::edge_type edge_type;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
typedef typename vertex_type::edges_const_iterator edge_const_iterator;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// V/E descriptors
typedef int vertex_descriptor;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
struct edge_descriptor // NOTE: Can't use std::pair due to std conflicts
{
int m_e, m_src;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
edge_descriptor() : m_e(-1), m_src(-1) {}
edge_descriptor(int e, int src) : m_e(e), m_src(src) {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
bool operator==(const edge_descriptor &e_d) {
return m_e == e_d.m_e;
} // Undirected
bool operator!=(const edge_descriptor &e_d) { return !operator==(e_d); }
};
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Iterators
struct out_edge_iterator : public edge_const_iterator {
int m_src;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
out_edge_iterator() : edge_const_iterator(), m_src(-1) {}
out_edge_iterator(const edge_const_iterator &it, int src)
: edge_const_iterator(it), m_src(src) {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
edge_descriptor operator*() const {
return edge_descriptor(edge_const_iterator::operator*(), m_src);
}
};
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
typedef typename tcg::list<vertex_type>::const_iterator vertex_iterator;
typedef typename tcg::list<edge_type>::const_iterator edge_iterator;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Categories
typedef undirected_tag directed_category;
typedef allow_parallel_edge_tag edge_parallel_category;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
typedef struct our_category : public bidirectional_graph_tag,
public vertex_list_graph_tag,
public edge_list_graph_tag {
} traversal_category;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Sizes
typedef int vertices_size_type;
typedef int edges_size_type;
typedef int degree_size_type;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// Functions
static inline vertex_descriptor null_vertex() { return -1; }
2016-03-19 06:57:51 +13:00
};
template <typename V, typename E, typename F>
struct graph_traits<typename tcg::TriMesh<V, E, F>>
2016-06-15 18:43:10 +12:00
: public graph_traits<typename tcg::Mesh<V, E, F>> {};
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
} // namespace boost
2016-03-19 06:57:51 +13:00
//************************************************************************************
// tcg::bgl helpers to edge data
//************************************************************************************
2016-06-15 18:43:10 +12:00
namespace tcg {
namespace bgl {
2016-03-19 06:57:51 +13:00
template <typename Mesh>
2016-06-15 18:43:10 +12:00
inline int source(
const typename boost::graph_traits<Mesh>::edge_descriptor &edge_descr,
const Mesh &mesh) {
return edge_descr.m_src;
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------------------------------------
template <typename Mesh>
2016-06-15 18:43:10 +12:00
inline int target(
const typename boost::graph_traits<Mesh>::edge_descriptor &edge_descr,
const Mesh &mesh) {
const typename Mesh::edge_type &ed = mesh.edge(edge_descr.m_e);
return (ed.vertex(0) == edge_descr.m_src) ? ed.vertex(1) : ed.vertex(0);
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------------------------------------
template <typename Mesh>
inline std::pair<typename boost::graph_traits<Mesh>::out_edge_iterator,
2016-06-15 18:43:10 +12:00
typename boost::graph_traits<Mesh>::out_edge_iterator>
out_edges(int v, const Mesh &mesh) {
typedef
typename boost::graph_traits<Mesh>::out_edge_iterator out_edge_iterator;
return make_pair(out_edge_iterator(mesh.vertex(v).edgesBegin(), v),
out_edge_iterator(mesh.vertex(v).edgesEnd(), v));
2016-03-19 06:57:51 +13:00
}
//---------------------------------------------------------------------------------------
template <typename Mesh>
2016-06-15 18:43:10 +12:00
inline int out_degree(int v, const Mesh &mesh) {
return mesh.vertex(v).edgesCount();
2016-03-19 06:57:51 +13:00
}
}
2016-06-15 18:43:10 +12:00
} // namespace tcg::bgl
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
#endif // TCG_MESH_BGL_H