Bug fix, provided by Martin Dickopp;
authorTon Roosendaal <ton@blender.org>
Fri, 4 Mar 2005 22:17:52 +0000 (22:17 +0000)
committerTon Roosendaal <ton@blender.org>
Fri, 4 Mar 2005 22:17:52 +0000 (22:17 +0000)
The dynamical allocated arrays (rwenzlaff, april 03) for render vertices/
faces/halos were freed in a way that requires the last element of array to
be NULL.
This wasn't coded however, causing memory errors in exceptional cases;
like when amount of faces/vertices is exact between 261888 and 262144. :)

source/blender/render/intern/source/renderdatabase.c
source/blender/renderconverter/intern/convertBlenderScene.c

index 2e519591afc353bda46f78bd67ded0f3ee2d8d8c..50ddc26fead8980d953f07f552591a4c4d67224b 100644 (file)
@@ -85,13 +85,13 @@ VertRen *RE_findOrAddVert(int nr)
        }
        a= nr>>8;
        
-       if (a>=rblovelen){  /* Need to allocate more columns...*/
-               // printf("Allocating %i more vert groups.  %i total.\n", 
+       if (a>=rblovelen-1){  /* Need to allocate more columns..., and keep last element NULL for free loop */
+               //printf("Allocating %i more vert groups.  %i total.\n", 
                //      TABLEINITSIZE, rblovelen+TABLEINITSIZE );
                temp=R.blove;
                R.blove=(VertRen**)MEM_callocN(sizeof(void*)*(rblovelen+TABLEINITSIZE) , "Blove");
                memcpy(R.blove, temp, rblovelen*sizeof(void*));
-               memset(&(R.blove[a]), 0, TABLEINITSIZE*sizeof(void*));
+               memset(&(R.blove[rblovelen]), 0, TABLEINITSIZE*sizeof(void*));
                rblovelen+=TABLEINITSIZE; 
                MEM_freeN(temp);        
        }
@@ -118,13 +118,13 @@ HaloRen *RE_findOrAddHalo(int nr)
        }
        a= nr>>8;
        
-       if (a>=rblohalen){  /* Need to allocate more columns...*/
+       if (a>=rblohalen-1){  /* Need to allocate more columns..., and keep last element NULL for free loop */
                //printf("Allocating %i more halo groups.  %i total.\n", 
                //      TABLEINITSIZE, rblohalen+TABLEINITSIZE );
                temp=R.bloha;
-               R.bloha=(HaloRen**)MEM_callocN(sizeof(void*)*(rblohalen+TABLEINITSIZE) , "Blove");
+               R.bloha=(HaloRen**)MEM_callocN(sizeof(void*)*(rblohalen+TABLEINITSIZE) , "Bloha");
                memcpy(R.bloha, temp, rblohalen*sizeof(void*));
-               memset(&(R.bloha[a]), 0, TABLEINITSIZE*sizeof(void*));
+               memset(&(R.bloha[rblohalen]), 0, TABLEINITSIZE*sizeof(void*));
                rblohalen+=TABLEINITSIZE;  /*Does this really need to be power of 2?*/
                MEM_freeN(temp);        
        }
@@ -152,13 +152,13 @@ VlakRen *RE_findOrAddVlak(int nr)
        }
        a= nr>>8;
        
-       if (a>=rblovllen){  /* Need to allocate more columns...*/
+       if (a>=rblovllen-1){  /* Need to allocate more columns..., and keep last element NULL for free loop */
                // printf("Allocating %i more face groups.  %i total.\n", 
                //      TABLEINITSIZE, rblovllen+TABLEINITSIZE );
                temp=R.blovl;
-               R.blovl=(VlakRen**)MEM_callocN(sizeof(void*)*(rblovllen+TABLEINITSIZE) , "Blove");
+               R.blovl=(VlakRen**)MEM_callocN(sizeof(void*)*(rblovllen+TABLEINITSIZE) , "Blovl");
                memcpy(R.blovl, temp, rblovllen*sizeof(void*));
-               memset(&(R.blovl[a]), 0, TABLEINITSIZE*sizeof(void*));
+               memset(&(R.blovl[rblovllen]), 0, TABLEINITSIZE*sizeof(void*));
                rblovllen+=TABLEINITSIZE;  /*Does this really need to be power of 2?*/
                MEM_freeN(temp);        
        }
index a74f1f16aad57dd95aa3f7ba56d84a384a1ff196..0a582a079cd569fff62c2095f5c6dba5924dea9a 100644 (file)
@@ -961,6 +961,14 @@ static void render_particle_system(Object *ob, PartEff *paf)
 
 /* ------------------------------------------------------------------------- */
 
+/* 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->id.newid;
+       return ob;
+}
+
 static void render_static_particle_system(Object *ob, PartEff *paf)
 {
        Particle *pa=0;
@@ -1175,14 +1183,6 @@ 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)
 {
@@ -2703,22 +2703,25 @@ void RE_freeRotateBlenderScene(void)
                if(R.la[a]->jitter) MEM_freeN(R.la[a]->jitter);
                MEM_freeN(R.la[a]);
        }
+
+       /* note; these pointer arrays were allocated, with last element NULL to stop loop */
        a=0;
        while(R.blove[a]) {
                MEM_freeN(R.blove[a]);
-               R.blove[a]=0;
+               R.blove[a]= NULL;
                a++;
        }
+
        a=0;
        while(R.blovl[a]) {
                MEM_freeN(R.blovl[a]);
-               R.blovl[a]=0;
+               R.blovl[a]= NULL;
                a++;
        }
        a=0;
        while(R.bloha[a]) {
                MEM_freeN(R.bloha[a]);
-               R.bloha[a]=0;
+               R.bloha[a]= NULL;
                a++;
        }