[Bf-blender-cvs] [5ee0200d439] blender2.8: Multires: Support masks propagation to higher levels
Sergey Sharybin
noreply at git.blender.org
Fri Sep 21 15:31:56 CEST 2018
Commit: 5ee0200d439f5b5697541bb8e7d6ec945c86298e
Author: Sergey Sharybin
Date: Fri Sep 21 15:30:55 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5ee0200d439f5b5697541bb8e7d6ec945c86298e
Multires: Support masks propagation to higher levels
===================================================================
M source/blender/blenkernel/intern/multires_reshape.c
M source/blender/blenkernel/intern/subdiv_ccg.c
===================================================================
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
index f0757a492c9..c051ea3ea22 100644
--- a/source/blender/blenkernel/intern/multires_reshape.c
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -228,21 +228,30 @@ static void multires_reshape_vertex_copy_to_next(
const MPoly *coarse_poly,
const int current_corner,
const MDisps *current_displacement_grid,
+ const GridPaintMask *current_mask_grid,
const int current_grid_x, const int current_grid_y)
{
const int grid_size = ctx->grid_size;
const int next_current_corner = (current_corner + 1) % coarse_poly->totloop;
- MDisps *next_displacement_grid = &ctx->mdisps[
- coarse_poly->loopstart + next_current_corner];
const int next_grid_x = 0;
const int next_grid_y = current_grid_x;
const int current_index = current_grid_y * grid_size + current_grid_x;
const int next_index = next_grid_y * grid_size + next_grid_x;
+ /* Copy displacement. */
+ MDisps *next_displacement_grid = &ctx->mdisps[
+ coarse_poly->loopstart + next_current_corner];
float *next_displacement = next_displacement_grid->disps[next_index];
copy_v3_v3(next_displacement,
current_displacement_grid->disps[current_index]);
SWAP(float, next_displacement[0], next_displacement[1]);
next_displacement[0] = -next_displacement[0];
+ /* Copy mask, if exists. */
+ if (current_mask_grid != NULL) {
+ GridPaintMask *next_mask_grid = &ctx->grid_paint_mask[
+ coarse_poly->loopstart + next_current_corner];
+ next_mask_grid->data[next_index] =
+ current_mask_grid->data[current_index];
+ }
}
static void multires_reshape_vertex_copy_to_prev(
@@ -250,22 +259,31 @@ static void multires_reshape_vertex_copy_to_prev(
const MPoly *coarse_poly,
const int current_corner,
const MDisps *current_displacement_grid,
+ const GridPaintMask *current_mask_grid,
const int current_grid_x, const int current_grid_y)
{
const int grid_size = ctx->grid_size;
const int prev_current_corner =
(current_corner - 1 + coarse_poly->totloop) % coarse_poly->totloop;
- MDisps *prev_displacement_grid = &ctx->mdisps[
- coarse_poly->loopstart + prev_current_corner];
const int prev_grid_x = current_grid_y;
const int prev_grid_y = 0;
const int current_index = current_grid_y * grid_size + current_grid_x;
const int prev_index = prev_grid_y * grid_size + prev_grid_x;
+ /* Copy displacement. */
+ MDisps *prev_displacement_grid = &ctx->mdisps[
+ coarse_poly->loopstart + prev_current_corner];
float *prev_displacement = prev_displacement_grid->disps[prev_index];
copy_v3_v3(prev_displacement,
current_displacement_grid->disps[current_index]);
SWAP(float, prev_displacement[0], prev_displacement[1]);
prev_displacement[1] = -prev_displacement[1];
+ /* Copy mask, if exists. */
+ if (current_mask_grid != NULL) {
+ GridPaintMask *prev_mask_grid = &ctx->grid_paint_mask[
+ coarse_poly->loopstart + prev_current_corner];
+ prev_mask_grid->data[prev_index] =
+ current_mask_grid->data[current_index];
+ }
}
static void copy_boundary_displacement(
@@ -273,19 +291,24 @@ static void copy_boundary_displacement(
const MPoly *coarse_poly,
const int corner,
const int grid_x, const int grid_y,
- const MDisps *displacement_grid)
+ const MDisps *displacement_grid,
+ const GridPaintMask *mask_grid)
{
if (grid_x == 0 && grid_y == 0) {
for (int i = 0; i < coarse_poly->totloop; i++) {
const int current_face_corner =
(corner + i) % coarse_poly->totloop;
- MDisps *current_displacement_grid = &ctx->mdisps[
- coarse_poly->loopstart + current_face_corner];
+ const int grid_index = coarse_poly->loopstart + current_face_corner;
+ MDisps *current_displacement_grid = &ctx->mdisps[grid_index];
+ GridPaintMask *current_mask_grid =
+ mask_grid != NULL ? &ctx->grid_paint_mask[grid_index]
+ : NULL;
multires_reshape_vertex_copy_to_next(
ctx,
coarse_poly,
current_face_corner,
current_displacement_grid,
+ current_mask_grid,
0, 0);
}
}
@@ -295,6 +318,7 @@ static void copy_boundary_displacement(
coarse_poly,
corner,
displacement_grid,
+ mask_grid,
grid_x, grid_y);
}
else if (grid_y == 0) {
@@ -303,6 +327,7 @@ static void copy_boundary_displacement(
coarse_poly,
corner,
displacement_grid,
+ mask_grid,
grid_x, grid_y);
}
}
@@ -368,7 +393,8 @@ static void multires_reshape_vertex_from_final_data(
}
/* Copy boundary to the next/previous grids */
copy_boundary_displacement(
- ctx, coarse_poly, face_corner, grid_x, grid_y, displacement_grid);
+ ctx, coarse_poly, face_corner, grid_x, grid_y,
+ displacement_grid, grid_paint_mask);
}
/* =============================================================================
@@ -383,8 +409,16 @@ typedef struct MultiresPropagateData {
int top_grid_size;
MDisps *old_displacement_grids;
MDisps *new_displacement_grids;
+ GridPaintMask *grid_paint_mask;
} MultiresPropagateData;
+typedef struct MultiresPropagateCornerData {
+ float old_coord[3];
+ float new_coord[3];
+ float coord_delta[3];
+ float mask;
+} MultiresPropagateCornerData;
+
static void multires_reshape_propagate_prepare(
MultiresPropagateData *data,
Object *object,
@@ -423,6 +457,8 @@ static void multires_reshape_propagate_prepare(
data->top_grid_size = (1 << (top_level - 1)) + 1;
data->old_displacement_grids = old_mdisps;
data->new_displacement_grids = mdisps;
+ data->grid_paint_mask =
+ CustomData_get_layer(&coarse_mesh->ldata, CD_GRID_PAINT_MASK);
}
static void multires_reshape_propagate_prepare_from_mmd(
@@ -438,40 +474,97 @@ static void multires_reshape_propagate_prepare_from_mmd(
multires_reshape_propagate_prepare(data, object, level, mmd->totlvl);
}
-static void multires_reshape_propagate_calc_simple_delta(
- float r_delta[3],
+static void multires_reshape_propagate_corner_data(
+ MultiresPropagateCornerData* corner,
const MDisps *old_displacement_grid,
const MDisps *new_displacement_grid,
+ const GridPaintMask *grid_paint_mask,
const int grid_size,
- const int x, const int y)
+ const int grid_skip,
+ const int reshape_x, const int reshape_y)
{
- copy_v3_v3(r_delta, new_displacement_grid->disps[y * grid_size + x]);
+ const int x = reshape_x * grid_skip;
+ const int y = reshape_y * grid_skip;
+ const int grid_index = y * grid_size + x;
if (old_displacement_grid->disps != NULL) {
- sub_v3_v3(r_delta, old_displacement_grid->disps[y * grid_size + x]);
+ copy_v3_v3(corner->old_coord, old_displacement_grid->disps[grid_index]);
+ }
+ else {
+ zero_v3(corner->old_coord);
+ }
+ copy_v3_v3(corner->new_coord, new_displacement_grid->disps[grid_index]);
+ sub_v3_v3v3(corner->coord_delta, corner->new_coord, corner->old_coord);
+ if (grid_paint_mask != NULL) {
+ corner->mask = grid_paint_mask->data[grid_index];
+ }
+ else {
+ corner->mask = 0.0f;
}
}
-static void multires_reshape_propagate_calc_reshape_delta(
- float r_delta[3],
+static void multires_reshape_propagate_all_corners_data(
+ MultiresPropagateCornerData corners[4],
const MDisps *old_displacement_grid,
const MDisps *new_displacement_grid,
+ const GridPaintMask *grid_paint_mask,
const int grid_size,
const int grid_skip,
const int reshape_x, const int reshape_y)
{
- const int x = reshape_x * grid_skip;
- const int y = reshape_y * grid_skip;
- multires_reshape_propagate_calc_simple_delta(
- r_delta,
- old_displacement_grid, new_displacement_grid,
- grid_size,
- x, y);
+ int corner_index = 0;
+ for (int dy = 0; dy <= 1; dy++) {
+ for (int dx = 0; dx <= 1; dx++) {
+ multires_reshape_propagate_corner_data(
+ &corners[corner_index],
+ old_displacement_grid,
+ new_displacement_grid,
+ grid_paint_mask,
+ grid_size,
+ grid_skip,
+ reshape_x + dx, reshape_y + dy);
+ corner_index++;
+ }
+ }
+}
+
+static void multires_reshape_propagate_interpolate_coord(
+ MDisps *new_displacement_grid,
+ const MultiresPropagateCornerData corners[4],
+ const float weights[4],
+ const int x, const int y,
+ const int grid_size)
+{
+ float delta[3];
+ interp_v3_v3v3v3v3(
+ delta,
+ corners[0].coord_delta, corners[1].coord_delta,
+ corners[2].coord_delta, corners[3].coord_delta,
+ weights);
+ const int index = y * grid_size + x;
+ float *new_displacement = new_displacement_grid->disps[index];
+ add_v3_v3(new_displacement, delta);
+}
+
+static void multires_reshape_propagate_interpolate_mask(
+ GridPaintMask *grid_paint_mask,
+ const MultiresPropagateCornerData corners[4],
+ const float weights[4],
+ const int x, const int y,
+ const int grid_size)
+{
+ const int index = y * grid_size + x;
+ grid_paint_mask->data[index] =
+ corners[0].mask * weights[0] +
+ corners[1].mask * weights[1] +
+ corners[2].mask * weights[2] +
+ corners[3].mask * weights[3];
}
static void multires_reshape_propagate_grid(
MultiresPropagateData *data,
const MDisps *old_displacement_grid,
- MDisps *new_displacement_grid)
+ MDisps *new_displacement_grid,
+ GridPaintMask *grid_paint_mask)
{
const int reshape_grid_size = data->reshape_grid_size;
const int top_grid_size = data->top_grid_size;
@@ -485,32 +578,14 @@ static void multires_reshape_propagate_grid(
reshape_x < reshape_grid_size - 1;
reshape_x++)
{
- /* Calculate delta from the reshape. */
- float delta_corners[4][3];
- multires_reshape_propagate_calc_reshape_delta(
- delta_corners[0],
+ MultiresPropagateCornerData corners[4];
+ multires_reshape_propagate_al
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list