[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14323] trunk/blender/source/blender/src/ editparticle.c: Fix for bug: [#8610] Hair Particle 'cut' edit mode not respecting backface culling / z-depth
Janne Karhu
jhkarh at utu.fi
Thu Apr 3 01:59:38 CEST 2008
Revision: 14323
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14323
Author: jhk
Date: 2008-04-03 01:59:25 +0200 (Thu, 03 Apr 2008)
Log Message:
-----------
Fix for bug: [#8610] Hair Particle 'cut' edit mode not respecting backface culling / z-depth
-Cut-brush didn't use depth testing at all, now it does, but unfortunately this changes the behavior of the brush so that cutting is not perfect for hairs that are partly visible from behind an edge of the emitter (this change effects the brush only when z-buf clipping is used of course)
Modified Paths:
--------------
trunk/blender/source/blender/src/editparticle.c
Modified: trunk/blender/source/blender/src/editparticle.c
===================================================================
--- trunk/blender/source/blender/src/editparticle.c 2008-04-02 23:12:05 UTC (rev 14322)
+++ trunk/blender/source/blender/src/editparticle.c 2008-04-02 23:59:25 UTC (rev 14323)
@@ -294,7 +294,8 @@
y=wco[1];
if(G.vd->depths && x<G.vd->depths->w && y<G.vd->depths->h){
- if((float)uz>G.vd->depths->depths[y*G.vd->depths->w+x])
+ /* the 0.0001 is an experimental threshold to make selecting keys right next to a surface work better */
+ if((float)uz - 0.0001 > G.vd->depths->depths[y*G.vd->depths->w+x])
return 0;
else
return 1;
@@ -305,7 +306,7 @@
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
- if((float)uz>depth)
+ if((float)uz - 0.0001 > depth)
return 0;
else
return 1;
@@ -2075,7 +2076,7 @@
}
static void brush_cut(ParticleSystem *psys, int index, void *userData)
{
- struct { short *mval; float rad; rcti* rect; int selected; float cutfac;} *data = userData;
+ struct { short *mval; float rad; rcti* rect; int selected; float cutfac; bglMats mats;} *data = userData;
ParticleData *pa= &psys->particles[index];
ParticleCacheKey *key = psys->pathcache[index];
float rad2, cut_time = 1.0;
@@ -2101,7 +2102,7 @@
xo1 = x1 - o1;
/* check if root is inside circle */
- if(xo0*xo0 + xo1*xo1 < rad2) {
+ if(xo0*xo0 + xo1*xo1 < rad2 && test_key_depth(key->co,&(data->mats))) {
cut_time = -1.0f;
cut = 1;
}
@@ -2110,6 +2111,15 @@
for(k=1, key++; k<=keys; k++, key++){
project_short_noclip(key->co, vertco);
+ if(test_key_depth(key->co,&(data->mats)) == 0) {
+ x0 = (float)vertco[0];
+ x1 = (float)vertco[1];
+
+ xo0 = x0 - o0;
+ xo1 = x1 - o1;
+ continue;
+ }
+
v0 = (float)vertco[0] - x0;
v1 = (float)vertco[1] - x1;
@@ -2628,7 +2638,7 @@
}
case PE_BRUSH_CUT:
{
- struct { short *mval; float rad; rcti* rect; int selected; float cutfac;} data;
+ struct { short *mval; float rad; rcti* rect; int selected; float cutfac; bglMats mats;} data;
data.mval = mval;
data.rad = (float)brush->size;
@@ -2637,6 +2647,8 @@
data.cutfac = (float)(brush->strength / 100.0f);
+ bgl_get_mats(&(data.mats));
+
if(selected)
foreach_selected_element(psys, brush_cut, &data);
else
More information about the Bf-blender-cvs
mailing list