Subversion Repositories gelsvn

Rev

Rev 518 | Rev 520 | Go to most recent revision | Details | Compare with Previous | 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"
518 s042372 18
#include "ItemID.h"
511 s042372 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
 
518 s042372 33
    struct Vertex
34
    { 
35
        HalfEdgeID out; 
36
    };
37
 
38
    struct Face
39
    { 
40
        HalfEdgeID last; 
41
    };
42
 
43
    struct HalfEdge
44
    {
45
        HalfEdgeID next;
46
        HalfEdgeID prev;
47
        HalfEdgeID opp;
48
        VertexID vert;
49
        FaceID face;
50
    };
51
 
512 s042372 52
    class ConnectivityKernel
53
    {
54
    public:
55
        VertexID add_vertex();
56
        FaceID add_face();
57
        HalfEdgeID add_halfedge();
511 s042372 58
 
515 s042372 59
 
512 s042372 60
        void remove_vertex(VertexID id);
511 s042372 61
        void remove_face(FaceID id);
62
        void remove_halfedge(HalfEdgeID id);
63
 
518 s042372 64
        void resize_vertices(size_t size);
65
        void resize_faces(size_t size);
66
        void resize_halfedges(size_t size);
511 s042372 67
 
512 s042372 68
        HalfEdgeID next(HalfEdgeID id) const;
69
        HalfEdgeID prev(HalfEdgeID id) const;
70
        HalfEdgeID opp(HalfEdgeID id) const;
71
        HalfEdgeID out(VertexID id) const;
72
        HalfEdgeID last(FaceID id) const;
73
        VertexID vert(HalfEdgeID id) const;
74
        FaceID face(HalfEdgeID id) const;
511 s042372 75
 
512 s042372 76
        void set_next(HalfEdgeID id, HalfEdgeID next);
77
        void set_prev(HalfEdgeID id, HalfEdgeID prev);
78
        void set_opp(HalfEdgeID id, HalfEdgeID opp);
79
        void set_out(VertexID id, HalfEdgeID out);
80
        void set_last(FaceID id, HalfEdgeID last);
81
        void set_vert(HalfEdgeID id, VertexID vert);
82
        void set_face(HalfEdgeID id, FaceID face);
511 s042372 83
 
519 s042372 84
        size_t active_vertices() const;
85
        size_t active_faces() const;
86
        size_t active_halfedges() const;
511 s042372 87
 
519 s042372 88
        size_t total_vertices() const;
89
        size_t total_faces() const;
90
        size_t total_halfedges() const;
91
 
512 s042372 92
        bool in_use(VertexID id) const;
93
        bool in_use(FaceID id) const;
94
        bool in_use(HalfEdgeID id) const;
511 s042372 95
 
515 s042372 96
 
512 s042372 97
        VertexID vertices_next(VertexID id, bool skip = true) const;
98
        HalfEdgeID halfedges_next(HalfEdgeID id, bool skip = true) const;
99
        FaceID faces_next(FaceID id, bool skip = true) const;
511 s042372 100
 
512 s042372 101
        VertexID vertices_prev(VertexID id, bool skip = true) const;
102
        HalfEdgeID halfedges_prev(HalfEdgeID id, bool skip = true) const;
103
        FaceID faces_prev(FaceID id, bool skip = true) const;
104
 
105
        VertexID vertices_begin(bool skip = true) const;
511 s042372 106
        HalfEdgeID halfedges_begin(bool skip = true) const;
107
        FaceID faces_begin(bool skip = true) const;
108
 
109
        VertexID vertices_end() const;
110
        HalfEdgeID halfedges_end() const;
111
        FaceID faces_end() const;
112
 
515 s042372 113
        /// Clean up unused space in vectors - WARNING! Invalidates existing handles!
114
        void cleanup(IDRemap& map);
115
 
512 s042372 116
        void clear();
511 s042372 117
 
512 s042372 118
    private:
119
        ItemVector<Vertex> vertices;
120
        ItemVector<Face> faces;
121
        ItemVector<HalfEdge> halfedges;
122
    };
511 s042372 123
 
512 s042372 124
    inline VertexID ConnectivityKernel::add_vertex()
125
    {
126
        vertices.add(Vertex());
519 s042372 127
        return VertexID(vertices.total_size() - 1);
512 s042372 128
    }
511 s042372 129
 
512 s042372 130
    inline FaceID ConnectivityKernel::add_face()
131
    {
132
        faces.add(Face());
519 s042372 133
        return FaceID(faces.total_size() - 1);
512 s042372 134
    }
511 s042372 135
 
512 s042372 136
    inline HalfEdgeID ConnectivityKernel::add_halfedge()
137
    {
138
        halfedges.add(HalfEdge());
519 s042372 139
        return HalfEdgeID(halfedges.total_size() - 1);
512 s042372 140
    }
511 s042372 141
 
142
 
143
 
515 s042372 144
 
512 s042372 145
    inline void ConnectivityKernel::remove_vertex(VertexID id)
515 s042372 146
    { vertices.remove(id.index); }
511 s042372 147
 
512 s042372 148
    inline void ConnectivityKernel::remove_face(FaceID id)
515 s042372 149
    { faces.remove(id.index); }
511 s042372 150
 
512 s042372 151
    inline void ConnectivityKernel::remove_halfedge(HalfEdgeID id)
515 s042372 152
    { halfedges.remove(id.index); }
511 s042372 153
 
154
 
155
 
518 s042372 156
    inline void ConnectivityKernel::resize_vertices(size_t size)
512 s042372 157
    {  vertices.resize(size); }
511 s042372 158
 
518 s042372 159
    inline void ConnectivityKernel::resize_faces(size_t size)
512 s042372 160
    {  faces.resize(size); }
511 s042372 161
 
518 s042372 162
    inline void ConnectivityKernel::resize_halfedges(size_t size)
512 s042372 163
    {  halfedges.resize(size); }
511 s042372 164
 
165
 
512 s042372 166
    inline HalfEdgeID ConnectivityKernel::next(HalfEdgeID id) const
515 s042372 167
    { return HalfEdgeID(halfedges[id.index].next); }
511 s042372 168
 
512 s042372 169
    inline HalfEdgeID ConnectivityKernel::prev(HalfEdgeID id) const
515 s042372 170
    { return HalfEdgeID(halfedges[id.index].prev); }
511 s042372 171
 
512 s042372 172
    inline HalfEdgeID ConnectivityKernel::opp(HalfEdgeID id) const
515 s042372 173
    { return HalfEdgeID(halfedges[id.index].opp); }
511 s042372 174
 
512 s042372 175
    inline HalfEdgeID ConnectivityKernel::out(VertexID id) const
515 s042372 176
    { return HalfEdgeID(vertices[id.index].out); }
511 s042372 177
 
512 s042372 178
    inline HalfEdgeID ConnectivityKernel::last(FaceID id) const
515 s042372 179
    { return HalfEdgeID(faces[id.index].last); }
511 s042372 180
 
512 s042372 181
    inline VertexID ConnectivityKernel::vert(HalfEdgeID id) const
515 s042372 182
    { return VertexID(halfedges[id.index].vert); }
511 s042372 183
 
512 s042372 184
    inline FaceID ConnectivityKernel::face(HalfEdgeID id) const
515 s042372 185
    { return FaceID(halfedges[id.index].face); }
511 s042372 186
 
512 s042372 187
    inline void ConnectivityKernel::set_next(HalfEdgeID id, HalfEdgeID next)
515 s042372 188
    { halfedges[id.index].next = next; }
511 s042372 189
 
512 s042372 190
    inline void ConnectivityKernel::set_prev(HalfEdgeID id, HalfEdgeID prev)
515 s042372 191
    { halfedges[id.index].prev = prev; }
511 s042372 192
 
512 s042372 193
    inline void ConnectivityKernel::set_opp(HalfEdgeID id, HalfEdgeID opp)
515 s042372 194
    {halfedges[id.index].opp = opp; }
511 s042372 195
 
512 s042372 196
    inline void ConnectivityKernel::set_out(VertexID id, HalfEdgeID out)
515 s042372 197
    { vertices[id.index].out = out; }
511 s042372 198
 
512 s042372 199
    inline void ConnectivityKernel::set_last(FaceID id, HalfEdgeID last)
515 s042372 200
    { faces[id.index].last = last; }
511 s042372 201
 
512 s042372 202
    inline void ConnectivityKernel::set_vert(HalfEdgeID id, VertexID vert)
515 s042372 203
    { halfedges[id.index].vert = vert; }
511 s042372 204
 
512 s042372 205
    inline void ConnectivityKernel::set_face(HalfEdgeID id, FaceID face)
515 s042372 206
    { halfedges[id.index].face = face; }
511 s042372 207
 
208
 
209
 
519 s042372 210
    inline size_t ConnectivityKernel::active_vertices() const
211
    { return vertices.active_size(); }
511 s042372 212
 
519 s042372 213
    inline size_t ConnectivityKernel::active_faces() const
214
    { return faces.active_size(); }
515 s042372 215
 
519 s042372 216
    inline size_t ConnectivityKernel::active_halfedges() const
217
    { return halfedges.active_size(); }
515 s042372 218
 
519 s042372 219
 
220
 
221
    inline size_t ConnectivityKernel::total_vertices() const
222
    { return vertices.total_size(); }
223
 
224
    inline size_t ConnectivityKernel::total_faces() const
225
    { return faces.total_size(); }
226
 
227
    inline size_t ConnectivityKernel::total_halfedges() const
228
    { return halfedges.total_size(); }
229
 
230
 
231
 
512 s042372 232
    inline bool ConnectivityKernel::in_use(VertexID id) const
515 s042372 233
    { return vertices.in_use(id.index); }
511 s042372 234
 
512 s042372 235
    inline bool ConnectivityKernel::in_use(FaceID id) const
515 s042372 236
    { return faces.in_use(id.index); }
511 s042372 237
 
512 s042372 238
    inline bool ConnectivityKernel::in_use(HalfEdgeID id) const
515 s042372 239
    { return halfedges.in_use(id.index); }
511 s042372 240
 
515 s042372 241
 
242
 
512 s042372 243
    inline VertexID ConnectivityKernel::vertices_next(VertexID id, bool skip) const
515 s042372 244
    { return vertices.index_next(id.index, skip); }
511 s042372 245
 
512 s042372 246
    inline HalfEdgeID ConnectivityKernel::halfedges_next(HalfEdgeID id, bool skip) const
515 s042372 247
    { return halfedges.index_next(id.index, skip); }
511 s042372 248
 
512 s042372 249
    inline FaceID ConnectivityKernel::faces_next(FaceID id, bool skip) const
515 s042372 250
    { return faces.index_next(id.index, skip); }
511 s042372 251
 
512 s042372 252
    inline VertexID ConnectivityKernel::vertices_prev(VertexID id, bool skip) const
515 s042372 253
    { return vertices.index_prev(id.index, skip); }
511 s042372 254
 
512 s042372 255
    inline HalfEdgeID ConnectivityKernel::halfedges_prev(HalfEdgeID id, bool skip) const
515 s042372 256
    { return halfedges.index_prev(id.index, skip); }
511 s042372 257
 
512 s042372 258
    inline FaceID ConnectivityKernel::faces_prev(FaceID id, bool skip) const
515 s042372 259
    { return faces.index_prev(id.index, skip); }
511 s042372 260
 
512 s042372 261
    inline VertexID ConnectivityKernel::vertices_begin(bool skip) const
262
    { return vertices.index_begin(skip); }
263
 
511 s042372 264
    inline HalfEdgeID ConnectivityKernel::halfedges_begin(bool skip) const
512 s042372 265
    { return halfedges.index_begin(skip); }
511 s042372 266
 
267
    inline FaceID ConnectivityKernel::faces_begin(bool skip) const
512 s042372 268
    { return faces.index_begin(skip); }
511 s042372 269
 
270
    inline VertexID ConnectivityKernel::vertices_end() const
512 s042372 271
    { return vertices.index_end(); }
511 s042372 272
 
273
    inline HalfEdgeID ConnectivityKernel::halfedges_end() const
512 s042372 274
    { return halfedges.index_end(); }
511 s042372 275
 
276
    inline FaceID ConnectivityKernel::faces_end() const
512 s042372 277
    { return faces.index_end(); }
511 s042372 278
 
512 s042372 279
    inline void ConnectivityKernel::clear()
280
    {
281
        vertices.clear();
282
        faces.clear();
283
        halfedges.clear();
284
    }
511 s042372 285
}
286
 
287
#endif