Blender V4.3
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
7#include <cstdint> // for bool
8
10
13
15 const OpenSubdiv_Converter *converter);
17 const OpenSubdiv_Converter *converter);
18
19 // Denotes whether this converter specifies full topology, which includes
20 // vertices, edges, faces, vertices+edges of a face and edges/faces of a
21 // vertex.
22 // Otherwise this converter will only provide number of vertices and faces,
23 // and vertices of faces. The rest of topology will be created by OpenSubdiv.
24 //
25 // NOTE: Even if converter does not provide full topology, it still needs
26 // to provide number of edges and vertices-of-edge. Those are used to assign
27 // topology tags.
29
31 // Global geometry counters.
32
33 // Number of faces/edges/vertices in the base mesh.
34 int (*getNumFaces)(const OpenSubdiv_Converter *converter);
35 int (*getNumEdges)(const OpenSubdiv_Converter *converter);
37
39 // Face relationships.
40
41 // Number of vertices the face consists of.
42 int (*getNumFaceVertices)(const OpenSubdiv_Converter *converter, const int face_index);
43 // Array of vertex indices the face consists of.
44 void (*getFaceVertices)(const OpenSubdiv_Converter *converter,
45 const int face_index,
46 int *face_vertices);
47 // Array of edge indices the face consists of.
48 // Aligned with the vertex indices array, edge i connects face vertex i
49 // with face index i+1.
50 void (*getFaceEdges)(const OpenSubdiv_Converter *converter,
51 const int face_index,
52 int *face_edges);
53
55 // Edge relationships.
56
57 // Vertices the edge consists of.
58 void (*getEdgeVertices)(const OpenSubdiv_Converter *converter,
59 const int edge_index,
60 int edge_vertices[2]);
61 // Number of faces which are sharing the given edge.
62 int (*getNumEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge_index);
63 // Array of face indices which are sharing the given edge.
64 void (*getEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge, int *edge_faces);
65 // Edge sharpness (aka crease).
66 float (*getEdgeSharpness)(const OpenSubdiv_Converter *converter, const int edge_index);
67
69 // Vertex relationships.
70
71 // Number of edges which are adjacent to the given vertex.
72 int (*getNumVertexEdges)(const OpenSubdiv_Converter *converter, const int vertex_index);
73 // Array fo edge indices which are adjacent to the given vertex.
74 void (*getVertexEdges)(const OpenSubdiv_Converter *converter,
75 const int vertex_index,
76 int *vertex_edges);
77 // Number of faces which are adjacent to the given vertex.
78 int (*getNumVertexFaces)(const OpenSubdiv_Converter *converter, const int vertex_index);
79 // Array fo face indices which are adjacent to the given vertex.
80 void (*getVertexFaces)(const OpenSubdiv_Converter *converter,
81 const int vertex_index,
82 int *vertex_faces);
83
84 // Check whether vertex is to be marked as an infinite sharp.
85 // This is a way to make sharp vertices which are adjacent to a loose edges.
86 bool (*isInfiniteSharpVertex)(const OpenSubdiv_Converter *converter, const int vertex_index);
87
88 // If vertex is not infinitely sharp, this is its actual sharpness.
89 float (*getVertexSharpness)(const OpenSubdiv_Converter *converter, const int vertex_index);
90
92 // Face-varying data.
93
95 // UV coordinates.
96
97 // Number of UV layers.
99
100 // We need some corner connectivity information, which might not be trivial
101 // to be gathered (might require multiple matching calculations per corver
102 // query).
103 // precalc() is called before any corner connectivity or UV coordinate is
104 // queried from the given layer, allowing converter to calculate and cache
105 // complex complex-to-calculate information.
106 // finish() is called after converter is done porting UV layer to OpenSubdiv,
107 // allowing to free cached data.
108 void (*precalcUVLayer)(const OpenSubdiv_Converter *converter, const int layer_index);
109 void (*finishUVLayer)(const OpenSubdiv_Converter *converter);
110
111 // Get number of UV coordinates in the current layer (layer which was
112 // specified in precalcUVLayer().
114 // For the given face index and its corner (known as loop in Blender)
115 // get corresponding UV coordinate index.
117 const int face_index,
118 const int corner_index);
119
121 // User data associated with this converter.
122
123 void (*freeUserData)(const OpenSubdiv_Converter *converter);
125};
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
OpenSubdiv_FVarLinearInterpolation
OpenSubdiv_VtxBoundaryInterpolation
OpenSubdiv_SchemeType
int(* getFaceCornerUVIndex)(const OpenSubdiv_Converter *converter, const int face_index, const int corner_index)
int(* getNumFaceVertices)(const OpenSubdiv_Converter *converter, const int face_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)
int(* getNumFaces)(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)
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)