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>2003-11-13 15:44:34 +0300
committerTon Roosendaal <ton@blender.org>2003-11-13 15:44:34 +0300
commit2ffb2376e09df0c5bb01a5170264c4efa3c0799c (patch)
tree48dca6d976ea93e6edd19be60a39e542199cafa1 /source/blender
parent994e0c40b1905df2813241129eb4bbdeb35c4611 (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/blender')
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h4
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c37
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) {