[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