16#include <opensubdiv/far/topologyRefinerFactory.h>
31namespace OPENSUBDIV_VERSION {
35inline bool TopologyRefinerFactory<TopologyRefinerData>::resizeComponentTopology(
45 base_mesh_topology->setNumVertices(num_vertices);
46 setNumBaseVertices(refiner, num_vertices);
61 const int num_edges = converter->
getNumEdges(converter);
62 base_mesh_topology->setNumEdges(num_edges);
66 const int num_faces = converter->
getNumFaces(converter);
67 base_mesh_topology->setNumFaces(num_faces);
68 setNumBaseFaces(refiner, num_faces);
69 for (
int face_index = 0; face_index < num_faces; ++face_index) {
71 base_mesh_topology->setNumFaceVertices(face_index, num_face_vertices);
72 setNumBaseFaceVertices(refiner, face_index, num_face_vertices);
80 base_mesh_topology->finishResizeTopology();
85 const int num_edges = converter->
getNumEdges(converter);
86 setNumBaseEdges(refiner, num_edges);
87 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
88 const int num_edge_faces = converter->
getNumEdgeFaces(converter, edge_index);
89 setNumBaseEdgeFaces(refiner, edge_index, num_edge_faces);
93 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
96 setNumBaseVertexEdges(refiner, vertex_index, num_vert_edges);
97 setNumBaseVertexFaces(refiner, vertex_index, num_vert_faces);
100 base_mesh_topology->finishResizeTopology();
105inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTopology(
109 using Far::IndexArray;
117 const int num_faces = converter->
getNumFaces(converter);
118 for (
int face_index = 0; face_index < num_faces; ++face_index) {
119 IndexArray dst_face_verts = getBaseFaceVertices(refiner, face_index);
122 base_mesh_topology->setFaceVertexIndices(
123 face_index, dst_face_verts.size(), &dst_face_verts[0]);
130 if (!full_topology_specified) {
136 std::vector<int> vertex_faces, vertex_edges;
137 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
139 IndexArray dst_vertex_faces = getBaseVertexFaces(refiner, vertex_index);
140 const int num_vertex_faces = converter->
getNumVertexFaces(converter, vertex_index);
141 vertex_faces.resize(num_vertex_faces);
142 converter->
getVertexFaces(converter, vertex_index, &vertex_faces[0]);
145 IndexArray dst_vertex_edges = getBaseVertexEdges(refiner, vertex_index);
146 const int num_vertex_edges = converter->
getNumVertexEdges(converter, vertex_index);
147 vertex_edges.resize(num_vertex_edges);
148 converter->
getVertexEdges(converter, vertex_index, &vertex_edges[0]);
149 memcpy(&dst_vertex_edges[0], &vertex_edges[0],
sizeof(
int) * num_vertex_edges);
150 memcpy(&dst_vertex_faces[0], &vertex_faces[0],
sizeof(
int) * num_vertex_faces);
154 const int num_edges = converter->
getNumEdges(converter);
155 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
157 IndexArray dst_edge_vertices = getBaseEdgeVertices(refiner, edge_index);
158 converter->
getEdgeVertices(converter, edge_index, &dst_edge_vertices[0]);
161 IndexArray dst_edge_faces = getBaseEdgeFaces(refiner, edge_index);
162 converter->
getEdgeFaces(converter, edge_index, &dst_edge_faces[0]);
166 for (
int face_index = 0; face_index < num_faces; ++face_index) {
167 IndexArray dst_face_edges = getBaseFaceEdges(refiner, face_index);
168 converter->
getFaceEdges(converter, face_index, &dst_face_edges[0]);
171 populateBaseLocalIndices(refiner);
177inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
181 using OpenSubdiv::Sdc::Crease;
188 const int num_edges = converter->
getNumEdges(converter);
189 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
191 if (sharpness < 1e-6f) {
195 int edge_vertices[2];
197 base_mesh_topology->setEdgeVertexIndices(edge_index, edge_vertices[0], edge_vertices[1]);
198 base_mesh_topology->setEdgeSharpness(edge_index, sharpness);
200 if (full_topology_specified) {
201 setBaseEdgeSharpness(refiner, edge_index, sharpness);
206 const int base_edge_index = findBaseEdge(refiner, edge_vertices[0], edge_vertices[1]);
207 if (base_edge_index == OpenSubdiv::Far::INDEX_INVALID) {
208 printf(
"OpenSubdiv Error: failed to find reconstructed edge\n");
211 setBaseEdgeSharpness(refiner, base_edge_index, sharpness);
221 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
222 ConstIndexArray vertex_edges = getBaseVertexEdges(refiner, vertex_index);
224 base_mesh_topology->setVertexSharpness(vertex_index, Crease::SHARPNESS_INFINITE);
225 setBaseVertexSharpness(refiner, vertex_index, Crease::SHARPNESS_INFINITE);
230 float sharpness = 0.0f;
233 base_mesh_topology->setVertexSharpness(vertex_index, sharpness);
240 if (vertex_edges.size() == 2) {
241 const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
242 const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
243 const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
245 sharpness += std::min(sharpness0, sharpness1);
246 sharpness = std::min(sharpness, 10.0f);
249 setBaseVertexSharpness(refiner, vertex_index, sharpness);
255inline bool TopologyRefinerFactory<TopologyRefinerData>::assignFaceVaryingTopology(
267 if (num_layers <= 0) {
271 const int num_faces = getNumBaseFaces(refiner);
272 for (
int layer_index = 0; layer_index < num_layers; ++layer_index) {
276 const int channel = createBaseFVarChannel(refiner, num_uvs);
279 for (
int face_index = 0; face_index < num_faces; ++face_index) {
280 Far::IndexArray dst_face_uvs = getBaseFaceFVarValues(refiner, face_index, channel);
281 for (
int corner = 0; corner < dst_face_uvs.size(); ++corner) {
283 dst_face_uvs[corner] = uv_index;
292inline void TopologyRefinerFactory<TopologyRefinerData>::reportInvalidTopology(
295 printf(
"OpenSubdiv Error: %s\n", msg);
306 using OpenSubdiv::Sdc::Options;
312 options.SetVtxBoundaryInterpolation(
314 options.SetCreasingMethod(Options::CREASE_UNIFORM);
315 options.SetFVarLinearInterpolation(linear_interpolation);
323 using OpenSubdiv::Sdc::SchemeType;
325 OpenSubdiv::Sdc::Options sdc_options =
getSDCOptions(converter);
328 TopologyRefinerFactoryType::Options topology_options(scheme_type, sdc_options);
333 topology_options.validateFullTopology =
false;
335 return topology_options;
341 using OpenSubdiv::Far::TopologyRefiner;
352 TopologyRefiner *
topology_refiner = TopologyRefinerFactoryType::Create(cb_data,
353 topology_refiner_options);
364 return topology_refiner_impl;
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
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(* getNumFaceVertices)(const OpenSubdiv_Converter *converter, const int face_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)
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)
blender::opensubdiv::MeshTopology * base_mesh_topology
const OpenSubdiv_Converter * converter
OpenSubdiv::Far::TopologyRefinerFactory< TopologyRefinerData > TopologyRefinerFactoryType