diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-07-13 04:40:20 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-07-13 04:40:20 +0400 |
commit | 26ef6da24b3324fb6f8ab6cfe12f101f0d7dedb4 (patch) | |
tree | 375aa10e98780325086c215454f71cdeaef2de4b /source/blender/gpu | |
parent | 6fb0181b50461b529bb960950870de941711041e (diff) |
2.5
* Objects now support up to 32767 material slots. It's easy to
increase this further, but I prefer not to increase the memory
usage of mesh faces, it seems unlikely that someone would
create 32767 distinct materials?
* Forward compatibility: the only thing you can potentially lose
reading a 2.5 file in 2.4 is object linking (instead of default
data), though usually that will go fine too. Reading files with
> 32 material slots in 2.4 can start giving issues.
* The ob->colbits variable is deprecated by the array ob->matbits
but I didn't remove the ob->colbits updates in very few places
it is set.
* I hope I changed all the relevant things, various places just
hardcoded the number 16 instead of using the MAXMAT define.
* Join Objects operator back. This is using the version from the
animsys2 branch coded by Joshua, which means it now supports
joining of shape keys.
* Fix for crash reading file saved during render.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_draw.h | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_draw.c | 52 |
2 files changed, 41 insertions, 15 deletions
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h index ce130951840..802f30506f8 100644 --- a/source/blender/gpu/GPU_draw.h +++ b/source/blender/gpu/GPU_draw.h @@ -63,8 +63,10 @@ void GPU_state_init(void); * GPU_enable_material returns 0 if drawing should be skipped * - after drawing, the material must be disabled again */ -void GPU_set_object_materials(struct View3D *v3d, struct RegionView3D *rv3d, +void GPU_begin_object_materials(struct View3D *v3d, struct RegionView3D *rv3d, struct Scene *scene, struct Object *ob, int glsl, int *do_alpha_pass); +void GPU_end_object_materials(void); + int GPU_enable_material(int nr, void *attribs); void GPU_disable_material(void); diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 5edb619f7e5..efb7d688a49 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -776,16 +776,17 @@ void GPU_free_images(void) /* OpenGL Materials */ -/* materials start counting at # one.... */ -#define MAXMATBUF (MAXMAT+1) +#define FIXEDMAT 8 /* OpenGL state caching for materials */ static struct GPUMaterialState { - float matbuf[MAXMATBUF][2][4]; + float (*matbuf)[2][4]; + float matbuf_fixed[FIXEDMAT][2][4]; int totmat; - Material *gmatbuf[MAXMATBUF]; + Material **gmatbuf; + Material *gmatbuf_fixed[FIXEDMAT]; Material *gboundmat; Object *gob; Scene *gscene; @@ -793,7 +794,8 @@ static struct GPUMaterialState { float (*gviewmat)[4]; float (*gviewinv)[4]; - GPUBlendMode blendmode[MAXMATBUF]; + GPUBlendMode *blendmode; + GPUBlendMode blendmode_fixed[FIXEDMAT]; int alphapass; int lastmatnr, lastretval; @@ -814,7 +816,7 @@ Material *gpu_active_node_material(Material *ma) return ma; } -void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass) +void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Object *ob, int glsl, int *do_alpha_pass) { extern Material defmaterial; /* from material.c */ Material *ma; @@ -830,7 +832,7 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj GMS.gob = ob; GMS.gscene = scene; - GMS.totmat= ob->totcol; + GMS.totmat= ob->totcol+1; /* materials start from 1, default material is 0 */ GMS.glay= v3d->lay; GMS.gviewmat= rv3d->viewmat; GMS.gviewinv= rv3d->viewinv; @@ -838,6 +840,17 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj GMS.alphapass = (v3d && v3d->transp); if(do_alpha_pass) *do_alpha_pass = 0; + + if(GMS.totmat > FIXEDMAT) { + GMS.matbuf= MEM_callocN(sizeof(*GMS.matbuf)*GMS.totmat, "GMS.matbuf"); + GMS.gmatbuf= MEM_callocN(sizeof(*GMS.gmatbuf)*GMS.totmat, "GMS.matbuf"); + GMS.blendmode= MEM_callocN(sizeof(*GMS.blendmode)*GMS.totmat, "GMS.matbuf"); + } + else { + GMS.matbuf= GMS.matbuf_fixed; + GMS.gmatbuf= GMS.gmatbuf_fixed; + GMS.blendmode= GMS.blendmode_fixed; + } /* no materials assigned? */ if(ob->totcol==0) { @@ -870,10 +883,6 @@ void GPU_set_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, Obj if(!glsl) ma= gpu_active_node_material(ma); if(ma==NULL) ma= &defmaterial; - /* this shouldn't happen .. */ - if(a>=MAXMATBUF) - continue; - /* create glsl material if requested */ gpumat = (glsl)? GPU_material_from_blender(GMS.gscene, ma): NULL; @@ -926,14 +935,14 @@ int GPU_enable_material(int nr, void *attribs) GPUBlendMode blendmode; /* prevent index to use un-initialized array items */ - if(nr>GMS.totmat) - nr= GMS.totmat; + if(nr>=GMS.totmat) + nr= 0; if(gattribs) memset(gattribs, 0, sizeof(*gattribs)); /* keep current material */ - if(nr>=MAXMATBUF || nr==GMS.lastmatnr) + if(nr==GMS.lastmatnr) return GMS.lastretval; /* unbind glsl material */ @@ -1004,6 +1013,21 @@ void GPU_disable_material(void) GPU_set_material_blend_mode(GPU_BLEND_SOLID); } +void GPU_end_object_materials(void) +{ + GPU_disable_material(); + + if(GMS.matbuf && GMS.matbuf != GMS.matbuf_fixed) { + MEM_freeN(GMS.matbuf); + MEM_freeN(GMS.gmatbuf); + MEM_freeN(GMS.blendmode); + + GMS.matbuf= NULL; + GMS.gmatbuf= NULL; + GMS.blendmode= NULL; + } +} + /* Lights */ int GPU_default_lights(void) |