28 #include <opensubdiv/far/topologyRefinerFactory.h>
37 using blender::opensubdiv::stack;
48 namespace OPENSUBDIV_VERSION {
52 inline bool TopologyRefinerFactory<TopologyRefinerData>::resizeComponentTopology(
62 base_mesh_topology->setNumVertices(num_vertices);
63 setNumBaseVertices(refiner, num_vertices);
78 const int num_edges = converter->
getNumEdges(converter);
79 base_mesh_topology->setNumEdges(num_edges);
83 const int num_faces = converter->
getNumFaces(converter);
84 base_mesh_topology->setNumFaces(num_faces);
85 setNumBaseFaces(refiner, num_faces);
86 for (
int face_index = 0; face_index < num_faces; ++face_index) {
88 base_mesh_topology->setNumFaceVertices(face_index, num_face_vertices);
89 setNumBaseFaceVertices(refiner, face_index, num_face_vertices);
97 base_mesh_topology->finishResizeTopology();
102 const int num_edges = converter->
getNumEdges(converter);
103 setNumBaseEdges(refiner, num_edges);
104 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
105 const int num_edge_faces = converter->
getNumEdgeFaces(converter, edge_index);
106 setNumBaseEdgeFaces(refiner, edge_index, num_edge_faces);
110 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
111 const int num_vert_edges = converter->
getNumVertexEdges(converter, vertex_index);
112 const int num_vert_faces = converter->
getNumVertexFaces(converter, vertex_index);
113 setNumBaseVertexEdges(refiner, vertex_index, num_vert_edges);
114 setNumBaseVertexFaces(refiner, vertex_index, num_vert_faces);
117 base_mesh_topology->finishResizeTopology();
122 inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTopology(
126 using Far::IndexArray;
134 const int num_faces = converter->
getNumFaces(converter);
135 for (
int face_index = 0; face_index < num_faces; ++face_index) {
136 IndexArray dst_face_verts = getBaseFaceVertices(refiner, face_index);
139 base_mesh_topology->setFaceVertexIndices(
140 face_index, dst_face_verts.size(), &dst_face_verts[0]);
147 if (!full_topology_specified) {
154 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
156 IndexArray dst_vertex_faces = getBaseVertexFaces(refiner, vertex_index);
157 const int num_vertex_faces = converter->
getNumVertexFaces(converter, vertex_index);
158 vertex_faces.resize(num_vertex_faces);
159 converter->
getVertexFaces(converter, vertex_index, &vertex_faces[0]);
162 IndexArray dst_vertex_edges = getBaseVertexEdges(refiner, vertex_index);
163 const int num_vertex_edges = converter->
getNumVertexEdges(converter, vertex_index);
164 vertex_edges.resize(num_vertex_edges);
165 converter->
getVertexEdges(converter, vertex_index, &vertex_edges[0]);
166 memcpy(&dst_vertex_edges[0], &vertex_edges[0],
sizeof(
int) * num_vertex_edges);
167 memcpy(&dst_vertex_faces[0], &vertex_faces[0],
sizeof(
int) * num_vertex_faces);
171 const int num_edges = converter->
getNumEdges(converter);
172 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
174 IndexArray dst_edge_vertices = getBaseEdgeVertices(refiner, edge_index);
175 converter->
getEdgeVertices(converter, edge_index, &dst_edge_vertices[0]);
178 IndexArray dst_edge_faces = getBaseEdgeFaces(refiner, edge_index);
179 converter->
getEdgeFaces(converter, edge_index, &dst_edge_faces[0]);
183 for (
int face_index = 0; face_index < num_faces; ++face_index) {
184 IndexArray dst_face_edges = getBaseFaceEdges(refiner, face_index);
185 converter->
getFaceEdges(converter, face_index, &dst_face_edges[0]);
188 populateBaseLocalIndices(refiner);
194 inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
198 using OpenSubdiv::Sdc::Crease;
205 const int num_edges = converter->
getNumEdges(converter);
206 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
208 if (sharpness < 1e-6f) {
212 int edge_vertices[2];
214 base_mesh_topology->setEdgeVertexIndices(edge_index, edge_vertices[0], edge_vertices[1]);
215 base_mesh_topology->setEdgeSharpness(edge_index, sharpness);
217 if (full_topology_specified) {
218 setBaseEdgeSharpness(refiner, edge_index, sharpness);
223 const int base_edge_index = findBaseEdge(refiner, edge_vertices[0], edge_vertices[1]);
225 printf(
"OpenSubdiv Error: failed to find reconstructed edge\n");
228 setBaseEdgeSharpness(refiner, base_edge_index, sharpness);
238 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
239 ConstIndexArray vertex_edges = getBaseVertexEdges(refiner, vertex_index);
241 base_mesh_topology->setVertexSharpness(vertex_index, Crease::SHARPNESS_INFINITE);
242 setBaseVertexSharpness(refiner, vertex_index, Crease::SHARPNESS_INFINITE);
247 float sharpness = 0.0f;
250 base_mesh_topology->setVertexSharpness(vertex_index, sharpness);
257 if (vertex_edges.size() == 2) {
258 const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
259 const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
260 const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
262 sharpness +=
min(sharpness0, sharpness1);
263 sharpness =
min(sharpness, 10.0f);
266 setBaseVertexSharpness(refiner, vertex_index, sharpness);
272 inline bool TopologyRefinerFactory<TopologyRefinerData>::assignFaceVaryingTopology(
284 if (num_layers <= 0) {
288 const int num_faces = getNumBaseFaces(refiner);
289 for (
int layer_index = 0; layer_index < num_layers; ++layer_index) {
293 const int channel = createBaseFVarChannel(refiner, num_uvs);
296 for (
int face_index = 0; face_index < num_faces; ++face_index) {
297 Far::IndexArray dst_face_uvs = getBaseFaceFVarValues(refiner, face_index, channel);
300 dst_face_uvs[
corner] = uv_index;
309 inline void TopologyRefinerFactory<TopologyRefinerData>::reportInvalidTopology(
312 printf(
"OpenSubdiv Error: %s\n", msg);
320 namespace opensubdiv {
326 using OpenSubdiv::Sdc::Options;
332 options.SetVtxBoundaryInterpolation(
334 options.SetCreasingMethod(Options::CREASE_UNIFORM);
335 options.SetFVarLinearInterpolation(linear_interpolation);
342 using OpenSubdiv::Sdc::SchemeType;
344 OpenSubdiv::Sdc::Options sdc_options = getSDCOptions(converter);
347 TopologyRefinerFactoryType::Options topology_options(scheme_type, sdc_options);
352 topology_options.validateFullTopology =
false;
354 return topology_options;
362 using OpenSubdiv::Far::TopologyRefiner;
371 TopologyRefinerFactoryType::Options topology_refiner_options = getTopologyRefinerOptions(
373 TopologyRefiner *
topology_refiner = TopologyRefinerFactoryType::Create(cb_data,
374 topology_refiner_options);
385 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)
OpenSubdiv::Sdc::Options::FVarLinearInterpolation getFVarLinearInterpolationFromCAPI(OpenSubdiv_FVarLinearInterpolation linear_interpolation)
std::vector< ElementType, Eigen::aligned_allocator< ElementType > > vector
int(* getNumVertexFaces)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
bool(* specifiesFullTopology)(const struct OpenSubdiv_Converter *converter)
void(* getFaceVertices)(const struct OpenSubdiv_Converter *converter, const int face_index, int *face_vertices)
float(* getVertexSharpness)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
void(* getFaceEdges)(const struct OpenSubdiv_Converter *converter, const int face_index, int *face_edges)
int(* getNumUVLayers)(const struct OpenSubdiv_Converter *converter)
int(* getNumVertexEdges)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
OpenSubdiv_FVarLinearInterpolation(* getFVarLinearInterpolation)(const struct OpenSubdiv_Converter *converter)
void(* getEdgeVertices)(const struct OpenSubdiv_Converter *converter, const int edge_index, int edge_vertices[2])
OpenSubdiv_SchemeType(* getSchemeType)(const struct OpenSubdiv_Converter *converter)
bool(* isInfiniteSharpVertex)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
void(* getVertexFaces)(const struct OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_faces)
int(* getNumVertices)(const struct OpenSubdiv_Converter *converter)
float(* getEdgeSharpness)(const struct OpenSubdiv_Converter *converter, const int edge_index)
int(* getNumEdges)(const struct OpenSubdiv_Converter *converter)
int(* getNumFaces)(const struct OpenSubdiv_Converter *converter)
int(* getNumEdgeFaces)(const struct OpenSubdiv_Converter *converter, const int edge_index)
int(* getNumUVCoordinates)(const struct OpenSubdiv_Converter *converter)
void(* getVertexEdges)(const struct OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_edges)
void(* finishUVLayer)(const struct OpenSubdiv_Converter *converter)
void(* getEdgeFaces)(const struct OpenSubdiv_Converter *converter, const int edge, int *edge_faces)
OpenSubdiv_VtxBoundaryInterpolation(* getVtxBoundaryInterpolation)(const struct OpenSubdiv_Converter *converter)
void(* precalcUVLayer)(const struct OpenSubdiv_Converter *converter, const int layer_index)
int(* getFaceCornerUVIndex)(const struct OpenSubdiv_Converter *converter, const int face_index, const int corner_index)
int(* getNumFaceVertices)(const struct OpenSubdiv_Converter *converter, const int face_index)
blender::opensubdiv::MeshTopology * base_mesh_topology
const OpenSubdiv_Converter * converter
OpenSubdiv::Far::TopologyRefinerFactory< TopologyRefinerData > TopologyRefinerFactoryType