diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 45 |
1 files changed, 12 insertions, 33 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 7c8a6e030d5..37ef16d7105 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -4935,13 +4935,6 @@ static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, in } } -/* additional data for dupli objects outside - * of the main dupli list - */ -typedef struct DupliObjectExtra { - float omat[4][4]; -} DupliObjectExtra; - static void database_init_objects(Render *re, unsigned int renderlay, int nolamps, int onlyselected, Object *actob, int timeoffset) { Base *base; @@ -5001,26 +4994,18 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp if ((ob->transflag & OB_DUPLI) && (ob->type!=OB_MBALL)) { DupliObject *dob; ListBase *duplilist; - DupliObjectExtra *duplilist_extra = NULL; - int totdob, i; + DupliApplyData *duplilist_apply_data = NULL; + int i; /* create list of duplis generated by this object, particle * system need to have render settings set for dupli particles */ dupli_render_particle_set(re, ob, timeoffset, 0, 1); duplilist = object_duplilist(re->eval_ctx, re->scene, ob); - totdob = BLI_countlist(duplilist); - if (totdob > 0) - duplilist_extra = MEM_mallocN(sizeof(DupliObjectExtra) * totdob, "DupliObject extra data"); + duplilist_apply_data = duplilist_apply_matrix(duplilist); dupli_render_particle_set(re, ob, timeoffset, 0, 0); - /* set dupli obmats */ - for (dob= duplilist->first, i = 0; dob; dob= dob->next, ++i) { - copy_m4_m4(duplilist_extra[i].omat, dob->ob->obmat); - copy_m4_m4(dob->ob->obmat, dob->mat); - } - for (dob= duplilist->first, i = 0; dob; dob= dob->next, ++i) { - DupliObjectExtra *dob_extra = &duplilist_extra[i]; + DupliExtraData *dob_extra = &duplilist_apply_data->extra[i]; Object *obd= dob->ob; /* group duplis need to set ob matrices correct, for deform. so no_draw is part handled */ @@ -5055,7 +5040,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp obi= RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], 0, mat, ob->lay); /* fill in instance variables for texturing */ - set_dupli_tex_mat(re, obi, dob, dob_extra->omat); + set_dupli_tex_mat(re, obi, dob, dob_extra->obmat); if (dob->type != OB_DUPLIGROUP) { copy_v3_v3(obi->dupliorco, dob->orco); obi->dupliuv[0]= dob->uv[0]; @@ -5081,7 +5066,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp mul_m4_m4m4(mat, re->viewmat, dob->mat); obi= RE_addRenderInstance(re, NULL, obd, ob, dob->persistent_id[0], psysindex++, mat, obd->lay); - set_dupli_tex_mat(re, obi, dob, dob_extra->omat); + set_dupli_tex_mat(re, obi, dob, dob_extra->obmat); if (dob->type != OB_DUPLIGROUP) { copy_v3_v3(obi->dupliorco, dob->orco); obi->dupliuv[0]= dob->uv[0]; @@ -5097,7 +5082,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp if (obi==NULL) /* can't instance, just create the object */ - init_render_object(re, obd, ob, dob, dob_extra->omat, timeoffset); + init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); if (dob->type != OB_DUPLIGROUP) { obd->flag |= OB_DONE; @@ -5105,22 +5090,16 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp } } else - init_render_object(re, obd, ob, dob, dob_extra->omat, timeoffset); + init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); if (re->test_break(re->tbh)) break; } - - /* restore obmats - * NOTE: this has to happen in reverse order, since nested - * dupli objects can repeatedly override the obmat - */ - for (dob= duplilist->last, i = totdob - 1; dob; dob= dob->prev, --i) { - copy_m4_m4(dob->ob->obmat, duplilist_extra[i].omat); + + if (duplilist_apply_data) { + duplilist_restore_matrix(duplilist, duplilist_apply_data); + duplilist_free_apply_data(duplilist_apply_data); } - free_object_duplilist(duplilist); - if (duplilist_extra) - MEM_freeN(duplilist_extra); if (allow_render_object(re, ob, nolamps, onlyselected, actob)) init_render_object(re, ob, NULL, NULL, NULL, timeoffset); |