Coverage Report

Created: 2025-11-24 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/alembic/lib/Alembic/AbcGeom/GeometryScope.h
Line
Count
Source
1
//-*****************************************************************************
2
//
3
// Copyright (c) 2009-2012,
4
//  Sony Pictures Imageworks, Inc. and
5
//  Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd.
6
//
7
// All rights reserved.
8
//
9
// Redistribution and use in source and binary forms, with or without
10
// modification, are permitted provided that the following conditions are
11
// met:
12
// *       Redistributions of source code must retain the above copyright
13
// notice, this list of conditions and the following disclaimer.
14
// *       Redistributions in binary form must reproduce the above
15
// copyright notice, this list of conditions and the following disclaimer
16
// in the documentation and/or other materials provided with the
17
// distribution.
18
// *       Neither the name of Sony Pictures Imageworks, nor
19
// Industrial Light & Magic nor the names of their contributors may be used
20
// to endorse or promote products derived from this software without specific
21
// prior written permission.
22
//
23
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
//
35
//-*****************************************************************************
36
37
#ifndef Alembic_AbcGeom_GeometryScope_h
38
#define Alembic_AbcGeom_GeometryScope_h
39
40
#include <Alembic/Util/Export.h>
41
#include <Alembic/AbcGeom/Foundation.h>
42
43
namespace Alembic {
44
namespace AbcGeom {
45
namespace ALEMBIC_VERSION_NS {
46
47
//-*****************************************************************************
48
//! "GeometryScope" is the name we use for what is called Primitive Variable
49
//! Class in the Renderman Interface. "Primitive Variable Class" is a bit
50
//! non-descriptive in a geometry caching context, so we use the somewhat
51
//! more meaningful (but still admittedly vague) "GeometryScope".
52
//! Below is a table reproduced from PRMan Application Note #22
53
//! describing what each of these labels means for different types
54
//! of geometry.
55
//-*****************************************************************************
56
57
//-*****************************************************************************
58
//! From Prman Application Note #22 (and Prman Application Note #19)
59
//! For every geometric prim, there is 1 value for "constant" geometry scope.
60
//! To save space in my little table here, I'll leave out the "constant" column
61
//! but just imagine it with a big happy column of '1's.
62
//!
63
//!-----------------------------------------------------------------------------
64
//! QUADRIC & POLYGON SURFACE PRIMITIVES                                       |
65
//! Surface Primitive     | Uniform | Varying | Vertex  | Facevarying          |
66
//!-----------------------|---------|---------|---------|----------------------|
67
//! Quadrics              | 1       | 4       | 4       | 4                    |
68
//! Polygon               | 1       | nverts  | nverts  | nverts               |
69
//! GeneralPolygon        | 1       | nverts  | nverts  | nverts               |
70
//! PointsPolygons        | npolys  | nverts  | nverts  | sum(nvertices_i)     |
71
//! PointsGeneralPolygons | npolys  | nverts  | nverts  | sum(nvertices_i)     |
72
//! Points                | 1       | npoints | npoints | npoints              |
73
//! SubdivisionMesh       | nfaces  | nverts  | nverts  | sum(nvertices_i)     |
74
//!-----------------------------------------------------------------------------
75
//!
76
//!-----------------------------------------------------------------------------
77
//! PARAMETRIC SURFACE PRIMITIVES                                              |
78
//! Surface Primitive  | Uniform         | Varying and      | Vertex           |
79
//!                    |                 |  Facevarying     |                  |
80
//!--------------------|-----------------|------------------|------------------|
81
//! Patch bilinear     | 1               | 4                | 4                |
82
//! Patch bicubic      | 1               | 4                | 16               |
83
//! PatchMesh bilinear | (nu-unowrap)*   | nu*nv            | nu*nv            |
84
//!                    |   (nv-vnowrap)  |                  |                  |
85
//! PatchMesh bicubic  | usegs * vsegs   | (usegs+unowrap)* | nu*nv            |
86
//!                    |                 |  (vsegs+vnowrap) |                  |
87
//! NuPatch            | (nu-uorder+1)*  | (nu-uorder+2)*   | nu*nv            |
88
//!                    |   (nv-vorder+1) |  (nv-vorder+2)   |                  |
89
//! Curves linear      | ncurves         | sum(nvertices_i) | sum(nvertices_i) |
90
//! Curves cubic       | ncurves         | sum(nsegs_i      | sum(nvertices_i) |
91
//!                    |                 |     +nowrap)     |                  |
92
//! Blobby             |  1              | nleaf            | nleaf            |
93
//!-----------------------------------------------------------------------------
94
95
//-*****************************************************************************
96
enum GeometryScope
97
{
98
    kConstantScope = 0,
99
    kUniformScope = 1,
100
    kVaryingScope = 2,
101
    kVertexScope = 3,
102
    kFacevaryingScope = 4,
103
104
    kUnknownScope = 127
105
};
106
107
//-*****************************************************************************
108
//! These functions will set or get the GeometryScope out of
109
//! an object, by looking at its metadata.
110
//-*****************************************************************************
111
112
//-*****************************************************************************
113
inline void SetGeometryScope( AbcA::MetaData &ioMetaData, GeometryScope iScope )
114
0
{
115
0
    switch ( iScope )
116
0
    {
117
0
    case kConstantScope: ioMetaData.set( "geoScope", "con" ); return;
118
0
    case kUniformScope: ioMetaData.set( "geoScope", "uni" ); return;
119
0
    case kVaryingScope: ioMetaData.set( "geoScope", "var" ); return;
120
0
    case kVertexScope: ioMetaData.set( "geoScope", "vtx" ); return;
121
0
    case kFacevaryingScope: ioMetaData.set( "geoScope", "fvr" ); return;
122
0
    case kUnknownScope: return;
123
0
    default: return;
124
0
    }
125
0
}
126
127
//-*****************************************************************************
128
inline GeometryScope GetGeometryScope( const AbcA::MetaData &iMetaData )
129
0
{
130
0
    const std::string val = iMetaData.get( "geoScope" );
131
0
    if ( val == "con" || val == "" ) { return kConstantScope; }
132
0
    else if ( val == "uni" ) { return kUniformScope; }
133
0
    else if ( val == "var" ) { return kVaryingScope; }
134
0
    else if ( val == "vtx" ) { return kVertexScope; }
135
0
    else if ( val == "fvr" ) { return kFacevaryingScope; }
136
0
    else { return kUnknownScope; }
137
0
}
138
139
//-*****************************************************************************
140
//! These functions below are just implementations of the statements
141
//! in the table above.
142
//-*****************************************************************************
143
144
//! Works for any quadric.
145
//! ....
146
ALEMBIC_EXPORT size_t 
147
GeometryScopeNumValuesQuadrics( GeometryScope iScope );
148
149
//! Works for GeneralPolygon & Polygon
150
//! ...
151
ALEMBIC_EXPORT size_t 
152
GeometryScopeNumValuesPolygon( GeometryScope iScope, size_t iNumVerts );
153
154
//! Works for PointsPolygons & PointsGeneralPolygons
155
//! ...
156
ALEMBIC_EXPORT size_t 
157
GeometryScopeNumValuesPointsPolygons( GeometryScope iScope,
158
                                      size_t iNumPolys,
159
                                      size_t iNumVerts,
160
                                      size_t iSumOfCounts );
161
162
//! Works for Points
163
//! ...
164
ALEMBIC_EXPORT size_t 
165
GeometryScopeNumValuesPoints( GeometryScope iScope,
166
                              size_t iNumPoints );
167
168
//! Works for Subds, but not hierarchical.
169
//! ...
170
ALEMBIC_EXPORT size_t 
171
GeometryScopeNumValuesSubdivisionMesh( GeometryScope iScope,
172
                                       size_t iNumFaces,
173
                                       size_t iNumVerts,
174
                                       size_t iSumOfCounts );
175
176
//! Works for Bilinear Patch
177
//! ...
178
ALEMBIC_EXPORT size_t 
179
GeometryScopeNumValuesBilinearPatch( GeometryScope iScope );
180
181
//! Works for Bicubic Patch
182
//! ...
183
ALEMBIC_EXPORT size_t 
184
GeometryScopeNumValuesBicubicPatch( GeometryScope iScope );
185
186
//! Works for BilinearPatchMesh
187
//! ...
188
ALEMBIC_EXPORT size_t 
189
GeometryScopeNumValuesBilinearPatchMesh( GeometryScope iScope,
190
                                         size_t iNu, bool iUNoWrap,
191
                                         size_t iNv, bool iVNoWrap );
192
193
//! Works for BicubicPatchMesh
194
//! Usegs = Nu-3.
195
//! Vsegs = Nv-3.
196
ALEMBIC_EXPORT size_t 
197
GeometryScopeNumValuesBicubicPatchMesh( GeometryScope iScope,
198
                                        size_t iNu, bool iUNoWrap,
199
                                        size_t iNv, bool iVNoWrap );
200
201
//! Works for Nurbs patch
202
//! ...
203
ALEMBIC_EXPORT size_t 
204
GeometryScopeNumValuesNuPatch( GeometryScope iScope,
205
                               size_t iNu, size_t iUorder,
206
                               size_t iNv, size_t iVorder );
207
208
//! Works for Linear Curves
209
//! ...
210
ALEMBIC_EXPORT size_t 
211
GeometryScopeNumValuesLinearCurves( GeometryScope iScope,
212
                                    size_t iNumCurves, bool iNoWrap,
213
                                    size_t iSumOfCounts );
214
//! Works for Bicubic Curves
215
//! ...
216
ALEMBIC_EXPORT size_t 
217
GeometryScopeNumValuesCubicCurves( GeometryScope iScope,
218
                                   size_t iNumCurves, bool iNoWrap,
219
                                   size_t iSumOfCounts );
220
221
//-*****************************************************************************
222
//! These functions below are convenience functions for identifying UVs.
223
//! ...
224
//-*****************************************************************************
225
226
ALEMBIC_EXPORT void SetIsUV( AbcA::MetaData &ioMetaData, bool isUV );
227
228
ALEMBIC_EXPORT bool isUV( const AbcA::PropertyHeader & iHeader );
229
230
} // End namespace ALEMBIC_VERSION_NS
231
232
using namespace ALEMBIC_VERSION_NS;
233
234
} // End namespace AbcGeom
235
} // End namespace Alembic
236
237
238
239
#endif