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:
authorTon Roosendaal <ton@blender.org>2005-03-04 23:20:59 +0300
committerTon Roosendaal <ton@blender.org>2005-03-04 23:20:59 +0300
commit512aabd68e6cee0540f1e09766c5bd956b432ed7 (patch)
treea00ebfb55864a986454d0632c224a3ce2091cab0 /source/blender
parent9e7c5901467084878e8f5ebcc5b10e9c950245cb (diff)
Bug fix #2265
Found (old) issue in render... the "VlakRen" (render face) has an Object pointer which can point to a duplicated one (dupliframes/dupliverts option), which is freed before actual render starts... this nicely crashes in Windows. I now store the original Object pointer, which can lead to texture orientation errors in some situations (like normal-bump stuff). Real solution is recode of duplicator system!
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 5bdd0c36702..a74f1f16aad 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -1029,7 +1029,7 @@ static void render_static_particle_system(Object *ob, PartEff *paf)
float cvec[3]={-1.0, 0.0, 0.0};
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= v1;
vlr->v2= RE_findOrAddVert(R.totvert++);
vlr->v3= vlr->v2;
@@ -1175,6 +1175,14 @@ static Material *give_render_material(Object *ob, int nr)
return ma;
}
+/* when objects are duplicated, they are freed immediate, but still might be
+ in use for render... */
+static Object *vlr_set_ob(Object *ob)
+{
+ if(ob->flag & OB_FROMDUPLI) return (Object *)ob->newid;
+ return ob;
+}
+
/* ------------------------------------------------------------------------- */
static void init_render_mball(Object *ob)
{
@@ -1234,7 +1242,7 @@ static void init_render_mball(Object *ob)
for(a=0; a<dl->parts; a++, index+=4) {
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= RE_findOrAddVert(startvert+index[0]);
vlr->v2= RE_findOrAddVert(startvert+index[1]);
vlr->v3= RE_findOrAddVert(startvert+index[2]);
@@ -1501,7 +1509,7 @@ static void init_render_mesh(Object *ob)
float len;
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= RE_findOrAddVert(vertofs+v1);
vlr->v2= RE_findOrAddVert(vertofs+v2);
vlr->v3= RE_findOrAddVert(vertofs+v3);
@@ -1537,7 +1545,7 @@ static void init_render_mesh(Object *ob)
}
else if(v2 && (ma->mode & MA_WIRE)) {
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= RE_findOrAddVert(vertofs+v1);
vlr->v2= RE_findOrAddVert(vertofs+v2);
vlr->v3= vlr->v2;
@@ -1566,7 +1574,7 @@ static void init_render_mesh(Object *ob)
medge= dlm?dlm->medge:me->medge;
for(a1=0; a1<end; a1++, medge++) {
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= RE_findOrAddVert(vertofs+medge->v1);
vlr->v2= RE_findOrAddVert(vertofs+medge->v2);
vlr->v3= vlr->v2;
@@ -2031,7 +2039,7 @@ static void init_render_surf(Object *ob)
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= v1; vlr->v2= v2; vlr->v3= v3; vlr->v4= v4;
flen= CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, n1);
@@ -2155,7 +2163,7 @@ static void init_render_surf(Object *ob)
flen= CalcNormFloat4(v1->co, v3->co, v4->co, v2->co, n1);
if(flen!=0.0) {
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= v1;
vlr->v2= v3;
vlr->v3= v4;
@@ -2394,7 +2402,7 @@ static void init_render_curve(Object *ob)
for(; b<bl->nr; b++) {
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob= ob;
+ vlr->ob= vlr_set_ob(ob);
vlr->v1= RE_findOrAddVert(p2);
vlr->v2= RE_findOrAddVert(p1);
vlr->v3= RE_findOrAddVert(p3);
@@ -2508,7 +2516,7 @@ static void init_render_curve(Object *ob)
for(a=0; a<dl->parts; a++, index+=3) {
vlr= RE_findOrAddVlak(R.totvlak++);
- vlr->ob = ob; /* yafray: correction for curve rendering, obptr was not set */
+ vlr->ob = vlr_set_ob(ob); /* yafray: correction for curve rendering, obptr was not set */
vlr->v1= RE_findOrAddVert(startvert+index[0]);
vlr->v2= RE_findOrAddVert(startvert+index[1]);
vlr->v3= RE_findOrAddVert(startvert+index[2]);