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
path: root/source
diff options
context:
space:
mode:
authorRobert Wenzlaff <rwenzlaff@soylent-green.com>2003-10-20 01:47:03 +0400
committerRobert Wenzlaff <rwenzlaff@soylent-green.com>2003-10-20 01:47:03 +0400
commit147895715a31bc83d07afd52864dc0046e3b65da (patch)
treebd07980ceca1493290d09c88f31816c6713d6aef /source
parent7ac2731e63e0102583238541ee9dd786b9ff3746 (diff)
Dynamic Face/Vert/Halo/Lamp tables:
User Info: Hard coded limits on the total number of face, verts, halos, and lamps is gone. Blender now allocates the tables for these on an as needed basis. As long as your system can come up with the memory, you won't run out. As a bonus, it also uses slightly less memory on smaller scenes. Coder info: This has been in tuhopuu for a while, but I don't know how hard it has been tested. Since it now allocates only an initial 1024 tables (of 256 verts/faces/halos each), it seems like it has been put through it's paces. Lamps are allocated one at a time, and I start with 256. I rendered 2.5M Faces/Verts/Halos. 4444 lamps. None the less, I left a few printf's in the realocation to hunt bugs. I'll take them out just before the release freeze. Also, be on the lookout for other "sanity checks" that assume a limited number of the above items. I think I got them all, but you never know.
Diffstat (limited to 'source')
-rw-r--r--source/blender/render/extern/include/render_types.h5
-rw-r--r--source/blender/render/intern/source/initrender.c8
-rw-r--r--source/blender/render/intern/source/renderdatabase.c53
-rw-r--r--source/blender/renderconverter/intern/convertBlenderScene.c32
4 files changed, 72 insertions, 26 deletions
diff --git a/source/blender/render/extern/include/render_types.h b/source/blender/render/extern/include/render_types.h
index 9777393685c..9b1f0ac02e6 100644
--- a/source/blender/render/extern/include/render_types.h
+++ b/source/blender/render/extern/include/render_types.h
@@ -37,9 +37,8 @@
#include "DNA_world_types.h"
#include "DNA_object_types.h"
-/* Definitely weird: this equals 1<<21... so wtf?*/
-#define MAXVERT (2<<20)
-#define MAXVLAK (2<<20)
+#define TABLEINITSIZE 1024
+#define LAMPINITSIZE 256
/* This is needed to not let VC choke on near and far... old
* proprietary MS extensions... */
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index e472e6727c7..e6ba91ee072 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -136,10 +136,10 @@ void RE_init_render_data(void)
O.dxwin[0]= 1.0;
O.dywin[1]= 1.0;
- R.blove= (VertRen **)MEM_callocN(sizeof(void *)*(MAXVERT>>8),"Blove");
- R.blovl= (VlakRen **)MEM_callocN(sizeof(void *)*(MAXVLAK>>8),"Blovl");
- R.bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(MAXVERT>>8),"Bloha");
- R.la= (LampRen **)MEM_mallocN(MAXLAMP*sizeof(void *),"renderlamparray");
+ R.blove= (VertRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Blove");
+ R.blovl= (VlakRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Blovl");
+ R.bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(TABLEINITSIZE),"Bloha");
+ R.la= (LampRen **)MEM_mallocN(LAMPINITSIZE*sizeof(void *),"renderlamparray");
init_def_material();
}
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index ecfc27baa62..609e640540a 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -75,14 +75,27 @@
VertRen *RE_findOrAddVert(int nr)
{
- VertRen *v;
+ VertRen *v, **temp;
+ static int rblovelen=TABLEINITSIZE;
int a;
- if(nr<0 || nr>MAXVERT ) {
+ if(nr<0) {
printf("error in findOrAddVert: %d\n",nr);
return R.blove[0];
}
a= nr>>8;
+
+ if (a>=rblovelen){ /* Need to allocate more columns...*/
+ 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*));
+ rblovelen+=TABLEINITSIZE;
+ MEM_freeN(temp);
+ }
+
v= R.blove[a];
if(v==0) {
v= (VertRen *)MEM_callocN(256*sizeof(VertRen),"findOrAddVert");
@@ -93,17 +106,29 @@ VertRen *RE_findOrAddVert(int nr)
}
/* ------------------------------------------------------------------------ */
-
+int rblohalen=TABLEINITSIZE;
HaloRen *RE_findOrAddHalo(int nr)
{
- HaloRen *h;
+ HaloRen *h, **temp;
int a;
- if(nr<0 || nr>MAXVERT ) {
+ if(nr<0) {
printf("error in findOrAddHalo: %d\n",nr);
return R.bloha[0];
}
a= nr>>8;
+
+ if (a>=rblohalen){ /* Need to allocate more columns...*/
+ 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");
+ memcpy(R.bloha, temp, rblohalen*sizeof(void*));
+ memset(&(R.bloha[a]), 0, TABLEINITSIZE*sizeof(void*));
+ rblohalen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
+ MEM_freeN(temp);
+ }
+
h= R.bloha[a];
if(h==0) {
h= (HaloRen *)MEM_callocN(256*sizeof(HaloRen),"findOrAdHalo");
@@ -117,15 +142,29 @@ HaloRen *RE_findOrAddHalo(int nr)
VlakRen *RE_findOrAddVlak(int nr)
{
- VlakRen *v;
+ VlakRen *v, **temp;
+ static int rblovllen=TABLEINITSIZE;
int a;
- if(nr<0 || nr>MAXVLAK ) {
+ if(nr<0) {
printf("error in findOrAddVlak: %d\n",nr);
return R.blovl[0];
}
a= nr>>8;
+
+ if (a>=rblovllen){ /* Need to allocate more columns...*/
+ 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");
+ memcpy(R.blovl, temp, rblovllen*sizeof(void*));
+ memset(&(R.blovl[a]), 0, TABLEINITSIZE*sizeof(void*));
+ rblovllen+=TABLEINITSIZE; /*Does this really need to be power of 2?*/
+ MEM_freeN(temp);
+ }
+
v= R.blovl[a];
+
if(v==0) {
v= (VlakRen *)MEM_callocN(256*sizeof(VlakRen),"findOrAddVlak");
R.blovl[a]= v;
diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index f2d1e738073..4461b849398 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -301,13 +301,13 @@ void RE_make_stars(void (*initfunc)(void),
}
}
}
- if(done > MAXVERT) {
- printf("Too many stars\n");
- break;
- }
+// if(done > MAXVERT) {
+// printf("Too many stars\n");
+// break;
+// }
if(blender_test_break()) break;
}
- if(done > MAXVERT) break;
+// if(done > MAXVERT) break;
if(blender_test_break()) break;
}
@@ -1325,7 +1325,7 @@ static int verghalo(const void *a1, const void *a2)
}
/* ------------------------------------------------------------------------- */
-
+extern int rblohalen;
static void sort_halos(void)
{
struct halosort *hablock, *haso;
@@ -1350,7 +1350,7 @@ static void sort_halos(void)
/* re-assamble R.bloha */
bloha= R.bloha;
- R.bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(MAXVERT>>8),"Bloha");
+ R.bloha= (HaloRen **)MEM_callocN(sizeof(void *)*(rblohalen),"Bloha");
haso= hablock;
for(a=0; a<R.tothalo; a++) {
@@ -1767,15 +1767,23 @@ 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;
+ Lamp *la, **temp;
LampRen *lar;
float mat[4][4], hoek, xn, yn;
int c;
-
- if(R.totlamp>=MAXLAMP) {
- printf("lamp overflow\n");
- return;
+ static int rlalen=LAMPINITSIZE; /*number of currently allocated lampren pointers*/
+
+ if(R.totlamp>=rlalen) { /* Need more Lamp pointers....*/
+ printf("Alocating %i more lamp groups, %i total.\n",
+ LAMPINITSIZE, rlalen+LAMPINITSIZE);
+ temp=R.la;
+ R.la=(LampRen**)MEM_callocN(sizeof(void*)*(rlalen+LAMPINITSIZE) , "renderlamparray");
+ memcpy(R.la, temp, rlalen*sizeof(void*));
+ memset(&(R.la[R.totlamp]), 0, LAMPINITSIZE*sizeof(void*));
+ rlalen+=LAMPINITSIZE;
+ MEM_freeN(temp);
}
+
la= ob->data;
lar= (LampRen *)MEM_callocN(sizeof(LampRen),"lampren");
R.la[R.totlamp++]= lar;