Blender V4.5
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
8
9#include "DNA_mesh_types.h"
10#include "DNA_modifier_types.h"
11#include "DNA_object_types.h"
12
13#include "BKE_subdiv.hh"
14#include "BKE_subdiv_eval.hh"
15
16#include "multires_reshape.hh"
18#include "subdiv_converter.hh"
19
20#ifdef WITH_OPENSUBDIV
21
22static float simple_to_catmull_clark_get_edge_sharpness(const OpenSubdiv_Converter * /*converter*/,
23 int /*manifold_edge_index*/)
24{
25 return 10.0f;
26}
27
28static bool simple_to_catmull_clark_is_infinite_sharp_vertex(
29 const OpenSubdiv_Converter * /*converter*/, int /*manifold_vertex_index*/)
30{
31 return true;
32}
33
34static blender::bke::subdiv::Subdiv *subdiv_for_simple_to_catmull_clark(Object *object,
36{
37 using namespace blender::bke;
38 subdiv::Settings subdiv_settings;
39 BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
40
41 const Mesh *base_mesh = static_cast<const Mesh *>(object->data);
42
43 OpenSubdiv_Converter converter;
44 subdiv::converter_init_for_mesh(&converter, &subdiv_settings, base_mesh);
45 converter.getEdgeSharpness = simple_to_catmull_clark_get_edge_sharpness;
46 converter.isInfiniteSharpVertex = simple_to_catmull_clark_is_infinite_sharp_vertex;
47
48 subdiv::Subdiv *subdiv = subdiv::new_from_converter(&subdiv_settings, &converter);
49 subdiv::converter_free(&converter);
50
52 subdiv, base_mesh, {}, subdiv::SUBDIV_EVALUATOR_TYPE_CPU, nullptr))
53 {
55 return nullptr;
56 }
57
58 return subdiv;
59}
60
61#endif
62
64{
65#ifdef WITH_OPENSUBDIV
66 const Mesh *base_mesh = static_cast<const Mesh *>(object->data);
67 if (base_mesh->corners_num == 0) {
68 return;
69 }
70
71 /* Store the grids displacement in object space against the simple limit surface. */
72 {
73 blender::bke::subdiv::Subdiv *subdiv = subdiv_for_simple_to_catmull_clark(object, mmd);
74 MultiresReshapeContext reshape_context;
76 &reshape_context, object, mmd, subdiv, mmd->totlvl))
77 {
79 return;
80 }
81
84 multires_reshape_context_free(&reshape_context);
85
87 }
88
89 /* Calculate the new tangent displacement against the new Catmull-Clark limit surface. */
90 {
91 MultiresReshapeContext reshape_context;
92 if (!multires_reshape_context_create_from_modifier(&reshape_context, object, mmd, mmd->totlvl))
93 {
94 return;
95 }
97 multires_reshape_context_free(&reshape_context);
98 }
99#else
100 UNUSED_VARS(object, mmd);
101#endif
102}
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.
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:190
void converter_init_for_mesh(OpenSubdiv_Converter *converter, const Settings *settings, const Mesh *mesh)
bool eval_begin_from_mesh(Subdiv *subdiv, const Mesh *mesh, Span< float3 > coarse_vert_positions, eSubdivEvaluatorType evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache)
Subdiv * new_from_converter(const Settings *settings, OpenSubdiv_Converter *converter)
Definition subdiv.cc:98
void converter_free(OpenSubdiv_Converter *converter)
int corners_num
float(* getEdgeSharpness)(const OpenSubdiv_Converter *converter, const int edge_index)
bool(* isInfiniteSharpVertex)(const OpenSubdiv_Converter *converter, const int vertex_index)