"From particles" children are again allowed for non-hair/keyed particles, although with some limitations like no separate render amount or rough/branching values.

This commit is contained in:
Janne Karhu
2008-02-17 18:33:20 +00:00
parent b16eefadf8
commit a221c3db97
2 changed files with 47 additions and 34 deletions

View File

@@ -465,6 +465,8 @@ void psys_render_set(Object *ob, ParticleSystem *psys, float viewmat[][4], float
return;
if(psys->renderdata)
return;
if(psys->part->draw_as!=PART_DRAW_PATH)
return;
data= MEM_callocN(sizeof(ParticleRenderData), "ParticleRenderData");
@@ -505,6 +507,8 @@ void psys_render_restore(Object *ob, ParticleSystem *psys)
data= psys->renderdata;
if(!data)
return;
if(psys->part->draw_as!=PART_DRAW_PATH)
return;
if(data->elems)
MEM_freeN(data->elems);
@@ -3580,32 +3584,34 @@ int psys_get_particle_state(Object *ob, ParticleSystem *psys, int p, ParticleKey
return 1;
}
else{
//if(psys->totchild && p>=psys->totpart){
// ChildParticle *cpa=psys->child+p-psys->totpart;
// ParticleKey *key1, skey;
// float t=(cfra-pa->time)/pa->lifetime, clump;
if(between)
return 0; /* currently not supported */
else if(psys->totchild && p>=psys->totpart){
ChildParticle *cpa=psys->child+p-psys->totpart;
ParticleKey *key1, skey;
float t = (cfra - pa->time + pa->loop * pa->lifetime) / pa->lifetime, clump;
// pa=psys->particles+cpa->parent;
pa = psys->particles + cpa->parent;
// if(pa->alive==PARS_DEAD && part->flag&PART_STICKY && pa->flag&PARS_STICKY && pa->stick_ob){
// key1=&skey;
// copy_particle_key(key1,&pa->state,0);
// key_from_object(pa->stick_ob,key1);
// }
// else{
// key1=&pa->state;
// }
//
// offset_child(cpa, key1, state, part->childflat, part->childrad);
//
// CLAMP(t,0.0,1.0);
// if(part->kink) /* TODO: part->kink_freq*pa_kink */
// do_prekink(state,key1,t,part->kink_freq,part->kink_shape,part->kink_amp,part->kink,part->kink_axis,ob->obmat);
//
// /* TODO: pa_clump vgroup */
// do_clump(state,key1,t,part->clumpfac,part->clumppow,0);
//}
//else{
if(pa->alive==PARS_DEAD && part->flag&PART_STICKY && pa->flag&PARS_STICKY && pa->stick_ob) {
key1 = &skey;
copy_particle_key(key1,&pa->state,0);
key_from_object(pa->stick_ob,key1);
}
else {
key1=&pa->state;
}
offset_child(cpa, key1, state, part->childflat, part->childrad);
CLAMP(t,0.0,1.0);
if(part->kink) /* TODO: part->kink_freq*pa_kink */
do_prekink(state,key1,key1->rot,t,part->kink_freq,part->kink_shape,part->kink_amp,part->kink,part->kink_axis,ob->obmat);
/* TODO: pa_clump vgroup */
do_clump(state,key1,t,part->clumpfac,part->clumppow,1.0);
}
else{
if (pa) { /* TODO PARTICLE - should this ever be NULL? - Campbell */
copy_particle_key(state,&pa->state,0);
@@ -3616,7 +3622,7 @@ int psys_get_particle_state(Object *ob, ParticleSystem *psys, int p, ParticleKey
if(psys->lattice)
calc_latt_deform(state->co,1.0f);
}
//}
}
return 1;
}

View File

@@ -3983,7 +3983,7 @@ static void object_panel_particle_children(Object *ob)
if(part->childtype==0) return;
if((psys->flag&(PSYS_HAIR_DONE|PSYS_KEYED))==0) {
if(part->childtype==PART_CHILD_FACES && (psys->flag&(PSYS_HAIR_DONE|PSYS_KEYED))==0) {
uiDefBut(block, LABEL, 0, "Hair or keyed", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
uiDefBut(block, LABEL, 0, "particles needed!", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
return;
@@ -3994,7 +3994,9 @@ static void object_panel_particle_children(Object *ob)
buty -= buth/2;
uiDefButI(block, NUM, B_PART_ALLOC_CHILD, "Amount:", butx,(buty-=buth),butw,buth, &part->child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent");
uiDefButI(block, NUM, B_DIFF, "Render Amount:", butx,(buty-=buth),butw,buth, &part->ren_child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent for rendering");
if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED))
uiDefButI(block, NUM, B_DIFF, "Render Amount:", butx,(buty-=buth),butw,buth, &part->ren_child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent for rendering");
if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES) {
uiDefButF(block, NUMSLI, B_PART_DISTR_CHILD, "VParents:", butx,(buty-=buth),butw,buth, &part->parents, 0.0, 1.0, 1, 3, "Relative amount of virtual parents");
}
@@ -4015,9 +4017,11 @@ static void object_panel_particle_children(Object *ob)
buty -= buth/2;
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_PART_REDRAW, "Size:", butx,(buty-=buth),butw/2,buth, &part->childsize, 0.01, 100, 10, 1, "A multiplier for the child particle size");
uiDefButF(block, NUM, B_PART_REDRAW, "Rand:", butx+butw/2,buty,butw/2,buth, &part->childrandsize, 0.0, 1.0, 10, 1, "Random variation to the size of the child particles");
if(part->childtype==PART_CHILD_FACES) {
if(part->draw_as != PART_DRAW_PATH) {
uiDefButF(block, NUM, B_PART_REDRAW, "Size:", butx,(buty-=buth),butw/2,buth, &part->childsize, 0.01, 100, 10, 1, "A multiplier for the child particle size");
uiDefButF(block, NUM, B_PART_REDRAW, "Rand:", butx+butw/2,buty,butw/2,buth, &part->childrandsize, 0.0, 1.0, 10, 1, "Random variation to the size of the child particles");
}
if(part->childtype == PART_CHILD_FACES) {
uiDefButF(block, NUM, B_PART_REDRAW, "Spread:",butx,(buty-=buth),butw/2,buth, &part->childspread, -1.0, 1.0, 10, 1, "Spread children from the faces");
uiDefButBitI(block, TOG, PART_CHILD_SEAMS, B_PART_DISTR_CHILD, "Use Seams", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Use seams to determine parents");
}
@@ -4026,9 +4030,12 @@ static void object_panel_particle_children(Object *ob)
butx=160;
buty=180;
uiDefButBitS(block, TOG, 1, B_PART_REDRAW, "Kink/Branch", butx,(buty-=buth),butw,buth, &kink_ui, 0, 0, 0, 0, "Show kink and branch options");
if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED))
uiDefButBitS(block, TOG, 1, B_PART_REDRAW, "Kink/Branch", butx,(buty-=buth),butw,buth, &kink_ui, 0, 0, 0, 0, "Show kink and branch options");
else
buty-=buth;
if(kink_ui) {
if(kink_ui || (psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)) == 0) {
buty -= buth/2;
/* kink */
@@ -4046,7 +4053,7 @@ static void object_panel_particle_children(Object *ob)
}
uiBlockEndAlign(block);
if(part->childtype==PART_CHILD_PARTICLES) {
if(part->childtype==PART_CHILD_PARTICLES && psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)) {
if(part->flag & PART_BRANCHING) {
uiDefButBitI(block, TOG, PART_BRANCHING, B_PART_RECALC_CHILD, "Branching", butx,(buty-=2*buth),butw,buth, &part->flag, 0, 0, 0, 0, "Branch child paths from eachother");
uiDefButBitI(block, TOG, PART_ANIM_BRANCHING, B_PART_RECALC_CHILD, "Animated", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Animate branching");
@@ -4323,7 +4330,7 @@ static void object_panel_particle_visual(Object *ob)
}
}
else {
uiDefBut(block, LABEL, 0, "Baked or keyed", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
uiDefBut(block, LABEL, 0, "Hair or keyed", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
uiDefBut(block, LABEL, 0, "particles needed!", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
}
break;