Blender V4.3
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
9#pragma once
10
12#include "BLI_offset_indices.hh"
13#include "BLI_span.hh"
14#include "BLI_sys_types.h"
15#include "BLI_virtual_array.hh"
16
17#include "BKE_multires.hh"
18
19struct Depsgraph;
20struct GridPaintMask;
21struct MDisps;
22struct Mesh;
24struct Object;
25namespace blender::bke::subdiv {
26struct Subdiv;
27}
28struct SubdivCCG;
29
31 /* NOTE: Only available when context is initialized from object. */
32 Depsgraph *depsgraph;
34
36
37 /* Base mesh from original object.
38 * NOTE: Does NOT include any leading modifiers in it. */
45
46 /* Subdivision surface created for multires modifier.
47 *
48 * The coarse mesh of this subdivision surface is a base mesh with all deformation modifiers
49 * leading multires applied on it. */
52
53 struct {
54 /* Level at which displacement is being assigned to.
55 * It will be propagated up from this level to top.level. */
56 int level;
57
58 /* Grid size for reshape.level. */
61
62 struct {
63 /* Top level of the displacement grids.
64 * The displacement will be propagated up to this level. */
65 int level;
66
67 /* Grid size for top.level. */
68 int grid_size;
69 } top;
70
71 struct {
72 /* Copy of original displacement and painting masks. */
76
77 /* Number of grids which are required for base_mesh. */
79
80 /* Destination displacement and mask.
81 * Points to a custom data on a destination mesh. */
84
85 /* Indexed by face index, gives first grid index of the face. */
87
88 /* Indexed by grid index, contains face index in the base mesh from which the grid has
89 * been created (in other words, index of a face which contains loop corresponding to the grid
90 * index). */
92
93 /* Indexed by ptex face index, gives first grid index of the ptex face.
94 *
95 * For non-quad base faces ptex face is created for every face corner, so it's similar to a
96 * grid in this case. In this case start grid index will be the only one for this ptex face.
97 *
98 * For quad base faces there is a single ptex face but 4 grids. So in this case there will be
99 * 4 grids for the ptex, starting at a value stored in this mapping. */
101
102 /* Indexed by base face index, returns first ptex face index corresponding
103 * to that base face. */
105
106 /* Vertex crease custom data layer, empty if none is present. */
108 /* Edge crease custom data layer, empty if none is present. */
110};
111
116struct GridCoord {
118 float u, v;
119};
120
124struct PTexCoord {
126 float u, v;
127};
128
135 float *mask;
136};
137
139 float displacement[3];
140 float mask;
141};
142
143/* --------------------------------------------------------------------
144 * Construct/destruct reshape context.
145 */
146
152 Object *object,
153 const MultiresModifierData *mmd);
154
161 Depsgraph *depsgraph,
162 Object *object,
164
166 Depsgraph *depsgraph,
167 Object *object,
169
171 SubdivCCG *subdiv_ccg,
172 Mesh *base_mesh,
173 int top_level);
174
176 Object *object,
178 int top_level);
179
181 Object *object,
184 int top_level);
185
188
189/* --------------------------------------------------------------------
190 * Helper accessors.
191 */
192
197 int grid_index);
198
202int multires_reshape_grid_to_corner(const MultiresReshapeContext *reshape_context, int grid_index);
203
204bool multires_reshape_is_quad_face(const MultiresReshapeContext *reshape_context, int face_index);
205
210 int grid_index);
211
216 const GridCoord *grid_coord);
217
222 const PTexCoord *ptex_coord);
223
229 int face_index,
230 int corner,
231 const float dPdu[3],
232 const float dPdv[3],
233 float r_tangent_matrix[3][3]);
234
240 const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord);
242 const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord);
243
248 const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord);
249
250/* --------------------------------------------------------------------
251 * Sample limit surface of the base mesh.
252 */
253
259 const GridCoord *grid_coord,
260 float r_P[3],
261 float r_tangent_matrix[3][3]);
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,
286 const float (*vert_coords)[3],
287 int num_vert_coords);
288
289/* --------------------------------------------------------------------
290 * Functions specific to reshaping from CCG.
291 */
292
303 SubdivCCG *subdiv_ccg);
304
305/* --------------------------------------------------------------------
306 * Functions specific to reshaping from MDISPS.
307 */
308
313 const MultiresReshapeContext *reshape_context);
314
319 const MultiresReshapeContext *reshape_context);
320
321/* --------------------------------------------------------------------
322 * Displacement smooth.
323 */
324
333 const MultiresReshapeContext *reshape_context);
334
343
344/* --------------------------------------------------------------------
345 * Displacement, space conversion.
346 */
347
353
355 const MultiresReshapeContext *reshape_context);
356
357/* --------------------------------------------------------------------
358 * Apply base.
359 */
360
368
374
379
eMultiresSubdivideModeType
const Depsgraph * depsgraph
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)
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_smooth_object_grids(const MultiresReshapeContext *reshape_context, enum eMultiresSubdivideModeType mode)
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)
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
struct MultiresReshapeContext::@92 top
struct MultiresReshapeContext::@91 reshape
blender::Span< int > base_corner_verts
MultiresModifierData * mmd
struct MultiresReshapeContext::@93 orig