Blender V4.3
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
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
22
28 const blender::bke::subdiv::ForeachContext *foreach_context,
29 const GridCoord *grid_coord,
30 const int subdiv_vertex_index)
31{
32 MultiresReshapeAssignVertcosContext *reshape_vertcos_context =
33 static_cast<MultiresReshapeAssignVertcosContext *>(foreach_context->user_data);
34 const float *coordinate = reshape_vertcos_context->vert_coords[subdiv_vertex_index];
35
37 reshape_vertcos_context->reshape_context, grid_coord);
38 BLI_assert(grid_element.displacement != nullptr);
39 copy_v3_v3(grid_element.displacement, coordinate);
40}
41
42/* TODO(sergey): De-duplicate with similar function in multires_reshape_smooth.cc */
44 const blender::bke::subdiv::ForeachContext *foreach_context,
45 const PTexCoord *ptex_coord,
46 const int subdiv_vertex_index)
47{
48 const MultiresReshapeAssignVertcosContext *reshape_vertcos_context =
49 static_cast<MultiresReshapeAssignVertcosContext *>(foreach_context->user_data);
50 const MultiresReshapeContext *reshape_context = reshape_vertcos_context->reshape_context;
51
52 const GridCoord grid_coord = multires_reshape_ptex_coord_to_grid(reshape_context, ptex_coord);
53 const int face_index = multires_reshape_grid_to_face_index(reshape_context,
54 grid_coord.grid_index);
55
56 const int num_corners = reshape_context->base_faces[face_index].size();
57 const int start_grid_index = reshape_context->face_start_grid_index[face_index];
58 const int corner = grid_coord.grid_index - start_grid_index;
59
60 if (grid_coord.u == 0.0f && grid_coord.v == 0.0f) {
61 for (int current_corner = 0; current_corner < num_corners; ++current_corner) {
62 GridCoord corner_grid_coord = grid_coord;
63 corner_grid_coord.grid_index = start_grid_index + current_corner;
65 foreach_context, &corner_grid_coord, subdiv_vertex_index);
66 }
67 return;
68 }
69
71 foreach_context, &grid_coord, subdiv_vertex_index);
72
73 if (grid_coord.u == 0.0f) {
74 GridCoord prev_grid_coord;
75 prev_grid_coord.grid_index = start_grid_index + ((corner + num_corners - 1) % num_corners);
76 prev_grid_coord.u = grid_coord.v;
77 prev_grid_coord.v = 0.0f;
78
80 foreach_context, &prev_grid_coord, subdiv_vertex_index);
81 }
82
83 if (grid_coord.v == 0.0f) {
84 GridCoord next_grid_coord;
85 next_grid_coord.grid_index = start_grid_index + ((corner + 1) % num_corners);
86 next_grid_coord.u = 0.0f;
87 next_grid_coord.v = grid_coord.u;
88
90 foreach_context, &next_grid_coord, subdiv_vertex_index);
91 }
92}
93
94/* blender::bke::subdiv::ForeachContext::topology_info() */
96 const blender::bke::subdiv::ForeachContext *foreach_context,
97 const int num_vertices,
98 const int /*num_edges*/,
99 const int /*num_loops*/,
100 const int /*num_faces*/,
101 const int * /*subdiv_face_offset*/)
102{
103 MultiresReshapeAssignVertcosContext *reshape_vertcos_context =
104 static_cast<MultiresReshapeAssignVertcosContext *>(foreach_context->user_data);
105 if (num_vertices != reshape_vertcos_context->num_vert_coords) {
106 return false;
107 }
108 return true;
109}
110
111/* blender::bke::subdiv::ForeachContext::vertex_inner() */
113 const blender::bke::subdiv::ForeachContext *foreach_context,
114 void * /*tls_v*/,
115 const int ptex_face_index,
116 const float ptex_face_u,
117 const float ptex_face_v,
118 const int /*coarse_face_index*/,
119 const int /*coarse_face_corner*/,
120 const int subdiv_vertex_index)
121{
122 PTexCoord ptex_coord{};
123 ptex_coord.ptex_face_index = ptex_face_index;
124 ptex_coord.u = ptex_face_u;
125 ptex_coord.v = ptex_face_v;
126 multires_reshape_vertcos_foreach_vertex(foreach_context, &ptex_coord, subdiv_vertex_index);
127}
128
129/* blender::bke::subdiv::ForeachContext::vertex_every_corner() */
131 const blender::bke::subdiv::ForeachContext *foreach_context,
132 void * /*tls_v*/,
133 const int ptex_face_index,
134 const float ptex_face_u,
135 const float ptex_face_v,
136 const int /*coarse_vertex_index*/,
137 const int /*coarse_face_index*/,
138 const int /*coarse_face_corner*/,
139 const int subdiv_vertex_index)
140{
141 PTexCoord ptex_coord{};
142 ptex_coord.ptex_face_index = ptex_face_index;
143 ptex_coord.u = ptex_face_u;
144 ptex_coord.v = ptex_face_v;
145 multires_reshape_vertcos_foreach_vertex(foreach_context, &ptex_coord, subdiv_vertex_index);
146}
147
148/* blender::bke::subdiv::ForeachContext::vertex_every_edge() */
150 const blender::bke::subdiv::ForeachContext *foreach_context,
151 void * /*tls_v*/,
152 const int ptex_face_index,
153 const float ptex_face_u,
154 const float ptex_face_v,
155 const int /*coarse_edge_index*/,
156 const int /*coarse_face_index*/,
157 const int /*coarse_face_corner*/,
158 const int subdiv_vertex_index)
159{
160 PTexCoord ptex_coord{};
161 ptex_coord.ptex_face_index = ptex_face_index;
162 ptex_coord.u = ptex_face_u;
163 ptex_coord.v = ptex_face_v;
164 multires_reshape_vertcos_foreach_vertex(foreach_context, &ptex_coord, subdiv_vertex_index);
165}
166
168 const MultiresReshapeContext *reshape_context,
169 const float (*vert_coords)[3],
170 const int num_vert_coords)
171{
172 MultiresReshapeAssignVertcosContext reshape_vertcos_context{};
173 reshape_vertcos_context.reshape_context = reshape_context;
174 reshape_vertcos_context.vert_coords = vert_coords;
175 reshape_vertcos_context.num_vert_coords = num_vert_coords;
176
177 blender::bke::subdiv::ForeachContext foreach_context{};
179 foreach_context.vertex_inner = multires_reshape_vertcos_foreach_vertex_inner;
180 foreach_context.vertex_every_edge = multires_reshape_vertcos_foreach_vertex_every_edge;
181 foreach_context.vertex_every_corner = multires_reshape_vertcos_foreach_vertex_every_corner;
182 foreach_context.user_data = &reshape_vertcos_context;
183
185 mesh_settings.resolution = (1 << reshape_context->reshape.level) + 1;
186 mesh_settings.use_optimal_display = false;
187
189 reshape_context->subdiv, &foreach_context, &mesh_settings, reshape_context->base_mesh);
190}
#define BLI_assert(a)
Definition BLI_assert.h:50
MINLINE void copy_v3_v3(float r[3], const float a[3])
draw_view in_light_buf[] float
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)
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)
bool multires_reshape_assign_final_coords_from_vertcos(const MultiresReshapeContext *reshape_context, const float(*vert_coords)[3], const int num_vert_coords)
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)
const MultiresReshapeContext * reshape_context
blender::bke::subdiv::Subdiv * subdiv
blender::OffsetIndices< int > base_faces
struct MultiresReshapeContext::@91 reshape
ForeachTopologyInformationCb topology_info