[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15250] branches/apricot/source/blender: Apricot Branch: GLSL

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Jun 17 16:21:41 CEST 2008


Revision: 15250
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15250
Author:   blendix
Date:     2008-06-17 16:21:33 +0200 (Tue, 17 Jun 2008)

Log Message:
-----------
Apricot Branch: GLSL
====================

* Added support for the ColorRamp node.
* Added less than / greather than in the Math node.
* Added support for all blend modes of the Mix node and
  all blend modes in the texture stack.
* Added more Map To support, now available:
  Col, Nor, Csp, Ref, Spec, Amb, Hard, Alpha, Emit.

* Possible fix for a GLEW / opengl include conflict on
  Mac OS X in playanim.c

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/BKE_texture.h
    branches/apricot/source/blender/blenkernel/intern/texture.c
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/gpu/intern/material_shaders.glsl
    branches/apricot/source/blender/gpu/intern/material_shaders.glsl.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_math.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
    branches/apricot/source/blender/src/playanim.c

Modified: branches/apricot/source/blender/blenkernel/BKE_texture.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_texture.h	2008-06-17 10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/blenkernel/BKE_texture.h	2008-06-17 14:21:33 UTC (rev 15250)
@@ -53,6 +53,7 @@
 void init_colorband(struct ColorBand *coba, int rangetype);
 struct ColorBand *add_colorband(int rangetype);
 int do_colorband(struct ColorBand *coba, float in, float out[4]);
+void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
 
 void default_tex(struct Tex *tex);
 struct Tex *add_texture(char *name);

Modified: branches/apricot/source/blender/blenkernel/intern/texture.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/texture.c	2008-06-17 10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/blenkernel/intern/texture.c	2008-06-17 14:21:33 UTC (rev 15250)
@@ -53,6 +53,7 @@
 #include "DNA_world_types.h"
 #include "DNA_brush_types.h"
 #include "DNA_node_types.h"
+#include "DNA_color_types.h"
 
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
@@ -389,6 +390,17 @@
 	return 1;	/* OK */
 }
 
+void colorband_table_RGBA(ColorBand *coba, float **array, int *size)
+{
+	int a;
+	
+	*size = CM_TABLE+1;
+	*array = MEM_callocN(sizeof(float)*(*size)*4, "ColorBand");
+
+	for(a=0; a<*size; a++)
+		do_colorband(coba, (float)a/(float)CM_TABLE, &(*array)[a*4]);
+}
+
 /* ******************* TEX ************************ */
 
 void free_texture(Tex *tex)

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-06-17 10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-06-17 14:21:33 UTC (rev 15250)
@@ -146,6 +146,7 @@
 	struct GPUPass *next, *prev;
 
 	ListBase nodes;
+	int firstbind;
 	struct GPUOutput *output;
 	struct GPUShader *shader;
 };
@@ -677,21 +678,28 @@
 
 			if (input->tex) {
 				if (input->bindtex) {
+					if(pass->firstbind);
 					GPU_texture_bind(input->tex, input->texid);
 					GPU_shader_uniform_texture(shader, name, input->tex);
 				}
 			}
-			else if (input->arraysize)
-				GPU_shader_uniform_vector(shader, name, input->type,
-					input->arraysize,
-					(input->dynamicvec)? input->dynamicvec: input->vec);
-			else
-				GPU_shader_uniform_vector(shader, name, input->type, 1,
-					(input->dynamicvec)? input->dynamicvec: input->vec);
+			else if (input->arraysize) {
+				if(pass->firstbind || input->dynamicvec)
+					GPU_shader_uniform_vector(shader, name, input->type,
+						input->arraysize,
+						(input->dynamicvec)? input->dynamicvec: input->vec);
+			}
+			else {
+				if(pass->firstbind || input->dynamicvec)
+					GPU_shader_uniform_vector(shader, name, input->type, 1,
+						(input->dynamicvec)? input->dynamicvec: input->vec);
+			}
 
 			MEM_freeN(name);
 		}
 	}
+
+	pass->firstbind = 0;
 }
 
 void GPU_pass_unbind(GPUPass *pass)
@@ -744,6 +752,7 @@
 	pass->nodes = *nodes;
 	pass->output = outlink->source;
 	pass->shader = shader;
+	pass->firstbind = 1;
 
 	/* take ownership over nodes */
 	memset(nodes, 0, sizeof(*nodes));

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-06-17 10:27:34 UTC (rev 15249)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-06-17 14:21:33 UTC (rev 15250)
@@ -211,6 +211,11 @@
 
 /* Code generation */
 
+typedef struct GPUShadeInput {
+	GPUNodeLink *rgb, *specrgb, *vn;
+	GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb;
+} GPUShadeInput;
+
 static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, Object *lampob, Lamp *la, GPUNodeLink **lv, GPUNodeLink **dist)
 {
 	GPUNodeLink *visifac, *inpr;
@@ -318,11 +323,11 @@
 }
 #endif
 
-static void shade_one_light(GPUMaterial *mat, Object *lampob, Lamp *la, Material *ma, GPUNodeLink *col, GPUNodeLink  *specrgb, GPUNodeLink *nor, GPUNodeLink **out)
+static void shade_one_light(GPUMaterial *mat, Object *lampob, Lamp *la, Material *ma, GPUShadeInput *shi, GPUNodeLink **out)
 {
 	GPUNodeLink *lv, *dist, *visifac, *is, *inp, *i, *vn, *view;
 	GPUNodeLink *outcol, *specfac, *result, *t;
-	float hard, energy, lampcol[3], zero[3] = {0.0f, 0.0f, 0.0f};
+	float energy, lampcol[3], zero[3] = {0.0f, 0.0f, 0.0f};
 	float *lampvec, *lampco;
 
 	if((la->mode & LA_ONLYSHADOW) && !(ma->mode & MA_SHADOW))
@@ -331,7 +336,7 @@
 	lampvec= lampob->obmat[2];
 	lampco= lampob->obmat[3];
 
-	vn= nor;
+	vn= shi->vn;
 	GPU_link(mat, "shade_view", &view);
 	GPU_link(mat, "setrgb", GPU_uniform(zero), &result);
 
@@ -381,32 +386,30 @@
 		GPU_link(mat, "shade_cubic", is, &is);
 	
 	i = is;
-	GPU_link(mat, "shade_visifac", i, visifac, GPU_uniform(&ma->ref), &i);
+	GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i);
 
-	vn = nor;
+	vn = shi->vn;
 	/*if(ma->mode & MA_TANGENT_VN)
 		GPU_link(mat, "shade_tangent_v_spec", GPU_attribute(CD_TANGENT, ""), &vn);*/
 	
 	if(!(la->mode & LA_NO_DIFF)) {
-		GPU_link(mat, "shade_add_to_diffuse", i, GPU_uniform(lampcol), col, &outcol);
+		GPU_link(mat, "shade_add_to_diffuse", i, GPU_uniform(lampcol), shi->rgb, &outcol);
 		GPU_link(mat, "shade_add", result, outcol, &result);
 	}
 
 	if(!(la->mode & LA_NO_SPEC) && !(la->mode & LA_ONLYSHADOW)) {
-		hard= ma->har;
-
 		if(la->type == LA_HEMI) {
-			GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), GPU_uniform(&hard), &t);
-			GPU_link(mat, "shade_add_spec", t, GPU_uniform(lampcol), specrgb, visifac, &outcol);
+			GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), shi->har, &t);
+			GPU_link(mat, "shade_add_spec", t, GPU_uniform(lampcol), shi->specrgb, visifac, &outcol);
 			GPU_link(mat, "shade_add", result, outcol, &result);
 		}
 		else {
 			if(ma->spec_shader==MA_SPEC_PHONG)
-				GPU_link(mat, "shade_phong_spec", vn, lv, view, GPU_uniform(&hard), &specfac);
+				GPU_link(mat, "shade_phong_spec", vn, lv, view, shi->har, &specfac);
 			else if(ma->spec_shader==MA_SPEC_COOKTORR)
-				GPU_link(mat, "shade_cooktorr_spec", vn, lv, view, GPU_uniform(&hard), &specfac);
+				GPU_link(mat, "shade_cooktorr_spec", vn, lv, view, shi->har, &specfac);
 			else if(ma->spec_shader==MA_SPEC_BLINN)
-				GPU_link(mat, "shade_blinn_spec", vn, lv, view, GPU_uniform(&ma->refrac), GPU_uniform(&hard), &specfac);
+				GPU_link(mat, "shade_blinn_spec", vn, lv, view, GPU_uniform(&ma->refrac), shi->har, &specfac);
 			else if(ma->spec_shader==MA_SPEC_WARDISO)
 				GPU_link(mat, "shade_wardiso_spec", vn, lv, view, GPU_uniform(&ma->rms), &specfac);
 			else
@@ -415,7 +418,7 @@
 			if(la->type==LA_AREA)
 				GPU_link(mat, "shade_spec_area_inp", specfac, inp, &specfac);
 
-			GPU_link(mat, "shade_spec_t", GPU_uniform(&ma->spec), visifac, specfac, &t);
+			GPU_link(mat, "shade_spec_t", shi->spec, visifac, specfac, &t);
 
 			/*if(ma->mode & MA_RAMP_SPEC) {
 				float spec[3];
@@ -425,7 +428,7 @@
 				shr->spec[2]+= t*(lacol[2] * spec[2]);
 			}
 			else {*/
-				GPU_link(mat, "shade_add_spec", t, GPU_uniform(lampcol), specrgb, visifac, &outcol);
+				GPU_link(mat, "shade_add_spec", t, GPU_uniform(lampcol), shi->specrgb, visifac, &outcol);
 				GPU_link(mat, "shade_add", result, outcol, &result);
 			/*}*/
 		}
@@ -434,7 +437,7 @@
 	GPU_link(mat, "shade_add", *out, result, out);
 }
 
-static void material_lights(GPUMaterial *mat, Material *ma, GPUNodeLink *col, GPUNodeLink *spec, GPUNodeLink *nor, GPUNodeLink **out)
+static void material_lights(GPUMaterial *mat, Material *ma, GPUShadeInput *shi, GPUNodeLink **out)
 {
 	Base *base;
 	Object *lampob;
@@ -446,7 +449,7 @@
 				lampob= base->object;
 				la= lampob->data;
 
-				shade_one_light(mat, lampob, la, ma, col, spec, nor, out);
+				shade_one_light(mat, lampob, la, ma, shi, out);
 			}
 		}
 	}
@@ -454,22 +457,103 @@
 
 static void texture_rgb_blend(GPUMaterial *mat, GPUNodeLink *tex, GPUNodeLink *out, GPUNodeLink *fact, GPUNodeLink *facg, int blendtype, GPUNodeLink **in)
 {
-	GPU_link(mat, "mtex_rgb_blend", out, tex, fact, facg, in);
+	float inval[3] = {0.0f, 0.0f, 0.0f};
+
+	switch(blendtype) {
+	case MTEX_BLEND:
+		GPU_link(mat, "mtex_rgb_blend", out, tex, fact, facg, in);
+		break;
+	case MTEX_MUL:
+		GPU_link(mat, "mtex_rgb_mul", out, tex, fact, facg, in);
+		break;
+	case MTEX_SCREEN:
+		GPU_link(mat, "mtex_rgb_screen", out, tex, fact, facg, in);
+		break;
+	case MTEX_OVERLAY:
+		GPU_link(mat, "mtex_rgb_overlay", out, tex, fact, facg, in);
+		break;
+	case MTEX_SUB:
+		GPU_link(mat, "mtex_rgb_sub", out, tex, fact, facg, in);
+		break;
+	case MTEX_ADD:
+		GPU_link(mat, "mtex_rgb_add", out, tex, fact, facg, in);
+		break;
+	case MTEX_DIV:
+		GPU_link(mat, "mtex_rgb_div", out, tex, fact, facg, in);
+		break;
+	case MTEX_DIFF:
+		GPU_link(mat, "mtex_rgb_diff", out, tex, fact, facg, in);
+		break;
+	case MTEX_DARK:
+		GPU_link(mat, "mtex_rgb_dark", out, tex, fact, facg, in);
+		break;
+	case MTEX_LIGHT:
+		GPU_link(mat, "mtex_rgb_light", out, tex, fact, facg, in);
+		break;
+	case MTEX_BLEND_HUE:
+		GPU_link(mat, "mtex_rgb_hue", out, tex, fact, facg, in);
+		break;
+	case MTEX_BLEND_SAT:
+		GPU_link(mat, "mtex_rgb_sat", out, tex, fact, facg, in);
+		break;
+	case MTEX_BLEND_VAL:
+		GPU_link(mat, "mtex_rgb_val", out, tex, fact, facg, in);
+		break;
+	case MTEX_BLEND_COLOR:
+		GPU_link(mat, "mtex_rgb_color", out, tex, fact, facg, in);
+		break;
+	default:
+		GPU_link(mat, "setvalue", GPU_uniform(inval), &in);
+		break;
+	}
 }
 
-static void texture_value_blend(GPUMaterial *mat, GPUNodeLink *tex, GPUNodeLink *out, GPUNodeLink *fact, GPUNodeLink *facg, int blendtype, GPUNodeLink **in)
+static void texture_value_blend(GPUMaterial *mat, GPUNodeLink *tex, GPUNodeLink *out, GPUNodeLink *fact, GPUNodeLink *facg, int blendtype, int flip, GPUNodeLink **in)
 {
-	GPU_link(mat, "mtex_value_blend", out, tex, fact, facg, in);
+	float inf = 0.0f;
+	float flipf = (flip)? 1.0f: 0.0;
+
+	switch(blendtype) {
+	case MTEX_BLEND:
+		GPU_link(mat, "mtex_value_blend", out, tex, fact, facg, GPU_uniform(&flipf), in);
+		break;
+	case MTEX_MUL:
+		GPU_link(mat, "mtex_value_mul", out, tex, fact, facg, GPU_uniform(&flipf), in);
+		break;
+	case MTEX_SCREEN:
+		GPU_link(mat, "mtex_value_screen", out, tex, fact, facg, GPU_uniform(&flipf), in);
+		break;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list