BRL-CAD
topology.h
Go to the documentation of this file.
1/* T O P O L O G Y . H
2 * BRL-CAD
3 *
4 * Copyright (c) 2004-2023 United States Government as represented by
5 * the U.S. Army Research Laboratory.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public License
9 * version 2.1 as published by the Free Software Foundation.
10 *
11 * This library is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this file; see the file named COPYING for more
18 * information.
19 */
20
21/*----------------------------------------------------------------------*/
22/** @addtogroup nmg_topology
23 *
24 * This is the interconnected hierarchical data scheme proposed by Weiler and
25 * documented by Muuss and Butler in: Combinatorial Solid Geometry, Boundary
26 * Representations, and Non-Manifold Geometry, State of the Art in Computer
27 * Graphics: Visualization and Modeling D. F. Rogers, R. A. Earnshaw editors,
28 * Springer-Verlag, New York, 1991, pages 185-223:
29 * https://ftp.arl.army.mil/~mike/papers/90nmg/joined.html
30 *
31 * Because of the interconnectedness of these containers, they are defined
32 * together rather than in separate headers - all of the "use" containers
33 * need to know about other use container types, as seen in Figure 4 from the
34 * Muuss/Butler paper:
35 *
36 @verbatim
37 Model
38 |
39 Region
40 |
41 Shell
42 ||||
43 |||*--> Faceuse <--------> Face
44 ||| |
45 ||*---> Loopuse <--------> Loop
46 || | |
47 |*------|--> Edgeuse <---> Edge
48 | | |
49 | *--> Vertexuse <-> Vertex
50 *------------^
51 @endverbatim
52 *
53 * Each element has a direct connection to its parent and child types. The
54 * elements are defined thusly:
55 *
56 * - Vertex: a unique topological point
57 * - Edge: a line or curve terminated by one or two Vertices
58 * - Loop: a single Vertex, or a circuit of one or more Edges
59 * - Face: one or more Loops defining a surface. Exterior Loops include an area, interior Loops exclude an area
60 * - Shell: a single Vertex, or a collection of Faces, Loops and Edgesa
61 * - Region: a collection of shells
62 * - Model: a collection of regions
63 *
64 * The "use" notation refers to a conceptual separation between an entity and a
65 * reference to that entity. For example, a face has two sides - each of those
66 * sides is individually referenced by a "use" of the underlying face data
67 * structure, with the faceuse adding additional information to identify the
68 * specific side associated with that particular application of the underlying
69 * face data.
70 *
71 */
72/** @{ */
73/** @file nmg/topology.h */
74
75#ifndef NMG_TOPOLOGY_H
76#define NMG_TOPOLOGY_H
77
78#include "common.h"
79
80#include "vmath.h"
81#include "bu/list.h"
82#include "nmg/defines.h"
83
84__BEGIN_DECLS
85
86/**
87 * @brief
88 * NMG topological vertex - the simplest element of the topology system
89 *
90 * A vertex stores knowledge of all the places in the model topology where it
91 * is used, via a list of "vertexuse" containers stored in the vu_hd list.
92 * Each vertex has its own unique associated geometric point, vg_p;
93 *
94 * Neither vertex_g nor vertex structures are the primary topological unit used
95 * in describing more complex structures - it is the "use" of a vertex (i.e.
96 * the vertexuse structure) that manifests an active vertex point in the model.
97 */
98struct vertex {
99 uint32_t magic;
100 struct bu_list vu_hd; /**< @brief heads list of vu's of this vertex */
101 struct vertex_g *vg_p; /**< @brief geometry */
102 long index; /**< @brief struct # in this model */
103};
104
105/**
106 * @brief
107 * NMG topological vertex usage
108 */
109struct vertexuse {
110 struct bu_list l; /**< @brief list of all vu's on a vertex */
111 union {
112 struct shell *s_p; /**< @brief no fu's or eu's on shell */
113 struct loopuse *lu_p; /**< @brief loopuse contains single vertex */
114 struct edgeuse *eu_p; /**< @brief eu causing this vu */
115 uint32_t *magic_p; /**< @brief for those times when we're not sure */
116 } up;
117 struct vertex *v_p; /**< @brief vertex definition and attributes */
118 union {
119 uint32_t *magic_p;
122 } a; /**< @brief Attributes */
123 long index; /**< @brief struct # in this model */
124};
125
126/**
127 * @brief
128 * NMG topological edge
129 *
130 * To find all edgeuses of an edge, use eu_p to get an arbitrary
131 * edgeuse, then wander around either eumate_p or radial_p from there.
132 *
133 * Only the first vertex of an edge is kept in an edgeuse (eu->vu_p).
134 * The other vertex can be found by either eu->eumate_p->vu_p or by
135 * BU_LIST_PNEXT_CIRC(edgeuse, eu)->vu_p. Note that the first form
136 * gives a vertexuse in the faceuse of *opposite* orientation, while
137 * the second form gives a vertexuse in the faceuse of the correct
138 * orientation. If going on to the vertex (vu_p->v_p), both forms are
139 * identical.
140 *
141 * An edge occupies the range eu->param to eu->eumate_p->param in its
142 * geometry's parameter space. (cnurbs only)
143 */
144struct edge {
145 uint32_t magic;
146 struct edgeuse *eu_p; /**< @brief Ptr to one use of this edge */
147 long is_real; /**< @brief artifact or modeled edge (from tessellator) */
148 long index; /**< @brief struct # in this model */
149};
150
151/**
152 * @brief
153 * NMG topological edge usage
154 */
155struct edgeuse {
156 struct bu_list l; /**< @brief cw/ccw edges in loop or wire edges in shell */
157 struct bu_list l2; /**< @brief member of edge_g's eu_hd2 list */
158 union {
159 struct loopuse *lu_p;
160 struct shell *s_p;
161 uint32_t *magic_p; /**< @brief for those times when we're not sure */
162 } up;
163 struct edgeuse *eumate_p; /**< @brief eu on other face or other end of wire*/
164 struct edgeuse *radial_p; /**< @brief eu on radially adj. fu (null if wire)*/
165 struct edge *e_p; /**< @brief edge definition and attributes */
166 int orientation; /**< @brief compared to geom (null if wire) */
167 struct vertexuse *vu_p; /**< @brief first vu of eu in this orient */
168 union {
169 uint32_t *magic_p;
172 } g; /**< @brief geometry */
173 /* (u, v, w) param[] of vu is found in vu_p->vua_p->param */
174 long index; /**< @brief struct # in this model */
175};
176
177/**
178 * @brief
179 * NMG topological loop
180 */
181struct loop {
182 uint32_t magic;
183 struct loopuse *lu_p; /**< @brief Ptr to one use of this loop */
184 struct loop_a *la_p; /**< @brief Geometry */
185 long index; /**< @brief struct # in this model */
186};
187
188/**
189 * @brief
190 * NMG topological loop usage
191 */
192struct loopuse {
193 struct bu_list l; /**< @brief lu's, in fu's lu_hd, or shell's lu_hd */
194 union {
195 struct faceuse *fu_p; /**< @brief owning face-use */
196 struct shell *s_p;
197 uint32_t *magic_p;
198 } up;
199 struct loopuse *lumate_p; /**< @brief loopuse on other side of face */
200 int orientation; /**< @brief OT_SAME=outside loop */
201 struct loop *l_p; /**< @brief loop definition and attributes */
202 struct bu_list down_hd; /**< @brief eu list or vu pointer */
203 long index; /**< @brief struct # in this model */
204};
205
206/**
207 * @brief
208 * NMG topological face
209 */
210struct face {
211 struct bu_list l; /**< @brief faces in face_g's f_hd list */
212 struct faceuse *fu_p; /**< @brief Ptr up to one use of this face */
213 union {
214 uint32_t *magic_p;
217 } g; /**< @brief geometry */
218 int flip; /**< @brief !0 ==> flip normal of fg */
219 /* These might be better stored in a face_a (not faceuse_a!) */
220 /* These are not stored on disk */
221 point_t min_pt; /**< @brief minimums of bounding box */
222 point_t max_pt; /**< @brief maximums of bounding box */
223 long index; /**< @brief struct # in this model */
224};
225
226/**
227 * @brief
228 * NMG topological face usage
229 */
230struct faceuse {
231 struct bu_list l; /**< @brief fu's, in shell's fu_hd list */
232 struct shell *s_p; /**< @brief owning shell */
233 struct faceuse *fumate_p; /**< @brief opposite side of face */
234 int orientation; /**< @brief rel to face geom defn */
235 int outside; /**< @brief RESERVED for future: See Lee Butler */
236 struct face *f_p; /**< @brief face definition and attributes */
237 struct bu_list lu_hd; /**< @brief list of loops in face-use */
238 long index; /**< @brief struct # in this model */
239};
240
241/**
242 * @brief
243 * NMG topological shell
244 *
245 * When a shell encloses volume, it's done entirely by the list of
246 * faceuses.
247 *
248 * The wire loopuses (each of which heads a list of edges) define a
249 * set of connected line segments which form a closed path, but do not
250 * enclose either volume or surface area.
251 *
252 * The wire edgeuses are disconnected line segments. There is a
253 * special interpretation to the eu_hd list of wire edgeuses. Unlike
254 * edgeuses seen in loops, the eu_hd list contains eu1, eu1mate, eu2,
255 * eu2mate, ..., where each edgeuse and its mate comprise a
256 * *non-connected* "wire" edge which starts at eu1->vu_p->v_p and ends
257 * at eu1mate->vu_p->v_p. There is no relationship between the pairs
258 * of edgeuses at all, other than that they all live on the same
259 * linked list.
260 */
261struct shell {
262 struct bu_list l; /**< @brief shells, in region's s_hd list */
263 struct nmgregion *r_p; /**< @brief owning region */
264 struct shell_a *sa_p; /**< @brief attribs */
265
266 struct bu_list fu_hd; /**< @brief list of face uses in shell */
267 struct bu_list lu_hd; /**< @brief wire loopuses (edge groups) */
268 struct bu_list eu_hd; /**< @brief wire list (shell has wires) */
269 struct vertexuse *vu_p; /**< @brief internal ptr to single vertexuse */
270 long index; /**< @brief struct # in this model */
271};
272
273/**
274 * @brief
275 * NMG topological region
276 */
277struct nmgregion {
278 struct bu_list l; /**< @brief regions, in model's r_hd list */
279 struct model *m_p; /**< @brief owning model */
280 struct nmgregion_a *ra_p; /**< @brief attributes */
281 struct bu_list s_hd; /**< @brief list of shells in region */
282 long index; /**< @brief struct # in this model */
283};
284
285/**
286 * @brief
287 * NMG topological model
288 */
289struct model {
290 uint32_t magic;
291 struct bu_list r_hd; /**< @brief list of regions */
292 char *manifolds; /**< @brief structure 1-3manifold table */
293 long index; /**< @brief struct # in this model */
294 long maxindex; /**< @brief # of structs so far */
295};
296
297/*****************************************************************************/
298/*****************************************************************************/
299/* Geometric data containers - referenced by the topological containers to
300 * describe geometric information in 3D space. */
301
302/**
303 * @brief
304 * Point in 3D space.
305 *
306 * Note that this container is responsible ONLY for geometric information, and
307 * has no knowledge of topological relationships.
308 */
309struct vertex_g {
310 uint32_t magic;
311 point_t coord; /**< @brief coordinates of vertex in space */
312 long index; /**< @brief struct # in this model */
313};
314
315/**
316 * @brief
317 * Line in 3D space.
318 *
319 * An edge_g_lseg structure represents a line in 3-space. All edges on that
320 * line should share the same edge_g.
321 *
322 * IMPORTANT: First two items in edge_g_lseg and edge_g_cnurb (or any other
323 * segment type added) must be identical structures, so pointers are puns for
324 * both. eu_hd2 list must be in same place for both.
325 */
327 struct bu_list l; /**< @brief NOTICE: l.forw & l.back *not* stored in database. For alignment only. */
328 struct bu_list eu_hd2; /**< @brief heads l2 list of edgeuses on this line */
329 point_t e_pt; /**< @brief parametric equation of the line */
331 long index; /**< @brief struct # in this model */
332};
333
334/**
335 * @brief
336 * Planar face geometry
337 *
338 * Note: there will always be exactly two faceuse's using a face. To
339 * find them, go up fu_p for one, then across fumate_p to other.
340 */
342 uint32_t magic;
343 struct bu_list f_hd; /**< @brief list of faces sharing this surface */
344 plane_t N; /**< @brief Plane equation (incl normal) */
345 long index; /**< @brief struct # in this model */
346};
347
348/**
349 * @brief
350 * Definition of a knot vector.
351 *
352 * Not found independently, but used in the cnurb and snurb
353 * structures. (Exactly the same as the definition in nurb.h)
354 */
356 uint32_t magic;
357 int k_size; /**< @brief knot vector size */
358 fastf_t * knots; /**< @brief pointer to knot vector */
359};
360
361/**
362 * @brief
363 * Edge NURBS curve geometry.
364 *
365 * The ctl_points on this curve are (u, v) values on the face's
366 * surface. As a storage and performance efficiency measure, if order
367 * <= 0, then the cnurb is a straight line segment in parameter space,
368 * and the k.knots and ctl_points pointers will be NULL. In this
369 * case, the vertexuse_a_cnurb's at both ends of the edgeuse define
370 * the path through parameter space.
371 *
372 * IMPORTANT: First two items in edge_g_lseg and edge_g_cnurb (or any other
373 * segment type added) must be identical structures, so pointers are puns for
374 * both. eu_hd2 list must be in same place for both.
375 */
377 struct bu_list l; /**< @brief NOTICE: l.forw & l.back are NOT stored in database. For bspline primitive internal use only. */
378 struct bu_list eu_hd2; /**< @brief heads l2 list of edgeuses on this curve */
379 int order; /**< @brief Curve Order */
380 struct knot_vector k; /**< @brief curve knot vector */
381 /* curve control polygon */
382 int c_size; /**< @brief number of ctl points */
383 int pt_type; /**< @brief curve point type */
384 fastf_t *ctl_points; /**< @brief array [c_size] */
385 long index; /**< @brief struct # in this model */
386};
387
388/**
389 * @brief
390 * Face NURBS surface geometry.
391 */
393 /* NOTICE: l.forw & l.back *not* stored in database. They are for
394 * bspline primitive internal use only.
395 */
396 struct bu_list l;
397 struct bu_list f_hd; /**< @brief list of faces sharing this surface */
398 int order[2]; /**< @brief surface order [0] = u, [1] = v */
399 struct knot_vector u; /**< @brief surface knot vectors */
400 struct knot_vector v; /**< @brief surface knot vectors */
401 /* surface control points */
402 int s_size[2]; /**< @brief mesh size, u, v */
403 int pt_type; /**< @brief surface point type */
404 fastf_t *ctl_points; /**< @brief array [size[0]*size[1]] */
405 /* START OF ITEMS VALID IN-MEMORY ONLY -- NOT STORED ON DISK */
406 int dir; /**< @brief direction of last refinement */
407 point_t min_pt; /**< @brief min corner of bounding box */
408 point_t max_pt; /**< @brief max corner of bounding box */
409 /* END OF ITEMS VALID IN-MEMORY ONLY -- NOT STORED ON DISK */
410 long index; /**< @brief struct # in this model */
411};
412/*****************************************************************************/
413
414/*****************************************************************************/
415/* Attribute data containers - storing additional information about topological
416 * elements over and above their basic geometry definitions.
417 *
418 * It questionable to me (CY) whether the added complexity of these structures
419 * being separate entities is warranted, instead of just including these fields
420 * directly in the struct definitions. Presumably this was originally done to
421 * allow applications that didn't need to store these data to avoid the space
422 * overhead, but hardware constraints in 2022 are a bit different than in the
423 * 1980s... Unless there's another motivation for this separation I've not
424 * found yet, we should just fold these into their parent structs to simplify
425 * the data management logic.
426 *
427 * Unfortunately, there is a complication - the serialization logic in librt
428 * that writes NMGs out to disk has awareness of these data types. To remove
429 * these cleanly would also mean changing the on-disk storage format of the
430 * NMG primitives, or doing some VERY careful analysis to determine if we can
431 * change the in-memory containers while still making it possible to retain
432 * the existing on-disk serialization.
433 */
434
435/**
436 * @brief
437 * Vertexuse normal
438 */
440 uint32_t magic;
441 vect_t N; /**< @brief (opt) surface Normal at vertexuse */
442 long index; /**< @brief struct # in this model */
443};
444
445/**
446 * @brief
447 * Vertexuse NURBS parameters
448 */
450 uint32_t magic;
451 fastf_t param[3]; /**< @brief (u, v, w) of vu on eu's cnurb */
452 long index; /**< @brief struct # in this model */
453};
454
455/**
456 * @brief
457 * Loop bounding box
458 */
459struct loop_a {
460 uint32_t magic;
461 point_t min_pt; /**< @brief minimums of bounding box */
462 point_t max_pt; /**< @brief maximums of bounding box */
463 long index; /**< @brief struct # in this model */
464};
465
466/**
467 * @brief
468 * Shell bounding box
469 */
470struct shell_a {
471 uint32_t magic;
472 point_t min_pt; /**< @brief minimums of bounding box */
473 point_t max_pt; /**< @brief maximums of bounding box */
474 long index; /**< @brief struct # in this model */
475};
476
477/**
478 * @brief
479 * Region bounding box
480 */
482 uint32_t magic;
483 point_t min_pt; /**< @brief minimums of bounding box */
484 point_t max_pt; /**< @brief maximums of bounding box */
485 long index; /**< @brief struct # in this model */
486};
487/*****************************************************************************/
488
489
490
491__END_DECLS
492
493#endif /* NMG_TOPOLOGY_H */
494/** @} */
495/*
496 * Local Variables:
497 * mode: C
498 * tab-width: 8
499 * indent-tabs-mode: t
500 * c-file-style: "stroustrup"
501 * End:
502 * ex: shiftwidth=4 tabstop=8
503 */
Header file for the BRL-CAD common definitions.
fastf_t vect_t[ELEMENTS_PER_VECT]
3-tuple vector
Definition: vmath.h:345
double fastf_t
fastest 64-bit (or larger) floating point type
Definition: vmath.h:330
fastf_t plane_t[ELEMENTS_PER_PLANE]
Definition of a plane equation.
Definition: vmath.h:393
fastf_t point_t[ELEMENTS_PER_POINT]
3-tuple point
Definition: vmath.h:351
Definition: list.h:131
Edge NURBS curve geometry.
Definition: topology.h:376
fastf_t * ctl_points
array [c_size]
Definition: topology.h:384
long index
struct # in this model
Definition: topology.h:385
struct knot_vector k
curve knot vector
Definition: topology.h:380
int c_size
number of ctl points
Definition: topology.h:382
struct bu_list l
NOTICE: l.forw & l.back are NOT stored in database. For bspline primitive internal use only.
Definition: topology.h:377
int order
Curve Order.
Definition: topology.h:379
int pt_type
curve point type
Definition: topology.h:383
struct bu_list eu_hd2
heads l2 list of edgeuses on this curve
Definition: topology.h:378
Line in 3D space.
Definition: topology.h:326
point_t e_pt
parametric equation of the line
Definition: topology.h:329
vect_t e_dir
Definition: topology.h:330
long index
struct # in this model
Definition: topology.h:331
struct bu_list l
NOTICE: l.forw & l.back not stored in database. For alignment only.
Definition: topology.h:327
struct bu_list eu_hd2
heads l2 list of edgeuses on this line
Definition: topology.h:328
NMG topological edge.
Definition: topology.h:144
struct edgeuse * eu_p
Ptr to one use of this edge.
Definition: topology.h:146
uint32_t magic
Definition: topology.h:145
long index
struct # in this model
Definition: topology.h:148
long is_real
artifact or modeled edge (from tessellator)
Definition: topology.h:147
NMG topological edge usage.
Definition: topology.h:155
struct shell * s_p
Definition: topology.h:160
struct loopuse * lu_p
Definition: topology.h:159
struct vertexuse * vu_p
first vu of eu in this orient
Definition: topology.h:167
struct edgeuse * eumate_p
eu on other face or other end of wire
Definition: topology.h:163
int orientation
compared to geom (null if wire)
Definition: topology.h:166
long index
struct # in this model
Definition: topology.h:174
union edgeuse::@3 up
uint32_t * magic_p
for those times when we're not sure
Definition: topology.h:161
struct bu_list l2
member of edge_g's eu_hd2 list
Definition: topology.h:157
struct edge * e_p
edge definition and attributes
Definition: topology.h:165
struct bu_list l
cw/ccw edges in loop or wire edges in shell
Definition: topology.h:156
struct edgeuse * radial_p
eu on radially adj. fu (null if wire)
Definition: topology.h:164
union edgeuse::@4 g
geometry
struct edge_g_cnurb * cnurb_p
Definition: topology.h:171
struct edge_g_lseg * lseg_p
Definition: topology.h:170
Planar face geometry.
Definition: topology.h:341
uint32_t magic
Definition: topology.h:342
long index
struct # in this model
Definition: topology.h:345
struct bu_list f_hd
list of faces sharing this surface
Definition: topology.h:343
plane_t N
Plane equation (incl normal)
Definition: topology.h:344
Face NURBS surface geometry.
Definition: topology.h:392
fastf_t * ctl_points
array [size[0]*size[1]]
Definition: topology.h:404
point_t min_pt
min corner of bounding box
Definition: topology.h:407
long index
struct # in this model
Definition: topology.h:410
point_t max_pt
max corner of bounding box
Definition: topology.h:408
int dir
direction of last refinement
Definition: topology.h:406
struct bu_list f_hd
list of faces sharing this surface
Definition: topology.h:397
int s_size[2]
mesh size, u, v
Definition: topology.h:402
struct knot_vector u
surface knot vectors
Definition: topology.h:399
int order[2]
surface order [0] = u, [1] = v
Definition: topology.h:398
struct bu_list l
Definition: topology.h:396
int pt_type
surface point type
Definition: topology.h:403
struct knot_vector v
surface knot vectors
Definition: topology.h:400
NMG topological face.
Definition: topology.h:210
union face::@6 g
geometry
point_t min_pt
minimums of bounding box
Definition: topology.h:221
struct face_g_plane * plane_p
Definition: topology.h:215
long index
struct # in this model
Definition: topology.h:223
struct face_g_snurb * snurb_p
Definition: topology.h:216
point_t max_pt
maximums of bounding box
Definition: topology.h:222
int flip
!0 ==> flip normal of fg
Definition: topology.h:218
uint32_t * magic_p
Definition: topology.h:214
struct bu_list l
faces in face_g's f_hd list
Definition: topology.h:211
struct faceuse * fu_p
Ptr up to one use of this face.
Definition: topology.h:212
NMG topological face usage.
Definition: topology.h:230
struct face * f_p
face definition and attributes
Definition: topology.h:236
struct shell * s_p
owning shell
Definition: topology.h:232
struct faceuse * fumate_p
opposite side of face
Definition: topology.h:233
int orientation
rel to face geom defn
Definition: topology.h:234
long index
struct # in this model
Definition: topology.h:238
struct bu_list lu_hd
list of loops in face-use
Definition: topology.h:237
struct bu_list l
fu's, in shell's fu_hd list
Definition: topology.h:231
int outside
RESERVED for future: See Lee Butler.
Definition: topology.h:235
Definition of a knot vector.
Definition: topology.h:355
uint32_t magic
Definition: topology.h:356
fastf_t * knots
pointer to knot vector
Definition: topology.h:358
int k_size
knot vector size
Definition: topology.h:357
Loop bounding box.
Definition: topology.h:459
point_t min_pt
minimums of bounding box
Definition: topology.h:461
uint32_t magic
Definition: topology.h:460
long index
struct # in this model
Definition: topology.h:463
point_t max_pt
maximums of bounding box
Definition: topology.h:462
NMG topological loop.
Definition: topology.h:181
struct loopuse * lu_p
Ptr to one use of this loop.
Definition: topology.h:183
uint32_t magic
Definition: topology.h:182
long index
struct # in this model
Definition: topology.h:185
struct loop_a * la_p
Geometry.
Definition: topology.h:184
NMG topological loop usage.
Definition: topology.h:192
struct shell * s_p
Definition: topology.h:196
struct loop * l_p
loop definition and attributes
Definition: topology.h:201
int orientation
OT_SAME=outside loop.
Definition: topology.h:200
long index
struct # in this model
Definition: topology.h:203
uint32_t * magic_p
Definition: topology.h:197
struct loopuse * lumate_p
loopuse on other side of face
Definition: topology.h:199
union loopuse::@5 up
struct bu_list l
lu's, in fu's lu_hd, or shell's lu_hd
Definition: topology.h:193
struct bu_list down_hd
eu list or vu pointer
Definition: topology.h:202
struct faceuse * fu_p
owning face-use
Definition: topology.h:195
NMG topological model.
Definition: topology.h:289
uint32_t magic
Definition: topology.h:290
long index
struct # in this model
Definition: topology.h:293
char * manifolds
structure 1-3manifold table
Definition: topology.h:292
long maxindex
# of structs so far
Definition: topology.h:294
struct bu_list r_hd
list of regions
Definition: topology.h:291
Region bounding box.
Definition: topology.h:481
point_t min_pt
minimums of bounding box
Definition: topology.h:483
uint32_t magic
Definition: topology.h:482
long index
struct # in this model
Definition: topology.h:485
point_t max_pt
maximums of bounding box
Definition: topology.h:484
NMG topological region.
Definition: topology.h:277
struct bu_list s_hd
list of shells in region
Definition: topology.h:281
struct nmgregion_a * ra_p
attributes
Definition: topology.h:280
long index
struct # in this model
Definition: topology.h:282
struct bu_list l
regions, in model's r_hd list
Definition: topology.h:278
struct model * m_p
owning model
Definition: topology.h:279
Shell bounding box.
Definition: topology.h:470
point_t min_pt
minimums of bounding box
Definition: topology.h:472
uint32_t magic
Definition: topology.h:471
long index
struct # in this model
Definition: topology.h:474
point_t max_pt
maximums of bounding box
Definition: topology.h:473
NMG topological shell.
Definition: topology.h:261
struct bu_list fu_hd
list of face uses in shell
Definition: topology.h:266
struct vertexuse * vu_p
internal ptr to single vertexuse
Definition: topology.h:269
long index
struct # in this model
Definition: topology.h:270
struct nmgregion * r_p
owning region
Definition: topology.h:263
struct bu_list lu_hd
wire loopuses (edge groups)
Definition: topology.h:267
struct bu_list eu_hd
wire list (shell has wires)
Definition: topology.h:268
struct bu_list l
shells, in region's s_hd list
Definition: topology.h:262
struct shell_a * sa_p
attribs
Definition: topology.h:264
Point in 3D space.
Definition: topology.h:309
point_t coord
coordinates of vertex in space
Definition: topology.h:311
uint32_t magic
Definition: topology.h:310
long index
struct # in this model
Definition: topology.h:312
NMG topological vertex - the simplest element of the topology system.
Definition: topology.h:98
uint32_t magic
Definition: topology.h:99
long index
struct # in this model
Definition: topology.h:102
struct vertex_g * vg_p
geometry
Definition: topology.h:101
struct bu_list vu_hd
heads list of vu's of this vertex
Definition: topology.h:100
Vertexuse NURBS parameters.
Definition: topology.h:449
fastf_t param[3]
(u, v, w) of vu on eu's cnurb
Definition: topology.h:451
uint32_t magic
Definition: topology.h:450
long index
struct # in this model
Definition: topology.h:452
Vertexuse normal.
Definition: topology.h:439
uint32_t magic
Definition: topology.h:440
long index
struct # in this model
Definition: topology.h:442
vect_t N
(opt) surface Normal at vertexuse
Definition: topology.h:441
NMG topological vertex usage.
Definition: topology.h:109
union vertexuse::@2 a
Attributes.
struct shell * s_p
no fu's or eu's on shell
Definition: topology.h:112
struct edgeuse * eu_p
eu causing this vu
Definition: topology.h:114
struct vertex * v_p
vertex definition and attributes
Definition: topology.h:117
struct loopuse * lu_p
loopuse contains single vertex
Definition: topology.h:113
struct vertexuse_a_cnurb * cnurb_p
Definition: topology.h:121
long index
struct # in this model
Definition: topology.h:123
uint32_t * magic_p
for those times when we're not sure
Definition: topology.h:115
struct bu_list l
list of all vu's on a vertex
Definition: topology.h:110
union vertexuse::@1 up
struct vertexuse_a_plane * plane_p
Definition: topology.h:120
fundamental vector, matrix, quaternion math macros