Blender V4.5
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
134 float *mask;
135};
136
138 float displacement[3];
139 float mask;
140};
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 float dPdu[3],
231 const float dPdv[3],
232 float r_tangent_matrix[3][3]);
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 GridCoord *grid_coord,
259 float r_P[3],
260 float r_tangent_matrix[3][3]);
261
262/* --------------------------------------------------------------------
263 * Custom data preparation.
264 */
265
269void multires_reshape_ensure_grids(Mesh *mesh, int level);
270
271/* --------------------------------------------------------------------
272 * Functions specific to reshaping from a set of vertices in a object position.
273 */
274
284 const MultiresReshapeContext *reshape_context,
285 const float (*vert_coords)[3],
286 int num_vert_coords);
287
288/* --------------------------------------------------------------------
289 * Functions specific to reshaping from CCG.
290 */
291
302 SubdivCCG *subdiv_ccg);
303
304/* --------------------------------------------------------------------
305 * Functions specific to reshaping from MDISPS.
306 */
307
312 const MultiresReshapeContext *reshape_context);
313
318 const MultiresReshapeContext *reshape_context);
319
320/* --------------------------------------------------------------------
321 * Displacement smooth.
322 */
323
332 const MultiresReshapeContext *reshape_context);
333
341 enum MultiresSubdivideModeType mode);
342
343/* --------------------------------------------------------------------
344 * Displacement, space conversion.
345 */
346
352
354 const MultiresReshapeContext *reshape_context);
355
356/* --------------------------------------------------------------------
357 * Apply base.
358 */
359
367
373
378
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)
bool multires_reshape_assign_final_coords_from_vertcos(const MultiresReshapeContext *reshape_context, const float(*vert_coords)[3], int num_vert_coords)
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)
void multires_reshape_tangent_matrix_for_corner(const MultiresReshapeContext *reshape_context, int face_index, int corner, const float dPdu[3], const float dPdv[3], float r_tangent_matrix[3][3])
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_apply_base_refine_from_deform(MultiresReshapeContext *reshape_context)
void multires_reshape_evaluate_limit_at_grid(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord, float r_P[3], float r_tangent_matrix[3][3])
bool multires_reshape_context_create_from_ccg(MultiresReshapeContext *reshape_context, SubdivCCG *subdiv_ccg, Mesh *base_mesh, int top_level)
struct MultiresReshapeContext::@217025040031013155267033302301341011136345264200 reshape
blender::bke::subdiv::Subdiv * subdiv
blender::VArraySpan< float > cd_vertex_crease
blender::Span< int > base_corner_edges
GridPaintMask * grid_paint_masks
blender::VArraySpan< float > cd_edge_crease
blender::OffsetIndices< int > base_faces
blender::Span< blender::int2 > base_edges
blender::Span< blender::float3 > base_positions
blender::Span< int > base_corner_verts
MultiresModifierData * mmd
struct MultiresReshapeContext::@240345071146130371125365207064366216255363142356 orig