[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22344] branches/blender2.5/blender/source /blender/editors/sculpt_paint/sculpt.c: Sculpt/2.5:
Nicholas Bishop
nicholasbishop at gmail.com
Mon Aug 10 18:52:29 CEST 2009
Revision: 22344
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22344
Author: nicholasbishop
Date: 2009-08-10 18:52:29 +0200 (Mon, 10 Aug 2009)
Log Message:
-----------
Sculpt/2.5:
* Fixed clay brush to work more like the original patch. It should now correctly limit the depth being added or subtracted.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/sculpt_paint/sculpt.c
Modified: branches/blender2.5/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/sculpt_paint/sculpt.c 2009-08-10 15:39:11 UTC (rev 22343)
+++ branches/blender2.5/blender/source/blender/editors/sculpt_paint/sculpt.c 2009-08-10 16:52:29 UTC (rev 22344)
@@ -525,46 +525,77 @@
VecMulf(co, 1.0f / FLATTEN_SAMPLE_SIZE);
}
+/* Projects a point onto a plane along the plane's normal */
+static void point_plane_project(float intr[3], float co[3], float plane_normal[3], float plane_center[3])
+{
+ float p1[3], sub1[3], sub2[3];
+
+ /* Find the intersection between squash-plane and vertex (along the area normal) */
+ VecSubf(p1, co, plane_normal);
+ VecSubf(sub1, plane_center, p1);
+ VecSubf(sub2, co, p1);
+ VecSubf(intr, co, p1);
+ VecMulf(intr, Inpf(plane_normal, sub1) / Inpf(plane_normal, sub2));
+ VecAddf(intr, intr, p1);
+}
+
static void do_flatten_clay_brush(Sculpt *sd, SculptSession *ss, const ListBase *active_verts, int clay)
{
ActiveData *node= active_verts->first;
/* area_normal and cntr define the plane towards which vertices are squashed */
float area_normal[3];
- float cntr[3];
+ float cntr[3], cntr2[3], bstr;
calc_area_normal(sd, area_normal, active_verts);
calc_flatten_center(ss, node, cntr);
+ if(clay) {
+ bstr= brush_strength(sd, ss->cache);
+ /* Limit clay application to here */
+ cntr2[0]=cntr[0]+area_normal[0]*bstr*ss->cache->scale[0];
+ cntr2[1]=cntr[1]+area_normal[1]*bstr*ss->cache->scale[1];
+ cntr2[2]=cntr[2]+area_normal[2]*bstr*ss->cache->scale[2];
+ }
+
while(node){
float *co= ss->mvert[node->Index].co;
- float p1[3], sub1[3], sub2[3], intr[3], val[3];
+ float intr[3], val[3], d;
- /* Find the intersection between squash-plane and vertex (along the area normal) */
- VecSubf(p1, co, area_normal);
- VecSubf(sub1, cntr, p1);
- VecSubf(sub2, co, p1);
- VecSubf(intr, co, p1);
- VecMulf(intr, Inpf(area_normal, sub1) / Inpf(area_normal, sub2));
- VecAddf(intr, intr, p1);
-
- VecSubf(val, intr, co);
- VecMulf(val, fabs(node->Fade));
- VecAddf(val, val, co);
-
if(clay) {
- /* Clay brush displaces after flattening */
- float tmp[3];
- VecCopyf(tmp, area_normal);
- VecMulf(tmp, ss->cache->radius * node->Fade * 0.1);
- VecAddf(val, val, tmp);
+ float delta[3];
+
+ VecSubf(delta, co, cntr2);
+ d = Inpf(area_normal, delta);
+
+ /* Check for subtractive mode */
+ if(bstr < 0)
+ d = -d;
}
- sculpt_clip(sd, co, val);
+ if(!clay || d <= 0.0f) {
+ /* Find the intersection between squash-plane and vertex (along the area normal) */
+ point_plane_project(intr, co, area_normal, cntr);
+
+ VecSubf(val, intr, co);
+
+ if(clay) {
+ VecMulf(val, node->Fade / bstr);
+ /* Clay displacement */
+ val[0]+=area_normal[0] * ss->cache->scale[0]*node->Fade;
+ val[1]+=area_normal[1] * ss->cache->scale[1]*node->Fade;
+ val[2]+=area_normal[2] * ss->cache->scale[2]*node->Fade;
+ }
+ else
+ VecMulf(val, fabs(node->Fade));
+
+ VecAddf(val, val, co);
+ sculpt_clip(sd, co, val);
+ }
node= node->next;
}
}
-
+
/* Uses symm to selectively flip any axis of a coordinate. */
static void flip_coord(float out[3], float in[3], const char symm)
{
More information about the Bf-blender-cvs
mailing list