Blender V5.0
multires_reshape.hh
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#pragma once
10
12#include "BLI_offset_indices.hh"
13#include "BLI_span.hh"
14#include "BLI_virtual_array.hh"
15
16#include "BKE_multires.hh"
17
18struct Depsgraph;
19struct GridPaintMask;
20struct MDisps;
21struct Mesh;
23struct Object;
24namespace blender::bke::subdiv {
25struct Subdiv;
26}
27struct SubdivCCG;
28
30 /* NOTE: Only available when context is initialized from object. */
31 Depsgraph *depsgraph;
33
35
36 /* Base mesh from original object.
37 * NOTE: Does NOT include any leading modifiers in it. */
44
45 /* Subdivision surface created for multires modifier.
46 *
47 * The coarse mesh of this subdivision surface is a base mesh with all deformation modifiers
48 * leading multires applied on it. */
51
52 struct {
53 /* Level at which displacement is being assigned to.
54 * It will be propagated up from this level to top.level. */
55 int level;
56
57 /* Grid size for reshape.level. */
60
61 struct {
62 /* Top level of the displacement grids.
63 * The displacement will be propagated up to this level. */
64 int level;
65
66 /* Grid size for top.level. */
67 int grid_size;
68 } top;
69
70 struct {
71 /* Copy of original displacement and painting masks. */
75
76 /* Number of grids which are required for base_mesh. */
78
79 /* Destination displacement and mask.
80 * Points to a custom data on a destination mesh. */
83
84 /* Indexed by face index, gives first grid index of the face. */
86
87 /* Indexed by grid index, contains face index in the base mesh from which the grid has
88 * been created (in other words, index of a face which contains loop corresponding to the grid
89 * index). */
91
92 /* Indexed by ptex face index, gives first grid index of the ptex face.
93 *
94 * For non-quad base faces ptex face is created for every face corner, so it's similar to a
95 * grid in this case. In this case start grid index will be the only one for this ptex face.
96 *
97 * For quad base faces there is a single ptex face but 4 grids. So in this case there will be
98 * 4 grids for the ptex, starting at a value stored in this mapping. */
100
101 /* Indexed by base face index, returns first ptex face index corresponding
102 * to that base face. */
104
105 /* Vertex crease custom data layer, empty if none is present. */
107 /* Edge crease custom data layer, empty if none is present. */
109};
110
115struct GridCoord {
117 float u, v;
118};
119
123struct PTexCoord {
125 float u, v;
126};
127
136
141
142/* --------------------------------------------------------------------
143 * Construct/destruct reshape context.
144 */
145
151 Object *object,
152 const MultiresModifierData *mmd);
153
160 Depsgraph *depsgraph,
161 Object *object,
163
165 Depsgraph *depsgraph,
166 Object *object,
168
170 SubdivCCG *subdiv_ccg,
171 Mesh *base_mesh,
172 int top_level);
173
175 Object *object,
177 int top_level);
178
180 Object *object,
183 int top_level);
184
187
188/* --------------------------------------------------------------------
189 * Helper accessors.
190 */
191
196 int grid_index);
197
201int multires_reshape_grid_to_corner(const MultiresReshapeContext *reshape_context, int grid_index);
202
203bool multires_reshape_is_quad_face(const MultiresReshapeContext *reshape_context, int face_index);
204
209 int grid_index);
210
215 const GridCoord *grid_coord);
216
221 const PTexCoord *ptex_coord);
222
228 int face_index,
229 int corner,
230 const blender::float3 &dPdu,
231 const blender::float3 &dPdv,
232 blender::float3x3 &r_tangent_matrix);
233
239 const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord);
241 const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord);
242
247 const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord);
248
249/* --------------------------------------------------------------------
250 * Sample limit surface of the base mesh.
251 */
252
258 const MultiresReshapeContext *reshape_context,
259 const GridCoord *grid_coord,
260 blender::float3 &r_P,
261 blender::float3x3 &r_tangent_matrix);
262
263/* --------------------------------------------------------------------
264 * Custom data preparation.
265 */
266
270void multires_reshape_ensure_grids(Mesh *mesh, int level);
271
272/* --------------------------------------------------------------------
273 * Functions specific to reshaping from a set of vertices in a object position.
274 */
275
285 const MultiresReshapeContext *reshape_context, blender::Span<blender::float3> positions);
286
287/* --------------------------------------------------------------------
288 * Functions specific to reshaping from CCG.
289 */
290
301 SubdivCCG *subdiv_ccg);
302
303/* --------------------------------------------------------------------
304 * Functions specific to reshaping from MDISPS.
305 */
306
311 const MultiresReshapeContext *reshape_context);
312
317 const MultiresReshapeContext *reshape_context);
318
319/* --------------------------------------------------------------------
320 * Displacement smooth.
321 */
322
331 const MultiresReshapeContext *reshape_context);
332
340 enum MultiresSubdivideModeType mode);
341
342/* --------------------------------------------------------------------
343 * Displacement, space conversion.
344 */
345
351
353 const MultiresReshapeContext *reshape_context);
354
355/* --------------------------------------------------------------------
356 * Apply base.
357 */
358
366
372
377
MultiresSubdivideModeType
BPy_StructRNA * depsgraph
uint top
int multires_reshape_grid_to_face_index(const MultiresReshapeContext *reshape_context, int grid_index)
void multires_reshape_assign_final_elements_from_orig_mdisps(const MultiresReshapeContext *reshape_context)
void multires_reshape_smooth_object_grids(const MultiresReshapeContext *reshape_context, enum MultiresSubdivideModeType mode)
bool multires_reshape_is_quad_face(const MultiresReshapeContext *reshape_context, int face_index)
void multires_reshape_smooth_object_grids_with_details(const MultiresReshapeContext *reshape_context)
void multires_reshape_assign_final_coords_from_mdisps(const MultiresReshapeContext *reshape_context)
bool multires_reshape_context_create_from_object(MultiresReshapeContext *reshape_context, Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
void multires_reshape_apply_base_refit_base_mesh(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)
ReshapeGridElement multires_reshape_grid_element_for_grid_coord(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
int multires_reshape_grid_to_ptex_index(const MultiresReshapeContext *reshape_context, int grid_index)
PTexCoord multires_reshape_grid_coord_to_ptex(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
void multires_reshape_context_free(MultiresReshapeContext *reshape_context)
void multires_reshape_store_original_grids(MultiresReshapeContext *reshape_context)
void multires_reshape_ensure_grids(Mesh *mesh, int level)
void multires_reshape_apply_base_refine_from_base(MultiresReshapeContext *reshape_context)
int multires_reshape_grid_to_corner(const MultiresReshapeContext *reshape_context, int grid_index)
void multires_reshape_free_original_grids(MultiresReshapeContext *reshape_context)
blender::bke::subdiv::Subdiv * multires_reshape_create_subdiv(Depsgraph *depsgraph, Object *object, const MultiresModifierData *mmd)
void multires_reshape_apply_base_update_mesh_coords(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)
bool multires_reshape_context_create_from_base_mesh(MultiresReshapeContext *reshape_context, Depsgraph *depsgraph, Object *object, MultiresModifierData *mmd)
ReshapeConstGridElement multires_reshape_orig_grid_element_for_grid_coord(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
ReshapeGridElement multires_reshape_grid_element_for_ptex_coord(const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord)
bool multires_reshape_assign_final_coords_from_ccg(const MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg)
GridCoord multires_reshape_ptex_coord_to_grid(const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord)
void multires_reshape_tangent_matrix_for_corner(const MultiresReshapeContext *reshape_context, int face_index, int corner, const blender::float3 &dPdu, const blender::float3 &dPdv, blender::float3x3 &r_tangent_matrix)
void multires_reshape_evaluate_base_mesh_limit_at_grid(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, blender::float3 &r_P, blender::float3x3 &r_tangent_matrix)
void multires_reshape_apply_base_refine_from_deform(MultiresReshapeContext *reshape_context)
bool multires_reshape_assign_final_coords_from_vertcos(const MultiresReshapeContext *reshape_context, blender::Span< blender::float3 > positions)
bool multires_reshape_context_create_from_ccg(MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg, Mesh *base_mesh, int top_level)
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
struct MultiresReshapeContext::@114377305000353127144042327223234020156043120202 reshape
blender::bke::subdiv::Subdiv * subdiv
blender::Span< int > face_ptex_offset
blender::VArraySpan< float > cd_vertex_crease
blender::Array< int > ptex_start_grid_index
blender::Span< int > base_corner_edges
GridPaintMask * grid_paint_masks
blender::VArraySpan< float > cd_edge_crease
struct MultiresReshapeContext::@224024350043126210016356042105244264040105373265 orig
blender::OffsetIndices< int > base_faces
blender::Span< blender::int2 > base_edges
blender::Array< int > face_start_grid_index
blender::Span< blender::float3 > base_positions
blender::Span< int > base_corner_verts
blender::Array< int > grid_to_face_index
MultiresModifierData * mmd
blender::float3 * displacement