[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30234] branches/soc-2010-jwilkins/source/ blender/editors/sculpt_paint/sculpt.c: * bug fix: clay tubes wasn' t working when 'use_original_normal' was enabled
Jason Wilkins
Jason.A.Wilkins at gmail.com
Mon Jul 12 19:25:48 CEST 2010
Revision: 30234
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30234
Author: jwilkins
Date: 2010-07-12 19:25:48 +0200 (Mon, 12 Jul 2010)
Log Message:
-----------
* bug fix: clay tubes wasn't working when 'use_original_normal' was enabled
* renamed 'calc_area_normal' to 'calc_sculpt_normal' and 'calc_area_normal_and_flatten_center' to 'calc_sculpt_plane'
* factored out the code for calculating area normal and flatten center to functions and gave them the old names
Modified Paths:
--------------
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c 2010-07-12 16:24:43 UTC (rev 30233)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c 2010-07-12 17:25:48 UTC (rev 30234)
@@ -918,9 +918,69 @@
}
}
+static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode)
+{
+ int n;
+
+ float out_flip[3] = {0.0f, 0.0f, 0.0f};
+
+ zero_v3(an);
+
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for(n=0; n<totnode; n++) {
+ PBVHVertexIter vd;
+ SculptBrushTest test;
+ SculptUndoNode *unode;
+ float private_an[3] = {0.0f, 0.0f, 0.0f};
+ float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
+
+ unode = sculpt_undo_push_node(ss, nodes[n]);
+ sculpt_brush_test_init(ss, &test);
+
+ if(ss->cache->original) {
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ if(sculpt_brush_test_fast(&test, unode->co[vd.i])) {
+ float fno[3];
+
+ normal_short_to_float_v3(fno, unode->no[vd.i]);
+ add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+ else {
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ if(sculpt_brush_test_fast(&test, vd.co)) {
+ if(vd.no) {
+ float fno[3];
+
+ normal_short_to_float_v3(fno, vd.no);
+ add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
+ }
+ else {
+ add_norm_if(ss->cache->view_normal, private_an, private_out_flip, vd.fno);
+ }
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+
+ #pragma omp critical
+ {
+ add_v3_v3(an, private_an);
+ add_v3_v3(out_flip, private_out_flip);
+ }
+ }
+
+ if (is_zero_v3(an))
+ copy_v3_v3(an, out_flip);
+
+ normalize_v3(an);
+}
+
/* This initializes the faces to be moved for this sculpt for draw/layer/flatten; then it
finds average normal for all active vertices - note that this is called once for each mirroring direction */
-static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode)
+static void calc_sculpt_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode)
{
Brush *brush = paint_brush(&sd->paint);
@@ -952,67 +1012,8 @@
break;
case SCULPT_DISP_DIR_AREA:
- /* this calculates flatten center and area normal together,
- amortizing the memory bandwidth and loop overhead to calculate both at the same time */
- {
- int n;
+ calc_area_normal(sd, ss, an, nodes, totnode);
- float out_flip[3] = {0.0f, 0.0f, 0.0f};
-
- zero_v3(an);
-
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for(n=0; n<totnode; n++) {
- PBVHVertexIter vd;
- SculptBrushTest test;
- SculptUndoNode *unode;
- float private_an[3] = {0.0f, 0.0f, 0.0f};
- float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
-
- unode = sculpt_undo_push_node(ss, nodes[n]);
- sculpt_brush_test_init(ss, &test);
-
- if(ss->cache->original) {
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test_fast(&test, unode->co[vd.i])) {
- float fno[3];
-
- normal_short_to_float_v3(fno, unode->no[vd.i]);
- add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
- }
- }
- BLI_pbvh_vertex_iter_end;
- }
- else {
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test_fast(&test, vd.co)) {
- if(vd.no) {
- float fno[3];
-
- normal_short_to_float_v3(fno, vd.no);
- add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
- }
- else {
- add_norm_if(ss->cache->view_normal, private_an, private_out_flip, vd.fno);
- }
- }
- }
- BLI_pbvh_vertex_iter_end;
- }
-
- #pragma omp critical
- {
- add_v3_v3(an, private_an);
- add_v3_v3(out_flip, private_out_flip);
- }
- }
-
- if (is_zero_v3(an))
- copy_v3_v3(an, out_flip);
-
- normalize_v3(an);
- }
-
default:
break;
}
@@ -1247,7 +1248,7 @@
float bstrength= ss->cache->bstrength;
int n;
- calc_area_normal(sd, ss, area_normal, nodes, totnode);
+ calc_sculpt_normal(sd, ss, area_normal, nodes, totnode);
/* offset with as much as possible factored in already */
mul_v3_v3fl(offset, area_normal, ss->cache->radius);
@@ -1290,7 +1291,7 @@
float flippedbstrength, crease_correction;
int n;
- calc_area_normal(sd, ss, area_normal, nodes, totnode);
+ calc_sculpt_normal(sd, ss, area_normal, nodes, totnode);
/* offset with as much as possible factored in already */
mul_v3_v3fl(offset, area_normal, ss->cache->radius);
@@ -1388,7 +1389,7 @@
float len;
if (brush->normal_weight > 0)
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ss, an, nodes, totnode);
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
@@ -1438,7 +1439,7 @@
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ss, an, nodes, totnode);
cross_v3_v3v3(tmp, an, grab_delta);
cross_v3_v3v3(cono, tmp, an);
@@ -1476,7 +1477,7 @@
float len;
if (brush->normal_weight > 0)
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ss, an, nodes, totnode);
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
@@ -1526,7 +1527,7 @@
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ss, an, nodes, totnode);
cross_v3_v3v3(tmp, an, grab_delta);
cross_v3_v3v3(cono, tmp, an);
@@ -1568,7 +1569,7 @@
static const int flip[8] = { 1, -1, -1, 1, -1, 1, 1, -1 };
float angle = ss->cache->vertex_rotation * flip[ss->cache->mirror_symmetry_pass];
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ss, an, nodes, totnode);
axis_angle_to_mat3(m, an, angle);
@@ -1612,7 +1613,7 @@
if(bstrength < 0)
lim = -lim;
- calc_area_normal(sd, ss, area_normal, nodes, totnode);
+ calc_sculpt_normal(sd, ss, area_normal, nodes, totnode);
mul_v3_v3v3(offset, ss->cache->scale, area_normal);
@@ -1755,8 +1756,99 @@
mul_v3_fl(fc, 1.0f / count);
}
+/* this calculates flatten center and area normal together,
+amortizing the memory bandwidth and loop overhead to calculate both at the same time */
static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float an[3], float fc[3])
{
+ int n;
+
+ // an
+ float out_flip[3] = {0.0f, 0.0f, 0.0f};
+
+ // fc
+ float count = 0;
+
+ // an
+ zero_v3(an);
+
+ // fc
+ zero_v3(fc);
+
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for(n=0; n<totnode; n++) {
+ PBVHVertexIter vd;
+ SculptBrushTest test;
+ SculptUndoNode *unode;
+ float private_an[3] = {0.0f, 0.0f, 0.0f};
+ float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
+ float private_fc[3] = {0.0f, 0.0f, 0.0f};
+ int private_count = 0;
+
+ unode = sculpt_undo_push_node(ss, nodes[n]);
+ sculpt_brush_test_init(ss, &test);
+
+ if(ss->cache->original) {
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ if(sculpt_brush_test_fast(&test, unode->co[vd.i])) {
+ // an
+ float fno[3];
+
+ normal_short_to_float_v3(fno, unode->no[vd.i]);
+ add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
+
+ // fc
+ add_v3_v3(private_fc, vd.co);
+ private_count++;
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+ else {
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ if(sculpt_brush_test_fast(&test, vd.co)) {
+ // an
+ if(vd.no) {
+ float fno[3];
+
+ normal_short_to_float_v3(fno, vd.no);
+ add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
+ }
+ else {
+ add_norm_if(ss->cache->view_normal, private_an, private_out_flip, vd.fno);
+ }
+
+ // fc
+ add_v3_v3(private_fc, vd.co);
+ private_count++;
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+
+ #pragma omp critical
+ {
+ // an
+ add_v3_v3(an, private_an);
+ add_v3_v3(out_flip, private_out_flip);
+
+ // fc
+ add_v3_v3(fc, private_fc);
+ count += private_count;
+ }
+ }
+
+ // an
+ if (is_zero_v3(an))
+ copy_v3_v3(an, out_flip);
+
+ normalize_v3(an);
+
+ // fc
+ mul_v3_fl(fc, 1.0f / count);
+}
+
+static void calc_sculpt_plane(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float an[3], float fc[3])
+{
Brush *brush = paint_brush(&sd->paint);
if (ss->cache->mirror_symmetry_pass == 0 &&
@@ -1787,96 +1879,8 @@
break;
case SCULPT_DISP_DIR_AREA:
- /* this calculates flatten center and area normal together,
- amortizing the memory bandwidth and loop overhead to calculate both at the same time */
- {
- int n;
+ calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, an, fc);
- // an
- float out_flip[3] = {0.0f, 0.0f, 0.0f};
-
- // fc
- float count = 0;
-
- // an
- zero_v3(an);
-
- // fc
- zero_v3(fc);
-
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for(n=0; n<totnode; n++) {
- PBVHVertexIter vd;
- SculptBrushTest test;
- SculptUndoNode *unode;
- float private_an[3] = {0.0f, 0.0f, 0.0f};
- float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
- float private_fc[3] = {0.0f, 0.0f, 0.0f};
- int private_count = 0;
-
- unode = sculpt_undo_push_node(ss, nodes[n]);
- sculpt_brush_test_init(ss, &test);
-
- if(ss->cache->original) {
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test_fast(&test, unode->co[vd.i])) {
- // an
- float fno[3];
-
- normal_short_to_float_v3(fno, unode->no[vd.i]);
- add_norm_if(ss->cache->view_normal, private_an, private_out_flip, fno);
-
- // fc
- add_v3_v3(private_fc, vd.co);
- private_count++;
- }
- }
- BLI_pbvh_vertex_iter_end;
- }
- else {
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test_fast(&test, vd.co)) {
- // an
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list