From 1bacd09abb60a4b3febb6d8c78c784ce86f50e3e Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 28 Nov 2022 13:49:55 -0600 Subject: [PATCH] Fix: Mishandled creases in Cycles adaptive subdivision Caused by a8a454287a27 which assumed it was possible to access the raw data of the edge creases layer. Also allow processing vertex creases even if there aren't any edge creases. --- intern/cycles/blender/mesh.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/intern/cycles/blender/mesh.cpp b/intern/cycles/blender/mesh.cpp index fbc470cada4..1887440bc67 100644 --- a/intern/cycles/blender/mesh.cpp +++ b/intern/cycles/blender/mesh.cpp @@ -1085,11 +1085,11 @@ static void create_subd_mesh(Scene *scene, const int edges_num = b_mesh.edges.length(); if (edges_num != 0 && b_mesh.edge_creases.length() > 0) { - size_t num_creases = 0; - const float *creases = static_cast(b_mesh.edge_creases[0].ptr.data); + BL::MeshEdgeCreaseLayer creases = b_mesh.edge_creases[0]; + size_t num_creases = 0; for (int i = 0; i < edges_num; i++) { - if (creases[i] != 0.0f) { + if (creases.data[i].value() != 0.0f) { num_creases++; } } @@ -1098,17 +1098,18 @@ static void create_subd_mesh(Scene *scene, const MEdge *edges = static_cast(b_mesh.edges[0].ptr.data); for (int i = 0; i < edges_num; i++) { - if (creases[i] != 0.0f) { + const float crease = creases.data[i].value(); + if (crease != 0.0f) { const MEdge &b_edge = edges[i]; - mesh->add_edge_crease(b_edge.v1, b_edge.v2, creases[i]); + mesh->add_edge_crease(b_edge.v1, b_edge.v2, crease); } } + } - for (BL::MeshVertexCreaseLayer &c : b_mesh.vertex_creases) { - for (int i = 0; i < c.data.length(); ++i) { - if (c.data[i].value() != 0.0f) { - mesh->add_vertex_crease(i, c.data[i].value()); - } + for (BL::MeshVertexCreaseLayer &c : b_mesh.vertex_creases) { + for (int i = 0; i < c.data.length(); ++i) { + if (c.data[i].value() != 0.0f) { + mesh->add_vertex_crease(i, c.data[i].value()); } } }