Blender V5.0
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
53 return nullptr;
54 }
55
56 return subdiv;
57}
58
59#endif
60
62{
63#ifdef WITH_OPENSUBDIV
64 const Mesh *base_mesh = static_cast<const Mesh *>(object->data);
65 if (base_mesh->corners_num == 0) {
66 return;
67 }
68
69 /* Store the grids displacement in object space against the simple limit surface. */
70 {
71 blender::bke::subdiv::Subdiv *subdiv = subdiv_for_simple_to_catmull_clark(object, mmd);
72 MultiresReshapeContext reshape_context;
74 &reshape_context, object, mmd, subdiv, mmd->totlvl))
75 {
77 return;
78 }
79
82 multires_reshape_context_free(&reshape_context);
83
85 }
86
87 /* Calculate the new tangent displacement against the new Catmull-Clark limit surface. */
88 {
89 MultiresReshapeContext reshape_context;
90 if (!multires_reshape_context_create_from_modifier(&reshape_context, object, mmd, mmd->totlvl))
91 {
92 return;
93 }
95 multires_reshape_context_free(&reshape_context);
96 }
97#else
98 UNUSED_VARS(object, mmd);
99#endif
100}
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, eSubdivEvaluatorType evaluator_type, Span< float3 > coarse_vert_positions={}, OpenSubdiv_EvaluatorCache *evaluator_cache=nullptr)
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)