forked from bartvdbraak/blender
More hairdressing goodies; in the 'velocity' section of the Particle
buttons you now can add a vertexgroup to define speed (or strand length). http://www.blender.org/bf/rt3.jpg
This commit is contained in:
parent
095eb2400a
commit
07b826409a
@ -1447,6 +1447,35 @@ static void make_weight_tables(PartEff *paf, Mesh *me, int totpart, MVert *vertl
|
||||
}
|
||||
}
|
||||
|
||||
/* helper function for build_particle_system() */
|
||||
static void make_length_tables(PartEff *paf, Mesh *me, int totvert, MFace *facelist, int totface, float **vlengths, float **flengths)
|
||||
{
|
||||
MFace *mface;
|
||||
float *folengths=NULL, *volengths=NULL;
|
||||
int a;
|
||||
|
||||
if((paf->flag & PAF_FACE)==0) totface= 0;
|
||||
|
||||
/* collect emitting vertices & faces if vert groups used */
|
||||
if(paf->vertgroup_v && me->dvert) {
|
||||
|
||||
/* allocate lengths array for all vertices, also for lookup of faces later on. note it's a malloc */
|
||||
*vlengths= volengths= MEM_mallocN( totvert*sizeof(float), "pafvolengths" );
|
||||
for(a=0; a<totvert; a++) {
|
||||
volengths[a]= vert_weight(me->dvert+a, paf->vertgroup_v-1);
|
||||
}
|
||||
|
||||
if(totface) {
|
||||
/* allocate lengths array for faces, note it's a malloc */
|
||||
*flengths= folengths= MEM_mallocN(totface*sizeof(float), "paffolengths" );
|
||||
for(a=0, mface=facelist; a<totface; a++, mface++) {
|
||||
folengths[a] = face_weight(mface, volengths);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* for paf start to end, store all matrices for objects */
|
||||
typedef struct pMatrixCache {
|
||||
float obmat[4][4];
|
||||
@ -1533,6 +1562,7 @@ void build_particle_system(Object *ob)
|
||||
float ftime, dtime, force[3], vec[3];
|
||||
float fac, co[3];
|
||||
float *voweights= NULL, *foweights= NULL, maxw=1.0f;
|
||||
float *volengths= NULL, *folengths= NULL;
|
||||
int deform=0, a, totpart, paf_sta, paf_end;
|
||||
int dmNeedsFree, waitcursor_set= 0, totvert, totface, curface, curvert;
|
||||
short no[3];
|
||||
@ -1632,6 +1662,9 @@ void build_particle_system(Object *ob)
|
||||
/* if vertexweights or even distribution, it makes weight tables, also checks where it emits from */
|
||||
make_weight_tables(paf, me, totpart, vertlist, totvert, facelist, totface, &voweights, &foweights);
|
||||
|
||||
/* vertexweights can define lengths too */
|
||||
make_length_tables(paf, me, totvert, facelist, totface, &volengths, &folengths);
|
||||
|
||||
/* now define where to emit from, if there are face weights we skip vertices */
|
||||
if(paf->flag & PAF_OFACE) totvert= 0;
|
||||
if((paf->flag & PAF_FACE)==0) totface= 0;
|
||||
@ -1819,6 +1852,9 @@ void build_particle_system(Object *ob)
|
||||
}
|
||||
pa->mat_nr= paf->omat;
|
||||
|
||||
if(folengths)
|
||||
pa->lifetime*= folengths[curface];
|
||||
|
||||
make_particle_keys(rng, ob, 0, a, paf, pa, force, deform, mtexmove, ob->lay);
|
||||
}
|
||||
|
||||
@ -1826,6 +1862,8 @@ void build_particle_system(Object *ob)
|
||||
give_mesh_particle_coord(NULL, NULL, NULL, 0, 0, NULL, NULL);
|
||||
if(voweights) MEM_freeN(voweights);
|
||||
if(foweights) MEM_freeN(foweights);
|
||||
if(volengths) MEM_freeN(volengths);
|
||||
if(folengths) MEM_freeN(folengths);
|
||||
if(mcache) MEM_freeN(mcache);
|
||||
|
||||
if(deform) end_latt_deform();
|
||||
|
@ -628,6 +628,7 @@ enum {
|
||||
#define B_FIELD_DEP 3414
|
||||
#define B_FIELD_CHANGE 3415
|
||||
#define B_PAF_SET_VG 3416
|
||||
#define B_PAF_SET_VG1 3417
|
||||
|
||||
#define B_MODIFIER_BUTS 3600
|
||||
|
||||
|
@ -122,9 +122,9 @@ typedef struct PartEff {
|
||||
short child[4], mat[4];
|
||||
short texmap, curmult;
|
||||
short staticstep, omat, timetex, speedtex, flag2, flag2neg;
|
||||
short disp, pad;
|
||||
short disp, vertgroup_v;
|
||||
|
||||
char vgroupname[32];
|
||||
char vgroupname[32], vgroupname_v[32];
|
||||
Particle *keys;
|
||||
|
||||
} PartEff;
|
||||
|
@ -1624,6 +1624,20 @@ void do_effects_panels(unsigned short event)
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
break;
|
||||
case B_PAF_SET_VG1:
|
||||
|
||||
paf= give_parteff(ob);
|
||||
if(paf) {
|
||||
bDeformGroup *dg= get_named_vertexgroup(ob, paf->vgroupname_v);
|
||||
if(dg)
|
||||
paf->vertgroup_v= get_defgroup_num(ob, dg)+1;
|
||||
else
|
||||
paf->vertgroup_v= 0;
|
||||
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
break;
|
||||
case B_FIELD_DEP:
|
||||
DAG_scene_sort(G.scene);
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
|
||||
@ -1895,6 +1909,7 @@ static void object_softbodies(Object *ob)
|
||||
static void object_panel_particles_motion(Object *ob)
|
||||
{
|
||||
uiBlock *block;
|
||||
uiBut *but;
|
||||
PartEff *paf= give_parteff(ob);
|
||||
|
||||
if (paf==NULL) return;
|
||||
@ -1912,16 +1927,18 @@ static void object_panel_particles_motion(Object *ob)
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
/* left collumn */
|
||||
uiDefBut(block, LABEL, 0, "Velocity:", 0,150,150,20, NULL, 0.0, 0, 0, 0, "");
|
||||
uiDefBut(block, LABEL, 0, "Velocity:", 0,160,150,20, NULL, 0.0, 0, 0, 0, "");
|
||||
uiBlockBeginAlign(block);
|
||||
uiBlockSetCol(block, TH_BUT_SETTING2);
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Normal:", 0,130,150,20, &paf->normfac, -2.0, 2.0, 1, 3, "Let the mesh give the particle a starting speed");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Object:", 0,110,150,20, &paf->obfac, -1.0, 1.0, 1, 3, "Let the object give the particle a starting speed");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Random:", 0,90,150,20, &paf->randfac, 0.0, 2.0, 1, 3, "Give the startingspeed a random variation");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Texture:", 0,70,150,20, &paf->texfac, 0.0, 2.0, 1, 3, "Let the texture give the particle a starting speed");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Damping:", 0,50,150,20, &paf->damp, 0.0, 1.0, 1, 3, "Specify the damping factor");
|
||||
uiBlockEndAlign(block);
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Normal:", 0,140,150,18, &paf->normfac, -2.0, 2.0, 1, 3, "Let the mesh give the particle a starting speed");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Object:", 0,122,150,18, &paf->obfac, -1.0, 1.0, 1, 3, "Let the object give the particle a starting speed");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Random:", 0,104,150,18, &paf->randfac, 0.0, 2.0, 1, 3, "Give the startingspeed a random variation");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Texture:", 0,86,150,18, &paf->texfac, 0.0, 2.0, 1, 3, "Let the texture give the particle a starting speed");
|
||||
uiDefButF(block, NUM, B_CALCEFFECT, "Damping:", 0,68,150,18, &paf->damp, 0.0, 1.0, 1, 3, "Specify the damping factor");
|
||||
uiBlockSetCol(block, TH_AUTO);
|
||||
but=uiDefBut(block, TEX, B_PAF_SET_VG1, "VGroup:", 0,50,150,18, paf->vgroupname_v, 0, 31, 0, 0, "Name of vertex group to use for speed control");
|
||||
uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)OBACT);
|
||||
uiBlockEndAlign(block);
|
||||
|
||||
uiDefBut(block, LABEL, 0, "Texture Emission", 0,30,150,20, NULL, 0.0, 0, 0, 0, "");
|
||||
uiBlockBeginAlign(block);
|
||||
@ -1977,7 +1994,7 @@ static void object_panel_particles(Object *ob)
|
||||
|
||||
uiDefBut(block, LABEL, 0, "Emit:", 0,150,75,20, NULL, 0.0, 0, 0, 0, "");
|
||||
uiBlockBeginAlign(block);
|
||||
uiDefButI(block, NUM, B_CALCEFFECT, "Amount:", 0,130,150,20, &paf->totpart, 1.0, 100000.0, 0, 0, "The total number of particles");
|
||||
uiDefButI(block, NUM, B_CALCEFFECT, "Amount:", 0,130,150,20, &paf->totpart, 1.0, 100000.0, 0, 0, "The total number of particles");
|
||||
if(paf->flag & PAF_STATIC) {
|
||||
uiDefButS(block, NUM, REDRAWVIEW3D, "Step:", 0,110,150,20, &paf->staticstep, 1.0, 100.0, 10, 0, "For static duplicators, the Step value skips particles");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user