diff options
author | Ton Roosendaal <ton@blender.org> | 2003-11-13 15:44:34 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2003-11-13 15:44:34 +0300 |
commit | 2ffb2376e09df0c5bb01a5170264c4efa3c0799c (patch) | |
tree | 48dca6d976ea93e6edd19be60a39e542199cafa1 /source | |
parent | 994e0c40b1905df2813241129eb4bbdeb35c4611 (diff) |
- bug fix #694
when using linked-duplicated mesh, with subsurf and tfaces (UV texture)
the render crashed.
Found out the renderloop makes a new displaylist for each Mesh, also when
it is linked multiple times. That way pointers to previous created elements
in displaylists become invalid. Crash!
Result now it even renders faster for linked-duplis. :)
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/makesdna/DNA_mesh_types.h | 4 | ||||
-rw-r--r-- | source/blender/renderconverter/intern/convertBlenderScene.c | 37 |
2 files changed, 16 insertions, 25 deletions
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 89f9a0f67aa..ee00eecf151 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -143,9 +143,9 @@ typedef struct Mesh { float rot[3]; short smoothresh, flag; - short subdiv, subdivr; + short subdiv, subdivr, subdivdone; short totcol; - short reserved1, reserved2, reserved3; /* Padding */ + short reserved1, reserved2; /* Padding */ float cubemapsize, rtf; diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c index 9899e2c56a3..bf816666b53 100644 --- a/source/blender/renderconverter/intern/convertBlenderScene.c +++ b/source/blender/renderconverter/intern/convertBlenderScene.c @@ -1114,23 +1114,17 @@ static void init_render_displist_mesh(Object *ob) dl= me->disp.first; /* Force a displist rebuild if this is a subsurf and we have a different subdiv level */ -#if 1 - if((dl==0) || ((me->subdiv != me->subdivr))){ - object_deform(ob); - subsurf_make_mesh(ob, me->subdivr); - dl = me->disp.first; - - } - else{ - makeDispList(ob); - dl= me->disp.first; + + if((dl==0) || ((me->subdiv != me->subdivr))) { + /* prevent subsurf called again for duplicate use of mesh, tface pointers change */ + if(me->subdivdone!=me->subdivr) { + object_deform(ob); + subsurf_make_mesh(ob, me->subdivr); + me->subdivdone= me->subdivr; + dl = me->disp.first; + } } -#else - tempdiv = me->subdiv; - me->subdiv = me->subdivr; - makeDispList(ob); - dl= me->disp.first; -#endif + if(dl==0) return; if(need_orco) { @@ -1138,10 +1132,6 @@ static void init_render_displist_mesh(Object *ob) orco= me->orco; } -#if 0 - me->subdiv = tempdiv; -#endif - while(dl) { if(dl->type==DL_SURF) { startvert= R.totvert; @@ -1767,8 +1757,8 @@ static void init_render_mesh(Object *ob) /* If lar takes more lamp data, the decoupling will be better. */ void RE_add_render_lamp(Object *ob, int doshadbuf) { - Lamp *la, **temp; - LampRen *lar; + Lamp *la; + LampRen *lar, **temp; float mat[4][4], hoek, xn, yn; int c; static int rlalen=LAMPINITSIZE; /*number of currently allocated lampren pointers*/ @@ -2770,8 +2760,9 @@ void RE_freeRotateBlenderScene(void) MEM_freeN(me->orco); me->orco= 0; } - if (rendermesh_uses_displist(me) && (me->subdiv!=me->subdivr)){ + if (rendermesh_uses_displist(me) && (me->subdiv!=me->subdivr)) { makeDispList(ob); + me->subdivdone= 0; /* needed to prevent multiple used meshes being recalculated */ } } else if(ob->type==OB_MBALL) { |