forked from bartvdbraak/blender
Revert "Sculpt: Multires Heal Brush"
This reverts commit ae349eb2d50524b030f702b8ed3fd75531d4db7e.
This commit is contained in:
parent
4425e0cd64
commit
969a571e0f
Binary file not shown.
Binary file not shown.
@ -314,17 +314,6 @@ void BKE_subdiv_ccg_eval_limit_point(const SubdivCCG *subdiv_ccg,
|
||||
const SubdivCCGCoord *coord,
|
||||
float r_point[3]);
|
||||
|
||||
void BKE_subdiv_ccg_eval_limit_point_and_derivatives(const SubdivCCG *subdiv_ccg,
|
||||
const SubdivCCGCoord *coord,
|
||||
float r_point[3],
|
||||
float r_dPdu[3],
|
||||
float r_dPdv[3]);
|
||||
|
||||
void BKE_subdiv_ccg_get_tangent_matrix(const SubdivCCG *subdiv_ccg,
|
||||
const SubdivCCGCoord *coord,
|
||||
float mat[3][3],
|
||||
float r_point[3]);
|
||||
|
||||
typedef enum SubdivCCGAdjacencyType {
|
||||
SUBDIV_CCG_ADJACENT_NONE,
|
||||
SUBDIV_CCG_ADJACENT_VERTEX,
|
||||
|
@ -37,7 +37,6 @@
|
||||
#include "BKE_ccg.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_mesh.h"
|
||||
#include "BKE_multires.h"
|
||||
#include "BKE_subdiv.h"
|
||||
#include "BKE_subdiv_eval.h"
|
||||
|
||||
@ -2103,38 +2102,4 @@ void BKE_subdiv_ccg_eval_limit_point(const SubdivCCG *subdiv_ccg,
|
||||
BKE_subdiv_eval_limit_point(subdiv, ptex_face_index, u, v, r_point);
|
||||
}
|
||||
|
||||
void BKE_subdiv_ccg_eval_limit_point_and_derivatives(const SubdivCCG *subdiv_ccg,
|
||||
const SubdivCCGCoord *coord,
|
||||
float r_point[3],
|
||||
float r_dPdu[3],
|
||||
float r_dPdv[3])
|
||||
{
|
||||
Subdiv *subdiv = subdiv_ccg->subdiv;
|
||||
int ptex_face_index;
|
||||
float u, v;
|
||||
subdiv_ccg_coord_to_ptex_coord(subdiv_ccg, coord, &ptex_face_index, &u, &v);
|
||||
BKE_subdiv_eval_limit_point_and_derivatives(
|
||||
subdiv, ptex_face_index, u, v, r_point, r_dPdu, r_dPdv);
|
||||
}
|
||||
|
||||
void BKE_subdiv_ccg_get_tangent_matrix(const SubdivCCG *subdiv_ccg,
|
||||
const SubdivCCGCoord *coord,
|
||||
float mat[3][3],
|
||||
float r_point[3])
|
||||
{
|
||||
int ptex_face_index;
|
||||
float u, v;
|
||||
float du[3], dv[3];
|
||||
|
||||
const int face_index = BKE_subdiv_ccg_grid_to_face_index(subdiv_ccg, coord->grid_index);
|
||||
const SubdivCCGFace *faces = subdiv_ccg->faces;
|
||||
const SubdivCCGFace *face = &faces[face_index];
|
||||
const float corner = coord->grid_index - face->start_grid_index;
|
||||
|
||||
subdiv_ccg_coord_to_ptex_coord(subdiv_ccg, coord, &ptex_face_index, &u, &v);
|
||||
|
||||
BKE_subdiv_ccg_eval_limit_point_and_derivatives(subdiv_ccg, coord, r_point, du, dv);
|
||||
BKE_multires_construct_tangent_matrix(mat, du, dv, corner);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@ -751,7 +751,7 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
|
||||
brush.sculpt.cloth
|
||||
brush.sculpt.crease
|
||||
brush.sculpt.displacement_eraser
|
||||
brush.sculpt.displacement_heal
|
||||
brush.sculpt.displacement_smear
|
||||
brush.sculpt.draw
|
||||
brush.sculpt.draw_face_sets
|
||||
brush.sculpt.draw_sharp
|
||||
|
@ -2229,7 +2229,6 @@ static float brush_strength(const Sculpt *sd,
|
||||
case SCULPT_TOOL_DRAW_SHARP:
|
||||
case SCULPT_TOOL_LAYER:
|
||||
return alpha * flip * pressure * overlap * feather;
|
||||
case SCULPT_TOOL_DISPLACEMENT_HEAL:
|
||||
case SCULPT_TOOL_DISPLACEMENT_ERASER:
|
||||
return alpha * pressure * overlap * feather;
|
||||
case SCULPT_TOOL_CLOTH:
|
||||
@ -3401,9 +3400,6 @@ static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush, UnifiedPaintSe
|
||||
case SCULPT_TOOL_DISPLACEMENT_SMEAR:
|
||||
SCULPT_do_displacement_smear_brush(sd, ob, nodes, totnode);
|
||||
break;
|
||||
case SCULPT_TOOL_DISPLACEMENT_HEAL:
|
||||
SCULPT_do_displacement_heal_brush(sd, ob, nodes, totnode);
|
||||
break;
|
||||
case SCULPT_TOOL_PAINT:
|
||||
SCULPT_do_paint_brush(sd, ob, nodes, totnode);
|
||||
break;
|
||||
@ -3954,8 +3950,6 @@ static const char *sculpt_tool_name(Sculpt *sd)
|
||||
return "Multires Displacement Eraser";
|
||||
case SCULPT_TOOL_DISPLACEMENT_SMEAR:
|
||||
return "Multires Displacement Smear";
|
||||
case SCULPT_TOOL_DISPLACEMENT_HEAL:
|
||||
return "Multires Heal";
|
||||
case SCULPT_TOOL_PAINT:
|
||||
return "Paint Brush";
|
||||
case SCULPT_TOOL_SMEAR:
|
||||
|
@ -2845,181 +2845,3 @@ void SCULPT_do_mask_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Multires Heal Brush
|
||||
* \{ */
|
||||
|
||||
BLI_INLINE int grid_xy_to_vertex(int x, int y, int grid_i, int gridsize)
|
||||
{
|
||||
return grid_i * gridsize * gridsize + y * gridsize + x;
|
||||
}
|
||||
|
||||
typedef struct DisplacementHealTaskData {
|
||||
Object *ob;
|
||||
Brush *brush;
|
||||
Sculpt *sd;
|
||||
PBVHNode **nodes;
|
||||
BLI_bitmap *bitmap;
|
||||
float plane_view[3];
|
||||
float bstrength;
|
||||
} DisplacementHealTaskData;
|
||||
|
||||
static void do_displacement_heal_cb(void *__restrict userdata,
|
||||
const int n,
|
||||
const TaskParallelTLS *__restrict tls)
|
||||
{
|
||||
DisplacementHealTaskData *data = userdata;
|
||||
SculptSession *ss = data->ob->sculpt;
|
||||
|
||||
PBVHNode *node = data->nodes[n];
|
||||
|
||||
CCGElem **grids;
|
||||
|
||||
int *grid_indices, totgrid, maxgrid, gridsize;
|
||||
const float bstrength = data->bstrength;
|
||||
|
||||
BKE_pbvh_node_get_grids(ss->pbvh, node, &grid_indices, &totgrid, &maxgrid, &gridsize, &grids);
|
||||
|
||||
float(*disps)[3] = MEM_calloc_arrayN(gridsize * gridsize, sizeof(float) * 3, __func__);
|
||||
float(*mats)[16] = MEM_calloc_arrayN(gridsize * gridsize, sizeof(float) * 16, __func__);
|
||||
float(*limits)[3] = MEM_calloc_arrayN(gridsize * gridsize, sizeof(float) * 3, __func__);
|
||||
|
||||
bool modified = false;
|
||||
|
||||
for (int i = 0; i < totgrid; i++) {
|
||||
const int grid_i = grid_indices[i];
|
||||
|
||||
for (int x = 0; x < gridsize; x++) {
|
||||
for (int y = 0; y < gridsize; y++) {
|
||||
int vertex = grid_xy_to_vertex(x, y, grid_i, gridsize);
|
||||
|
||||
SubdivCCGCoord coord = {.grid_index = grid_i, .x = x, .y = y};
|
||||
int locali = y * gridsize + x;
|
||||
float mat[3][3], p[3];
|
||||
|
||||
BKE_subdiv_ccg_get_tangent_matrix(ss->subdiv_ccg, &coord, mat, p);
|
||||
copy_m3_m3(mats[locali], mat);
|
||||
|
||||
invert_m3(mat);
|
||||
|
||||
float disp[3];
|
||||
copy_v3_v3(disp, SCULPT_vertex_co_get(ss, vertex));
|
||||
sub_v3_v3(disp, p);
|
||||
mul_v3_m3v3(disp, mat, disp);
|
||||
|
||||
float test = dot_v3v3(disp, disp);
|
||||
if (isnan(test) || isinf(test)) {
|
||||
zero_v3(disp);
|
||||
}
|
||||
|
||||
copy_v3_v3(disps[locali], disp);
|
||||
copy_v3_v3(limits[locali], p);
|
||||
}
|
||||
}
|
||||
|
||||
for (int x = 0; x < gridsize; x++) {
|
||||
for (int y = 0; y < gridsize; y++) {
|
||||
int locali = y * gridsize + x;
|
||||
|
||||
int vertex = grid_xy_to_vertex(x, y, grid_i, gridsize);
|
||||
float *disp = disps[locali];
|
||||
float avg[3] = {0.0f, 0.0f, 0.0f};
|
||||
float tot = 0.0f;
|
||||
|
||||
for (int x2 = x - 1; x2 <= x + 1; x2++) {
|
||||
for (int y2 = y - 1; y2 <= y + 1; y2++) {
|
||||
if (x2 < 0 || y2 < 0 || x2 >= gridsize || y2 >= gridsize) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int local2 = y2 * gridsize + x2;
|
||||
|
||||
add_v3_v3(avg, disps[local2]);
|
||||
tot += 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (tot == 0.0f) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mul_v3_fl(avg, 1.0 / tot);
|
||||
|
||||
if (dot_v3v3(avg, avg) == 0.0f || dot_v3v3(disp, disp) == 0.0f) {
|
||||
continue;
|
||||
}
|
||||
|
||||
float ratio = len_v3(disp) / len_v3(avg);
|
||||
|
||||
if (ratio < 1.0f) {
|
||||
continue;
|
||||
}
|
||||
|
||||
modified = true;
|
||||
|
||||
ratio = pow(ratio, 0.1f);
|
||||
float tmp[3];
|
||||
|
||||
copy_v3_v3(tmp, disp);
|
||||
mul_v3_fl(tmp, 1.0f / ratio);
|
||||
mul_v3_m3v3(tmp, mats[locali], tmp);
|
||||
add_v3_v3(tmp, limits[locali]);
|
||||
|
||||
float *co = (float *)SCULPT_vertex_co_get(ss, vertex);
|
||||
float test = dot_v3v3(co, co);
|
||||
|
||||
if (isnan(test) || isinf(test)) {
|
||||
copy_v3_v3(co, tmp);
|
||||
}
|
||||
else {
|
||||
interp_v3_v3v3(co, co, tmp, bstrength);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MEM_SAFE_FREE(disps);
|
||||
MEM_SAFE_FREE(mats);
|
||||
MEM_SAFE_FREE(limits);
|
||||
|
||||
if (modified) {
|
||||
BKE_pbvh_node_mark_update(node);
|
||||
}
|
||||
}
|
||||
|
||||
void SCULPT_do_displacement_heal_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
Brush *brush = BKE_paint_brush(&sd->paint);
|
||||
|
||||
if (!ss->pbvh || BKE_pbvh_type(ss->pbvh) != PBVH_GRIDS) {
|
||||
return;
|
||||
}
|
||||
|
||||
SCULPT_boundary_info_ensure(ob);
|
||||
|
||||
const int totvert = SCULPT_vertex_count_get(ss);
|
||||
BLI_bitmap *bitmap = BLI_BITMAP_NEW(totvert, __func__);
|
||||
const float bstrength = fabsf(ss->cache->bstrength);
|
||||
|
||||
/* paranoia check */
|
||||
ss->cache->radius_squared = ss->cache->radius * ss->cache->radius;
|
||||
|
||||
/* Threaded loop over nodes. */
|
||||
DisplacementHealTaskData data = {.sd = sd,
|
||||
.ob = ob,
|
||||
.brush = brush,
|
||||
.bstrength = bstrength,
|
||||
.nodes = nodes,
|
||||
.bitmap = bitmap};
|
||||
|
||||
copy_v3_v3(data.plane_view, ss->cache->view_normal);
|
||||
|
||||
TaskParallelSettings settings;
|
||||
BKE_pbvh_parallel_range_settings(&settings, true, totnode);
|
||||
BLI_task_parallel_range(0, totnode, &data, do_displacement_heal_cb, &settings);
|
||||
|
||||
MEM_SAFE_FREE(bitmap);
|
||||
}
|
||||
/** \} */
|
||||
|
@ -1719,10 +1719,6 @@ void SCULPT_do_slide_relax_brush(struct Sculpt *sd,
|
||||
struct PBVHNode **nodes,
|
||||
int totnode);
|
||||
|
||||
void SCULPT_do_displacement_heal_brush(struct Sculpt *sd,
|
||||
struct Object *ob,
|
||||
struct PBVHNode **nodes,
|
||||
int totnode);
|
||||
void SCULPT_do_displacement_smear_brush(struct Sculpt *sd,
|
||||
struct Object *ob,
|
||||
struct PBVHNode **nodes,
|
||||
|
@ -460,7 +460,6 @@ typedef enum eBrushSculptTool {
|
||||
SCULPT_TOOL_BOUNDARY = 30,
|
||||
SCULPT_TOOL_DISPLACEMENT_ERASER = 31,
|
||||
SCULPT_TOOL_DISPLACEMENT_SMEAR = 32,
|
||||
SCULPT_TOOL_DISPLACEMENT_HEAL = 45 /* use value from sculpt-dev */
|
||||
} eBrushSculptTool;
|
||||
|
||||
/* Brush.uv_sculpt_tool */
|
||||
|
@ -138,7 +138,6 @@ const EnumPropertyItem rna_enum_brush_sculpt_tool_items[] = {
|
||||
{SCULPT_TOOL_PAINT, "PAINT", ICON_BRUSH_SCULPT_DRAW, "Paint", ""},
|
||||
{SCULPT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_SCULPT_DRAW, "Smear", ""},
|
||||
{SCULPT_TOOL_DRAW_FACE_SETS, "DRAW_FACE_SETS", ICON_BRUSH_MASK, "Draw Face Sets", ""},
|
||||
{SCULPT_TOOL_DISPLACEMENT_HEAL, "DISPLACEMENT_HEAL", ICON_BRUSH_MASK, "Multires Heal", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
/* clang-format on */
|
||||
|
Loading…
Reference in New Issue
Block a user