Blender  V3.3
multires_versioning.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2020 Blender Foundation. All rights reserved. */
3 
8 #include "MEM_guardedalloc.h"
9 
10 #include "DNA_mesh_types.h"
11 #include "DNA_modifier_types.h"
12 #include "DNA_object_types.h"
13 
14 #include "BKE_subdiv.h"
15 #include "BKE_subdiv_eval.h"
16 
17 #include "multires_reshape.h"
19 #include "subdiv_converter.h"
20 
22  const OpenSubdiv_Converter *UNUSED(converter), int UNUSED(manifold_edge_index))
23 {
24  return 10.0f;
25 }
26 
28  const OpenSubdiv_Converter *UNUSED(converter), int UNUSED(manifold_vertex_index))
29 {
30  return true;
31 }
32 
34 {
35  SubdivSettings subdiv_settings;
36  BKE_multires_subdiv_settings_init(&subdiv_settings, mmd);
37 
38  Mesh *base_mesh = object->data;
39 
40  OpenSubdiv_Converter converter;
41  BKE_subdiv_converter_init_for_mesh(&converter, &subdiv_settings, base_mesh);
44 
45  Subdiv *subdiv = BKE_subdiv_new_from_converter(&subdiv_settings, &converter);
46  BKE_subdiv_converter_free(&converter);
47 
49  BKE_subdiv_free(subdiv);
50  return NULL;
51  }
52 
53  return subdiv;
54 }
55 
57 {
58  const Mesh *base_mesh = object->data;
59  if (base_mesh->totloop == 0) {
60  return;
61  }
62 
63  /* Store the grids displacement in object space against the simple limit surface. */
64  {
65  Subdiv *subdiv = subdiv_for_simple_to_catmull_clark(object, mmd);
66  MultiresReshapeContext reshape_context;
68  &reshape_context, object, mmd, subdiv, mmd->totlvl)) {
69  BKE_subdiv_free(subdiv);
70  return;
71  }
72 
73  multires_reshape_store_original_grids(&reshape_context);
75  multires_reshape_context_free(&reshape_context);
76 
77  BKE_subdiv_free(subdiv);
78  }
79 
80  /* Calculate the new tangent displacement against the new Catmull-Clark limit surface. */
81  {
82  MultiresReshapeContext reshape_context;
84  &reshape_context, object, mmd, mmd->totlvl)) {
85  return;
86  }
88  multires_reshape_context_free(&reshape_context);
89  }
90 }
void BKE_multires_subdiv_settings_init(struct SubdivSettings *settings, const struct MultiresModifierData *mmd)
void BKE_subdiv_free(Subdiv *subdiv)
Definition: subdiv.c:184
Subdiv * BKE_subdiv_new_from_converter(const SubdivSettings *settings, struct OpenSubdiv_Converter *converter)
Definition: subdiv.c:98
@ SUBDIV_EVALUATOR_TYPE_CPU
bool BKE_subdiv_eval_begin_from_mesh(struct Subdiv *subdiv, const struct Mesh *mesh, const float(*coarse_vertex_cos)[3], eSubdivEvaluatorType evaluator_type, struct OpenSubdiv_EvaluatorCache *evaluator_cache)
#define UNUSED(x)
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)
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, struct Object *object, 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_object_grids_to_tangent_displacement(const MultiresReshapeContext *reshape_context)
static float simple_to_catmull_clark_get_edge_sharpness(const OpenSubdiv_Converter *UNUSED(converter), int UNUSED(manifold_edge_index))
static bool simple_to_catmull_clark_is_infinite_sharp_vertex(const OpenSubdiv_Converter *UNUSED(converter), int UNUSED(manifold_vertex_index))
static Subdiv * subdiv_for_simple_to_catmull_clark(Object *object, MultiresModifierData *mmd)
void multires_do_versions_simple_to_catmull_clark(Object *object, MultiresModifierData *mmd)
int totloop
bool(* isInfiniteSharpVertex)(const struct OpenSubdiv_Converter *converter, const int vertex_index)
float(* getEdgeSharpness)(const struct OpenSubdiv_Converter *converter, const int edge_index)
void BKE_subdiv_converter_free(struct OpenSubdiv_Converter *converter)
void BKE_subdiv_converter_init_for_mesh(struct OpenSubdiv_Converter *converter, const struct SubdivSettings *settings, const struct Mesh *mesh)