Blender V5.0
opensubdiv_converter_capi.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2015 Blender Foundation
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
8
10
19
21
23 const OpenSubdiv_Converter *converter);
25 const OpenSubdiv_Converter *converter);
26
27 // Denotes whether this converter specifies full topology, which includes
28 // vertices, edges, faces, vertices+edges of a face and edges/faces of a
29 // vertex.
30 // Otherwise this converter will only provide number of vertices and faces,
31 // and vertices of faces. The rest of topology will be created by OpenSubdiv.
32 //
33 // NOTE: Even if converter does not provide full topology, it still needs
34 // to provide number of edges and vertices-of-edge. Those are used to assign
35 // topology tags.
37
39 // Global geometry counters.
40
41 // Number of faces/edges/vertices in the base mesh.
42 int (*getNumEdges)(const OpenSubdiv_Converter *converter);
43 int (*getNumVertices)(const OpenSubdiv_Converter *converter);
44
46 // Face relationships.
47
48 // Array of vertex indices the face consists of.
49 void (*getFaceVertices)(const OpenSubdiv_Converter *converter,
50 const int face_index,
51 int *face_vertices);
52 // Array of edge indices the face consists of.
53 // Aligned with the vertex indices array, edge i connects face vertex i
54 // with face index i+1.
55 void (*getFaceEdges)(const OpenSubdiv_Converter *converter,
56 const int face_index,
57 int *face_edges);
58
60 // Edge relationships.
61
62 // Vertices the edge consists of.
63 void (*getEdgeVertices)(const OpenSubdiv_Converter *converter,
64 const int edge_index,
65 int edge_vertices[2]);
66 // Number of faces which are sharing the given edge.
67 int (*getNumEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge_index);
68 // Array of face indices which are sharing the given edge.
69 void (*getEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge, int *edge_faces);
70 // Edge sharpness (aka crease).
71 float (*getEdgeSharpness)(const OpenSubdiv_Converter *converter, const int edge_index);
72
74 // Vertex relationships.
75
76 // Number of edges which are adjacent to the given vertex.
77 int (*getNumVertexEdges)(const OpenSubdiv_Converter *converter, const int vertex_index);
78 // Array for edge indices which are adjacent to the given vertex.
79 void (*getVertexEdges)(const OpenSubdiv_Converter *converter,
80 const int vertex_index,
81 int *vertex_edges);
82 // Number of faces which are adjacent to the given vertex.
83 int (*getNumVertexFaces)(const OpenSubdiv_Converter *converter, const int vertex_index);
84 // Array for face indices which are adjacent to the given vertex.
85 void (*getVertexFaces)(const OpenSubdiv_Converter *converter,
86 const int vertex_index,
87 int *vertex_faces);
88
89 // Check whether vertex is to be marked as an infinite sharp.
90 // This is a way to make sharp vertices which are adjacent to a loose edges.
91 bool (*isInfiniteSharpVertex)(const OpenSubdiv_Converter *converter, const int vertex_index);
92
93 // If vertex is not infinitely sharp, this is its actual sharpness.
94 float (*getVertexSharpness)(const OpenSubdiv_Converter *converter, const int vertex_index);
95
97 // Face-varying data.
98
100 // UV coordinates.
101
102 // Number of UV layers.
103 int (*getNumUVLayers)(const OpenSubdiv_Converter *converter);
104
105 // We need some corner connectivity information, which might not be trivial
106 // to be gathered (might require multiple matching calculations per corver
107 // query).
108 // precalc() is called before any corner connectivity or UV coordinate is
109 // queried from the given layer, allowing converter to calculate and cache
110 // complex complex-to-calculate information.
111 // finish() is called after converter is done porting UV layer to OpenSubdiv,
112 // allowing to free cached data.
113 void (*precalcUVLayer)(const OpenSubdiv_Converter *converter, const int layer_index);
114 void (*finishUVLayer)(const OpenSubdiv_Converter *converter);
115
116 // Get number of UV coordinates in the current layer (layer which was
117 // specified in precalcUVLayer().
119 // For the given face index and its corner (known as loop in Blender)
120 // get corresponding UV coordinate index.
122 const int face_index,
123 const int corner_index);
124
126 // User data associated with this converter.
127
128 void (*freeUserData)(const OpenSubdiv_Converter *converter);
130};
nullptr float
OpenSubdiv_FVarLinearInterpolation
OpenSubdiv_VtxBoundaryInterpolation
OpenSubdiv_SchemeType
int(* getFaceCornerUVIndex)(const OpenSubdiv_Converter *converter, const int face_index, const int corner_index)
void(* freeUserData)(const OpenSubdiv_Converter *converter)
int(* getNumEdges)(const OpenSubdiv_Converter *converter)
void(* precalcUVLayer)(const OpenSubdiv_Converter *converter, const int layer_index)
float(* getEdgeSharpness)(const OpenSubdiv_Converter *converter, const int edge_index)
int(* getNumVertexFaces)(const OpenSubdiv_Converter *converter, const int vertex_index)
void(* getVertexFaces)(const OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_faces)
void(* getVertexEdges)(const OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_edges)
OpenSubdiv_FVarLinearInterpolation(* getFVarLinearInterpolation)(const OpenSubdiv_Converter *converter)
bool(* specifiesFullTopology)(const OpenSubdiv_Converter *converter)
int(* getNumUVCoordinates)(const OpenSubdiv_Converter *converter)
void(* getFaceVertices)(const OpenSubdiv_Converter *converter, const int face_index, int *face_vertices)
OpenSubdiv_VtxBoundaryInterpolation(* getVtxBoundaryInterpolation)(const OpenSubdiv_Converter *converter)
int(* getNumUVLayers)(const OpenSubdiv_Converter *converter)
int(* getNumEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge_index)
blender::OffsetIndices< int > faces
bool(* isInfiniteSharpVertex)(const OpenSubdiv_Converter *converter, const int vertex_index)
float(* getVertexSharpness)(const OpenSubdiv_Converter *converter, const int vertex_index)
OpenSubdiv_SchemeType(* getSchemeType)(const OpenSubdiv_Converter *converter)
void(* getEdgeVertices)(const OpenSubdiv_Converter *converter, const int edge_index, int edge_vertices[2])
int(* getNumVertexEdges)(const OpenSubdiv_Converter *converter, const int vertex_index)
int(* getNumVertices)(const OpenSubdiv_Converter *converter)
void(* getFaceEdges)(const OpenSubdiv_Converter *converter, const int face_index, int *face_edges)
void(* finishUVLayer)(const OpenSubdiv_Converter *converter)
void(* getEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge, int *edge_faces)