diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_blender_version.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires_reshape.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires_reshape_apply_base.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires_reshape_util.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires_subdiv.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires_versioning.c | 106 |
9 files changed, 146 insertions, 23 deletions
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 987b64c217e..59e6b5629f0 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -39,7 +39,7 @@ extern "C" { /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 0 +#define BLENDER_FILE_SUBVERSION 1 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and show a warning if the file diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index 763011c8d92..5a668532033 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -218,6 +218,13 @@ BLI_INLINE void BKE_multires_construct_tangent_matrix(float tangent_matrix[3][3] const float dPdv[3], const int corner); +/* Versioning. */ + +/* Convert displacement which is stored for simply-subdivided mesh to a Catmull-Clark + * subdivided mesh. */ +void multires_do_versions_simple_to_catmull_clark(struct Object *object, + struct MultiresModifierData *mmd); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index f6df3f1bb62..e6be2fe9531 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -189,6 +189,7 @@ set(SRC intern/multires_reshape_vertcos.c intern/multires_subdiv.c intern/multires_unsubdivide.c + intern/multires_versioning.c intern/nla.c intern/node.c intern/object.c diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index d7ea662a5d6..441da8b134a 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -747,7 +747,6 @@ static DerivedMesh *multires_dm_create_local(Scene *scene, DerivedMesh *dm, int lvl, int totlvl, - int simple, bool alloc_paint_mask, int flags) { @@ -757,7 +756,6 @@ static DerivedMesh *multires_dm_create_local(Scene *scene, mmd.sculptlvl = lvl; mmd.renderlvl = lvl; mmd.totlvl = totlvl; - mmd.simple = simple; flags |= MULTIRES_USE_LOCAL_MMD; if (alloc_paint_mask) { @@ -1081,7 +1079,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene) ob, cddm, totlvl, - mmd->simple, + false, 0, mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, has_mask, @@ -1091,7 +1089,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene) /* create multires DM from original mesh and displacements */ lowdm = multires_dm_create_local( - scene, ob, cddm, lvl, totlvl, mmd->simple, has_mask, MULTIRES_IGNORE_SIMPLIFY); + scene, ob, cddm, lvl, totlvl, has_mask, MULTIRES_IGNORE_SIMPLIFY); cddm->release(cddm); /* gather grid data */ @@ -1156,7 +1154,7 @@ void multires_modifier_update_mdisps(struct DerivedMesh *dm, Scene *scene) ob, cddm, mmd->totlvl, - mmd->simple, + false, 0, mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, has_mask, @@ -1254,7 +1252,7 @@ DerivedMesh *multires_make_derived_from_derived( ob, dm, lvl, - mmd->simple, + false, mmd->flags & eMultiresModifierFlag_ControlEdges, mmd->uv_smooth == SUBSURF_UV_SMOOTH_NONE, flags & MULTIRES_ALLOC_PAINT_MASK, @@ -1368,14 +1366,8 @@ void multiresModifier_sync_levels_ex(Object *ob_dst, } if (mmd_src->totlvl > mmd_dst->totlvl) { - if (mmd_dst->simple) { - multiresModifier_subdivide_to_level( - ob_dst, mmd_dst, mmd_src->totlvl, MULTIRES_SUBDIVIDE_SIMPLE); - } - else { - multiresModifier_subdivide_to_level( - ob_dst, mmd_dst, mmd_src->totlvl, MULTIRES_SUBDIVIDE_CATMULL_CLARK); - } + multiresModifier_subdivide_to_level( + ob_dst, mmd_dst, mmd_src->totlvl, MULTIRES_SUBDIVIDE_CATMULL_CLARK); } else { multires_del_higher(mmd_dst, ob_dst, mmd_src->totlvl); diff --git a/source/blender/blenkernel/intern/multires_reshape.h b/source/blender/blenkernel/intern/multires_reshape.h index 9dec1423eba..36ecf1a6395 100644 --- a/source/blender/blenkernel/intern/multires_reshape.h +++ b/source/blender/blenkernel/intern/multires_reshape.h @@ -172,6 +172,12 @@ bool multires_reshape_context_create_from_modifier(MultiresReshapeContext *resha struct MultiresModifierData *mmd, int top_level); +bool multires_reshape_context_create_from_subdiv(MultiresReshapeContext *reshape_context, + struct Object *object, + struct MultiresModifierData *mmd, + struct Subdiv *subdiv, + int top_level); + void multires_reshape_free_original_grids(MultiresReshapeContext *reshape_context); void multires_reshape_context_free(MultiresReshapeContext *reshape_context); diff --git a/source/blender/blenkernel/intern/multires_reshape_apply_base.c b/source/blender/blenkernel/intern/multires_reshape_apply_base.c index 6e7e2b90c05..b693b1114ba 100644 --- a/source/blender/blenkernel/intern/multires_reshape_apply_base.c +++ b/source/blender/blenkernel/intern/multires_reshape_apply_base.c @@ -81,11 +81,6 @@ static float v3_dist_from_plane(const float v[3], const float center[3], const f void multires_reshape_apply_base_refit_base_mesh(MultiresReshapeContext *reshape_context) { - if (reshape_context->mmd->simple) { - /* Simple subdivisions does not move base mesh verticies, so no refitting is needed. */ - return; - } - Mesh *base_mesh = reshape_context->base_mesh; MeshElemMap *pmap; diff --git a/source/blender/blenkernel/intern/multires_reshape_util.c b/source/blender/blenkernel/intern/multires_reshape_util.c index f3b19961e29..8fb406e54a5 100644 --- a/source/blender/blenkernel/intern/multires_reshape_util.c +++ b/source/blender/blenkernel/intern/multires_reshape_util.c @@ -247,6 +247,22 @@ bool multires_reshape_context_create_from_modifier(MultiresReshapeContext *resha struct MultiresModifierData *mmd, int top_level) { + Subdiv *subdiv = multires_reshape_create_subdiv(NULL, object, mmd); + + const bool result = multires_reshape_context_create_from_subdiv( + reshape_context, object, mmd, subdiv, top_level); + + reshape_context->need_free_subdiv = true; + + return result; +} + +bool multires_reshape_context_create_from_subdiv(MultiresReshapeContext *reshape_context, + struct Object *object, + struct MultiresModifierData *mmd, + struct Subdiv *subdiv, + int top_level) +{ context_zero(reshape_context); Mesh *base_mesh = (Mesh *)object->data; @@ -254,8 +270,8 @@ bool multires_reshape_context_create_from_modifier(MultiresReshapeContext *resha reshape_context->mmd = mmd; reshape_context->base_mesh = base_mesh; - reshape_context->subdiv = multires_reshape_create_subdiv(NULL, object, mmd); - reshape_context->need_free_subdiv = true; + reshape_context->subdiv = subdiv; + reshape_context->need_free_subdiv = false; reshape_context->reshape.level = mmd->totlvl; reshape_context->reshape.grid_size = BKE_subdiv_grid_size_from_level( diff --git a/source/blender/blenkernel/intern/multires_subdiv.c b/source/blender/blenkernel/intern/multires_subdiv.c index 73ef623fbfd..8156814d9f1 100644 --- a/source/blender/blenkernel/intern/multires_subdiv.c +++ b/source/blender/blenkernel/intern/multires_subdiv.c @@ -36,7 +36,7 @@ void BKE_multires_subdiv_settings_init(SubdivSettings *settings, const MultiresModifierData *mmd) { - settings->is_simple = (mmd->simple != 0); + settings->is_simple = false; settings->is_adaptive = true; settings->level = settings->is_simple ? 1 : mmd->quality; settings->use_creases = (mmd->flags & eMultiresModifierFlag_UseCrease); diff --git a/source/blender/blenkernel/intern/multires_versioning.c b/source/blender/blenkernel/intern/multires_versioning.c new file mode 100644 index 00000000000..4c0d7165cd0 --- /dev/null +++ b/source/blender/blenkernel/intern/multires_versioning.c @@ -0,0 +1,106 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2020 by Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup bke + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_mesh_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" + +#include "BKE_subdiv.h" +#include "BKE_subdiv_eval.h" + +#include "multires_reshape.h" +#include "opensubdiv_converter_capi.h" +#include "subdiv_converter.h" + +static float simple_to_catmull_clark_get_edge_sharpness( + const OpenSubdiv_Converter *UNUSED(converter), int UNUSED(manifold_edge_index)) +{ + return 10.0f; +} + +static bool simple_to_catmull_clark_is_infinite_sharp_vertex( + const OpenSubdiv_Converter *UNUSED(converter), int UNUSED(manifold_vertex_index)) +{ + return true; +} + +static Subdiv *subdiv_for_simple_to_catmull_clark(Object *object, MultiresModifierData *mmd) +{ + SubdivSettings subdiv_settings; + BKE_multires_subdiv_settings_init(&subdiv_settings, mmd); + + Mesh *base_mesh = object->data; + + OpenSubdiv_Converter converter; + BKE_subdiv_converter_init_for_mesh(&converter, &subdiv_settings, base_mesh); + converter.getEdgeSharpness = simple_to_catmull_clark_get_edge_sharpness; + converter.isInfiniteSharpVertex = simple_to_catmull_clark_is_infinite_sharp_vertex; + + Subdiv *subdiv = BKE_subdiv_new_from_converter(&subdiv_settings, &converter); + BKE_subdiv_converter_free(&converter); + + if (!BKE_subdiv_eval_begin_from_mesh(subdiv, base_mesh, NULL)) { + BKE_subdiv_free(subdiv); + return NULL; + } + + return subdiv; +} + +void multires_do_versions_simple_to_catmull_clark(Object *object, MultiresModifierData *mmd) +{ + const Mesh *base_mesh = object->data; + if (base_mesh->totloop == 0) { + return; + } + + /* Store the grids displacement in object space against the simple limit surface. */ + { + Subdiv *subdiv = subdiv_for_simple_to_catmull_clark(object, mmd); + MultiresReshapeContext reshape_context; + if (!multires_reshape_context_create_from_subdiv( + &reshape_context, object, mmd, subdiv, mmd->totlvl)) { + BKE_subdiv_free(subdiv); + return; + } + + multires_reshape_store_original_grids(&reshape_context); + multires_reshape_assign_final_coords_from_mdisps(&reshape_context); + multires_reshape_context_free(&reshape_context); + + BKE_subdiv_free(subdiv); + } + + /* Calculate the new tangent displacement against the new Catmull-Clark limit surface. */ + { + MultiresReshapeContext reshape_context; + if (!multires_reshape_context_create_from_modifier( + &reshape_context, object, mmd, mmd->totlvl)) { + return; + } + multires_reshape_object_grids_to_tangent_displacement(&reshape_context); + multires_reshape_context_free(&reshape_context); + } +} |