Revision: 49013
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49013
Author:   kupoman
Date:     2012-07-18 05:40:24 +0000 (Wed, 18 Jul 2012)
Log Message:
-----------
Shader datablocks are now saving and loading smoother. Loading and saving 
Uniforms still needs some work, but the uniforms in general need work.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/blenkernel/intern/shader.c
    branches/ge_harmony/source/blender/blenloader/intern/readfile.c
    branches/ge_harmony/source/blender/blenloader/intern/writefile.c

Modified: branches/ge_harmony/source/blender/blenkernel/intern/shader.c
===================================================================
--- branches/ge_harmony/source/blender/blenkernel/intern/shader.c       
2012-07-18 03:56:42 UTC (rev 49012)
+++ branches/ge_harmony/source/blender/blenkernel/intern/shader.c       
2012-07-18 05:40:24 UTC (rev 49013)
@@ -59,6 +59,8 @@
 {
        if (sh->source)
                MEM_freeN(sh->source);
+
+       BLI_freelistN(&sh->uniforms);
 }
 
 struct Shader *BKE_shader_add(const char *name)

Modified: branches/ge_harmony/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/ge_harmony/source/blender/blenloader/intern/readfile.c     
2012-07-18 03:56:42 UTC (rev 49012)
+++ branches/ge_harmony/source/blender/blenloader/intern/readfile.c     
2012-07-18 05:40:24 UTC (rev 49013)
@@ -138,6 +138,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_sequencer.h"
+#include "BKE_shader.h"
 #include "BKE_text.h" // for txt_extended_ascii_as_utf8
 #include "BKE_tracking.h"
 #include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER 
TEST REND
@@ -3211,7 +3212,6 @@
        Material *ma;
        MTex *mtex;
        CustomShader *cs;
-       CustomUniform *cu;
        int a;
        
        for (ma = main->mat.first; ma; ma = ma->id.next) {
@@ -3236,22 +3236,9 @@
                        if (ma->nodetree)
                                lib_link_ntree(fd, &ma->id, ma->nodetree);
 
-                       cs = (CustomShader *)ma->custom_shaders.first;
-                       while (cs) {
-                               cs->shader->sourcetext = newlibadr(fd, 
ma->id.lib, cs->shader->sourcetext);
+                       for (cs = ma->custom_shaders.first; cs; cs = cs->next)
+                               cs->shader = newlibadr_us(fd, ma->id.lib, 
cs->shader);
 
-                               cu = cs->shader->uniforms.first;
-
-                               while(cu) {
-                                       if(cu->type==MA_UNF_SAMPLER2D)
-                                               cu->data= newlibadr(fd, 
ma->id.lib, cu->data);
-
-                                       cu = cu->next;
-                               }
-
-                               cs = cs->next;
-                       }
-
                        ma->id.flag -= LIB_NEEDLINK;
                }
        }
@@ -3260,9 +3247,6 @@
 static void direct_link_material(FileData *fd, Material *ma)
 {
        int a;
-       CustomShader *cs;
-       CustomUniform *cu;
-
        
        ma->adt = newdataadr(fd, ma->adt);
        direct_link_animdata(fd, ma->adt);
@@ -3270,25 +3254,9 @@
        for (a = 0; a < MAX_MTEX; a++) {
                ma->mtex[a] = newdataadr(fd, ma->mtex[a]);
        }
-       link_list(fd, &ma->csi.uniforms);
-       
-       cs = (CustomShader *)ma->custom_shaders.first;
 
-       while (cs) {
-               cu = (CustomUniform *)cs->shader->uniforms.first;
+       link_list(fd, &ma->custom_shaders);
 
-               while(cu) {
-                       // Sampler2D is handled in lib_link, so only vec* and 
ivec* need special attention here
-                       if (cu->type != MA_UNF_FLOAT &&
-                               cu->type != MA_UNF_INT &&
-                               cu->type != MA_UNF_SAMPLER2D)
-                               cu->data= newdataadr(fd, cu->data);
-
-                       cu = cu->next;
-               }
-               cs = cs->next;
-       }
-       
        ma->ramp_col = newdataadr(fd, ma->ramp_col);
        ma->ramp_spec = newdataadr(fd, ma->ramp_spec);
        
@@ -3300,6 +3268,44 @@
        ma->gpumaterial.first = ma->gpumaterial.last = NULL;
 }
 
+/* ************ READ SHADER ***************** */
+static void lib_link_shader(FileData *fd, Main *main)
+{      
+       Shader *sh;
+       Uniform *uni;
+       for (sh = main->shader.first; sh; sh = sh->id.next) {
+               if (sh->id.flag & LIB_NEEDLINK) {                       
+                       /* Link ID Properties -- and copy this comment EXACTLY 
for easy finding
+                        * of library blocks that implement this.*/
+                       if (sh->id.properties) 
IDP_LibLinkProperty(sh->id.properties, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), 
fd);
+                       
+                       sh->sourcetext = newlibadr_us(fd, sh->id.lib, 
sh->sourcetext);
+                       for (uni = sh->uniforms.first; uni; uni = uni->next) {
+                               if(uni->type==MA_UNF_SAMPLER2D)
+                                       uni->data= newlibadr(fd, sh->id.lib, 
uni->data);
+                       }
+
+                       BKE_shader_read_source(sh);
+
+                       sh->id.flag -= LIB_NEEDLINK;
+               }
+       }
+}
+
+static void direct_link_shader(FileData *fd, Shader *sh)
+{
+       Uniform *uni;
+
+       link_list(fd, &sh->uniforms);
+
+       for (uni = sh->uniforms.first; uni; uni = uni->next) {
+               if (uni->type != MA_UNF_FLOAT &&
+                       uni->type != MA_UNF_INT &&
+                       uni->type != MA_UNF_SAMPLER2D)
+                       uni->data= newdataadr(fd, uni->data);
+       }
+}
+
 /* ************ READ PARTICLE SETTINGS ***************** */
 /* update this also to writefile.c */
 static const char *ptcache_data_struct[] = {
@@ -6561,6 +6567,9 @@
                case ID_MSK:
                        direct_link_mask(fd, (Mask *)id);
                        break;
+               case ID_SH:
+                       direct_link_shader(fd, (Mask *)id);
+                       break;
        }
        
        /*link direct data of ID properties*/
@@ -7846,6 +7855,7 @@
        lib_link_curve(fd, main);
        lib_link_mball(fd, main);
        lib_link_material(fd, main);
+       lib_link_shader(fd, main);
        lib_link_texture(fd, main);
        lib_link_image(fd, main);
        lib_link_ipo(fd, main);         // XXX depreceated... still needs to be 
maintained for version patches still
@@ -8384,6 +8394,7 @@
 static void expand_material(FileData *fd, Main *mainvar, Material *ma)
 {
        int a;
+       CustomShader *cs;
        
        for (a = 0; a < MAX_MTEX; a++) {
                if (ma->mtex[a]) {
@@ -8397,6 +8408,8 @@
        /*expand_doit(fd, mainvar, ma->vert_text);
        expand_doit(fd, mainvar, ma->frag_text);
        expand_doit(fd, mainvar, ma->geom_text);*/
+       for (cs = ma->custom_shaders.first; cs; cs = cs->next)
+               expand_doit(fd, mainvar, cs->shader);
        
        if (ma->adt)
                expand_animdata(fd, mainvar, ma->adt);

Modified: branches/ge_harmony/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/ge_harmony/source/blender/blenloader/intern/writefile.c    
2012-07-18 03:56:42 UTC (rev 49012)
+++ branches/ge_harmony/source/blender/blenloader/intern/writefile.c    
2012-07-18 05:40:24 UTC (rev 49013)
@@ -1986,6 +1986,7 @@
 static void write_materials(WriteData *wd, ListBase *idbase)
 {
        Material *ma;
+       CustomShader *cs;
        int a;
 
        ma= idbase->first;
@@ -2015,12 +2016,49 @@
                                write_nodetree(wd, ma->nodetree);
                        }
 
-                       write_previews(wd, ma->preview);                        
+                       write_previews(wd, ma->preview);
+
+                       for (cs = ma->custom_shaders.first; cs; cs = cs->next) {
+                               writestruct(wd, DATA, "CustomShader", 1, cs);
+                               writestruct(wd, DATA, "Shader", 1, cs->shader);
+                       }
                }
                ma= ma->id.next;
        }
 }
 
+static void write_shaders(WriteData *wd, ListBase *idbase)
+{
+       Shader *sh;
+       Uniform *uni;
+
+       for (sh = idbase->first; sh; sh = sh->id.next) {
+               if (sh->id.us>0 || wd->current) {
+                       /* write LibData */
+                       writestruct(wd, ID_SH, "Shader", 1, sh);
+                       writestruct(wd, ID_TXT, "Text", 1, sh->sourcetext);
+
+                       for (uni = sh->uniforms.first; uni; uni = uni->next) {
+                               writestruct(wd, DATA, "Uniform", 1, uni);
+                switch (uni->type)
+                {
+                        case SHADER_UNF_VEC2:
+                        case SHADER_UNF_VEC3:
+                        case SHADER_UNF_VEC4:
+                                writedata(wd, DATA, sizeof(float) * uni->size, 
uni->data);
+                                break;
+                        case SHADER_UNF_IVEC2:
+                        case SHADER_UNF_IVEC3:
+                        case SHADER_UNF_IVEC4:
+                                writedata(wd, DATA, sizeof(int) * uni->size, 
uni->data);
+                                break;
+                }
+                       }
+               }
+       }
+
+}
+
 static void write_worlds(WriteData *wd, ListBase *idbase)
 {
        World *wrld;
@@ -2916,6 +2954,7 @@
        write_brushes  (wd, &mainvar->brush);
        write_scripts  (wd, &mainvar->script);
        write_gpencils (wd, &mainvar->gpencil);
+       write_shaders  (wd, &mainvar->shader);
        write_libraries(wd,  mainvar->next);
 
        if (write_user_block) {

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

Reply via email to