14#include <opensubdiv/far/topologyRefinerFactory.h>
32inline bool TopologyRefinerFactory<TopologyRefinerData>::resizeComponentTopology(
42 base_mesh_topology->setNumVertices(num_vertices);
43 setNumBaseVertices(refiner, num_vertices);
58 const int num_edges = converter->
getNumEdges(converter);
59 base_mesh_topology->setNumEdges(num_edges);
64 base_mesh_topology->setNumFaces(src_faces.
size());
65 setNumBaseFaces(refiner, src_faces.
size());
66 for (
const int face_index : src_faces.
index_range()) {
67 const int num_face_vertices = src_faces[face_index].
size();
68 base_mesh_topology->setNumFaceVertices(face_index, num_face_vertices);
69 setNumBaseFaceVertices(refiner, face_index, num_face_vertices);
77 base_mesh_topology->finishResizeTopology();
82 const int num_edges = converter->
getNumEdges(converter);
83 setNumBaseEdges(refiner, num_edges);
84 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
85 const int num_edge_faces = converter->
getNumEdgeFaces(converter, edge_index);
86 setNumBaseEdgeFaces(refiner, edge_index, num_edge_faces);
90 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
93 setNumBaseVertexEdges(refiner, vertex_index, num_vert_edges);
94 setNumBaseVertexFaces(refiner, vertex_index, num_vert_faces);
97 base_mesh_topology->finishResizeTopology();
102inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTopology(
106 using Far::IndexArray;
116 for (
const int face_index : src_faces.
index_range()) {
117 IndexArray dst_face_verts = getBaseFaceVertices(refiner, face_index);
120 base_mesh_topology->setFaceVertexIndices(
121 face_index, dst_face_verts.size(), &dst_face_verts[0]);
128 if (!full_topology_specified) {
134 std::vector<int> vertex_faces, vertex_edges;
135 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
137 IndexArray dst_vertex_faces = getBaseVertexFaces(refiner, vertex_index);
138 const int num_vertex_faces = converter->
getNumVertexFaces(converter, vertex_index);
139 vertex_faces.resize(num_vertex_faces);
140 converter->
getVertexFaces(converter, vertex_index, vertex_faces.data());
143 IndexArray dst_vertex_edges = getBaseVertexEdges(refiner, vertex_index);
144 const int num_vertex_edges = converter->
getNumVertexEdges(converter, vertex_index);
145 vertex_edges.resize(num_vertex_edges);
146 converter->
getVertexEdges(converter, vertex_index, vertex_edges.data());
147 memcpy(&dst_vertex_edges[0], vertex_edges.data(),
sizeof(
int) * num_vertex_edges);
148 memcpy(&dst_vertex_faces[0], vertex_faces.data(),
sizeof(
int) * num_vertex_faces);
152 const int num_edges = converter->
getNumEdges(converter);
153 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
155 IndexArray dst_edge_vertices = getBaseEdgeVertices(refiner, edge_index);
156 converter->
getEdgeVertices(converter, edge_index, &dst_edge_vertices[0]);
159 IndexArray dst_edge_faces = getBaseEdgeFaces(refiner, edge_index);
160 converter->
getEdgeFaces(converter, edge_index, &dst_edge_faces[0]);
164 for (
const int face_index : src_faces.
index_range()) {
165 IndexArray dst_face_edges = getBaseFaceEdges(refiner, face_index);
166 converter->
getFaceEdges(converter, face_index, &dst_face_edges[0]);
169 populateBaseLocalIndices(refiner);
175inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
179 using OpenSubdiv::Sdc::Crease;
185 if (full_topology_specified || converter->
getEdgeVertices !=
nullptr) {
186 const int num_edges = converter->
getNumEdges(converter);
187 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
189 if (sharpness < 1e-6f) {
193 int edge_vertices[2];
195 base_mesh_topology->setEdgeVertexIndices(edge_index, edge_vertices[0], edge_vertices[1]);
196 base_mesh_topology->setEdgeSharpness(edge_index, sharpness);
198 if (full_topology_specified) {
199 setBaseEdgeSharpness(refiner, edge_index, sharpness);
204 const int base_edge_index = findBaseEdge(refiner, edge_vertices[0], edge_vertices[1]);
205 if (base_edge_index == OpenSubdiv::Far::INDEX_INVALID) {
206 printf(
"OpenSubdiv Error: failed to find reconstructed edge\n");
209 setBaseEdgeSharpness(refiner, base_edge_index, sharpness);
219 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
220 ConstIndexArray vertex_edges = getBaseVertexEdges(refiner, vertex_index);
222 base_mesh_topology->setVertexSharpness(vertex_index, Crease::SHARPNESS_INFINITE);
223 setBaseVertexSharpness(refiner, vertex_index, Crease::SHARPNESS_INFINITE);
228 float sharpness = 0.0f;
231 base_mesh_topology->setVertexSharpness(vertex_index, sharpness);
238 if (vertex_edges.size() == 2) {
239 const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
240 const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
241 const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
243 sharpness += std::min(sharpness0, sharpness1);
244 sharpness = std::min(sharpness, 10.0f);
247 setBaseVertexSharpness(refiner, vertex_index, sharpness);
253inline bool TopologyRefinerFactory<TopologyRefinerData>::assignFaceVaryingTopology(
265 if (num_layers <= 0) {
269 const int num_faces = getNumBaseFaces(refiner);
270 for (
int layer_index = 0; layer_index < num_layers; ++layer_index) {
274 const int channel = createBaseFVarChannel(refiner, num_uvs);
277 for (
int face_index = 0; face_index < num_faces; ++face_index) {
278 Far::IndexArray dst_face_uvs = getBaseFaceFVarValues(refiner, face_index, channel);
279 for (
int corner = 0; corner < dst_face_uvs.size(); ++corner) {
281 dst_face_uvs[corner] = uv_index;
290inline void TopologyRefinerFactory<TopologyRefinerData>::reportInvalidTopology(
293 printf(
"OpenSubdiv Error: %s\n", msg);
302 using OpenSubdiv::Sdc::Options;
308 options.SetVtxBoundaryInterpolation(
310 options.SetCreasingMethod(Options::CREASE_UNIFORM);
311 options.SetFVarLinearInterpolation(linear_interpolation);
319 using OpenSubdiv::Sdc::SchemeType;
321 OpenSubdiv::Sdc::Options sdc_options =
getSDCOptions(converter);
324 TopologyRefinerFactoryType::Options topology_options(scheme_type, sdc_options);
329 topology_options.validateFullTopology =
false;
331 return topology_options;
337 using OpenSubdiv::Far::TopologyRefiner;
348 TopologyRefiner *
topology_refiner = TopologyRefinerFactoryType::Create(cb_data,
349 topology_refiner_options);
360 return topology_refiner_impl;
IndexRange index_range() const
MeshTopology base_mesh_topology
OpenSubdiv::Far::TopologyRefiner * topology_refiner
OpenSubdiv_TopologyRefinerSettings settings
static TopologyRefinerImpl * createFromConverter(OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings &settings)
CCL_NAMESPACE_BEGIN struct Options options
#define assert(assertion)
OpenSubdiv::Sdc::Options::VtxBoundaryInterpolation getVtxBoundaryInterpolationFromCAPI(OpenSubdiv_VtxBoundaryInterpolation boundary_interpolation)
OpenSubdiv::Sdc::SchemeType getSchemeTypeFromCAPI(OpenSubdiv_SchemeType type)
static OpenSubdiv::Sdc::Options getSDCOptions(OpenSubdiv_Converter *converter)
static TopologyRefinerFactoryType::Options getTopologyRefinerOptions(OpenSubdiv_Converter *converter)
OpenSubdiv::Sdc::Options::FVarLinearInterpolation getFVarLinearInterpolationFromCAPI(OpenSubdiv_FVarLinearInterpolation linear_interpolation)
int(* getFaceCornerUVIndex)(const OpenSubdiv_Converter *converter, const int face_index, const int corner_index)
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)
blender::opensubdiv::MeshTopology * base_mesh_topology
const OpenSubdiv_Converter * converter
OpenSubdiv::Far::TopologyRefinerFactory< TopologyRefinerData > TopologyRefinerFactoryType