23 #include <opensubdiv/sdc/crease.h>
30 namespace opensubdiv {
46 bool isEqualGeometryCounters(
const MeshTopology &mesh_topology,
49 if (converter->
getNumVertices(converter) != mesh_topology.getNumVertices()) {
52 if (converter->
getNumFaces(converter) != mesh_topology.getNumFaces()) {
55 if (getEffectiveNumEdges(converter) != mesh_topology.getNumEdges()) {
67 bool isEqualGeometryEdge(
const MeshTopology &mesh_topology,
const OpenSubdiv_Converter *converter)
69 const int num_requested_edges = getEffectiveNumEdges(converter);
70 if (num_requested_edges != mesh_topology.getNumEdges()) {
88 bool isEqualGeometryFace(
const MeshTopology &mesh_topology,
const OpenSubdiv_Converter *converter)
90 const int num_requested_faces = converter->
getNumFaces(converter);
91 if (num_requested_faces != mesh_topology.getNumFaces()) {
96 for (
int face_index = 0; face_index < num_requested_faces; ++face_index) {
98 if (mesh_topology.getNumFaceVertices(face_index) != num_face_vertices) {
102 vertices_of_face.resize(num_face_vertices);
103 converter->
getFaceVertices(converter, face_index, vertices_of_face.data());
105 if (!mesh_topology.isFaceVertexIndicesEqual(face_index, vertices_of_face)) {
117 if (!isEqualGeometryEdge(mesh_topology, converter)) {
120 if (!isEqualGeometryFace(mesh_topology, converter)) {
133 float getEffectiveVertexSharpness(
const OpenSubdiv_Converter *converter,
const int vertex_index)
137 return OpenSubdiv::Sdc::Crease::SHARPNESS_INFINITE;
147 bool isEqualVertexTags(
const MeshTopology &mesh_topology,
const OpenSubdiv_Converter *converter)
149 const int num_vertices = mesh_topology.getNumVertices();
150 for (
int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) {
151 const float current_sharpness = mesh_topology.getVertexSharpness(vertex_index);
152 const float requested_sharpness = getEffectiveVertexSharpness(converter, vertex_index);
154 if (current_sharpness != requested_sharpness) {
176 const int num_edges = mesh_topology.getNumEdges();
177 for (
int edge_index = 0; edge_index < num_edges; ++edge_index) {
178 const float current_sharpness = mesh_topology.getEdgeSharpness(edge_index);
179 const float requested_sharpness = getEffectiveEdgeSharpness(converter, edge_index);
181 if (current_sharpness != requested_sharpness) {
185 if (current_sharpness < 1e-6f) {
189 int requested_edge_vertices[2];
190 converter->
getEdgeVertices(converter, edge_index, requested_edge_vertices);
191 if (!mesh_topology.isEdgeEqual(
192 edge_index, requested_edge_vertices[0], requested_edge_vertices[1])) {
204 if (!isEqualVertexTags(mesh_topology, converter)) {
207 if (!isEqualEdgeTags(mesh_topology, converter)) {
222 if (!isEqualGeometryCounters(*
this, converter)) {
227 if (!isEqualGeometry(*
this, converter)) {
232 if (!isEqualTags(*
this, converter)) {
bool isEqualToConverter(const OpenSubdiv_Converter *converter) const
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(* getEdgeVertices)(const struct OpenSubdiv_Converter *converter, const int edge_index, int edge_vertices[2])
bool(* isInfiniteSharpVertex)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
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(* getNumFaceVertices)(const struct OpenSubdiv_Converter *converter, const int face_index)