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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-06-28 20:06:55 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-06-28 20:06:55 +0400
commitdc851350457a55726d20655da73881f3534ef5e8 (patch)
treea155ab314a56e321764776450408b77b390dee2d /source/blender
parent9e709d82ae522c792c70a7fa777ae9e8e9b2281f (diff)
Fix #35412: blender internal "from dupli" texture coordinates not working with
particles in linked groups.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/render/intern/source/convertblender.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index c96206643d9..29555756f9f 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -4563,7 +4563,7 @@ static int render_object_type(short type)
return OB_TYPE_SUPPORT_MATERIAL(type);
}
-static void find_dupli_instances(Render *re, ObjectRen *obr)
+static void find_dupli_instances(Render *re, ObjectRen *obr, DupliObject *dob)
{
ObjectInstanceRen *obi;
float imat[4][4], obmat[4][4], obimat[4][4], nmat[3][3];
@@ -4588,6 +4588,12 @@ static void find_dupli_instances(Render *re, ObjectRen *obr)
invert_m3_m3(obi->nmat, nmat);
transpose_m3(obi->nmat);
+ if (dob) {
+ copy_v3_v3(obi->dupliorco, dob->orco);
+ obi->dupliuv[0]= dob->uv[0];
+ obi->dupliuv[1]= dob->uv[1];
+ }
+
if (!first) {
re->totvert += obr->totvert;
re->totvlak += obr->totvlak;
@@ -4600,7 +4606,7 @@ static void find_dupli_instances(Render *re, ObjectRen *obr)
}
}
-static void assign_dupligroup_dupli(Render *re, ObjectInstanceRen *obi, ObjectRen *obr)
+static void assign_dupligroup_dupli(Render *re, ObjectInstanceRen *obi, ObjectRen *obr, DupliObject *dob)
{
float imat[4][4], obmat[4][4], obimat[4][4], nmat[3][3];
@@ -4618,6 +4624,12 @@ static void assign_dupligroup_dupli(Render *re, ObjectInstanceRen *obi, ObjectRe
invert_m3_m3(obi->nmat, nmat);
transpose_m3(obi->nmat);
+ if (dob) {
+ copy_v3_v3(obi->dupliorco, dob->orco);
+ obi->dupliuv[0]= dob->uv[0];
+ obi->dupliuv[1]= dob->uv[1];
+ }
+
re->totvert += obr->totvert;
re->totvlak += obr->totvlak;
re->tothalo += obr->tothalo;
@@ -4682,6 +4694,12 @@ static void set_dupli_tex_mat(Render *re, ObjectInstanceRen *obi, DupliObject *d
invert_m4_m4(imat, dob->mat);
mul_serie_m4(obi->duplitexmat, re->viewmat, dob->omat, imat, re->viewinv, 0, 0, 0, 0);
}
+
+ if (dob) {
+ copy_v3_v3(obi->dupliorco, dob->orco);
+ obi->dupliuv[0]= dob->uv[0];
+ obi->dupliuv[1]= dob->uv[1];
+ }
}
static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset)
@@ -4765,7 +4783,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
if (dob) set_dupli_tex_mat(re, obi, dob);
}
else
- find_dupli_instances(re, obr);
+ find_dupli_instances(re, obr, dob);
for (i=1; i<=ob->totcol; i++) {
Material* ma = give_render_material(re, ob, i);
@@ -4796,7 +4814,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
if (dob) set_dupli_tex_mat(re, obi, dob);
}
else
- find_dupli_instances(re, obr);
+ find_dupli_instances(re, obr, dob);
}
}
}
@@ -5154,9 +5172,9 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
* created object, and possibly setup instances if this object
* itself was duplicated. for the first case find_dupli_instances
* will be called later. */
- assign_dupligroup_dupli(re, obi, obr);
+ assign_dupligroup_dupli(re, obi, obr, dob);
if (obd->transflag & OB_RENDER_DUPLI)
- find_dupli_instances(re, obr);
+ find_dupli_instances(re, obr, dob);
}
}
@@ -5176,9 +5194,9 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
obi->dupliuv[1]= dob->uv[1];
}
else {
- assign_dupligroup_dupli(re, obi, obr);
+ assign_dupligroup_dupli(re, obi, obr, dob);
if (obd->transflag & OB_RENDER_DUPLI)
- find_dupli_instances(re, obr);
+ find_dupli_instances(re, obr, dob);
}
}
}