Revision: 16195 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16195 Author: blendix Date: 2008-08-20 18:29:55 +0200 (Wed, 20 Aug 2008)
Log Message: ----------- Apricot Branch ============== * Make lights and shadows work better with dupligroups, also in the game engine. Previously only one dupli would be created, and shadows didn't work well at all. * Make normal maps + stencil work. * Some glsl refresh and default material fixes. Modified Paths: -------------- branches/apricot/source/blender/blenkernel/intern/material.c branches/apricot/source/blender/blenkernel/intern/object.c branches/apricot/source/blender/blenloader/intern/readfile.c branches/apricot/source/blender/gpu/GPU_material.h branches/apricot/source/blender/gpu/intern/gpu_codegen.c branches/apricot/source/blender/gpu/intern/gpu_draw.c branches/apricot/source/blender/gpu/intern/gpu_material.c branches/apricot/source/blender/makesdna/DNA_object_types.h branches/apricot/source/blender/src/drawscene.c branches/apricot/source/blender/src/drawview.c branches/apricot/source/blender/src/previewrender.c branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp branches/apricot/source/gameengine/Ketsji/KX_GameObject.cpp branches/apricot/source/gameengine/Ketsji/KX_GameObject.h branches/apricot/source/gameengine/Ketsji/KX_KetsjiEngine.cpp branches/apricot/source/gameengine/Ketsji/KX_Light.cpp branches/apricot/source/gameengine/Ketsji/KX_Light.h branches/apricot/source/gameengine/Ketsji/KX_Scene.cpp Modified: branches/apricot/source/blender/blenkernel/intern/material.c =================================================================== --- branches/apricot/source/blender/blenkernel/intern/material.c 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/blenkernel/intern/material.c 2008-08-20 16:29:55 UTC (rev 16195) @@ -100,7 +100,7 @@ } if(ma->gpumaterial) - GPU_material_free(ma->gpumaterial); + GPU_material_free(ma); } void init_material(Material *ma) Modified: branches/apricot/source/blender/blenkernel/intern/object.c =================================================================== --- branches/apricot/source/blender/blenkernel/intern/object.c 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/blenkernel/intern/object.c 2008-08-20 16:29:55 UTC (rev 16195) @@ -270,7 +270,7 @@ } if(ob->soft) sbFree(ob->soft); if(ob->fluidsimSettings) fluidsimSettingsFree(ob->fluidsimSettings); - if(ob->gpulamp) GPU_lamp_free(ob->gpulamp); + if(ob->gpulamp.first) GPU_lamp_free(ob); } static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin) @@ -1229,7 +1229,7 @@ obn->vnode = NULL; #endif - obn->gpulamp = NULL; + obn->gpulamp.first = obn->gpulamp.last = NULL; return obn; } Modified: branches/apricot/source/blender/blenloader/intern/readfile.c =================================================================== --- branches/apricot/source/blender/blenloader/intern/readfile.c 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/blenloader/intern/readfile.c 2008-08-20 16:29:55 UTC (rev 16195) @@ -3400,7 +3400,7 @@ ob->bb= NULL; ob->derivedDeform= NULL; ob->derivedFinal= NULL; - ob->gpulamp= NULL; + ob->gpulamp.first= ob->gpulamp.last= NULL; } /* ************ READ SCENE ***************** */ Modified: branches/apricot/source/blender/gpu/GPU_material.h =================================================================== --- branches/apricot/source/blender/gpu/GPU_material.h 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/gpu/GPU_material.h 2008-08-20 16:29:55 UTC (rev 16195) @@ -120,7 +120,7 @@ /* High level functions to create and use GPU materials */ int GPU_material_from_blender(struct Scene *scene, struct Material *ma); -void GPU_material_free(GPUMaterial *material); +void GPU_material_free(struct Material *ma); void GPU_materials_free(); @@ -151,8 +151,8 @@ /* Lamps */ -int GPU_lamp_from_blender(struct Object *ob, struct Lamp *la); -void GPU_lamp_free(GPULamp *lamp); +GPULamp *GPU_lamp_from_blender(struct Object *ob, struct Object *par); +void GPU_lamp_free(struct Object *ob); int GPU_lamp_has_shadow_buffer(GPULamp *lamp); void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize, float winmat[][4]); Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c =================================================================== --- branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-08-20 16:29:55 UTC (rev 16195) @@ -362,10 +362,8 @@ { extern Material defmaterial; // render module abuse... - if(defmaterial.gpumaterial) { - GPU_material_free(defmaterial.gpumaterial); - defmaterial.gpumaterial = NULL; - } + if(defmaterial.gpumaterial) + GPU_material_free(&defmaterial); if(FUNCTION_HASH) { BLI_ghash_free(FUNCTION_HASH, NULL, (GHashValFreeFP)MEM_freeN); Modified: branches/apricot/source/blender/gpu/intern/gpu_draw.c =================================================================== --- branches/apricot/source/blender/gpu/intern/gpu_draw.c 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/gpu/intern/gpu_draw.c 2008-08-20 16:29:55 UTC (rev 16195) @@ -798,7 +798,12 @@ QUATCOPY(GMS.matbuf[1][0], GMS.matbuf[0][0]); QUATCOPY(GMS.matbuf[1][1], GMS.matbuf[0][1]); - GMS.gmatbuf[0]= NULL; + if(glsl) { + GMS.gmatbuf[0]= &defmaterial; + GPU_material_from_blender(GMS.gscene, &defmaterial); + } + + GMS.blendmode[0]= GPU_BLEND_SOLID; } /* setup materials */ Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c =================================================================== --- branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-08-20 06:11:11 UTC (rev 16194) +++ branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-08-20 16:29:55 UTC (rev 16195) @@ -100,6 +100,7 @@ struct GPULamp { Object *ob; + Object *par; Lamp *la; int type, mode, lay; @@ -216,14 +217,20 @@ return 0; } -void GPU_material_free(GPUMaterial *material) +void GPU_material_free(Material *ma) { - if(material->pass) - GPU_pass_free(material->pass); + GPUMaterial *material = ma->gpumaterial; - BLI_linklist_free(material->lamps, NULL); + if(material) { + if(material->pass) + GPU_pass_free(material->pass); - MEM_freeN(material); + BLI_linklist_free(material->lamps, NULL); + + MEM_freeN(material); + + ma->gpumaterial = NULL; + } } void GPU_material_bind(GPUMaterial *material, int lay, double time) @@ -729,14 +736,15 @@ Base *base; Object *ob; Scene *sce; + GPULamp *lamp; for(SETLOOPER(shi->gpumat->scene, base)) { ob= base->object; if(ob->type==OB_LAMP) { - GPU_lamp_from_blender(ob, ob->data); - if(ob->gpulamp) - shade_one_light(shi, shr, ob->gpulamp); + lamp = GPU_lamp_from_blender(ob, NULL); + if(lamp) + shade_one_light(shi, shr, lamp); } if (ob->transflag & OB_DUPLI) { @@ -749,9 +757,9 @@ if(ob->type==OB_LAMP) { Mat4CpyMat4(ob->obmat, dob->mat); - GPU_lamp_from_blender(ob, ob->data); - if(ob->gpulamp) - shade_one_light(shi, shr, ob->gpulamp); + lamp = GPU_lamp_from_blender(ob, base->object); + if(lamp) + shade_one_light(shi, shr, lamp); } } @@ -855,7 +863,7 @@ GPUMaterial *mat= shi->gpumat; MTex *mtex; Tex *tex; - GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil = NULL; + GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil, *tnorfac; GPUNodeLink *texco_norm, *texco_orco, *texco_object, *texco_tangent; GPUNodeLink *texco_global, *texco_uv = NULL; GPUNodeLink *colfac, *newnor, *varfac, *orn; @@ -993,10 +1001,17 @@ newnor = tnor; norfac = MIN2(mtex->norfac, 1.0); - if(norfac == 1.0f) + if(norfac == 1.0f && !GPU_link_changed(stencil)) { shi->vn = newnor; - else - GPU_link(mat, "mtex_blend_normal", GPU_uniform(&norfac), shi->vn, newnor, &shi->vn); + } + else { + tnorfac = GPU_uniform(&norfac); + + if(GPU_link_changed(stencil)) + GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac); + + GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn); + } } GPU_link(mat, "vec_math_negate", shi->vn, &orn); @@ -1217,31 +1232,40 @@ void GPU_materials_free() { + Object *ob; Material *ma; + extern Material defmaterial; - for(ma=G.main->mat.first; ma; ma=ma->id.next) { - if(ma->gpumaterial) { - GPU_material_free(ma->gpumaterial); - ma->gpumaterial = NULL; - } - } + for(ma=G.main->mat.first; ma; ma=ma->id.next) + GPU_material_free(ma); + + GPU_material_free(&defmaterial); + + for(ob=G.main->object.first; ma; ma=ma->id.next) + GPU_lamp_free(ob); } /* Lamps and shadow buffers */ void GPU_lamp_update(GPULamp *lamp, float obmat[][4]) { - VECCOPY(lamp->vec, obmat[2]); - VECCOPY(lamp->co, obmat[3]); - Mat4CpyMat4(lamp->obmat, obmat); - Mat4Invert(lamp->imat, obmat); + float mat[4][4]; + + Mat4CpyMat4(mat, obmat); + Mat4Ortho(mat); + + VECCOPY(lamp->vec, mat[2]); + VECCOPY(lamp->co, mat[3]); + Mat4CpyMat4(lamp->obmat, mat); + Mat4Invert(lamp->imat, mat); } -static void gpu_lamp_from_blender(Object *ob, Lamp *la, GPULamp *lamp) +static void gpu_lamp_from_blender(Object *ob, Object *par, Lamp *la, GPULamp *lamp) { float temp, angle, pixsize, wsize; lamp->ob = ob; + lamp->par = par; lamp->la = la; lamp->lay = ob->lay; @@ -1290,65 +1314,83 @@ i_window(-wsize, wsize, -wsize, wsize, lamp->d, lamp->clipend, lamp->winmat); } -int GPU_lamp_from_blender(Object *ob, Lamp *la) +static void gpu_lamp_shadow_free(GPULamp *lamp) { + if(lamp->tex) + GPU_texture_free(lamp->tex); + if(lamp->fb) + GPU_framebuffer_free(lamp->fb); +} + +GPULamp *GPU_lamp_from_blender(Object *ob, Object *par) +{ + Lamp *la; GPULamp *lamp; + LinkData *link; - if(ob->gpulamp) { - //gpu_lamp_from_blender(ob, la, ob->gpulamp); - return 1; - } + for(link=ob->gpulamp.first; link; link=link->next) + if(((GPULamp*)link->data)->par == par) + return link->data; lamp = MEM_callocN(sizeof(GPULamp), "GPULamp"); - ob->gpulamp = lamp; - gpu_lamp_from_blender(ob, la, lamp); + link = MEM_callocN(sizeof(LinkData), "GPULampLink"); + link->data = lamp; + BLI_addtail(&ob->gpulamp, link); + la = ob->data; + gpu_lamp_from_blender(ob, par, la, lamp); + if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF)) { /* opengl */ lamp->fb = GPU_framebuffer_create(); if(!lamp->fb) { - GPU_lamp_free(lamp); - return 0; + gpu_lamp_shadow_free(lamp); + return lamp; } lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size); if(!lamp->tex) { - GPU_lamp_free(lamp); - return 0; + gpu_lamp_shadow_free(lamp); + return lamp; } if(!GPU_framebuffer_texture_attach(lamp->fb, lamp->tex)) { - GPU_lamp_free(lamp); - return 0; + gpu_lamp_shadow_free(lamp); + return lamp; } GPU_framebuffer_restore(); } - return 1; + return lamp; } -void GPU_lamp_free(GPULamp *lamp) +void GPU_lamp_free(Object *ob) { + GPULamp *lamp; + LinkData *link; LinkNode *nlink; Material *ma; - for(nlink=lamp->materials; nlink; nlink=nlink->next) { - ma= nlink->link; - if(ma->gpumaterial) { - GPU_material_free(ma->gpumaterial); - ma->gpumaterial= NULL; + for(link=ob->gpulamp.first; link; link=link->next) { + lamp = link->data; + + for(nlink=lamp->materials; nlink; nlink=nlink->next) { + ma= nlink->link; + if(ma->gpumaterial) { + GPU_material_free(ma); + ma->gpumaterial= NULL; + } } + BLI_linklist_free(lamp->materials, NULL); + + gpu_lamp_shadow_free(lamp); + + MEM_freeN(lamp); } - BLI_linklist_free(lamp->materials, NULL); - if(lamp->tex) - GPU_texture_free(lamp->tex); - if(lamp->fb) - GPU_framebuffer_free(lamp->fb); - - MEM_freeN(lamp); + BLI_freelistN(&ob->gpulamp); } int GPU_lamp_has_shadow_buffer(GPULamp *lamp) Modified: branches/apricot/source/blender/makesdna/DNA_object_types.h @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs