Revision: 16301
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16301
Author:   blendix
Date:     2008-08-29 15:23:33 +0200 (Fri, 29 Aug 2008)

Log Message:
-----------
Apricot Branch: better support for multiple scenes with glsl,
now it keeps shaders and lamps per scene.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/intern/material.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_material_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/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/KX_Light.cpp
    branches/apricot/source/gameengine/Ketsji/KX_Light.h

Modified: branches/apricot/source/blender/blenkernel/intern/material.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/material.c        
2008-08-29 12:24:07 UTC (rev 16300)
+++ branches/apricot/source/blender/blenkernel/intern/material.c        
2008-08-29 13:23:33 UTC (rev 16301)
@@ -99,7 +99,7 @@
                MEM_freeN(ma->nodetree);
        }
 
-       if(ma->gpumaterial)
+       if(ma->gpumaterial.first)
                GPU_material_free(ma);
 }
 
@@ -213,7 +213,7 @@
                man->nodetree= ntreeCopyTree(ma->nodetree, 0);  /* 0 == full 
new tree */
        }
 
-       man->gpumaterial= NULL;
+       man->gpumaterial.first= man->gpumaterial.last= NULL;
        
        return man;
 }

Modified: branches/apricot/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/apricot/source/blender/blenloader/intern/readfile.c        
2008-08-29 12:24:07 UTC (rev 16300)
+++ branches/apricot/source/blender/blenloader/intern/readfile.c        
2008-08-29 13:23:33 UTC (rev 16301)
@@ -2562,7 +2562,7 @@
                direct_link_nodetree(fd, ma->nodetree);
 
        ma->preview = direct_link_preview_image(fd, ma->preview);
-       ma->gpumaterial = NULL;
+       ma->gpumaterial.first = ma->gpumaterial.last = NULL;
 }
 
 /* ************ READ PARTICLE SETTINGS ***************** */

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h  2008-08-29 12:24:07 UTC 
(rev 16300)
+++ branches/apricot/source/blender/gpu/GPU_material.h  2008-08-29 13:23:33 UTC 
(rev 16301)
@@ -119,7 +119,7 @@
 
 /* High level functions to create and use GPU materials */
 
-int GPU_material_from_blender(struct Scene *scene, struct Material *ma);
+GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material 
*ma);
 void GPU_material_free(struct Material *ma);
 
 void GPU_materials_free();
@@ -151,7 +151,7 @@
 
 /* Lamps */
 
-GPULamp *GPU_lamp_from_blender(struct Object *ob, struct Object *par);
+GPULamp *GPU_lamp_from_blender(struct Scene *scene, struct Object *ob, struct 
Object *par);
 void GPU_lamp_free(struct Object *ob);
 
 int GPU_lamp_has_shadow_buffer(GPULamp *lamp);

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c    2008-08-29 
12:24:07 UTC (rev 16300)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c    2008-08-29 
13:23:33 UTC (rev 16301)
@@ -362,7 +362,7 @@
 {
        extern Material defmaterial;    // render module abuse...
 
-       if(defmaterial.gpumaterial)
+       if(defmaterial.gpumaterial.first)
                GPU_material_free(&defmaterial);
 
        if(FUNCTION_HASH) {

Modified: branches/apricot/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_draw.c       2008-08-29 
12:24:07 UTC (rev 16300)
+++ branches/apricot/source/blender/gpu/intern/gpu_draw.c       2008-08-29 
13:23:33 UTC (rev 16301)
@@ -765,6 +765,7 @@
 {
        extern Material defmaterial; /* from material.c */
        Material *ma;
+       GPUMaterial *gpumat;
        GPUBlendMode blendmode;
        int a;
        
@@ -818,13 +819,12 @@
                        continue;
 
                /* create glsl material if requested */
-               if(glsl)
-                       GPU_material_from_blender(GMS.gscene, ma);
+               gpumat = (glsl)? GPU_material_from_blender(GMS.gscene, ma): 
NULL;
 
-               if(glsl && ma->gpumaterial) {
+               if(gpumat) {
                        /* do glsl only if creating it succeed, else fallback */
                        GMS.gmatbuf[a]= ma;
-                       blendmode = GPU_material_blend_mode(ma->gpumaterial, 
ob->col);
+                       blendmode = GPU_material_blend_mode(gpumat, ob->col);
                }
                else {
                        /* fixed function opengl materials */
@@ -866,6 +866,7 @@
 int GPU_enable_material(int nr, void *attribs)
 {
        GPUVertexAttribs *gattribs = attribs;
+       GPUMaterial *gpumat;
        GPUBlendMode blendmode;
 
        /* prevent index to use un-initialized array items */
@@ -882,7 +883,7 @@
        /* unbind glsl material */
        if(GMS.gboundmat) {
                if(GMS.alphapass) glDepthMask(0);
-               GPU_material_unbind(GMS.gboundmat->gpumaterial);
+               GPU_material_unbind(GPU_material_from_blender(GMS.gscene, 
GMS.gboundmat));
                GMS.gboundmat= NULL;
        }
 
@@ -897,9 +898,10 @@
                        /* bind glsl material and get attributes */
                        Material *mat = GMS.gmatbuf[nr];
 
-                       GPU_material_vertex_attributes(mat->gpumaterial, 
gattribs);
-                       GPU_material_bind(mat->gpumaterial, GMS.gob->lay, 1.0);
-                       GPU_material_bind_uniforms(mat->gpumaterial, 
GMS.gob->obmat, G.vd->viewmat, G.vd->viewinv, GMS.gob->col);
+                       gpumat = GPU_material_from_blender(GMS.gscene, mat);
+                       GPU_material_vertex_attributes(gpumat, gattribs);
+                       GPU_material_bind(gpumat, GMS.gob->lay, 1.0);
+                       GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, 
G.vd->viewmat, G.vd->viewinv, GMS.gob->col);
                        GMS.gboundmat= mat;
 
                        if(GMS.alphapass) glDepthMask(1);
@@ -939,7 +941,7 @@
 
        if(GMS.gboundmat) {
                if(GMS.alphapass) glDepthMask(0);
-               GPU_material_unbind(GMS.gboundmat->gpumaterial);
+               GPU_material_unbind(GPU_material_from_blender(GMS.gscene, 
GMS.gboundmat));
                GMS.gboundmat= NULL;
        }
 

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-08-29 
12:24:07 UTC (rev 16300)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-08-29 
13:23:33 UTC (rev 16301)
@@ -99,6 +99,7 @@
 };
 
 struct GPULamp {
+       Scene *scene;
        Object *ob;
        Object *par;
        Lamp *la;
@@ -219,18 +220,20 @@
 
 void GPU_material_free(Material *ma)
 {
-       GPUMaterial *material = ma->gpumaterial;
+       LinkData *link;
 
-       if(material) {
+       for(link=ma->gpumaterial.first; link; link=link->next) {
+               GPUMaterial *material = link->data;
+
                if(material->pass)
                        GPU_pass_free(material->pass);
 
                BLI_linklist_free(material->lamps, NULL);
 
                MEM_freeN(material);
+       }
 
-               ma->gpumaterial = NULL;
-       }
+       BLI_freelistN(&ma->gpumaterial);
 }
 
 void GPU_material_bind(GPUMaterial *material, int lay, double time)
@@ -742,7 +745,7 @@
                ob= base->object;
 
                if(ob->type==OB_LAMP) {
-                       lamp = GPU_lamp_from_blender(ob, NULL);
+                       lamp = GPU_lamp_from_blender(shi->gpumat->scene, ob, 
NULL);
                        if(lamp)
                                shade_one_light(shi, shr, lamp);
                }
@@ -757,7 +760,7 @@
                                if(ob->type==OB_LAMP) {
                                        Mat4CpyMat4(ob->obmat, dob->mat);
 
-                                       lamp = GPU_lamp_from_blender(ob, 
base->object);
+                                       lamp = 
GPU_lamp_from_blender(shi->gpumat->scene, ob, base->object);
                                        if(lamp)
                                                shade_one_light(shi, shr, lamp);
                                }
@@ -1202,14 +1205,16 @@
        return shr.combined;
 }
 
-int GPU_material_from_blender(Scene *scene, Material *ma)
+GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
 {
        GPUMaterial *mat;
        GPUNodeLink *outlink;
+       LinkData *link;
 
-       if(ma->gpumaterial)
-               return 1;
-       
+       for(link=ma->gpumaterial.first; link; link=link->next)
+               if(((GPUMaterial*)link->data)->scene == scene)
+                       return link->data;
+
        mat = GPU_material_construct_begin(ma);
        mat->scene = scene;
 
@@ -1229,8 +1234,11 @@
 
        GPU_material_construct_end(mat);
 
-       ma->gpumaterial= mat;
-       return 1;
+       link = MEM_callocN(sizeof(LinkData), "GPUMaterialLink");
+       link->data = mat;
+       BLI_addtail(&ma->gpumaterial, link);
+
+       return mat;
 }
 
 void GPU_materials_free()
@@ -1263,10 +1271,11 @@
        Mat4Invert(lamp->imat, mat);
 }
 
-static void gpu_lamp_from_blender(Object *ob, Object *par, Lamp *la, GPULamp 
*lamp)
+static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp 
*la, GPULamp *lamp)
 {
        float temp, angle, pixsize, wsize;
 
+       lamp->scene = scene;
        lamp->ob = ob;
        lamp->par = par;
        lamp->la = la;
@@ -1325,14 +1334,15 @@
                GPU_framebuffer_free(lamp->fb);
 }
 
-GPULamp *GPU_lamp_from_blender(Object *ob, Object *par)
+GPULamp *GPU_lamp_from_blender(Scene *scene, Object *ob, Object *par)
 {
        Lamp *la;
        GPULamp *lamp;
        LinkData *link;
 
        for(link=ob->gpulamp.first; link; link=link->next)
-               if(((GPULamp*)link->data)->par == par)
+               if(((GPULamp*)link->data)->par == par &&
+                  ((GPULamp*)link->data)->scene == scene)
                        return link->data;
 
        lamp = MEM_callocN(sizeof(GPULamp), "GPULamp");
@@ -1342,7 +1352,7 @@
        BLI_addtail(&ob->gpulamp, link);
 
        la = ob->data;
-       gpu_lamp_from_blender(ob, par, la, lamp);
+       gpu_lamp_from_blender(scene, ob, par, la, lamp);
 
        if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF)) {
                /* opengl */
@@ -1381,10 +1391,8 @@
 
                for(nlink=lamp->materials; nlink; nlink=nlink->next) {
                        ma= nlink->link;
-                       if(ma->gpumaterial) {
+                       if(ma->gpumaterial.first)
                                GPU_material_free(ma);
-                               ma->gpumaterial= NULL;
-                       }
                }
                BLI_linklist_free(lamp->materials, NULL);
 

Modified: branches/apricot/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/apricot/source/blender/makesdna/DNA_material_types.h       
2008-08-29 12:24:07 UTC (rev 16300)
+++ branches/apricot/source/blender/makesdna/DNA_material_types.h       
2008-08-29 13:23:33 UTC (rev 16301)
@@ -135,8 +135,7 @@
        
        ScriptLink scriptlink;
 
-       /* runtime glsl material */
-       struct GPUMaterial *gpumaterial;
+       ListBase gpumaterial;           /* runtime */
 } Material;
 
 /* **************** MATERIAL ********************* */

Modified: branches/apricot/source/blender/src/drawscene.c
===================================================================
--- branches/apricot/source/blender/src/drawscene.c     2008-08-29 12:24:07 UTC 
(rev 16300)
+++ branches/apricot/source/blender/src/drawscene.c     2008-08-29 13:23:33 UTC 
(rev 16301)
@@ -55,8 +55,6 @@
 
 #include "BSE_view.h"
 
-#include "GPU_material.h"
-
 #include "radio.h"
 
 #include "blendef.h" /* old */
@@ -77,8 +75,6 @@
        exit_paint_modes();
        
        set_last_seq(NULL);
-
-       GPU_materials_free();
        
        G.scene= sce;
 

Modified: branches/apricot/source/blender/src/drawview.c
===================================================================
--- branches/apricot/source/blender/src/drawview.c      2008-08-29 12:24:07 UTC 
(rev 16300)
+++ branches/apricot/source/blender/src/drawview.c      2008-08-29 13:23:33 UTC 
(rev 16301)
@@ -2938,7 +2938,7 @@
        GPULamp *lamp;
        View3DShadow *shadow;
 
-       lamp = GPU_lamp_from_blender(ob, par);
+       lamp = GPU_lamp_from_blender(G.scene, ob, par);
 
        if(lamp) {
                GPU_lamp_update(lamp, obmat);

Modified: branches/apricot/source/blender/src/previewrender.c
===================================================================

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to