[Bf-blender-cvs] [4fe6a2d9501] master: OpenSubdiv: Implement UV topology comparison
Sergey Sharybin
noreply at git.blender.org
Wed Jan 16 11:33:47 CET 2019
Commit: 4fe6a2d9501415d98f3c6a995526a8802920eedd
Author: Sergey Sharybin
Date: Tue Jan 15 16:15:46 2019 +0100
Branches: master
https://developer.blender.org/rB4fe6a2d9501415d98f3c6a995526a8802920eedd
OpenSubdiv: Implement UV topology comparison
===================================================================
M intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
===================================================================
diff --git a/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc b/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
index cbd076b256e..b31146a644e 100644
--- a/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
+++ b/intern/opensubdiv/internal/opensubdiv_topology_refiner.cc
@@ -385,6 +385,10 @@ bool compareCyclicBackward(const CyclicArray& array_a,
// The tricky part here is that we can't trust 1:1 array match here, since it's
// possible that OpenSubdiv oriented edges of a face to make it compatible with
// an internal representation of non-manifold meshes.
+//
+// TODO(sergey): Check whether this is needed, ot whether OpenSubdiv is only
+// creating edges in a proper orientation without modifying indices of face
+// verticies.
bool checkVerticesOfFacesMatch(const CyclicArray& indices_a,
const CyclicArray& indices_b) {
if (indices_a.size() != indices_a.size()) {
@@ -544,10 +548,53 @@ bool checkEdgeTagsMatch(
}
}
+bool checkSingleUVLayerMatch(
+ const OpenSubdiv::Far::TopologyLevel& base_level,
+ const OpenSubdiv_Converter* converter,
+ const int layer_index) {
+ converter->precalcUVLayer(converter, layer_index);
+ const int num_faces = base_level.GetNumFaces();
+ // TODO(sergey): Need to check whether converter changed the winding of
+ // face to match OpenSubdiv's expectations.
+ for (int face_index = 0; face_index < num_faces; ++face_index) {
+ OpenSubdiv::Far::ConstIndexArray base_level_face_uvs =
+ base_level.GetFaceFVarValues(face_index, layer_index);
+ for (int corner = 0; corner < base_level_face_uvs.size(); ++corner) {
+ const int uv_index =
+ converter->getFaceCornerUVIndex(converter, face_index, corner);
+ if (base_level_face_uvs[corner] != uv_index) {
+ converter->finishUVLayer(converter);
+ return false;
+ }
+ }
+ }
+ converter->finishUVLayer(converter);
+ return true;
+}
+
+bool checkUVLayersMatch(
+ const OpenSubdiv::Far::TopologyRefiner* topology_refiner,
+ const OpenSubdiv_Converter* converter) {
+ using OpenSubdiv::Far::TopologyLevel;
+ const int num_layers = converter->getNumUVLayers(converter);
+ const TopologyLevel& base_level = topology_refiner->GetLevel(0);
+ // Number of UF layers should match.
+ if (base_level.GetNumFVarChannels() != num_layers) {
+ return false;
+ }
+ for (int layer_index = 0; layer_index < num_layers; ++layer_index) {
+ if (!checkSingleUVLayerMatch(base_level, converter, layer_index)) {
+ return false;
+ }
+ }
+ return true;
+}
+
bool checkTopologyAttributesMatch(
const OpenSubdiv::Far::TopologyRefiner* topology_refiner,
const OpenSubdiv_Converter* converter) {
- return checkEdgeTagsMatch(topology_refiner, converter);
+ return checkEdgeTagsMatch(topology_refiner, converter) &&
+ checkUVLayersMatch(topology_refiner, converter);
}
} // namespace
More information about the Bf-blender-cvs
mailing list