[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11102] branches/soc-2007-maike/source/ blender: Corrected some segfaults

Miguel Torres Lima torreslima at gmail.com
Thu Jun 28 19:02:41 CEST 2007


Revision: 11102
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11102
Author:   maike
Date:     2007-06-28 19:02:41 +0200 (Thu, 28 Jun 2007)

Log Message:
-----------
Corrected some segfaults
Added ambient uniforms set function

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h
    branches/soc-2007-maike/source/blender/src/glsl_drawobject.c
    branches/soc-2007-maike/source/blender/src/glsl_light.c
    branches/soc-2007-maike/source/blender/src/glsl_material.c
    branches/soc-2007-maike/source/blender/src/glsl_material_node.c
    branches/soc-2007-maike/source/blender/src/glsl_node_util.c
    branches/soc-2007-maike/source/blender/src/glsl_program.c

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h	2007-06-28 15:57:54 UTC (rev 11101)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_material.h	2007-06-28 17:02:41 UTC (rev 11102)
@@ -85,3 +85,8 @@
 struct GLSL_Program_ *glsl_get_material_program(struct Material *mat, short mode);
 void glsl_redo_programs(void);
 void glsl_redo_mat_program(struct GLSL_Material_ *material);
+
+void glsl_update_all_world_uniforms(void);
+void glsl_update_tree_world_uniforms(GLSL_MaterialTree tree);
+void glsl_update_material_world_uniforms(struct Material *mat);
+void glsl_update_world_uniforms(unsigned long program);

Modified: branches/soc-2007-maike/source/blender/src/glsl_drawobject.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_drawobject.c	2007-06-28 15:57:54 UTC (rev 11101)
+++ branches/soc-2007-maike/source/blender/src/glsl_drawobject.c	2007-06-28 17:02:41 UTC (rev 11102)
@@ -14,6 +14,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_userdef_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_vec_types.h"
 
 #include "BLI_arithb.h"
 
@@ -32,6 +33,8 @@
 #include "BIF_gl.h"
 #include "BIF_glsl_drawobject.h"
 
+#include "BSE_view.h"
+
 #include "blendef.h"
 
 #include "MEM_guardedalloc.h"
@@ -64,11 +67,14 @@
 		      lamp_obj->obmat[3][2] };
     float mat[4][4];
     float vecc[3];
+    float eyevec[3] = { 0,0,0 };
 
-    glUniform3f(glsl_uniform_location(program, eye), 
-		G.vd->dist * G.vd->viewinv[2][0], 
+    glUniform3f(glsl_uniform_location(program, eye), eyevec[0], eyevec[1], eyevec[2] );
+		
+
+		/*G.vd->dist * G.vd->viewinv[2][0], 
 		G.vd->dist * G.vd->viewinv[2][1], 
-		G.vd->dist * G.vd->viewinv[2][2]);
+		G.vd->dist * G.vd->viewinv[2][2]);*/
 
 
     Mat4MulVecfl(G.vd->viewmat, vect);

Modified: branches/soc-2007-maike/source/blender/src/glsl_light.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_light.c	2007-06-28 15:57:54 UTC (rev 11101)
+++ branches/soc-2007-maike/source/blender/src/glsl_light.c	2007-06-28 17:02:41 UTC (rev 11102)
@@ -29,6 +29,7 @@
 static int num_lights = 0;
 
 extern GHash *treeHash;
+extern GHash *matHash;
 
 /* --------------------------------------------------------------- */
 
@@ -96,7 +97,8 @@
   printf("\nGLSL Light created.\n");
   num_lights++;
 
-  glsl_redo_programs();
+  if(treeHash && BLI_ghash_size(treeHash) > 0)
+    glsl_redo_programs();
 }
 
 
@@ -188,6 +190,7 @@
   char *att1    = glsl_string(3, 0, "lights[", GINT, n, 0, "].att1");
   char *att2    = glsl_string(3, 0, "lights[", GINT, n, 0, "].att2");
   char *att3    = glsl_string(3, 0, "lights[", GINT, n, 0, "].att3");
+  char *att4    = glsl_string(3, 0, "lights[", GINT, n, 0, "].att4");
   char *quad    = glsl_string(3, 0, "lights[", GINT, n, 0, "].quad");
   char *sphere  = glsl_string(3, 0, "lights[", GINT, n, 0, "].sphere");
   char *square  = glsl_string(3, 0, "lights[", GINT, n, 0, "].square");
@@ -217,12 +220,14 @@
       if(lamp->mode & LA_QUAD){
 	glUniform1f(glsl_uniform_location(program, att1), lamp->att1);
 	glUniform1f(glsl_uniform_location(program, att2), lamp->att2);
-	glUniform1f(glsl_uniform_location(program, att3), 0.0);
+	glUniform1f(glsl_uniform_location(program, att3), 1.0);
+	glUniform1f(glsl_uniform_location(program, att4), 0.0);
       }
       else{
 	glUniform1f(glsl_uniform_location(program, att1), 0.0);
 	glUniform1f(glsl_uniform_location(program, att2), 0.0);
-	glUniform1f(glsl_uniform_location(program, att3), 1.0);
+	glUniform1f(glsl_uniform_location(program, att3), 0.0);
+	glUniform1f(glsl_uniform_location(program, att4), 1.0);
       }
 
       if(lamp->mode & LA_SPHERE){
@@ -233,6 +238,7 @@
       }
     }
 
+   
     if(vtree && vtree == tree)
       break;  
 
@@ -245,6 +251,7 @@
   MEM_freeN(att1);
   MEM_freeN(att2);
   MEM_freeN(att3);
+  MEM_freeN(att4);
   MEM_freeN(quad);
   MEM_freeN(sphere);
   MEM_freeN(square);

Modified: branches/soc-2007-maike/source/blender/src/glsl_material.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-06-28 15:57:54 UTC (rev 11101)
+++ branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-06-28 17:02:41 UTC (rev 11102)
@@ -1,5 +1,7 @@
 #include <GL/glew.h>
 
+#include <math.h>
+
 #include "BIF_glsl_material.h"
 #include "BIF_glutil.h"
 #include "BIF_glsl_program.h"
@@ -22,6 +24,8 @@
 #include "DNA_meta_types.h"
 #include "DNA_curve_types.h"
 
+#include "DNA_world_types.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_ghash.h"
@@ -30,8 +34,9 @@
 
 /* ----------------------------------------------------------------------- */
 
-GHash *matHash, *treeHash;
-GLSL_MaterialTree glsl_defmaterial;
+GHash *matHash = NULL;
+GHash *treeHash = NULL;
+GLSL_MaterialTree glsl_defmaterial = NULL;
 extern Material defmaterial;
 
 /* ----------------------------------------------------------------------- */
@@ -89,23 +94,25 @@
 
 static void glsl_mattree_free(GLSL_MaterialTree tree)
 {
-  GHashIterator *iter = BLI_ghashIterator_new(treeHash);
-  int i;
- 
-  for(i = 0; i < BLI_ghash_size(treeHash); i++, BLI_ghashIterator_step(iter)){
-    if(BLI_ghashIterator_getValue(iter) == tree){
-      BLI_ghash_lookup_reset(treeHash, BLI_ghashIterator_getKey(iter));
-      break;
+  if(treeHash){
+    GHashIterator *iter = BLI_ghashIterator_new(treeHash);
+    int i;
+    
+    for(i = 0; i < BLI_ghash_size(treeHash); i++, BLI_ghashIterator_step(iter)){
+      if(BLI_ghashIterator_getValue(iter) == tree){
+	BLI_ghash_lookup_reset(treeHash, BLI_ghashIterator_getKey(iter));
+	break;
+      }
     }
   }
-  
+   
   BLI_ghash_free(tree->hash, NULL, NULL);
 
   if(tree->shaded_program)
     tree->shaded_program->free(tree->shaded_program);
   if(tree->textured_program)
     tree->textured_program->free(tree->textured_program);
-
+  
   if(tree)
     MEM_freeN(tree);
   
@@ -115,20 +122,22 @@
 
 static void glsl_mat_unlink(GLSL_Material material, Material *mat)
 {
-  GHashIterator *iter = BLI_ghashIterator_new(material->parent);
-  int i;
-  
-  for(i = 0; i < BLI_ghash_size(material->parent); i++, BLI_ghashIterator_step(iter)){ 
-    GLSL_MaterialTree tree = BLI_ghashIterator_getKey(iter); 
-    BLI_ghash_lookup_reset(material->parent, tree);
+  if(material->parent){
+    GHashIterator *iter = BLI_ghashIterator_new(material->parent);
+    int i;
     
-    tree->del_material(tree, mat);
-  }   
-  
-  BLI_ghashIterator_free(iter); 
-  
-  if(material->num_parents == 0)
-    material->free(material, mat);
+    for(i = 0; i < BLI_ghash_size(material->parent); i++, BLI_ghashIterator_step(iter)){ 
+      GLSL_MaterialTree tree = BLI_ghashIterator_getKey(iter); 
+      BLI_ghash_lookup_reset(material->parent, tree);
+      
+      tree->del_material(tree, mat);
+    }   
+    
+    BLI_ghashIterator_free(iter); 
+    
+    if(material->num_parents == 0)
+      material->free(material, mat);
+  }
 }
 
 
@@ -157,8 +166,15 @@
 /* called from usiblender.c in function exit_usiblender() */
 void glsl_free_ghash(void)
 {
-  BLI_ghash_free(matHash, NULL, NULL);
-  BLI_ghash_free(treeHash, NULL, NULL);
+  if(matHash){
+    BLI_ghash_free(matHash, NULL, NULL);  
+    matHash = NULL;
+  }
+  
+  if(treeHash){
+    BLI_ghash_free(treeHash, NULL, NULL);
+    treeHash = NULL;
+  }
 }
 
 
@@ -192,12 +208,15 @@
     
     if(material){
       BLI_ghashIterator_free(iter);
-      
-      BLI_ghash_free(material->parent, NULL, NULL);
+     
+      if(material->parent)
+	BLI_ghash_free(material->parent, NULL, NULL);
       MEM_freeN(material);
     }
     glsl_defmaterial->free(glsl_defmaterial);
   }
+
+  glsl_defmaterial = NULL;
 }
 
 
@@ -232,10 +251,9 @@
     
   }
 
-  if((Material *) mat != &defmaterial){
-    tree->create_programs(tree);
-    glsl_update_all_light_uniforms(tree);
-  }
+  tree->create_programs(tree);
+  glsl_update_all_light_uniforms(tree);
+  glsl_update_tree_world_uniforms(tree);
 
   printf("\n GLSL MaterialTree created.\n");
 
@@ -276,40 +294,44 @@
 
 void glsl_free_material_structs(void)
 {
-  GHashIterator *iterM = BLI_ghashIterator_new(matHash);  
-  GHashIterator *iterT = BLI_ghashIterator_new(treeHash);
-  int i;
+  if(matHash){
+    GHashIterator *iterM = BLI_ghashIterator_new(matHash);  
+    int i;
     
-
-  for(i = 0; i < BLI_ghash_size(matHash); i++, BLI_ghashIterator_step(iterM)){ 
-    GLSL_Material material = BLI_ghashIterator_getValue(iterM); 
+    for(i = 0; i < BLI_ghash_size(matHash); i++, BLI_ghashIterator_step(iterM)){ 
+      GLSL_Material material = BLI_ghashIterator_getValue(iterM); 
+      
+      printf("\n GLSL Material removed.\n");
+      
+      BLI_ghash_free(material->parent, NULL, NULL);
+      MEM_freeN(material);
+    }   
     
-    printf("\n GLSL Material removed.\n");
+    BLI_ghashIterator_free(iterM); 
+  }
 
-    BLI_ghash_free(material->parent, NULL, NULL);
-    MEM_freeN(material);
-  }   
-  
-  BLI_ghashIterator_free(iterM); 
+  if(treeHash){
+    GHashIterator *iterT = BLI_ghashIterator_new(treeHash);
+    int i;
 
-
-  for(i = 0; i < BLI_ghash_size(treeHash); i++, BLI_ghashIterator_step(iterT)){ 
-    GLSL_MaterialTree tree = BLI_ghashIterator_getValue(iterT); 
-
-    printf("\n GLSL MaterialTree removed.\n");
-
-    BLI_ghash_free(tree->hash, NULL, NULL);
+    for(i = 0; i < BLI_ghash_size(treeHash); i++, BLI_ghashIterator_step(iterT)){ 
+      GLSL_MaterialTree tree = BLI_ghashIterator_getValue(iterT); 
+      
+      printf("\n GLSL MaterialTree removed.\n");
+      
+      BLI_ghash_free(tree->hash, NULL, NULL);
+      
+      if(tree->shaded_program)
+	tree->shaded_program->free(tree->shaded_program);
+      /*tree->textured_program->free(tree->textured_program);*/
+      
+      MEM_freeN(tree);
+    }   
     
-    if(tree->shaded_program)
-      tree->shaded_program->free(tree->shaded_program);
-    //tree->textured_program->free(tree->textured_program);
+    BLI_ghashIterator_free(iterT); 
+  }
 
-    MEM_freeN(tree);
-  }   
-  
-  BLI_ghashIterator_free(iterT); 
 
-
   glsl_free_ghash();
   glsl_init_ghash();
 }
@@ -406,7 +428,7 @@
   char *spec, *alpha, *amb_fac;
   char *diff1, *diff2, *diff3;
   char *spec1, *spec2, *spec3;
-  char *emit, *hard;
+  char *emit, *hard, *ambcolor;
 
   glUseProgram(program);
 
@@ -417,6 +439,7 @@
 
   BLI_ghashIterator_free(iter);
 
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list