[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11845] branches/soc-2007-maike/source/ blender: Changed colorbands to fit them all in just one texture

Miguel Torres Lima torreslima at gmail.com
Mon Aug 27 18:20:54 CEST 2007


Revision: 11845
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11845
Author:   maike
Date:     2007-08-27 18:20:54 +0200 (Mon, 27 Aug 2007)

Log Message:
-----------
Changed colorbands to fit them all in just one texture
Needs many fixes, by the moment just one colorband is shown and there are problems updating the colorbands in the screen!

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BIF_glsl_colorband.h
    branches/soc-2007-maike/source/blender/src/buttons_shading.c
    branches/soc-2007-maike/source/blender/src/glsl_colorband.c
    branches/soc-2007-maike/source/blender/src/glsl_colorband_node.c
    branches/soc-2007-maike/source/blender/src/glsl_material.c
    branches/soc-2007-maike/source/blender/src/glsl_uniforms.c

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_colorband.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_colorband.h	2007-08-27 16:18:01 UTC (rev 11844)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_colorband.h	2007-08-27 16:20:54 UTC (rev 11845)
@@ -1,4 +1,5 @@
 #define COLORBAND_WIDTH   512
+#define MAX_COLORBAND     512
 
 /* -------------------------------------------------------- */
 
@@ -23,7 +24,7 @@
 
   short tex_set;
   
-  void (*add_tex)(struct GLSL_ColorBand_ *colorband, short type);
+  void (*add_tex)(struct GLSL_ColorBand_ *colorband, int index, short type);
   void (*free)(struct GLSL_ColorBand_ *colorband);
 };
 
@@ -33,6 +34,17 @@
 
 /* -------------------------------------------------------- */
 
+void glsl_init_cb_globals(void);
+void glsl_free_cb_globals(void);
+
+int glsl_find_free_cb_index(void);
+
+#ifdef __APPLE__
+unsigned long glsl_get_colorband_tex_id(void);
+#else
+unsigned int glsl_get_colorband_tex_id(void);
+#endif
+
 GLSL_ColorBand glsl_init_colorband(struct Material *mat, struct ColorBand *cb);
 
 void glsl_colorbands_change(struct Material *mat);

Modified: branches/soc-2007-maike/source/blender/src/buttons_shading.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/buttons_shading.c	2007-08-27 16:18:01 UTC (rev 11844)
+++ branches/soc-2007-maike/source/blender/src/buttons_shading.c	2007-08-27 16:20:54 UTC (rev 11845)
@@ -3115,12 +3115,14 @@
 				if(ma->ramp_spec==NULL) ma->ramp_spec= add_colorband(0);
 		  }
 		  
-		  if(glsl_active())
-			if(ma) end_render_material(ma);	/// temporal... 3d preview
-			allqueue(REDRAWBUTSSHADING, 0);
-			BIF_preview_changed(ID_MA);
-			shade_buttons_change_3d();
-			glsl_colorbands_change(ma);
+		  
+		  if(ma) {
+		    end_render_material(ma);	// temporal... 3d preview
+		    if(glsl_active()) glsl_colorbands_change(ma);
+		  }
+		  allqueue(REDRAWBUTSSHADING, 0);
+		  BIF_preview_changed(ID_MA);
+		  shade_buttons_change_3d();
 		}
 		break;
 	case B_MAT_USENODES:
@@ -3159,20 +3161,20 @@
 		}
 		break;
 	case B_MAT_CB_REWR:
-	  do_matbuts(B_MATPRV);
 	  if(ma){
 	    if(glsl_active())
 	      glsl_update_material(ma, event);
 	  }
+	  do_matbuts(B_MATPRV);
 	  break;
 	case B_MAT_CB_REDR:
-	  do_matbuts(B_MATPRV);
 	  if(ma){
 	    if(glsl_active()){
 	      glsl_colorband_create_tex(ma);
 	      glsl_update_mat_colorband_uniforms(ma);
 	    }
 	  }
+	  do_matbuts(B_MATPRV);
 	  break;
 	case B_MAT_CB_UNIFS:
 	  do_matbuts(B_MATPRV);
@@ -3188,12 +3190,12 @@
 	      glsl_update_material(ma, 0);
 	  }
 	  break;
-	case B_MATREWR:
-	  do_matbuts(B_MATPRV);
+	case B_MATREWR:	  
 	  if(ma){ 
 	    if(glsl_active() != 0)
 	      glsl_update_material(ma, event);
 	  }
+	  do_matbuts(B_MATPRV);
 	case B_MAT_MAPTO_UNIFS:
 	  do_matbuts(B_MATPRV);
 	  ob = OBACT;

Modified: branches/soc-2007-maike/source/blender/src/glsl_colorband.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_colorband.c	2007-08-27 16:18:01 UTC (rev 11844)
+++ branches/soc-2007-maike/source/blender/src/glsl_colorband.c	2007-08-27 16:20:54 UTC (rev 11845)
@@ -38,51 +38,108 @@
 
 extern GHash *matHash;
 
+static float colorbands[MAX_COLORBAND][COLORBAND_WIDTH][4];
+static GLuint colorband_tex;
+static int cb_index[MAX_COLORBAND];
+static int cb_count;
+
 /* ------------------------------------------------------------------------------- */
 
-static void glsl_cb_add_tex(GLSL_ColorBand colorband, short type)
+
+static void glsl_cb_add_tex(GLSL_ColorBand colorband, int index, short type)
 {
   float texels[4];
   ColorBand *cb = colorband->colorband;
   int i;
 
-  if(colorband->tex_set)
-    glDeleteTextures(1, &colorband->texid);
-
   for(i = 0; i < 512; i++){
     do_colorband(cb, (float) (i + 1) / 512, texels);
     colorband->tex[i][0] = texels[0];
     colorband->tex[i][1] = texels[1];
     colorband->tex[i][2] = texels[2];
     colorband->tex[i][3] = texels[3];
+
+    colorbands[index][i][0] = texels[0];
+    colorbands[index][i][1] = texels[1];
+    colorbands[index][i][2] = texels[2];
+    colorbands[index][i][3] = texels[3];
   }
 
-  glGenTextures(1, &colorband->texid);
-  glActiveTexture(GL_TEXTURE0 + type);
-  glBindTexture(GL_TEXTURE_1D, colorband->texid);
-  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-  glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, COLORBAND_WIDTH, 0, GL_RGBA, GL_FLOAT, colorband->tex);
-  colorband->tex_set = 1;
+  glActiveTexture(GL_TEXTURE1);
+  glBindTexture(GL_TEXTURE_2D, colorband_tex);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, COLORBAND_WIDTH, MAX_COLORBAND, 0, GL_RGBA, GL_FLOAT, colorbands);
+
   glActiveTexture(GL_TEXTURE0);
 }
 
 
 static void glsl_cb_free(GLSL_ColorBand colorband)
 {
+  cb_index[colorband->index] = 1;
+  cb_count--;
+
   MEM_freeN(colorband);
 }
 
 /* ------------------------------------------------------------------------------- */
 
 
+void glsl_init_cb_globals(void)
+{
+  int i, j;
+
+  for(i = 0; i < MAX_COLORBAND; i++){
+    for(j = 0; j < COLORBAND_WIDTH; j++){
+      colorbands[i][j][0] = 0.0;
+      colorbands[i][j][1] = 0.0;
+      colorbands[i][j][2] = 0.0;
+      colorbands[i][j][3] = 0.0;
+    }
+    
+    cb_index[i] = 1.0;
+  }
+
+  glGenTextures(1, &colorband_tex);
+  cb_count = 0;
+}
+
+
+void glsl_free_cb_globals(void)
+{
+  glDeleteTextures(1, &colorband_tex);
+}
+
+
+int glsl_find_free_cb_index(void)
+{
+  int i;
+  
+  for(i = 0; i < MAX_COLORBAND; i++){
+    if(cb_index[i]){
+      cb_index[i] = 0;
+      return i;
+    }
+  }
+
+  return -1;
+}
+
+
+GLuint glsl_get_colorband_tex_id(void)
+{
+  return colorband_tex;
+}
+
+
 GLSL_ColorBand glsl_init_colorband(Material *mat, ColorBand *cb)
 {
   GLSL_ColorBand colorband = MEM_mallocN(sizeof(struct GLSL_ColorBand_), "GLSL ColorBand");
 
-  colorband->index = 0;
+  colorband->index = glsl_find_free_cb_index();
   colorband->colorband = cb;
   colorband->texid = 0;
   colorband->tex_set = 0;
@@ -90,6 +147,8 @@
   colorband->add_tex = glsl_cb_add_tex;
   colorband->free = glsl_cb_free;
 
+  cb_count++;
+
   printf("\nGLSL Colorband created\n");
 
   return colorband;

Modified: branches/soc-2007-maike/source/blender/src/glsl_colorband_node.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_colorband_node.c	2007-08-27 16:18:01 UTC (rev 11844)
+++ branches/soc-2007-maike/source/blender/src/glsl_colorband_node.c	2007-08-27 16:20:54 UTC (rev 11845)
@@ -49,14 +49,14 @@
 
 char *glsl_colorband_node_uniforms(int num, int ramp_num)
 {
-  char *code, *sampler, *fac;
+  char *code, *index, *fac;
 
-  sampler = glsl_string(5,
-			0, "uniform sampler1D u_mat_", 
+  index = glsl_string(5,
+			0, "uniform float u_mat_", 
 			GINT, num, 
 			0, "_ramp_",
 			GINT, ramp_num, 
-			0, "_tex;\n");
+			0, "_index;\n");
   
   fac = glsl_string(5,
 		    0, "uniform float u_mat_",
@@ -65,7 +65,7 @@
 		    GINT, ramp_num,
 		    0, "_fac;\n");
 
-  code = glsl_string(2, GFREE, fac, GFREE, sampler);
+  code = glsl_string(2, GFREE, fac, GFREE, index);
 
   return code;
 }
@@ -77,7 +77,7 @@
   char *code = NULL;
   char *type = NULL;
   char *func = NULL;
-  char *tex = NULL;
+  char *index = NULL;
   char *fac = NULL;
   char *rslt = NULL;
   int blen_type;
@@ -88,12 +88,12 @@
 		       0, blendmode[mat->rampblend_col],
 		       0, "\n");
     
-    tex  = glsl_string(5, 
-		       0, "#define DIFF_CB_TEX u_mat_", 
+    index  = glsl_string(5, 
+		       0, "#define DIFF_CB_INDEX u_mat_", 
 		       GINT, num, 
 		       0, "_ramp_", 
 		       GINT, ramp_num, 
-		       0, "_tex\n");
+		       0, "_index\n");
     
     fac  = glsl_string(5, 
 		       0, "#define DIFF_CB_FAC u_mat_", 
@@ -104,7 +104,7 @@
 
     code = glsl_string(3, 
 		     GFREE, func, 
-		     GFREE, tex, 
+		     GFREE, index, 
 		     GFREE, fac);
 
     if(mat->rampin_col == MA_RAMP_IN_RESULT){
@@ -132,12 +132,12 @@
 		       0, blendmode[mat->rampblend_spec],
 		       0, "\n");
     
-    tex  = glsl_string(5, 
-		       0, "#define SPEC_CB_TEX u_mat_", 
+    index  = glsl_string(5, 
+		       0, "#define SPEC_CB_INDEX u_mat_", 
 		       GINT, num, 
 		       0, "_ramp_", 
 		       GINT, ramp_num, 
-		       0, "_tex\n");
+		       0, "_index\n");
     
     fac  = glsl_string(5, 
 		       0, "#define SPEC_CB_FAC u_mat_", 
@@ -148,7 +148,7 @@
 
     code = glsl_string(3, 
 		       GFREE, func, 
-		       GFREE, tex, 
+		       GFREE, index, 
 		       GFREE, fac);
 
     if(mat->rampin_spec == MA_RAMP_IN_RESULT){

Modified: branches/soc-2007-maike/source/blender/src/glsl_material.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-08-27 16:18:01 UTC (rev 11844)
+++ branches/soc-2007-maike/source/blender/src/glsl_material.c	2007-08-27 16:20:54 UTC (rev 11845)
@@ -158,7 +158,7 @@
 {
   GLSL_ColorBand colorband = material->diff_ramp;
 
-  colorband->add_tex(colorband, 1);
+  colorband->add_tex(colorband, colorband->index, 1);
 }
 
 
@@ -166,7 +166,7 @@
 {
   GLSL_ColorBand colorband = material->spec_ramp;
 
-  colorband->add_tex(colorband, 2);
+  colorband->add_tex(colorband, colorband->index, 2);
 }
 
 

Modified: branches/soc-2007-maike/source/blender/src/glsl_uniforms.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_uniforms.c	2007-08-27 16:18:01 UTC (rev 11844)
+++ branches/soc-2007-maike/source/blender/src/glsl_uniforms.c	2007-08-27 16:20:54 UTC (rev 11845)
@@ -384,6 +384,7 @@
 void glsl_update_colorband_uniforms(GLuint program, Material *mat, int index)
 {
   char *diff_fac, *spec_fac;
+  char *diff_index, *spec_index;
   
   GLSL_Material material = BLI_ghash_lookup(matHash, mat);
 
@@ -392,17 +393,29 @@
   glUseProgram(program);
 
   if(mat->mode & MA_RAMP_COL){
+    GLSL_ColorBand colorband = material->diff_ramp;
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list