HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GA_GBMacros.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: GA_GBMacros.h ( GA Library, C++)
7  *
8  * COMMENTS: Macros which emulate the old GB macros
9  */
10 
11 #pragma once
12 
13 #ifndef __GA_GBMacros__
14 #define __GA_GBMacros__
15 
16 /// @file GA_GBMacros.h
17 /// @brief Create macros which emulate the macros in the obsolete GB library
18 
19 /// TODO: The GA_ prefix is necessary while GA needs to coexist with GB. Once
20 /// GB has been entirely replaced, we'll remove the GA_ prefix for source
21 /// compatibility.
22 
23 
24 #include "GA_AttributeDict.h"
25 #include "GA_BreakpointGroup.h"
26 #include "GA_Detail.h"
27 #include "GA_GroupTable.h"
28 #include "GA_ElementGroupTable.h"
29 #include "GA_Iterator.h"
30 #include "GA_GBIterators.h"
31 #include "GA_EdgeGroup.h"
32 #include "GA_Types.h"
33 
34 /// @def GA_FOR_ALL_PRIMITIVES(gdp, prim)
35 /// Iterates over primitives, assigning prim to the current primitive
36 #define GA_FOR_ALL_PRIMITIVES(gdp, prim) \
37  for (GA_Iterator it((gdp)->getPrimitiveRange()); (!it.atEnd() || (prim = nullptr)) && \
38  ((prim) = GA_Detail::GB_MACRO_CAST((gdp), (gdp)->getPrimitive(*it))); ++it)
39 
40 /// @def GA_FOR_SAFE_PRIMITIVES(gdp, prim, next)
41 /// Iterates over primitives, but primitives may be deleted during the
42 /// iteration.
43 #define GA_FOR_SAFE_PRIMITIVES(gdp, prim, next) \
44  for (GA_GBPrimitiveIterator it(*(gdp), GA_Range::safedeletions()); \
45  (prim=GA_Detail::GB_MACRO_CAST(gdp, it.getPrimitive())) && \
46  ((next=GA_Detail::GB_MACRO_CAST(gdp, it.getNextPrimitive())) \
47  || true); \
48  ++it)
49 
50 /// @def GA_FOR_MASK_PRIMITIVES(gdp, prim, mask)
51 /// Iterates over primitives, filtering only primitives which match the type
52 /// mask specified. mask can be either GA_PrimCompat::TypeMask or a family
53 /// mask.
54 /// @see GA_Primitive::getTypeId(), GA_Primitive::getFamilyMask(),
55 /// GA_Primitive::getPrimitiveId()
56 #define GA_FOR_MASK_PRIMITIVES(gdp, prim, mask) \
57  for (GA_GBPrimitiveIterator it(*(gdp), mask); \
58  (prim=GA_Detail::GB_MACRO_CAST(gdp, it.getPrimitive())); \
59  ++it)
60 
61 /// @def GA_FOR_ALL_GROUP_PRIMITIVES(gdp, grp, prim)
62 /// Iterate over all primitives in group. @see GA_RTIElementGroup
63 #define GA_FOR_ALL_GROUP_PRIMITIVES(gdp, grp, prim) \
64  for (GA_Iterator it((gdp)->getPrimitiveRange(grp)); (!it.atEnd() || (prim = nullptr)) && \
65  ((prim)=GA_Detail::GB_MACRO_CAST((gdp), (gdp)->getPrimitive(*it))); \
66  ++it)
67 
68 /// @def GA_FOR_SAFE_GROUP_PRIMITIVES(gdp, grp, prim, next)
69 /// Iterates over primitives in group, but primitives may be deleted during the
70 /// iteration. @see GA_RTIElementGroup
71 #define GA_FOR_SAFE_GROUP_PRIMITIVES(gdp, grp, prim, next) \
72  for (GA_GBPrimitiveIterator it(*(gdp),grp,GA_Range::safedeletions()); \
73  (prim=GA_Detail::GB_MACRO_CAST(gdp, it.getPrimitive())) && \
74  ((next=GA_Detail::GB_MACRO_CAST(gdp, it.getNextPrimitive())) \
75  || true); \
76  ++it)
77 
78 /// @def GA_FOR_ALL_OPT_GROUP_PRIMITIVES(gdp, grp, prim)
79 /// Iterate over all primitives in group, but the group can be NULL.
80 /// @see GA_RTIElementGroup
81 #define GA_FOR_ALL_OPT_GROUP_PRIMITIVES(gdp,grp,prim) \
82  GA_FOR_ALL_GROUP_PRIMITIVES(gdp,grp,prim)
83 
84 
85 /// @def GA_FOR_ALL_PTOFF(gdp, ptoff)
86 /// Iterate over all points via offsets.
87 /// WARNING: Because this uses nested loops, "break;" won't work!
88 #define GA_FOR_ALL_PTOFF(gdp, ptoff) \
89  GA_Offset lcl_start, lcl_end; \
90  for (GA_Iterator lcl_it((gdp)->getPointRange()); lcl_it.blockAdvance(lcl_start, lcl_end); ) \
91  for (ptoff = lcl_start; ptoff < lcl_end; ++ptoff)
92 
93 /// @def GA_FOR_ALL_GROUP_PTOFF(gdp, grp, ptoff)
94 /// Iterate over all points in a group via point offsets.
95 /// WARNING: Because this uses nested loops, "break;" won't work!
96 #define GA_FOR_ALL_GROUP_PTOFF(gdp, grp, ptoff) \
97  GA_Offset lcl_start, lcl_end; \
98  for (GA_Iterator lcl_it((gdp)->getPointRange(grp)); lcl_it.blockAdvance(lcl_start, lcl_end); ) \
99  for (ptoff = lcl_start; ptoff < lcl_end; ++ptoff)
100 
101 /// @def GA_FOR_ALL_VTXOFF(gdp, ptoff)
102 /// Iterate over all vertices via offsets.
103 /// WARNING: Because this uses nested loops, "break;" won't work!
104 #define GA_FOR_ALL_VTXOFF(gdp, ptoff) \
105  GA_Offset lcl_start, lcl_end; \
106  for (GA_Iterator lcl_it((gdp)->getVertexRange()); lcl_it.blockAdvance(lcl_start, lcl_end); ) \
107  for (ptoff = lcl_start; ptoff < lcl_end; ++ptoff)
108 
109 /// @def GA_FOR_ALL_GROUP_VTXOFF(gdp, grp, ptoff)
110 /// Iterate over all points in a group via point offsets.
111 /// WARNING: Because this uses nested loops, "break;" won't work!
112 #define GA_FOR_ALL_GROUP_VTXOFF(gdp, grp, ptoff) \
113  GA_Offset lcl_start, lcl_end; \
114  for (GA_Iterator lcl_it((gdp)->getVertexRange(grp)); lcl_it.blockAdvance(lcl_start, lcl_end); ) \
115  for (ptoff = lcl_start; ptoff < lcl_end; ++ptoff)
116 
117 /// @def GA_FOR_ALL_PRIMOFF(gdp, ptoff)
118 /// Iterate over all points via offsets.
119 /// WARNING: Because this uses nested loops, "break;" won't work!
120 #define GA_FOR_ALL_PRIMOFF(gdp, ptoff) \
121  GA_Offset lcl_start, lcl_end; \
122  for (GA_Iterator lcl_it((gdp)->getPrimitiveRange()); lcl_it.blockAdvance(lcl_start, lcl_end); ) \
123  for (ptoff = lcl_start; ptoff < lcl_end; ++ptoff)
124 
125 /// @def GA_FOR_ALL_GROUP_PRIMOFF(gdp, grp, ptoff)
126 /// Iterate over all points in a group via point offsets.
127 /// WARNING: Because this uses nested loops, "break;" won't work!
128 #define GA_FOR_ALL_GROUP_PRIMOFF(gdp, grp, ptoff) \
129  GA_Offset lcl_start, lcl_end; \
130  for (GA_Iterator lcl_it((gdp)->getPrimitiveRange(grp)); lcl_it.blockAdvance(lcl_start, lcl_end); ) \
131  for (ptoff = lcl_start; ptoff < lcl_end; ++ptoff)
132 
133 /// @def GA_FOR_PAIRS_OF_PRIMITIVES(gdp1, prim1, gdp2, prim2)
134 /// Iterate over primitives in both GA_Details in a pairwise fashion.
135 #define GA_FOR_PAIRS_OF_PRIMITIVES(gdp1, prim1, gdp2, prim2) \
136  for (GA_GBPrimitiveIterator it(*(gdp1), NULL, *(gdp2), NULL); \
137  (prim1=GA_Detail::GB_MACRO_CAST(gdp1, it.getPrimitive())) && \
138  (prim2=GA_Detail::GB_MACRO_CAST(gdp2, it.getPrimitive2())); \
139  ++it)
140 
141 /// @def GA_FOR_PAIRS_OF_GROUP_PRIMITIVES(gdp1, group1, prim1, gdp2, group2, prim2)
142 /// Iterate over points in the specified groups across both GA_Details in a
143 /// pairwise fashion.
144 #define GA_FOR_PAIRS_OF_GROUP_PRIMITIVES(gdp1, grp1, prim1, gdp2, grp2, prim2) \
145  for (GA_GBPrimitiveIterator it(*(gdp1), grp1, *(gdp2), grp2); \
146  (prim1=GA_Detail::GB_MACRO_CAST(gdp1, it.getPrimitive())) && \
147  (prim2=GA_Detail::GB_MACRO_CAST(gdp2, it.getPrimitive2())); \
148  ++it)
149 
150 /// @def GA_FOR_ALL_GROUP_EDGES(group, edge)
151 /// Iterate over edges in the specified group.
152 #define GA_FOR_ALL_GROUP_EDGES(group, edge) \
153  for (auto it=(group)->begin(); \
154  !it.atEnd() && (edge = &it.getEdge()); \
155  ++it)
156 
157 /// @def GA_FOR_ALL_GROUP_EDGES_INCL_PRIMS(group, edge, primoff)
158 /// Iterate over edges in the specified group.
159 #define GA_FOR_ALL_GROUP_EDGES_INCL_PRIMS(group, edge, primoff) \
160  for (auto it=(group)->begin(); \
161  !it.atEnd() && (edge = &it.getEdge()) && \
162  (GAisValid(primoff = it.getPrimitive()) || true); \
163  ++it)
164 
165 /// @def GA_FOR_SAFE_GROUP_EDGES(group, edge)
166 /// Iterate over edges in the specified group. Edges may be deleted during
167 /// traversal.
168 #define GA_FOR_SAFE_GROUP_EDGES(group, edge) \
169  GA_FOR_ALL_GROUP_EDGES(group, edge)
170 
171 /// @def GA_FOR_SAFE_GROUP_EDGES_INCL_PRIMS(group, edge)
172 /// Iterate over edges in the specified group. Edges may be deleted during
173 /// traversal.
174 #define GA_FOR_SAFE_GROUP_EDGES_INCL_PRIMS(group, edge, prim) \
175  GA_FOR_ALL_GROUP_EDGES_INCL_PRIMS(group, edge, prim)
176 
177 /// @def GA_FOR_ALL_GROUP_BREAKPOINTS(group, bkp)
178 /// Iterate over breakpoints in the specified group.
179 #define GA_FOR_ALL_GROUP_BREAKPOINTS(group, bkp) \
180  for (GA_BreakpointGroup::iterator it=(group)->begin(); \
181  !it.atEnd() && (bkp = &it.getBreakpoint()); \
182  it.advance())
183 
184 /// @def GA_FOR_ALL_POINTGROUPS(gdp, group)
185 /// Iterate over all point GA_ElementGroups in an arbitrary order
186 /// @warning It is NOT safe to add or remove point groups during this loop.
187 #define GA_FOR_ALL_POINTGROUPS(gdp, grp) \
188  for (GA_GroupTable::iterator<GA_PointGroup> \
189  __iter = (gdp)->pointGroups().beginTraverse(); \
190  !__iter.atEnd() && \
191  ((grp) = __iter.group()); \
192  ++__iter)
193 
194 /// @def GA_FOR_ALL_POINTGROUPS_SORTED(gdp, group)
195 /// Iterate over all point GA_ElementGroups in alphabetical order
196 /// @warning It is NOT safe to add or remove point groups during this loop.
197 #define GA_FOR_ALL_POINTGROUPS_SORTED(gdp, grp) \
198  for (GA_PointGroupTable::ordered_iterator \
199  __iter = (gdp)->pointGroups().obegin(); \
200  !__iter.atEnd() && \
201  ((grp) = *__iter); \
202  ++__iter)
203 
204 /// @def GA_FOR_ALL_PRIMGROUPS(gdp, group)
205 /// Iterate over all primitive GA_ElementGroups in an arbitrary order
206 /// @warning It is NOT safe to add or remove point groups during this loop.
207 #define GA_FOR_ALL_PRIMGROUPS(gdp, grp) \
208  for (GA_GroupTable::iterator<GA_PrimitiveGroup> \
209  __iter = (gdp)->primitiveGroups().beginTraverse(); \
210  !__iter.atEnd() && \
211  ((grp) = __iter.group()); \
212  ++__iter)
213 
214 /// @def GA_FOR_ALL_PRIMGROUPS_SORTED(gdp, group)
215 /// Iterate over all primitive GA_ElementGroups in alphabetical order
216 /// @warning It is NOT safe to add or remove point groups during this loop.
217 #define GA_FOR_ALL_PRIMGROUPS_SORTED(gdp, grp) \
218  for (GA_PrimitiveGroupTable::ordered_iterator \
219  __iter = (gdp)->primitiveGroups().obegin(); \
220  !__iter.atEnd() && \
221  ((grp) = *__iter); \
222  ++__iter)
223 
224 /// @def GA_FOR_ALL_VERTEXGROUPS(gdp, group)
225 /// Iterate over all vertex GA_ElementGroups in an arbitrary order
226 /// @warning It is NOT safe to add or remove point groups during this loop.
227 #define GA_FOR_ALL_VERTEXGROUPS(gdp, grp) \
228  for (GA_GroupTable::iterator<GA_VertexGroup> \
229  __iter = (gdp)->vertexGroups().beginTraverse(); \
230  !__iter.atEnd() && \
231  ((grp) = __iter.group()); \
232  ++__iter)
233 
234 /// @def GA_FOR_ALL_VERTEXGROUPS_SORTED(gdp, group)
235 /// Iterate over all vertex GA_ElementGroups in alphabetical order
236 /// @warning It is NOT safe to add or remove point groups during this loop.
237 #define GA_FOR_ALL_VERTEXGROUPS_SORTED(gdp, grp) \
238  for (GA_VertexGroupTable::ordered_iterator \
239  __iter = (gdp)->vertexGroups().obegin(); \
240  !__iter.atEnd() && \
241  ((grp) = *__iter); \
242  ++__iter)
243 
244 /// @def GA_FOR_ALL_EDGEGROUPS(gdp, group)
245 /// Iterate over all GA_EdgeGroups in an arbitrary order
246 /// @warning It is NOT safe to add or remove edge groups during this loop.
247 #define GA_FOR_ALL_EDGEGROUPS(gdp, grp) \
248  for (GA_GroupTable::iterator<GA_EdgeGroup> \
249  __iter = (gdp)->edgeGroups().beginTraverse(); \
250  !__iter.atEnd() && \
251  ((grp) = __iter.group()); \
252  ++__iter)
253 
254 /// @def GA_FOR_ALL_EDGEGROUPS_SORTED(gdp, group)
255 /// Iterate over all GA_EdgeGroups in alphabetical order
256 /// @warning It is NOT safe to add or remove edge groups during this loop.
257 #define GA_FOR_ALL_EDGEGROUPS_SORTED(gdp, grp) \
258  for (GA_EdgeGroupTable::ordered_iterator \
259  __iter = (gdp)->edgeGroups().obegin(); \
260  !__iter.atEnd() && \
261  ((grp) = *__iter); \
262  ++__iter)
263 
264 /// @def GA_FOR_ALL_ATTRIBUTES(dict, attribute)
265 /// Iterate over all attributes in a GA_AttributeDict
266 #define GA_FOR_ALL_ATTRIBUTES(dict, A) \
267  for (GA_AttributeDict::iterator it=dict.begin(); \
268  !it.atEnd() && (A = it.attrib()); ++it)
269 
270 /// @def GA_FOR_ALL_DETAIL_ATTRIBUTES(gdp, attribute)
271 /// Iterate over all global/detail attributes in the geometry
272 #define GA_FOR_ALL_DETAIL_ATTRIBUTES(gdp, A) \
273  GA_FOR_ALL_ATTRIBUTES((gdp)->getAttributeDict(GA_ATTRIB_GLOBAL), A)
274 
275 /// @def GA_FOR_ALL_PRIMITIVE_ATTRIBUTES(gdp, attribute)
276 /// Iterate over all primitive attributes in the geometry
277 #define GA_FOR_ALL_PRIMITIVE_ATTRIBUTES(gdp, A) \
278  GA_FOR_ALL_ATTRIBUTES((gdp)->getAttributeDict(GA_ATTRIB_PRIMITIVE), A)
279 
280 /// @def GA_FOR_ALL_POINT_ATTRIBUTES(gdp, attribute)
281 /// Iterate over all point attributes in the geometry
282 #define GA_FOR_ALL_POINT_ATTRIBUTES(gdp, A) \
283  GA_FOR_ALL_ATTRIBUTES((gdp)->getAttributeDict(GA_ATTRIB_POINT), A)
284 
285 /// @def GA_FOR_ALL_VERTEX_ATTRIBUTES(gdp, attribute)
286 /// Iterate over all vertex attributes in the geometry
287 #define GA_FOR_ALL_VERTEX_ATTRIBUTES(gdp, A) \
288  GA_FOR_ALL_ATTRIBUTES((gdp)->getAttributeDict(GA_ATTRIB_VERTEX), A)
289 
290 #define GA_FOR_ALL_GROUPS(grptable, grp) \
291  for (GA_GroupTable::iterator<GA_ElementGroup> lcl_it = (grptable).beginTraverse(); !lcl_it.atEnd() && ((grp) = lcl_it.group()); ++lcl_it)
292 
293 #define GA_FOR_ALL_GROUPS_SORTED(grptable, grp) \
294  for (GA_ElementGroupTable::ordered_iterator lcl_it = (grptable).obegin(); !lcl_it.atEnd() && ((grp) = *lcl_it); ++lcl_it)
295 
296 #endif
Contains iterators to help backward compatibility with GB library. The constructors will initialize t...