Hairdresser request;

"Additive" Guides. See also:
http://www.blender3d.org/cms/New_Particle_options_a.721.0.html

This Guide type uses the falloff distance to also define how much the
particle (or hair strand) goes over the path, allowing to create local
extremes, or only local particle generating or hairgrowth. Nice for
spiky haircuts!
This commit is contained in:
2005-11-12 11:54:58 +00:00
parent 18b8f66a68
commit c7c7ccccae
3 changed files with 27 additions and 17 deletions

View File

@@ -342,8 +342,10 @@ ListBase *pdInitEffectors(unsigned int layer)
if(cu->path==NULL || cu->path->data==NULL) if(cu->path==NULL || cu->path->data==NULL)
makeDispListCurveTypes(ob, 0); makeDispListCurveTypes(ob, 0);
ec->ob= ob; if(cu->path && cu->path->data) {
BLI_addtail(&listb, ec); ec->ob= ob;
BLI_addtail(&listb, ec);
}
} }
} }
} }
@@ -562,19 +564,6 @@ void pdDoEffectors(ListBase *lb, float *opco, float *force, float *speed, float
/* WARNING: bails out with continue here */ /* WARNING: bails out with continue here */
if((pd->flag & PFIELD_USEMAX) && distance>pd->maxdist) continue; if((pd->flag & PFIELD_USEMAX) && distance>pd->maxdist) continue;
/* derive path point from loc_time */
where_on_path(ob, loc_time*ec->time_scale, guidevec, guidedir);
VECSUB(guidedir, guidevec, ec->oldloc);
VECCOPY(ec->oldloc, guidevec);
Mat4Mul3Vecfl(ob->obmat, guidedir);
VecMulf(guidedir, ec->scale); /* correction for lifetime and speed */
/* we subtract the speed we gave it previous step */
VECCOPY(guidevec, guidedir);
VECSUB(guidedir, guidedir, ec->oldspeed);
VECCOPY(ec->oldspeed, guidevec);
/* calculate contribution factor for this guide */ /* calculate contribution factor for this guide */
if(distance<=mindist) f_force= 1.0f; if(distance<=mindist) f_force= 1.0f;
else if(pd->flag & PFIELD_USEMAX) { else if(pd->flag & PFIELD_USEMAX) {
@@ -591,6 +580,22 @@ void pdDoEffectors(ListBase *lb, float *opco, float *force, float *speed, float
f_force = (float)pow(f_force, ffall_val+1.0); f_force = (float)pow(f_force, ffall_val+1.0);
} }
/* now derive path point from loc_time */
if(pd->flag & PFIELD_GUIDE_PATH_ADD)
where_on_path(ob, f_force*loc_time*ec->time_scale, guidevec, guidedir);
else
where_on_path(ob, loc_time*ec->time_scale, guidevec, guidedir);
VECSUB(guidedir, guidevec, ec->oldloc);
VECCOPY(ec->oldloc, guidevec);
Mat4Mul3Vecfl(ob->obmat, guidedir);
VecMulf(guidedir, ec->scale); /* correction for lifetime and speed */
/* we subtract the speed we gave it previous step */
VECCOPY(guidevec, guidedir);
VECSUB(guidedir, guidedir, ec->oldspeed);
VECCOPY(ec->oldspeed, guidevec);
/* if it fully contributes, we stop */ /* if it fully contributes, we stop */
if(f_force==1.0) { if(f_force==1.0) {
VECCOPY(guidecollect, guidedir); VECCOPY(guidecollect, guidedir);

View File

@@ -107,8 +107,9 @@ typedef struct SoftBody {
#define PFIELD_GUIDE 5 #define PFIELD_GUIDE 5
/* pd->flag: various settings */ /* pd->flag: various settings */
#define PFIELD_USEMAX 1 #define PFIELD_USEMAX 1
#define PDEFLE_DEFORM 2 #define PDEFLE_DEFORM 2
#define PFIELD_GUIDE_PATH_ADD 4
/* ob->softflag */ /* ob->softflag */
#define OB_SB_ENABLE 1 #define OB_SB_ENABLE 1

View File

@@ -1745,6 +1745,10 @@ static void object_panel_fields(Object *ob)
uiDefButBitS(block, TOG, PFIELD_USEMAX, B_FIELD_CHANGE, "Use MaxDist", 10,60,140,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum distance for the field to work"); uiDefButBitS(block, TOG, PFIELD_USEMAX, B_FIELD_CHANGE, "Use MaxDist", 10,60,140,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum distance for the field to work");
uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxDist: ", 10,40,140,20, &pd->maxdist, 0, 1000.0, 10, 0, "Maximum distance for the field to work"); uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxDist: ", 10,40,140,20, &pd->maxdist, 0, 1000.0, 10, 0, "Maximum distance for the field to work");
uiBlockEndAlign(block); uiBlockEndAlign(block);
if(pd->forcefield == PFIELD_GUIDE)
uiDefButBitS(block, TOG, PFIELD_GUIDE_PATH_ADD, B_FIELD_CHANGE, "Additive", 10,10,140,20, &pd->flag, 0.0, 0, 0, 0, "Based on distance/falloff it adds a portion of the entire path");
} }
uiDefBut(block, LABEL, 0, "Deflection", 160,180,140,20, NULL, 0.0, 0, 0, 0, ""); uiDefBut(block, LABEL, 0, "Deflection", 160,180,140,20, NULL, 0.0, 0, 0, 0, "");