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

Reply via email to