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-2024 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  */
98 struct 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  */
109 struct 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  */
144 struct 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  */
155 struct 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  */
181 struct 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  */
192 struct 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  */
210 struct 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  */
230 struct 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  */
261 struct 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  */
277 struct 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  */
289 struct 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  */
309 struct 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  */
326 struct edge_g_lseg {
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  */
341 struct face_g_plane {
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  */
355 struct knot_vector {
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  */
376 struct edge_g_cnurb {
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  */
392 struct face_g_snurb {
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  */
459 struct 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  */
470 struct 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  */
481 struct nmgregion_a {
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:349
double fastf_t
fastest 64-bit (or larger) floating point type
Definition: vmath.h:334
fastf_t plane_t[ELEMENTS_PER_PLANE]
Definition of a plane equation.
Definition: vmath.h:397
fastf_t point_t[ELEMENTS_PER_POINT]
3-tuple point
Definition: vmath.h:355
Definition: list.h:132
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