213
212
float *fp, *p0, *p1, *p2, *p3, fac;
215
214
int cycl=0, s0, s1, s2, s3;
217
216
if(ob==0 || ob->type != OB_CURVE) return 0;
219
if(cu->path==0 || cu->path->data==0) calc_curvepath(ob);
218
if(cu->path==0 || cu->path->data==0) {
220
if(cu->path==0 || cu->path->data==0) return 0;
276
static Object *new_dupli_object(ListBase *lb, Object *ob, Object *par)
280
newob= MEM_mallocN(sizeof(Object), "newobj dupli");
281
memcpy(newob, ob, sizeof(Object));
282
newob->flag |= OB_FROMDUPLI;
283
newob->id.newid= (ID *)par; /* store duplicator */
285
/* only basis-ball gets displist */
286
if(newob->type==OB_MBALL) newob->disp.first= newob->disp.last= NULL;
288
if(ob!=par) { // dupliverts, particle
292
BLI_addtail(lb, newob);
275
297
void frames_duplilist(Object *ob)
277
299
extern int enable_cu_speed; /* object.c */
307
newob= MEM_mallocN(sizeof(Object), "newobobj dupli");
308
memcpy(newob, ob, sizeof(Object));
310
/*only the basis-ball gets a displist */
311
if(newob->type==OB_MBALL) newob->disp.first= newob->disp.last= 0;
329
newob= new_dupli_object(&duplilist, ob, ob);
313
BLI_addtail(&duplilist, newob);
314
331
do_ob_ipo(newob);
315
where_is_object(newob);
317
newob->flag |= OB_FROMDUPLI;
318
newob->id.newid= (ID *)ob; /* store duplicator */
332
where_is_object_time(newob, (float)G.scene->r.cfra);
365
383
for(a=0; a<totvert; a++, mvert++) {
367
385
/* calc the extra offset for children (wrt. centre parent) */
368
VECCOPY(vec, mvert->co);
387
VECCOPY(vec, extverts+3*a);
390
VECCOPY(vec, mvert->co);
369
393
Mat4MulVecfl(pmat, vec);
370
394
VecSubf(vec, vec, pmat[3]);
371
395
VecAddf(vec, vec, ob->obmat[3]);
373
newob= MEM_mallocN(sizeof(Object), "newobj dupli");
374
memcpy(newob, ob, sizeof(Object));
375
newob->flag |= OB_FROMDUPLI;
376
newob->id.newid= (ID *)par; /* keep duplicator */
378
/* only basis-ball gets displist */
379
if(newob->type==OB_MBALL) newob->disp.first= newob->disp.last= 0;
397
newob= new_dupli_object(&duplilist, ob, par);
381
398
VECCOPY(newob->obmat[3], vec);
383
400
if(par->transflag & OB_DUPLIROT) {
445
456
for(a=0; a<paf->totpart; a++, pa+=paf->totkey) {
447
if(ctime > pa->time) {
448
if(ctime < pa->time+pa->lifetime) {
450
newob= MEM_mallocN(sizeof(Object), "newobj dupli");
451
memcpy(newob, ob, sizeof(Object));
452
newob->flag |= OB_FROMDUPLI;
453
newob->id.newid= (ID *)par; /* keep duplicator */
455
/* only basis-ball gets displist */
456
if(newob->type==OB_MBALL) newob->disp.first= newob->disp.last= 0;
458
if(paf->flag & PAF_STATIC) {
461
where_is_particle(paf, pa, pa->time, vec1);
462
mtime= pa->time+pa->lifetime;
464
for(ctime= pa->time; ctime<mtime; ctime+=paf->staticstep) {
465
newob= new_dupli_object(&duplilist, ob, par);
467
/* make sure hair grows until the end.. */
468
if(ctime>pa->time+pa->lifetime) ctime= pa->time+pa->lifetime;
458
470
/* to give ipos in object correct offset */
459
471
where_is_object_time(newob, ctime-pa->time);
473
where_is_particle(paf, pa, ctime, vec); // makes sure there's always a vec
474
Mat4MulVecfl(par->obmat, vec);
461
where_is_particle(paf, pa, ctime, vec);
462
476
if(paf->stype==PAF_VECT) {
463
where_is_particle(paf, pa, ctime+1.0f, vec1);
477
where_is_particle(paf, pa, ctime+1.0, vec1); // makes sure there's always a vec
478
Mat4MulVecfl(par->obmat, vec1);
465
480
VecSubf(vec1, vec1, vec);
466
481
q2= vectoquat(vec1, ob->trackflag, ob->upflag);
468
483
QuatToMat3(q2, mat);
469
484
Mat4CpyMat4(tmat, newob->obmat);
470
485
Mat4MulMat43(newob->obmat, tmat, mat);
473
488
VECCOPY(newob->obmat[3], vec);
491
else { // non static particles
493
if(ctime > pa->time) {
494
if(ctime < pa->time+pa->lifetime) {
495
newob= new_dupli_object(&duplilist, ob, par);
497
/* to give ipos in object correct offset */
498
where_is_object_time(newob, ctime-pa->time);
500
where_is_particle(paf, pa, ctime, vec);
501
if(paf->stype==PAF_VECT) {
502
where_is_particle(paf, pa, ctime+1.0f, vec1);
504
VecSubf(vec1, vec1, vec);
505
q2= vectoquat(vec1, ob->trackflag, ob->upflag);
478
BLI_addtail(&duplilist, newob);
508
Mat4CpyMat4(tmat, newob->obmat);
509
Mat4MulMat43(newob->obmat, tmat, mat);
512
VECCOPY(newob->obmat[3], vec);