Subversion Repositories gelsvn

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
512 s042372 1
/* ----------------------------------------------------------------------- *
2
 * This file is part of GEL, www.imm.dtu.dk/GEL
3
 * Copyright (C) the authors (see AUTHORS.txt) and DTU Informatics
4
 *
5
 * Principal authors:
6
 *  Christian Thode Larsen (thode2d@gmail.com)
7
 *  J. Andreas Baerentzen (jab@imm.dtu.dk)
8
 *
9
 * See LICENSE.txt for licensing information
10
 * ----------------------------------------------------------------------- */
511 s042372 11
 
12
#ifndef __HMESH_CONNECTIVITY_KERNEL_H__
13
#define __HMESH_CONNECTIVITY_KERNEL_H__
14
 
15
#include <vector>
515 s042372 16
#include <map>
511 s042372 17
#include "ItemVector.h"
18
#include "Items.h"
19
 
20
namespace HMesh
21
{
515 s042372 22
    typedef std::map<VertexID, VertexID> VertexIDRemap;
23
    typedef std::map<FaceID, FaceID> FaceIDRemap;
24
    typedef std::map<HalfEdgeID, HalfEdgeID> HalfEdgeIDRemap;
25
 
26
    struct IDRemap
27
    {
28
        VertexIDRemap vmap;
29
        FaceIDRemap fmap;
30
        HalfEdgeIDRemap hmap;
31
    };
32
 
512 s042372 33
    class ConnectivityKernel
34
    {
35
    public:
36
        VertexID add_vertex();
37
        FaceID add_face();
38
        HalfEdgeID add_halfedge();
511 s042372 39
 
515 s042372 40
 
512 s042372 41
        void remove_vertex(VertexID id);
511 s042372 42
        void remove_face(FaceID id);
43
        void remove_halfedge(HalfEdgeID id);
44
 
512 s042372 45
        void resize_vertices(IndexType size);
46
        void resize_faces(IndexType size);
47
        void resize_halfedges(IndexType size);
511 s042372 48
 
512 s042372 49
        HalfEdgeID next(HalfEdgeID id) const;
50
        HalfEdgeID prev(HalfEdgeID id) const;
51
        HalfEdgeID opp(HalfEdgeID id) const;
52
        HalfEdgeID out(VertexID id) const;
53
        HalfEdgeID last(FaceID id) const;
54
        VertexID vert(HalfEdgeID id) const;
55
        FaceID face(HalfEdgeID id) const;
511 s042372 56
 
512 s042372 57
        void set_next(HalfEdgeID id, HalfEdgeID next);
58
        void set_prev(HalfEdgeID id, HalfEdgeID prev);
59
        void set_opp(HalfEdgeID id, HalfEdgeID opp);
60
        void set_out(VertexID id, HalfEdgeID out);
61
        void set_last(FaceID id, HalfEdgeID last);
62
        void set_vert(HalfEdgeID id, VertexID vert);
63
        void set_face(HalfEdgeID id, FaceID face);
511 s042372 64
 
512 s042372 65
        IndexType no_vertices(bool active = true) const;
66
        IndexType no_faces(bool active = true) const;
67
        IndexType no_halfedges(bool active = true) const;
511 s042372 68
 
512 s042372 69
        bool in_use(VertexID id) const;
70
        bool in_use(FaceID id) const;
71
        bool in_use(HalfEdgeID id) const;
511 s042372 72
 
515 s042372 73
 
512 s042372 74
        VertexID vertices_next(VertexID id, bool skip = true) const;
75
        HalfEdgeID halfedges_next(HalfEdgeID id, bool skip = true) const;
76
        FaceID faces_next(FaceID id, bool skip = true) const;
511 s042372 77
 
512 s042372 78
        VertexID vertices_prev(VertexID id, bool skip = true) const;
79
        HalfEdgeID halfedges_prev(HalfEdgeID id, bool skip = true) const;
80
        FaceID faces_prev(FaceID id, bool skip = true) const;
81
 
82
        VertexID vertices_begin(bool skip = true) const;
511 s042372 83
        HalfEdgeID halfedges_begin(bool skip = true) const;
84
        FaceID faces_begin(bool skip = true) const;
85
 
86
        VertexID vertices_end() const;
87
        HalfEdgeID halfedges_end() const;
88
        FaceID faces_end() const;
89
 
515 s042372 90
        /// Clean up unused space in vectors - WARNING! Invalidates existing handles!
91
        void cleanup(IDRemap& map);
92
 
512 s042372 93
        void clear();
511 s042372 94
 
512 s042372 95
    private:
96
        ItemVector<Vertex> vertices;
97
        ItemVector<Face> faces;
98
        ItemVector<HalfEdge> halfedges;
99
    };
511 s042372 100
 
512 s042372 101
    inline VertexID ConnectivityKernel::add_vertex()
102
    {
103
        vertices.add(Vertex());
104
        return VertexID(vertices.size() - 1);
105
    }
511 s042372 106
 
512 s042372 107
    inline FaceID ConnectivityKernel::add_face()
108
    {
109
        faces.add(Face());
110
        return FaceID(faces.size() - 1);
111
    }
511 s042372 112
 
512 s042372 113
    inline HalfEdgeID ConnectivityKernel::add_halfedge()
114
    {
115
        halfedges.add(HalfEdge());
116
        return HalfEdgeID(halfedges.size() - 1);
117
    }
511 s042372 118
 
119
 
120
 
515 s042372 121
 
512 s042372 122
    inline void ConnectivityKernel::remove_vertex(VertexID id)
515 s042372 123
    { vertices.remove(id.index); }
511 s042372 124
 
512 s042372 125
    inline void ConnectivityKernel::remove_face(FaceID id)
515 s042372 126
    { faces.remove(id.index); }
511 s042372 127
 
512 s042372 128
    inline void ConnectivityKernel::remove_halfedge(HalfEdgeID id)
515 s042372 129
    { halfedges.remove(id.index); }
511 s042372 130
 
131
 
132
 
512 s042372 133
    inline void ConnectivityKernel::resize_vertices(IndexType size)
134
    {  vertices.resize(size); }
511 s042372 135
 
512 s042372 136
    inline void ConnectivityKernel::resize_faces(IndexType size)
137
    {  faces.resize(size); }
511 s042372 138
 
512 s042372 139
    inline void ConnectivityKernel::resize_halfedges(IndexType size)
140
    {  halfedges.resize(size); }
511 s042372 141
 
142
 
512 s042372 143
    inline HalfEdgeID ConnectivityKernel::next(HalfEdgeID id) const
515 s042372 144
    { return HalfEdgeID(halfedges[id.index].next); }
511 s042372 145
 
512 s042372 146
    inline HalfEdgeID ConnectivityKernel::prev(HalfEdgeID id) const
515 s042372 147
    { return HalfEdgeID(halfedges[id.index].prev); }
511 s042372 148
 
512 s042372 149
    inline HalfEdgeID ConnectivityKernel::opp(HalfEdgeID id) const
515 s042372 150
    { return HalfEdgeID(halfedges[id.index].opp); }
511 s042372 151
 
512 s042372 152
    inline HalfEdgeID ConnectivityKernel::out(VertexID id) const
515 s042372 153
    { return HalfEdgeID(vertices[id.index].out); }
511 s042372 154
 
512 s042372 155
    inline HalfEdgeID ConnectivityKernel::last(FaceID id) const
515 s042372 156
    { return HalfEdgeID(faces[id.index].last); }
511 s042372 157
 
512 s042372 158
    inline VertexID ConnectivityKernel::vert(HalfEdgeID id) const
515 s042372 159
    { return VertexID(halfedges[id.index].vert); }
511 s042372 160
 
512 s042372 161
    inline FaceID ConnectivityKernel::face(HalfEdgeID id) const
515 s042372 162
    { return FaceID(halfedges[id.index].face); }
511 s042372 163
 
512 s042372 164
    inline void ConnectivityKernel::set_next(HalfEdgeID id, HalfEdgeID next)
515 s042372 165
    { halfedges[id.index].next = next; }
511 s042372 166
 
512 s042372 167
    inline void ConnectivityKernel::set_prev(HalfEdgeID id, HalfEdgeID prev)
515 s042372 168
    { halfedges[id.index].prev = prev; }
511 s042372 169
 
512 s042372 170
    inline void ConnectivityKernel::set_opp(HalfEdgeID id, HalfEdgeID opp)
515 s042372 171
    {halfedges[id.index].opp = opp; }
511 s042372 172
 
512 s042372 173
    inline void ConnectivityKernel::set_out(VertexID id, HalfEdgeID out)
515 s042372 174
    { vertices[id.index].out = out; }
511 s042372 175
 
512 s042372 176
    inline void ConnectivityKernel::set_last(FaceID id, HalfEdgeID last)
515 s042372 177
    { faces[id.index].last = last; }
511 s042372 178
 
512 s042372 179
    inline void ConnectivityKernel::set_vert(HalfEdgeID id, VertexID vert)
515 s042372 180
    { halfedges[id.index].vert = vert; }
511 s042372 181
 
512 s042372 182
    inline void ConnectivityKernel::set_face(HalfEdgeID id, FaceID face)
515 s042372 183
    { halfedges[id.index].face = face; }
511 s042372 184
 
512 s042372 185
    inline IndexType ConnectivityKernel::no_vertices(bool active) const
186
    { return vertices.size(active); }
511 s042372 187
 
512 s042372 188
    inline IndexType ConnectivityKernel::no_faces(bool active) const
189
    { return faces.size(active); }
511 s042372 190
 
512 s042372 191
    inline IndexType ConnectivityKernel::no_halfedges(bool active) const
192
    { return halfedges.size(active); }
511 s042372 193
 
515 s042372 194
 
195
 
512 s042372 196
    inline bool ConnectivityKernel::in_use(VertexID id) const
515 s042372 197
    { return vertices.in_use(id.index); }
511 s042372 198
 
512 s042372 199
    inline bool ConnectivityKernel::in_use(FaceID id) const
515 s042372 200
    { return faces.in_use(id.index); }
511 s042372 201
 
512 s042372 202
    inline bool ConnectivityKernel::in_use(HalfEdgeID id) const
515 s042372 203
    { return halfedges.in_use(id.index); }
511 s042372 204
 
515 s042372 205
 
206
 
512 s042372 207
    inline VertexID ConnectivityKernel::vertices_next(VertexID id, bool skip) const
515 s042372 208
    { return vertices.index_next(id.index, skip); }
511 s042372 209
 
512 s042372 210
    inline HalfEdgeID ConnectivityKernel::halfedges_next(HalfEdgeID id, bool skip) const
515 s042372 211
    { return halfedges.index_next(id.index, skip); }
511 s042372 212
 
512 s042372 213
    inline FaceID ConnectivityKernel::faces_next(FaceID id, bool skip) const
515 s042372 214
    { return faces.index_next(id.index, skip); }
511 s042372 215
 
512 s042372 216
    inline VertexID ConnectivityKernel::vertices_prev(VertexID id, bool skip) const
515 s042372 217
    { return vertices.index_prev(id.index, skip); }
511 s042372 218
 
512 s042372 219
    inline HalfEdgeID ConnectivityKernel::halfedges_prev(HalfEdgeID id, bool skip) const
515 s042372 220
    { return halfedges.index_prev(id.index, skip); }
511 s042372 221
 
512 s042372 222
    inline FaceID ConnectivityKernel::faces_prev(FaceID id, bool skip) const
515 s042372 223
    { return faces.index_prev(id.index, skip); }
511 s042372 224
 
512 s042372 225
    inline VertexID ConnectivityKernel::vertices_begin(bool skip) const
226
    { return vertices.index_begin(skip); }
227
 
511 s042372 228
    inline HalfEdgeID ConnectivityKernel::halfedges_begin(bool skip) const
512 s042372 229
    { return halfedges.index_begin(skip); }
511 s042372 230
 
231
    inline FaceID ConnectivityKernel::faces_begin(bool skip) const
512 s042372 232
    { return faces.index_begin(skip); }
511 s042372 233
 
234
    inline VertexID ConnectivityKernel::vertices_end() const
512 s042372 235
    { return vertices.index_end(); }
511 s042372 236
 
237
    inline HalfEdgeID ConnectivityKernel::halfedges_end() const
512 s042372 238
    { return halfedges.index_end(); }
511 s042372 239
 
240
    inline FaceID ConnectivityKernel::faces_end() const
512 s042372 241
    { return faces.index_end(); }
511 s042372 242
 
512 s042372 243
    inline void ConnectivityKernel::clear()
244
    {
245
        vertices.clear();
246
        faces.clear();
247
        halfedges.clear();
248
    }
511 s042372 249
}
250
 
251
#endif