Blender V5.0
multires_reshape_vertcos.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 "multires_reshape.hh"
10
11#include "BLI_math_vector.h"
12
13#include "BKE_subdiv_foreach.hh"
14#include "BKE_subdiv_mesh.hh"
15
21
27 const blender::bke::subdiv::ForeachContext *foreach_context,
28 const GridCoord *grid_coord,
29 const int subdiv_vertex_index)
30{
31 MultiresReshapeAssignVertcosContext *reshape_vertcos_context =
32 static_cast<MultiresReshapeAssignVertcosContext *>(foreach_context->user_data);
33 const blender::float3 &coordinate = reshape_vertcos_context->positions[subdiv_vertex_index];
34
36 reshape_vertcos_context->reshape_context, grid_coord);
37 BLI_assert(grid_element.displacement != nullptr);
38 *grid_element.displacement = coordinate;
39}
40
41/* TODO(sergey): De-duplicate with similar function in multires_reshape_smooth.cc */
43 const blender::bke::subdiv::ForeachContext *foreach_context,
44 const PTexCoord *ptex_coord,
45 const int subdiv_vertex_index)
46{
47 const MultiresReshapeAssignVertcosContext *reshape_vertcos_context =
48 static_cast<MultiresReshapeAssignVertcosContext *>(foreach_context->user_data);
49 const MultiresReshapeContext *reshape_context = reshape_vertcos_context->reshape_context;
50
51 const GridCoord grid_coord = multires_reshape_ptex_coord_to_grid(reshape_context, ptex_coord);
52 const int face_index = multires_reshape_grid_to_face_index(reshape_context,
53 grid_coord.grid_index);
54
55 const int num_corners = reshape_context->base_faces[face_index].size();
56 const int start_grid_index = reshape_context->face_start_grid_index[face_index];
57 const int corner = grid_coord.grid_index - start_grid_index;
58
59 if (grid_coord.u == 0.0f && grid_coord.v == 0.0f) {
60 for (int current_corner = 0; current_corner < num_corners; ++current_corner) {
61 GridCoord corner_grid_coord = grid_coord;
62 corner_grid_coord.grid_index = start_grid_index + current_corner;
64 foreach_context, &corner_grid_coord, subdiv_vertex_index);
65 }
66 return;
67 }
68
70 foreach_context, &grid_coord, subdiv_vertex_index);
71
72 if (grid_coord.u == 0.0f) {
73 GridCoord prev_grid_coord;
74 prev_grid_coord.grid_index = start_grid_index + ((corner + num_corners - 1) % num_corners);
75 prev_grid_coord.u = grid_coord.v;
76 prev_grid_coord.v = 0.0f;
77
79 foreach_context, &prev_grid_coord, subdiv_vertex_index);
80 }
81
82 if (grid_coord.v == 0.0f) {
83 GridCoord next_grid_coord;
84 next_grid_coord.grid_index = start_grid_index + ((corner + 1) % num_corners);
85 next_grid_coord.u = 0.0f;
86 next_grid_coord.v = grid_coord.u;
87
89 foreach_context, &next_grid_coord, subdiv_vertex_index);
90 }
91}
92
93/* blender::bke::subdiv::ForeachContext::topology_info() */
95 const blender::bke::subdiv::ForeachContext *foreach_context,
96 const int num_vertices,
97 const int /*num_edges*/,
98 const int /*num_loops*/,
99 const int /*num_faces*/,
100 const int * /*subdiv_face_offset*/)
101{
102 MultiresReshapeAssignVertcosContext *reshape_vertcos_context =
103 static_cast<MultiresReshapeAssignVertcosContext *>(foreach_context->user_data);
104 if (num_vertices != reshape_vertcos_context->positions.size()) {
105 return false;
106 }
107 return true;
108}
109
110/* blender::bke::subdiv::ForeachContext::vertex_inner() */
112 const blender::bke::subdiv::ForeachContext *foreach_context,
113 void * /*tls_v*/,
114 const int ptex_face_index,
115 const float ptex_face_u,
116 const float ptex_face_v,
117 const int /*coarse_face_index*/,
118 const int /*coarse_face_corner*/,
119 const int subdiv_vertex_index)
120{
121 PTexCoord ptex_coord{};
122 ptex_coord.ptex_face_index = ptex_face_index;
123 ptex_coord.u = ptex_face_u;
124 ptex_coord.v = ptex_face_v;
125 multires_reshape_vertcos_foreach_vertex(foreach_context, &ptex_coord, subdiv_vertex_index);
126}
127
128/* blender::bke::subdiv::ForeachContext::vertex_every_corner() */
130 const blender::bke::subdiv::ForeachContext *foreach_context,
131 void * /*tls_v*/,
132 const int ptex_face_index,
133 const float ptex_face_u,
134 const float ptex_face_v,
135 const int /*coarse_vertex_index*/,
136 const int /*coarse_face_index*/,
137 const int /*coarse_face_corner*/,
138 const int subdiv_vertex_index)
139{
140 PTexCoord ptex_coord{};
141 ptex_coord.ptex_face_index = ptex_face_index;
142 ptex_coord.u = ptex_face_u;
143 ptex_coord.v = ptex_face_v;
144 multires_reshape_vertcos_foreach_vertex(foreach_context, &ptex_coord, subdiv_vertex_index);
145}
146
147/* blender::bke::subdiv::ForeachContext::vertex_every_edge() */
149 const blender::bke::subdiv::ForeachContext *foreach_context,
150 void * /*tls_v*/,
151 const int ptex_face_index,
152 const float ptex_face_u,
153 const float ptex_face_v,
154 const int /*coarse_edge_index*/,
155 const int /*coarse_face_index*/,
156 const int /*coarse_face_corner*/,
157 const int subdiv_vertex_index)
158{
159 PTexCoord ptex_coord{};
160 ptex_coord.ptex_face_index = ptex_face_index;
161 ptex_coord.u = ptex_face_u;
162 ptex_coord.v = ptex_face_v;
163 multires_reshape_vertcos_foreach_vertex(foreach_context, &ptex_coord, subdiv_vertex_index);
164}
165
167 const MultiresReshapeContext *reshape_context, const blender::Span<blender::float3> positions)
168{
169 MultiresReshapeAssignVertcosContext reshape_vertcos_context{};
170 reshape_vertcos_context.reshape_context = reshape_context;
171 reshape_vertcos_context.positions = positions;
172
173 blender::bke::subdiv::ForeachContext foreach_context{};
178 foreach_context.user_data = &reshape_vertcos_context;
179
181 mesh_settings.resolution = (1 << reshape_context->reshape.level) + 1;
182 mesh_settings.use_optimal_display = false;
183
185 reshape_context->subdiv, &foreach_context, &mesh_settings, reshape_context->base_mesh);
186}
#define BLI_assert(a)
Definition BLI_assert.h:46
int multires_reshape_grid_to_face_index(const MultiresReshapeContext *reshape_context, int grid_index)
ReshapeGridElement multires_reshape_grid_element_for_grid_coord(const MultiresReshapeContext *reshape_context, const GridCoord *grid_coord)
GridCoord multires_reshape_ptex_coord_to_grid(const MultiresReshapeContext *reshape_context, const PTexCoord *ptex_coord)
static void multires_reshape_vertcos_foreach_vertex_every_edge(const blender::bke::subdiv::ForeachContext *foreach_context, void *, const int ptex_face_index, const float ptex_face_u, const float ptex_face_v, const int, const int, const int, const int subdiv_vertex_index)
static void multires_reshape_vertcos_foreach_vertex_inner(const blender::bke::subdiv::ForeachContext *foreach_context, void *, const int ptex_face_index, const float ptex_face_u, const float ptex_face_v, const int, const int, const int subdiv_vertex_index)
static void multires_reshape_vertcos_foreach_vertex(const blender::bke::subdiv::ForeachContext *foreach_context, const PTexCoord *ptex_coord, const int subdiv_vertex_index)
static void multires_reshape_vertcos_foreach_single_vertex(const blender::bke::subdiv::ForeachContext *foreach_context, const GridCoord *grid_coord, const int subdiv_vertex_index)
bool multires_reshape_assign_final_coords_from_vertcos(const MultiresReshapeContext *reshape_context, const blender::Span< blender::float3 > positions)
static void multires_reshape_vertcos_foreach_vertex_every_corner(const blender::bke::subdiv::ForeachContext *foreach_context, void *, const int ptex_face_index, const float ptex_face_u, const float ptex_face_v, const int, const int, const int, const int subdiv_vertex_index)
static bool multires_reshape_vertcos_foreach_topology_info(const blender::bke::subdiv::ForeachContext *foreach_context, const int num_vertices, const int, const int, const int, const int *)
bool foreach_subdiv_geometry(Subdiv *subdiv, const ForeachContext *context, const ToMeshSettings *mesh_settings, const Mesh *coarse_mesh)
VecBase< float, 3 > float3
blender::Span< blender::float3 > positions
const MultiresReshapeContext * reshape_context
struct MultiresReshapeContext::@114377305000353127144042327223234020156043120202 reshape
blender::bke::subdiv::Subdiv * subdiv
blender::OffsetIndices< int > base_faces
blender::Array< int > face_start_grid_index
blender::float3 * displacement
ForeachTopologyInformationCb topology_info
ForeachVertexFromCornerCb vertex_every_corner