Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-04-29 15:38:39 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-04-29 15:52:04 +0400
commit7544961ea5177b61b8f1f07e156cac28afe29764 (patch)
tree3a89976a66f7cc0bbd19b11a531f8b324a1e1be5 /source/blender/render
parent182e97a2cd4bdca9709dbbd1a4e6c175aed448a6 (diff)
Fix T39942: Displacement of group instance objects when switching to textured viewport shading
Usual dupli object issue, sometimes it's needed that all the object in dupli group have modified obmat. Made it an utility function now, which is used by convertblender and dupli draw code now.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/source/convertblender.c45
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);