Blender V4.3
multires_versioning.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2020 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "MEM_guardedalloc.h"
10
11#include "DNA_mesh_types.h"
12#include "DNA_modifier_types.h"
13#include "DNA_object_types.h"
14
15#include "BKE_subdiv.hh"
16#include "BKE_subdiv_eval.hh"
17
18#include "multires_reshape.hh"
20#include "subdiv_converter.hh"
21
22#ifdef WITH_OPENSUBDIV
23
24static float simple_to_catmull_clark_get_edge_sharpness(const OpenSubdiv_Converter * /*converter*/,
25 int /*manifold_edge_index*/)
26{
27 return 10.0f;
28}
29
30static bool simple_to_catmull_clark_is_infinite_sharp_vertex(
31 const OpenSubdiv_Converter * /*converter*/, int /*manifold_vertex_index*/)
32{
33 return true;
34}
35
36static blender::bke::subdiv::Subdiv *subdiv_for_simple_to_catmull_clark(Object *object,
38{
39 using namespace blender::bke;
40 subdiv::Settings subdiv_settings;
41 BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
42
43 const Mesh *base_mesh = static_cast<const Mesh *>(object->data);
44
45 OpenSubdiv_Converter converter;
46 subdiv::converter_init_for_mesh(&converter, &subdiv_settings, base_mesh);
47 converter.getEdgeSharpness = simple_to_catmull_clark_get_edge_sharpness;
48 converter.isInfiniteSharpVertex = simple_to_catmull_clark_is_infinite_sharp_vertex;
49
50 subdiv::Subdiv *subdiv = subdiv::new_from_converter(&subdiv_settings, &converter);
51 subdiv::converter_free(&converter);
52
53 if (!subdiv::eval_begin_from_mesh(
54 subdiv, base_mesh, {}, subdiv::SUBDIV_EVALUATOR_TYPE_CPU, nullptr))
55 {
56 subdiv::free(subdiv);
57 return nullptr;
58 }
59
60 return subdiv;
61}
62
63#endif
64
66{
67#ifdef WITH_OPENSUBDIV
68 const Mesh *base_mesh = static_cast<const Mesh *>(object->data);
69 if (base_mesh->corners_num == 0) {
70 return;
71 }
72
73 /* Store the grids displacement in object space against the simple limit surface. */
74 {
75 blender::bke::subdiv::Subdiv *subdiv = subdiv_for_simple_to_catmull_clark(object, mmd);
76 MultiresReshapeContext reshape_context;
78 &reshape_context, object, mmd, subdiv, mmd->totlvl))
79 {
81 return;
82 }
83
86 multires_reshape_context_free(&reshape_context);
87
89 }
90
91 /* Calculate the new tangent displacement against the new Catmull-Clark limit surface. */
92 {
93 MultiresReshapeContext reshape_context;
94 if (!multires_reshape_context_create_from_modifier(&reshape_context, object, mmd, mmd->totlvl))
95 {
96 return;
97 }
99 multires_reshape_context_free(&reshape_context);
100 }
101#else
102 UNUSED_VARS(object, mmd);
103#endif
104}
void BKE_multires_subdiv_settings_init(blender::bke::subdiv::Settings *settings, const MultiresModifierData *mmd)
#define UNUSED_VARS(...)
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
void multires_reshape_assign_final_coords_from_mdisps(const MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_subdiv(MultiresReshapeContext *reshape_context, Object *object, MultiresModifierData *mmd, blender::bke::subdiv::Subdiv *subdiv, int top_level)
void multires_reshape_context_free(MultiresReshapeContext *reshape_context)
void multires_reshape_store_original_grids(MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_modifier(MultiresReshapeContext *reshape_context, Object *object, MultiresModifierData *mmd, int top_level)
void multires_reshape_object_grids_to_tangent_displacement(const MultiresReshapeContext *reshape_context)
void multires_do_versions_simple_to_catmull_clark(Object *object, MultiresModifierData *mmd)
void free(Subdiv *subdiv)
Definition subdiv.cc:192
int corners_num
float(* getEdgeSharpness)(const OpenSubdiv_Converter *converter, const int edge_index)
bool(* isInfiniteSharpVertex)(const OpenSubdiv_Converter *converter, const int vertex_index)