OpenSubdiv
Toggle main menu visibility
Loading...
Searching...
No Matches
componentInterfaces.h
Go to the documentation of this file.
1
//
2
// Copyright 2014 DreamWorks Animation LLC.
3
//
4
// Licensed under the terms set forth in the LICENSE.txt file available at
5
// https://opensubdiv.org/license.
6
//
7
#ifndef OPENSUBDIV3_VTR_COMPONENT_INTERFACES_H
8
#define OPENSUBDIV3_VTR_COMPONENT_INTERFACES_H
9
10
#include "../version.h"
11
12
#include "
../sdc/types.h
"
13
#include "
../sdc/crease.h
"
14
#include "
../vtr/types.h
"
15
#include "
../vtr/stackBuffer.h
"
16
17
#include <vector>
18
19
20
namespace
OpenSubdiv
{
21
namespace
OPENSUBDIV_VERSION
{
22
23
namespace
Vtr
{
24
namespace
internal {
25
26
//
27
// Simple classes supporting the interfaces required of generic topological
28
// types in the Scheme mask queries, e.g. <typename FACE, VERTEX, etc.>
29
//
30
// These are not used with Vtr but arguably belong with it as the details to
31
// write these efficiently depends very much on intimate details of Vtr's
32
// implementation, e.g. the use of tag bits, subdivision Rules, etc.
33
//
34
35
36
//
37
// For <typename FACE>, which provides information in the neighborhood of a face:
38
//
39
class
FaceInterface {
40
public
:
41
FaceInterface() { }
42
FaceInterface(
int
vertCount) : _vertCount(vertCount) { }
43
~FaceInterface() { }
44
45
public
:
// Generic interface expected of <typename FACE>:
46
int
GetNumVertices()
const
{
return
_vertCount; }
47
48
private
:
49
int
_vertCount;
50
};
51
52
53
//
54
// For <typename EDGE>, which provides information in the neighborhood of an edge:
55
//
56
class
EdgeInterface {
57
public
:
58
EdgeInterface() { }
59
EdgeInterface(Level
const
& level) : _level(&level) { }
60
~EdgeInterface() { }
61
62
void
SetIndex(
int
edgeIndex) { _eIndex = edgeIndex; }
63
64
public
:
// Generic interface expected of <typename EDGE>:
65
int
GetNumFaces()
const
{
return
_level->getEdgeFaces(_eIndex).size(); }
66
float
GetSharpness()
const
{
return
_level->getEdgeSharpness(_eIndex); }
67
68
void
GetChildSharpnesses(Sdc::Crease
const
&,
float
s[2])
const
{
69
// Need to use the Refinement here to identify the two child edges:
70
s[0] = s[1] = GetSharpness() - 1.0f;
71
}
72
73
void
GetNumVerticesPerFace(
int
vertsPerFace[])
const
{
74
ConstIndexArray
eFaces = _level->getEdgeFaces(_eIndex);
75
for
(
int
i = 0; i < eFaces.size(); ++i) {
76
vertsPerFace[i] = _level->getFaceVertices(eFaces[i]).size();
77
}
78
}
79
80
private
:
81
const
Level* _level;
82
83
int
_eIndex;
84
};
85
86
87
//
88
// For <typename VERTEX>, which provides information in the neighborhood of a vertex:
89
//
90
class
VertexInterface {
91
public
:
92
VertexInterface() { }
93
VertexInterface(Level
const
& parent, Level
const
& child) : _parent(&parent), _child(&child) { }
94
~VertexInterface() { }
95
96
void
SetIndex(
int
parentIndex,
int
childIndex) {
97
_pIndex = parentIndex;
98
_cIndex = childIndex;
99
_eCount = _parent->getVertexEdges(_pIndex).size();
100
_fCount = _parent->getVertexFaces(_pIndex).size();
101
}
102
103
public
:
// Generic interface expected of <typename VERT>:
104
int
GetNumEdges()
const
{
return
_eCount; }
105
int
GetNumFaces()
const
{
return
_fCount; }
106
107
float
GetSharpness()
const
{
return
_parent->getVertexSharpness(_pIndex); }
108
float
* GetSharpnessPerEdge(
float
pSharpness[])
const
{
109
ConstIndexArray
pEdges = _parent->getVertexEdges(_pIndex);
110
for
(
int
i = 0; i < _eCount; ++i) {
111
pSharpness[i] = _parent->getEdgeSharpness(pEdges[i]);
112
}
113
return
pSharpness;
114
}
115
116
float
GetChildSharpness(Sdc::Crease
const
&)
const
{
return
_child->getVertexSharpness(_cIndex); }
117
float
* GetChildSharpnessPerEdge(Sdc::Crease
const
& crease,
float
cSharpness[])
const
{
118
internal::StackBuffer<float,16> pSharpness(_eCount);
119
GetSharpnessPerEdge(pSharpness);
120
crease.SubdivideEdgeSharpnessesAroundVertex(_eCount, pSharpness, cSharpness);
121
return
cSharpness;
122
}
123
124
private
:
125
const
Level* _parent;
126
const
Level* _child;
127
128
int
_pIndex;
129
int
_cIndex;
130
int
_eCount;
131
int
_fCount;
132
};
133
134
}
// end namespace internal
135
}
// end namespace Vtr
136
137
}
// end namespace OPENSUBDIV_VERSION
138
using namespace
OPENSUBDIV_VERSION
;
139
}
// end namespace OpenSubdiv
140
141
#endif
/* OPENSUBDIV3_VTR_COMPONENT_INTERFACES_H */
stackBuffer.h
crease.h
OpenSubdiv
Definition
limits.h:15
OpenSubdiv::OPENSUBDIV_VERSION
Definition
limits.h:16
OpenSubdiv::OPENSUBDIV_VERSION::Vtr
Definition
topologyRefiner.h:23
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstIndexArray
ConstArray< Index > ConstIndexArray
Definition
types.h:63
types.h
types.h
opensubdiv
vtr
componentInterfaces.h
Generated on
for OpenSubdiv by
1.18.0