[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10861] branches/soc-2007-maike/source/ blender: + glsl_asprintf() to "flatten" string array pointer to one string

Miguel Torres Lima torreslima at gmail.com
Sat Jun 2 19:30:10 CEST 2007


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

Log Message:
-----------
+ glsl_asprintf() to "flatten" string array pointer to one string
+ glsl fragment shader main function for diffuse and specular light calculation done

Modified Paths:
--------------
    branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h
    branches/soc-2007-maike/source/blender/src/glsl_program.c

Modified: branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h
===================================================================
--- branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h	2007-06-02 15:49:56 UTC (rev 10860)
+++ branches/soc-2007-maike/source/blender/include/BIF_glsl_program.h	2007-06-02 17:30:10 UTC (rev 10861)
@@ -60,6 +60,7 @@
 
 GLuint glsl_create_shader(char *code, int type, int str_num);
 
+char *glsl_light_struct(void);
 char *glsl_globals(void);
 char *glsl_uniforms(void);
 char *glsl_varyings(void);
@@ -68,4 +69,7 @@
 char *glsl_diffuse_func(short shader, short lamp);
 char *glsl_specular_func(short shader, short lamp);
 char *glsl_main_func(struct Material *mat);
-char *glsl_create_lights_code(struct Material *mat);
+char *glsl_create_lights_define(int num_lights);
+char *glsl_create_lights_code(struct Material *mat, int num_lights);
+char *glsl_other_funcs(void);
+char *glsl_asprintf(char **strs, int max, int num);

Modified: branches/soc-2007-maike/source/blender/src/glsl_program.c
===================================================================
--- branches/soc-2007-maike/source/blender/src/glsl_program.c	2007-06-02 15:49:56 UTC (rev 10860)
+++ branches/soc-2007-maike/source/blender/src/glsl_program.c	2007-06-02 17:30:10 UTC (rev 10861)
@@ -1,6 +1,8 @@
 #include <GL/glew.h>
 #include <string.h>
 #include <stdlib.h>
+
+#define _GNU_SOURCE
 #include <stdio.h>
 
 #include "BIF_glsl_program.h"
@@ -113,17 +115,18 @@
 {
   GLuint shader;
 
-  char *light_struct = {
-    "struct light{"
-    "  vec3 loc, vec, color;"
-    "  float dist, energy, att1, att2;"
-    "  int no_diff, no_spec, quad, sphere, square, layer;"
-    "};"
-  };
+  char *frag_code[6];
 
+  frag_code[0] = glsl_light_struct();
+  frag_code[1] = glsl_globals();
+  frag_code[2] = glsl_uniforms();
+  frag_code[3] = glsl_varyings();
+  frag_code[4] = glsl_main_func(mat);
+  frag_code[5] = glsl_other_funcs();
   
-  char *main_f = glsl_main_func(mat);
 
+  free(frag_code[4]);
+
   program->fragment_shaders[program->tot_frag] = shader;
   program->tot_frag++;
 
@@ -149,6 +152,20 @@
 }
 
 
+char *glsl_light_struct(void)
+{
+  char *light_struct = {
+    "struct light{"
+    "  vec3 loc, vec, color;"
+    "  float dist, energy, att1, att2;"
+    "  int no_diff, no_spec, quad, sphere, square, layer;"
+    "};"
+  };
+
+  return light_struct;
+}
+
+
 char *glsl_globals(void)
 {
   char *globals = {
@@ -316,15 +333,17 @@
   };
 
   int num_lights;
+
   char *result;
 
   if((num_lights = glsl_get_num_lights()) > 0){
+    char *lights_define = glsl_create_lights_define(num_lights);
     char *lights_code = glsl_create_lights_code(mat, num_lights);
-     
-    asprintf(&result,"%s%s%s", main_init, lights_code, main_end);
+
+    asprintf(&result,"%s%s%s%s", lights_define, main_init, lights_code, main_end);
+
+    free(lights_define);
     free(lights_code);
-    
-    printf("\n%s a\n", result);
   }
   else{
     asprintf(&result, "%s%s", main_init, main_end);
@@ -334,36 +353,68 @@
 }
 
 
-char *glsl_create_lights_code(Material *mat, int num_lights)
+char *glsl_create_lights_define(int num_lights)
 {
-  int i;
-  GLSL_LightList list = glsl_get_lights();
-  GLSL_Light light;
+  char *defines;
 
-  char *light_types[5] = { "_lamp", "_sun", "_spot", "_hemi", "_area" };
-  char *light_types_[5] = { "", "_sun", "", "_hemi", "" };
-  char *diff_types[5] = { "lambert", "orennayar", "difftoon", "minnaert", "fresnel" };
-  char *spec_types[5] = { "cooktorr", "phong", "blinn", "spectoon", "wardiso" };
+  asprintf(&defines, "uniform light lights[%d];", num_lights);
 
-  char *light_coms[num_lights];
-  char *result;
+  return defines;
+}
 
-  for(i = 0; i < num_lights; i++, list = list->next){
-    char *light_com;
-    light = list->light;
+
+char *glsl_create_lights_code(Material *mat, int num_lights)
+{
+  if(num_lights > 0){
+    int i;
+    GLSL_LightList list = glsl_get_lights();
+    GLSL_Light light;
     
-    asprintf(&light_com, "visifac = visibility%s(%d); diffuse += %s%s(%d) * color * visifac; specular += %s%s(%d) * visifac;", light_types[light->type], i, diff_types[mat->diff_shader], light_types_[light->type], i, spec_types[mat->spec_shader], light_types_[light->type], i);
+    char *light_types[5] = { "_lamp", "_sun", "_spot", "_hemi", "_area" };
+    char *light_types_[5] = { "", "_sun", "", "_hemi", "" };
+    char *diff_types[5] = { "lambert", "orennayar", "difftoon", "minnaert", "fresnel" };
+    char *spec_types[5] = { "cooktorr", "phong", "blinn", "spectoon", "wardiso" };
+    
+    char *light_strs[num_lights];
+    char *result;
+    int light_strs_len = 0;
+    
+    for(i = 0; i < num_lights; i++, list = list->next){
+      light = list->light;
+      
+      asprintf(&light_strs[i], "visifac = visibility%s(%d); diffuse += %s%s(%d) * color * visifac; specular += %s%s(%d) * visifac;", light_types[light->type], i, diff_types[mat->diff_shader], light_types_[light->type], i, spec_types[mat->spec_shader], light_types_[light->type], i);
+      
+      light_strs_len += strlen(light_strs[i]);
+    }
+           
+    result = glsl_asprintf(light_strs, num_lights, 0);
 
-    asprintf(&light_coms[i], "%s", light_com);
-    
-    free(light_com);
+    return result;
   }
 
-  vasprintf(&result, "%s", light_coms);
+  return NULL;
+}
 
-  for(i = 0; i < num_lights; i++){
-    free(light_coms[i]);
-  }
 
+char *glsl_other_funcs(void)
+{
+  return NULL;
+}
+
+
+char *glsl_asprintf(char **strs, int max, int num)
+{
+  char *result;
+  char *tmp;
+
+  if(num == max - 1)
+    return strs[num];
+
+  tmp = glsl_asprintf(strs, max, num + 1);
+  asprintf(&result, "%s%s", strs[num], tmp);
+
+  free(tmp);
+  free(strs[num]);
+
   return result;
 }





More information about the Bf-blender-cvs mailing list