diff options
Diffstat (limited to 'source/blender/blenkernel/intern')
16 files changed, 79 insertions, 87 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index 3aeb2a17b3c..375e7b456cd 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -240,8 +240,6 @@ void DM_from_template(DerivedMesh *dm, CustomData_copy(&source->loopData, &dm->loopData, mask->lmask, CD_SET_DEFAULT, numLoops); CustomData_copy(&source->polyData, &dm->polyData, mask->pmask, CD_SET_DEFAULT, numPolys); - dm->cd_flag = source->cd_flag; - dm->type = type; dm->numVertData = numVerts; dm->numEdgeData = numEdges; diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 0261b2d7674..bcdd01aa8b3 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -206,7 +206,6 @@ static DerivedMesh *cdDM_from_mesh_ex(Mesh *mesh, * but only if the original mesh had its deformed_only flag correctly set * (which isn't generally the case). */ dm->deformedOnly = 1; - dm->cd_flag = mesh->cd_flag; CustomData_merge(&mesh->vdata, &dm->vertData, cddata_masks.vmask, alloctype, mesh->totvert); CustomData_merge(&mesh->edata, &dm->edgeData, cddata_masks.emask, alloctype, mesh->totedge); diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 892b1599bce..084fe76cd10 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -1869,9 +1869,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { /* 29: CD_BWEIGHT */ {sizeof(MFloatProperty), "MFloatProperty", 1, nullptr, nullptr, nullptr, layerInterp_bweight}, /* 30: CD_CREASE */ - /* NOTE: we do not interpolate crease data as it should be either inherited for subdivided - * edges, or for vertex creases, only present on the original vertex. */ - {sizeof(float), "", 0, N_("SubSurfCrease"), nullptr, nullptr, nullptr}, + {sizeof(float), "", 0, N_("SubSurfCrease"), nullptr, nullptr, layerInterp_propFloat}, /* 31: CD_ORIGSPACE_MLOOP */ {sizeof(OrigSpaceLoop), "OrigSpaceLoop", @@ -2124,7 +2122,8 @@ const CustomData_MeshMasks CD_MASK_BAREMESH_ORIGINDEX = { const CustomData_MeshMasks CD_MASK_MESH = { /* vmask */ (CD_MASK_MVERT | CD_MASK_MDEFORMVERT | CD_MASK_MVERT_SKIN | CD_MASK_PAINT_MASK | CD_MASK_PROP_ALL | CD_MASK_CREASE | CD_MASK_BWEIGHT), - /* emask */ (CD_MASK_MEDGE | CD_MASK_FREESTYLE_EDGE | CD_MASK_PROP_ALL | CD_MASK_BWEIGHT), + /* emask */ + (CD_MASK_MEDGE | CD_MASK_FREESTYLE_EDGE | CD_MASK_PROP_ALL | CD_MASK_BWEIGHT | CD_MASK_CREASE), /* fmask */ 0, /* pmask */ (CD_MASK_MPOLY | CD_MASK_FACEMAP | CD_MASK_FREESTYLE_FACE | CD_MASK_PROP_ALL), @@ -2136,7 +2135,9 @@ const CustomData_MeshMasks CD_MASK_DERIVEDMESH = { /* vmask */ (CD_MASK_ORIGINDEX | CD_MASK_MDEFORMVERT | CD_MASK_SHAPEKEY | CD_MASK_MVERT_SKIN | CD_MASK_PAINT_MASK | CD_MASK_ORCO | CD_MASK_CLOTH_ORCO | CD_MASK_PROP_ALL | CD_MASK_CREASE | CD_MASK_BWEIGHT), - /* emask */ (CD_MASK_ORIGINDEX | CD_MASK_FREESTYLE_EDGE | CD_MASK_BWEIGHT | CD_MASK_PROP_ALL), + /* emask */ + (CD_MASK_ORIGINDEX | CD_MASK_FREESTYLE_EDGE | CD_MASK_BWEIGHT | CD_MASK_PROP_ALL | + CD_MASK_CREASE), /* fmask */ (CD_MASK_ORIGINDEX | CD_MASK_ORIGSPACE | CD_MASK_PREVIEW_MCOL | CD_MASK_TANGENT), /* pmask */ (CD_MASK_ORIGINDEX | CD_MASK_FREESTYLE_FACE | CD_MASK_FACEMAP | CD_MASK_PROP_ALL), diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c index 6c7715c625e..f2732cea91a 100644 --- a/source/blender/blenkernel/intern/data_transfer.c +++ b/source/blender/blenkernel/intern/data_transfer.c @@ -199,7 +199,7 @@ int BKE_object_data_transfer_dttype_to_cdtype(const int dtdata_type) case DT_TYPE_SEAM: return CD_FAKE_SEAM; case DT_TYPE_CREASE: - return CD_FAKE_CREASE; + return CD_CREASE; case DT_TYPE_BWEIGHT_EDGE: return CD_BWEIGHT; case DT_TYPE_FREESTYLE_EDGE: @@ -981,39 +981,6 @@ static bool data_transfer_layersmapping_generate(ListBase *r_map, } return true; } - if (cddata_type == CD_FAKE_CREASE) { - const size_t elem_size = sizeof(*((MEdge *)NULL)); - const size_t data_size = sizeof(((MEdge *)NULL)->crease); - const size_t data_offset = offsetof(MEdge, crease); - const uint64_t data_flag = 0; - - if (!(me_src->cd_flag & ME_CDFLAG_EDGE_CREASE)) { - if (use_delete) { - me_dst->cd_flag &= ~ME_CDFLAG_EDGE_CREASE; - } - return true; - } - me_dst->cd_flag |= ME_CDFLAG_EDGE_CREASE; - if (r_map) { - data_transfer_layersmapping_add_item(r_map, - cddata_type, - mix_mode, - mix_factor, - mix_weights, - BKE_mesh_edges(me_src), - BKE_mesh_edges_for_write(me_dst), - me_src->totedge, - me_dst->totedge, - elem_size, - data_size, - data_offset, - data_flag, - data_transfer_interp_char, - interp_data); - } - return true; - } - if (r_map && ELEM(cddata_type, CD_FAKE_SHARP, CD_FAKE_SEAM)) { const size_t elem_size = sizeof(*((MEdge *)NULL)); const size_t data_size = sizeof(((MEdge *)NULL)->flag); diff --git a/source/blender/blenkernel/intern/geometry_component_mesh.cc b/source/blender/blenkernel/intern/geometry_component_mesh.cc index 255d0e92964..bf1dc1453c2 100644 --- a/source/blender/blenkernel/intern/geometry_component_mesh.cc +++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc @@ -904,14 +904,14 @@ static void set_loop_uv(MLoopUV &uv, float2 co) copy_v2_v2(uv.uv, co); } -static float get_crease(const MEdge &edge) +static float get_crease(const float &crease) { - return edge.crease / 255.0f; + return crease; } -static void set_crease(MEdge &edge, float value) +static void set_crease(float &crease, const float value) { - edge.crease = round_fl_to_uchar_clamp(value * 255.0f); + crease = std::clamp(value, 0.0f, 1.0f); } class VArrayImpl_For_VertexWeights final : public VMutableArrayImpl<float> { @@ -1256,13 +1256,13 @@ static ComponentAttributeProviders create_attribute_providers_for_mesh() "crease", ATTR_DOMAIN_EDGE, CD_PROP_FLOAT, - CD_MEDGE, - BuiltinAttributeProvider::NonCreatable, + CD_CREASE, + BuiltinAttributeProvider::Creatable, BuiltinAttributeProvider::Writable, - BuiltinAttributeProvider::NonDeletable, + BuiltinAttributeProvider::Deletable, edge_access, - make_derived_read_attribute<MEdge, float, get_crease>, - make_derived_write_attribute<MEdge, float, get_crease, set_crease>, + make_array_read_attribute<float>, + make_derived_write_attribute<float, float, get_crease, set_crease>, nullptr); static NamedLegacyCustomDataProvider uvs( diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc index 6b1179b0cc9..34cebeaa5d4 100644 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@ -148,8 +148,6 @@ static void mesh_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int mesh_tessface_clear_intern(mesh_dst, false); } - mesh_dst->cd_flag = mesh_src->cd_flag; - mesh_dst->edit_mesh = nullptr; mesh_dst->mselect = (MSelect *)MEM_dupallocN(mesh_dst->mselect); @@ -253,6 +251,7 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address BKE_mesh_legacy_convert_material_indices_to_mpoly(mesh); BKE_mesh_legacy_bevel_weight_from_layers(mesh); BKE_mesh_legacy_face_set_from_generic(mesh); + BKE_mesh_legacy_edge_crease_from_layers(mesh); /* When converting to the old mesh format, don't save redundant attributes. */ names_to_skip.add_multiple_new({".hide_vert", ".hide_edge", ".hide_poly", "material_index"}); @@ -1018,7 +1017,6 @@ Mesh *BKE_mesh_new_nomain_from_template_ex(const Mesh *me_src, me_dst->totloop = loops_len; me_dst->totpoly = polys_len; - me_dst->cd_flag = me_src->cd_flag; BKE_mesh_copy_parameters_for_eval(me_dst, me_src); CustomData_copy(&me_src->vdata, &me_dst->vdata, mask.vmask, CD_SET_DEFAULT, verts_len); @@ -1620,7 +1618,7 @@ void BKE_mesh_do_versions_cd_flag_init(Mesh *mesh) break; } } - if (edge.crease != 0) { + if (edge.crease_legacy != 0) { mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE; if (mesh->cd_flag & ME_CDFLAG_EDGE_BWEIGHT) { break; diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index 7a04e45fe00..3d6ecec44e1 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -449,7 +449,6 @@ static void copy_edge_attributes(Mesh *dest_mesh, int medge_index, int index_in_orig_me) { - medge->crease = orig_medge->crease; medge->flag = orig_medge->flag; CustomData *target_cd = &dest_mesh->edata; const CustomData *source_cd = &orig_me->edata; diff --git a/source/blender/blenkernel/intern/mesh_convert.cc b/source/blender/blenkernel/intern/mesh_convert.cc index e56df0e3fe3..1ad74ef693a 100644 --- a/source/blender/blenkernel/intern/mesh_convert.cc +++ b/source/blender/blenkernel/intern/mesh_convert.cc @@ -119,7 +119,6 @@ static void make_edges_mdata_extend(Mesh &mesh) BLI_edgehashIterator_getKey(ehi, &medge->v1, &medge->v2); BLI_edgehashIterator_setValue(ehi, POINTER_FROM_UINT(e_index)); - medge->crease = 0; medge->flag = ME_EDGEDRAW | ME_EDGERENDER; } BLI_edgehashIterator_free(ehi); @@ -1328,7 +1327,6 @@ void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob) BLI_listbase_clear(&mesh_src->vertex_group_names); BKE_mesh_copy_parameters(mesh_dst, mesh_src); - mesh_dst->cd_flag = mesh_src->cd_flag; /* For original meshes, shape key data is stored in the #Key data-block, so it * must be moved from the storage in #CustomData layers used for evaluation. */ diff --git a/source/blender/blenkernel/intern/mesh_debug.cc b/source/blender/blenkernel/intern/mesh_debug.cc index 8a9ce901923..ba4f25c74ee 100644 --- a/source/blender/blenkernel/intern/mesh_debug.cc +++ b/source/blender/blenkernel/intern/mesh_debug.cc @@ -27,21 +27,11 @@ # include "BLI_dynstr.h" -static void mesh_debug_info_from_cd_flag(const Mesh *me, DynStr *dynstr) -{ - BLI_dynstr_append(dynstr, "'cd_flag': {"); - if (me->cd_flag & ME_CDFLAG_EDGE_CREASE) { - BLI_dynstr_append(dynstr, "'EDGE_CREASE', "); - } - BLI_dynstr_append(dynstr, "},\n"); -} - char *BKE_mesh_debug_info(const Mesh *me) { DynStr *dynstr = BLI_dynstr_new(); char *ret; - const char *indent4 = " "; const char *indent8 = " "; BLI_dynstr_append(dynstr, "{\n"); @@ -75,9 +65,6 @@ char *BKE_mesh_debug_info(const Mesh *me) CustomData_debug_info_from_layers(&me->fdata, indent8, dynstr); BLI_dynstr_append(dynstr, " ),\n"); - BLI_dynstr_append(dynstr, indent4); - mesh_debug_info_from_cd_flag(me, dynstr); - BLI_dynstr_append(dynstr, "}\n"); ret = BLI_dynstr_get_cstring(dynstr); diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index efbea35bfcf..09982f15afa 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -1006,6 +1006,44 @@ void BKE_mesh_legacy_bevel_weight_to_layers(Mesh *mesh) /** \} */ /* -------------------------------------------------------------------- */ +/** \name Edge Crease Conversion + * \{ */ + +void BKE_mesh_legacy_edge_crease_from_layers(Mesh *mesh) +{ + using namespace blender; + MutableSpan<MEdge> edges = mesh->edges_for_write(); + if (const float *creases = static_cast<const float *>( + CustomData_get_layer(&mesh->edata, CD_CREASE))) { + mesh->cd_flag |= ME_CDFLAG_EDGE_CREASE; + for (const int i : edges.index_range()) { + edges[i].crease_legacy = std::clamp(creases[i], 0.0f, 1.0f) * 255.0f; + } + } + else { + mesh->cd_flag &= ~ME_CDFLAG_EDGE_CREASE; + for (const int i : edges.index_range()) { + edges[i].crease_legacy = 0; + } + } +} + +void BKE_mesh_legacy_edge_crease_to_layers(Mesh *mesh) +{ + using namespace blender; + const Span<MEdge> edges = mesh->edges(); + if (mesh->cd_flag & ME_CDFLAG_EDGE_CREASE) { + float *creases = static_cast<float *>( + CustomData_add_layer(&mesh->edata, CD_CREASE, CD_CONSTRUCT, nullptr, edges.size())); + for (const int i : edges.index_range()) { + creases[i] = edges[i].crease_legacy / 255.0f; + } + } +} + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Hide Attribute and Legacy Flag Conversion * \{ */ diff --git a/source/blender/blenkernel/intern/multires_reshape.h b/source/blender/blenkernel/intern/multires_reshape.h index 5e2822ad5df..f27618b2145 100644 --- a/source/blender/blenkernel/intern/multires_reshape.h +++ b/source/blender/blenkernel/intern/multires_reshape.h @@ -101,6 +101,8 @@ typedef struct MultiresReshapeContext { /* Vertex crease custom data layer, null if none is present. */ const float *cd_vertex_crease; + /* Edge crease custom data layer, null if none is present. */ + const float *cd_edge_crease; } MultiresReshapeContext; /** diff --git a/source/blender/blenkernel/intern/multires_reshape_smooth.c b/source/blender/blenkernel/intern/multires_reshape_smooth.c index e887f543dc5..1463404069f 100644 --- a/source/blender/blenkernel/intern/multires_reshape_smooth.c +++ b/source/blender/blenkernel/intern/multires_reshape_smooth.c @@ -482,13 +482,14 @@ static bool is_crease_supported(const MultiresReshapeSmoothContext *reshape_smoo /* Get crease which will be used for communication to OpenSubdiv topology. * Note that simple subdivision treats all base edges as infinitely sharp. */ -static char get_effective_crease_char(const MultiresReshapeSmoothContext *reshape_smooth_context, - const MEdge *base_edge) +static float get_effective_crease(const MultiresReshapeSmoothContext *reshape_smooth_context, + const int base_edge_index) { if (!is_crease_supported(reshape_smooth_context)) { return 255; } - return base_edge->crease; + const float *creases = reshape_smooth_context->reshape_context->cd_vertex_crease; + return creases ? creases[base_edge_index] : 0.0f; } static float get_effective_crease_float(const MultiresReshapeSmoothContext *reshape_smooth_context, @@ -812,7 +813,6 @@ static void foreach_edge(const struct SubdivForeachContext *foreach_context, const int subdiv_v2) { MultiresReshapeSmoothContext *reshape_smooth_context = foreach_context->user_data; - const MultiresReshapeContext *reshape_context = reshape_smooth_context->reshape_context; if (reshape_smooth_context->smoothing_type == MULTIRES_SUBDIVIDE_LINEAR) { if (!is_loose) { @@ -832,8 +832,7 @@ static void foreach_edge(const struct SubdivForeachContext *foreach_context, return; } /* Edges without crease are to be ignored as well. */ - const MEdge *base_edge = &reshape_context->base_edges[coarse_edge_index]; - const char crease = get_effective_crease_char(reshape_smooth_context, base_edge); + const char crease = get_effective_crease(reshape_smooth_context, coarse_edge_index); if (crease == 0) { return; } @@ -846,7 +845,6 @@ static void geometry_init_loose_information(MultiresReshapeSmoothContext *reshap const Mesh *base_mesh = reshape_context->base_mesh; const MPoly *base_mpoly = reshape_context->base_polys; const MLoop *base_mloop = reshape_context->base_loops; - const MEdge *base_edge = reshape_context->base_edges; reshape_smooth_context->non_loose_base_edge_map = BLI_BITMAP_NEW(base_mesh->totedge, "non_loose_base_edge_map"); @@ -859,8 +857,8 @@ static void geometry_init_loose_information(MultiresReshapeSmoothContext *reshap if (!BLI_BITMAP_TEST_BOOL(reshape_smooth_context->non_loose_base_edge_map, loop->e)) { BLI_BITMAP_ENABLE(reshape_smooth_context->non_loose_base_edge_map, loop->e); - const char crease = get_effective_crease_char(reshape_smooth_context, &base_edge[loop->e]); - if (crease != 0) { + const float crease = get_effective_crease(reshape_smooth_context, loop->e); + if (crease > 0.0f) { ++num_used_edges; } } diff --git a/source/blender/blenkernel/intern/multires_reshape_util.c b/source/blender/blenkernel/intern/multires_reshape_util.c index 5b60394feda..4fc1217158c 100644 --- a/source/blender/blenkernel/intern/multires_reshape_util.c +++ b/source/blender/blenkernel/intern/multires_reshape_util.c @@ -206,6 +206,7 @@ bool multires_reshape_context_create_from_object(MultiresReshapeContext *reshape reshape_context->top.grid_size = BKE_subdiv_grid_size_from_level(reshape_context->top.level); reshape_context->cd_vertex_crease = CustomData_get_layer(&base_mesh->vdata, CD_CREASE); + reshape_context->cd_edge_crease = CustomData_get_layer(&base_mesh->edata, CD_CREASE); context_init_commoon(reshape_context); @@ -271,6 +272,8 @@ bool multires_reshape_context_create_from_subdiv(MultiresReshapeContext *reshape reshape_context->base_edges = BKE_mesh_edges(base_mesh); reshape_context->base_polys = BKE_mesh_polys(base_mesh); reshape_context->base_loops = BKE_mesh_loops(base_mesh); + reshape_context->cd_vertex_crease = (const float *)CustomData_get_layer(&base_mesh->edata, + CD_CREASE); reshape_context->subdiv = subdiv; reshape_context->need_free_subdiv = false; diff --git a/source/blender/blenkernel/intern/subdiv_converter_mesh.c b/source/blender/blenkernel/intern/subdiv_converter_mesh.c index b13aec37c78..369e7f7060a 100644 --- a/source/blender/blenkernel/intern/subdiv_converter_mesh.c +++ b/source/blender/blenkernel/intern/subdiv_converter_mesh.c @@ -41,6 +41,8 @@ typedef struct ConverterStorage { /* CustomData layer for vertex sharpnesses. */ const float *cd_vertex_crease; + /* CustomData layer for edge sharpness. */ + const float *cd_edge_crease; /* Indexed by loop index, value denotes index of face-varying vertex * which corresponds to the UV coordinate. */ @@ -157,12 +159,11 @@ static float get_edge_sharpness(const OpenSubdiv_Converter *converter, int manif return 10.0f; } #endif - if (!storage->settings.use_creases) { + if (!storage->settings.use_creases || storage->cd_edge_crease == NULL) { return 0.0f; } const int edge_index = storage->manifold_edge_index_reverse[manifold_edge_index]; - const MEdge *medge = storage->edges; - return BKE_subdiv_crease_to_sharpness_char(medge[edge_index].crease); + return BKE_subdiv_crease_to_sharpness_f(storage->cd_edge_crease[edge_index]); } static bool is_infinite_sharp_vertex(const OpenSubdiv_Converter *converter, @@ -398,6 +399,7 @@ static void init_user_data(OpenSubdiv_Converter *converter, user_data->polys = BKE_mesh_polys(mesh); user_data->loops = BKE_mesh_loops(mesh); user_data->cd_vertex_crease = CustomData_get_layer(&mesh->vdata, CD_CREASE); + user_data->cd_edge_crease = CustomData_get_layer(&mesh->edata, CD_CREASE); user_data->loop_uv_indices = NULL; initialize_manifold_indices(user_data); converter->user_data = user_data; diff --git a/source/blender/blenkernel/intern/subdiv_mesh.cc b/source/blender/blenkernel/intern/subdiv_mesh.cc index 44bdd6e6d06..04389b43fd9 100644 --- a/source/blender/blenkernel/intern/subdiv_mesh.cc +++ b/source/blender/blenkernel/intern/subdiv_mesh.cc @@ -518,9 +518,11 @@ static bool subdiv_mesh_topology_info(const SubdivForeachContext *foreach_contex const int *UNUSED(subdiv_polygon_offset)) { /* Multi-resolution grid data will be applied or become invalid after subdivision, - * so don't try to preserve it and use memory. */ + * so don't try to preserve it and use memory. Crease values should also not be interpolated. */ CustomData_MeshMasks mask = CD_MASK_EVERYTHING; mask.lmask &= ~CD_MASK_MULTIRES_GRIDS; + mask.vmask &= ~CD_MASK_CREASE; + mask.emask &= ~CD_MASK_CREASE; SubdivMeshContext *subdiv_context = static_cast<SubdivMeshContext *>(foreach_context->user_data); subdiv_context->subdiv_mesh = BKE_mesh_new_nomain_from_template_ex( @@ -790,7 +792,7 @@ static void subdiv_copy_edge_data(SubdivMeshContext *ctx, { const int subdiv_edge_index = subdiv_edge - ctx->subdiv_edges; if (coarse_edge == nullptr) { - subdiv_edge->crease = 0; + /* TODO: Ensure crease layer isn't copied to result. */ subdiv_edge->flag = 0; if (!ctx->settings->use_optimal_display) { subdiv_edge->flag |= ME_EDGERENDER; diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index 0e5f9f30243..98d4ee6e8c2 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -592,11 +592,12 @@ static void ss_sync_ccg_from_derivedmesh(CCGSubSurf *ss, me = medge; index = (int *)dm->getEdgeDataArray(dm, CD_ORIGINDEX); + const float *creases = (const float *)dm->getEdgeDataArray(dm, CD_CREASE); for (i = 0; i < totedge; i++, me++) { CCGEdge *e; float crease; - crease = useFlatSubdiv ? creaseFactor : me->crease * creaseFactor / 255.0f; + crease = useFlatSubdiv ? creaseFactor : (creases ? creases[i] * creaseFactor : 0.0f); ccgSubSurf_syncEdge( ss, POINTER_FROM_INT(i), POINTER_FROM_UINT(me->v1), POINTER_FROM_UINT(me->v2), crease, &e); @@ -949,7 +950,6 @@ BLI_INLINE void ccgDM_to_MEdge(MEdge *med, const int v1, const int v2, const sho { med->v1 = v1; med->v2 = v2; - med->crease = 0; med->flag = flag; } |