[Bf-blender-cvs] [d71b6d37fe4] sculpt-dev: Array Brush: Initial radial and linear array editing
Pablo Dobarro
noreply at git.blender.org
Sun Jul 25 20:38:04 CEST 2021
Commit: d71b6d37fe4398635c535391d5fa6d26c4f1bad5
Author: Pablo Dobarro
Date: Fri Jul 23 21:29:07 2021 +0200
Branches: sculpt-dev
https://developer.blender.org/rBd71b6d37fe4398635c535391d5fa6d26c4f1bad5
Array Brush: Initial radial and linear array editing
===================================================================
M source/blender/blenkernel/BKE_paint.h
M source/blender/editors/sculpt_paint/sculpt_array.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 9291079db8f..066faa6f959 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -477,8 +477,11 @@ typedef struct SculptArray {
float total_length;
} path;
-
+ int mode;
float normal[3];
+ float direction[3];
+ float radial_angle;
+ float initial_radial_angle;
bool source_mat_valid;
float source_origin[3];
diff --git a/source/blender/editors/sculpt_paint/sculpt_array.c b/source/blender/editors/sculpt_paint/sculpt_array.c
index 24a79b73f92..cb316b40d47 100644
--- a/source/blender/editors/sculpt_paint/sculpt_array.c
+++ b/source/blender/editors/sculpt_paint/sculpt_array.c
@@ -296,11 +296,13 @@ static void sculpt_array_mesh_build(Sculpt *sd, Object *ob, SculptArray *array)
}
-static SculptArray *sculpt_array_cache_create(Object *ob, const int num_copies) {
+static SculptArray *sculpt_array_cache_create(Object *ob, eBrushArrayDeformType deform_type, const int num_copies) {
SculptArray *array = MEM_callocN(sizeof(SculptArray), "Sculpt Array");
array->num_copies = num_copies;
+ array->mode = deform_type;
+
const char symm = SCULPT_mesh_symmetry_xyz_get(ob);
for (char symm_it = 0; symm_it <= symm; symm_it++) {
if (!SCULPT_is_symmetry_iteration_valid(symm_it, symm)) {
@@ -326,7 +328,7 @@ static void sculpt_array_init(Object *ob, Brush *brush, SculptArray *array) {
/* TODO: add options. */
copy_v3_v3(array->normal, ss->cache->view_normal);
-
+ array->radial_angle = 2.0f * M_PI;
for (int symm_pass = 0; symm_pass < PAINT_SYMM_AREAS; symm_pass++) {
if (array->copies[symm_pass] == NULL) {
@@ -411,6 +413,10 @@ static void scultp_array_basis_from_direction(float r_mat[4][4], SculptArray *ar
normalize_v3(r_mat[2]);
}
+static float *sculpt_array_delta_from_path(SculptArray *array) {
+ return array->path.points[array->path.tot_points - 1].co;
+}
+
static void sculpt_array_update_copy(StrokeCache *cache, SculptArray *array, SculptArrayCopy *copy, Brush *brush) {
float copy_position[3];
@@ -420,13 +426,15 @@ static void sculpt_array_update_copy(StrokeCache *cache, SculptArray *array, Scu
float direction[3];
eBrushArrayDeformType array_type = brush->array_deform_type;
+ float delta[3];
+ copy_v3_v3(delta, sculpt_array_delta_from_path(array));
switch (array_type)
{
case BRUSH_ARRAY_DEFORM_LINEAR: {
const float fade = ((float)copy->index + 1.0f) / (float)(array->num_copies);
- mul_v3_v3fl(copy->mat[3], cache->grab_delta, fade);
- normalize_v3_v3(direction, cache->grab_delta);
+ mul_v3_v3fl(copy->mat[3], delta, fade);
+ normalize_v3_v3(direction, delta);
scale = cache->bstrength;
}
break;
@@ -434,9 +442,10 @@ static void sculpt_array_update_copy(StrokeCache *cache, SculptArray *array, Scu
case BRUSH_ARRAY_DEFORM_RADIAL: {
float pos[3];
const float fade = ((float)copy->index + 1.0f) / (float)(array->num_copies);
- copy_v3_v3(pos, cache->grab_delta);
- rotate_v3_v3v3fl(copy->mat[3], pos, cache->view_normal, fade * M_PI * 2.0f);
+ copy_v3_v3(pos, delta);
+ rotate_v3_v3v3fl(copy->mat[3], pos, array->normal, fade * array->radial_angle);
copy_v3_v3(direction, copy->mat[3]);
+ //sub_v3_v3v3(direction, copy->mat[3], array->source_origin);
scale = cache->bstrength;
}
break;
@@ -688,6 +697,7 @@ void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
ScultpArrayPathPoint *point = &array->path.points[i];
copy_v3_v3(point->orco, point->co);
}
+ array->initial_radial_angle = array->radial_angle;
/* Update Geometry Orco. */
const int totvert = SCULPT_vertex_count_get(ss);
@@ -703,24 +713,20 @@ void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
//sub_v3_v3v3(array->orco[i], SCULPT_vertex_co_get(ss, i), copy->mat[3]);
float co[3];
float source_origin_symm[3];
+ copy_v3_v3(co, SCULPT_vertex_co_get(ss, i));
flip_v3_v3(source_origin_symm, array->source_origin, array_symm_pass);
- sub_v3_v3v3(co, SCULPT_vertex_co_get(ss, i), source_origin_symm);
- mul_v3_m4v3(co, copy->imat, co);
mul_v3_m4v3(co, array->source_imat, co);
+ mul_v3_m4v3(co, copy->imat, co);
+ sub_v3_v3v3(co, co, source_origin_symm);
copy_v3_v3(array->orco[i], co);
-
-
-
-
-
-
-
- }
+ }
}
SculptArray *array = ss->array;
+ if (array->mode == BRUSH_ARRAY_DEFORM_PATH) {
+ /* Deform path */
for (int i = 0; i < array->path.tot_points; i++) {
ScultpArrayPathPoint *point = &array->path.points[i];
float point_co[3];
@@ -732,11 +738,29 @@ void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
}
madd_v3_v3v3fl(point->co, point->orco, ss->cache->grab_delta, fade);
}
-
for (int i = 0; i < array->path.tot_points; i++) {
sculpt_array_path_point_update(array, i);
}
+ }
+ else {
+ /* Tweak radial angle. */
+ /*
+ const float factor = 1.0f - ( len_v3(ss->cache->grab_delta) / ss->cache->initial_radius);
+ array->radial_angle = array->initial_radial_angle * clamp_f(factor, 0.0f, 1.0f);
+ */
+
+ float array_disp_co[3];
+ float brush_co[3];
+ add_v3_v3v3(brush_co, ss->cache->initial_location, ss->cache->grab_delta);
+ sub_v3_v3(brush_co, array->source_origin);
+ normalize_v3(brush_co);
+ normalize_v3_v3(array_disp_co, sculpt_array_delta_from_path(array));
+ array->radial_angle = angle_signed_on_axis_v3v3_v3(brush_co, array_disp_co, array->normal);
+
+
+ }
+
sculpt_array_update(ob, brush, ss->array);
sculpt_array_deform(sd, ob, nodes, totnode);
@@ -759,7 +783,7 @@ void SCULPT_do_array_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
sculpt_array_cache_free(ss->array);
}
- ss->array = sculpt_array_cache_create(ob, brush->array_count);
+ ss->array = sculpt_array_cache_create(ob, brush->array_deform_type, brush->array_count);
sculpt_array_init(ob, brush, ss->array);
sculpt_array_stroke_sample_add(ob, ss->array);
sculpt_array_mesh_build(sd, ob, ss->array);
More information about the Bf-blender-cvs
mailing list