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

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Jun 17 23:24:16 CEST 2008


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

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

* Added support for the Material and Extended Material nodes.
* Added support for node groups.
* All nodes except Dynamic are now supported.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/BKE_node.h
    branches/apricot/source/blender/blenkernel/intern/node.c
    branches/apricot/source/blender/gpu/GPU_material.h
    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/nodes/intern/SHD_nodes/SHD_camera.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_material.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_math.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_output.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_value.c
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c

Modified: branches/apricot/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_node.h	2008-06-17 21:17:11 UTC (rev 15256)
+++ branches/apricot/source/blender/blenkernel/BKE_node.h	2008-06-17 21:23:51 UTC (rev 15257)
@@ -95,7 +95,7 @@
 	void *pydict; /* holds pointer to python script dictionary (scope)*/
 
 	/* gpu */
-	struct GPUNode *(*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
+	int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
 
 } bNodeType;
 

Modified: branches/apricot/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/node.c	2008-06-17 21:17:11 UTC (rev 15256)
+++ branches/apricot/source/blender/blenkernel/intern/node.c	2008-06-17 21:23:51 UTC (rev 15257)
@@ -2379,6 +2379,8 @@
 
 		gs[i].name = "";
 		gs[i].hasinput= ns[i]->hasinput;
+		gs[i].hasoutput= ns[i]->hasinput;
+		gs[i].sockettype= ns[i]->sockettype;
 	}
 
 	gs[i].type= GPU_NONE;
@@ -2389,10 +2391,52 @@
 	bNodeSocket *sock;
 	int i;
 
-	for (sock=sockets->first, i=0; sock; sock=sock->next, i++)
+	for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
 		ns[i]->data= gs[i].link;
+		ns[i]->hasinput= gs[i].hasinput;
+		ns[i]->hasoutput= gs[i].hasoutput;
+		ns[i]->sockettype= gs[i].sockettype;
+	}
 }
 
+static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in, bNodeStack **out)
+{
+	bNode *node;
+	bNodeTree *ntree= (bNodeTree *)gnode->id;
+	bNodeStack *nsin[MAX_SOCKET];	/* arbitrary... watch this */
+	bNodeStack *nsout[MAX_SOCKET];	/* arbitrary... watch this */
+	GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
+	int doit = 0;
+	
+	if(ntree==NULL) return;
+	
+	stack+= gnode->stack_index;
+		
+	for(node= ntree->nodes.first; node; node= node->next) {
+		if(node->typeinfo->gpufunc) {
+			group_node_get_stack(node, stack, nsin, nsout, in, out);
+
+			doit = 0;
+			
+			/* for groups, only execute outputs for edited group */
+			if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+				if(gnode->flag & NODE_GROUP_EDIT)
+					if(node->flag & NODE_DO_OUTPUT)
+						doit = 1;
+			}
+			else
+				doit = 1;
+
+			if(doit)  {
+				gpu_from_node_stack(&node->inputs, nsin, gpuin);
+				gpu_from_node_stack(&node->outputs, nsout, gpuout);
+				if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
+					data_from_gpu_stack(&node->outputs, nsout, gpuout);
+			}
+		}
+	}
+}
+
 void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
 {
 	bNode *node;
@@ -2414,7 +2458,10 @@
 			if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
 				data_from_gpu_stack(&node->outputs, nsout, gpuout);
 		}
-		/* groups not supported yet .. */
+        else if(node->type==NODE_GROUP && node->id) {
+			node_get_stack(node, stack, nsin, nsout);
+			gpu_node_group_execute(stack, mat, node, nsin, nsout);
+		}
 	}
 
 	ntreeEndExecTree(ntree);

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h	2008-06-17 21:17:11 UTC (rev 15256)
+++ branches/apricot/source/blender/gpu/GPU_material.h	2008-06-17 21:23:51 UTC (rev 15257)
@@ -41,6 +41,7 @@
 struct ImageUser;
 struct Material;
 struct Object;
+struct bNode;
 struct GPUVertexAttribs;
 struct GPUNode;
 struct GPUNodeLink;
@@ -71,7 +72,9 @@
 	char *name;
 	float vec[4];
 	struct GPUNodeLink *link;
-	int hasinput;
+	short hasinput;
+	short hasoutput;
+	short sockettype;
 } GPUNodeStack;
 
 GPUNodeLink *GPU_attribute(int type, char *name);
@@ -81,8 +84,8 @@
 GPUNodeLink *GPU_texture(int size, float *pixels);
 GPUNodeLink *GPU_socket(GPUNodeStack *sock);
 
-GPUNode *GPU_link(GPUMaterial *mat, char *name, ...);
-GPUNode *GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
+int GPU_link(GPUMaterial *mat, char *name, ...);
+int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
 
 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
 void GPU_material_enable_alpha(GPUMaterial *material);
@@ -102,6 +105,23 @@
 void GPU_material_vertex_attributes(GPUMaterial *material,
 	struct GPUVertexAttribs *attrib);
 
+/* Exported shading */
+
+typedef struct GPUShadeInput {
+	GPUMaterial *gpumat;
+	struct Material *mat;
+
+	GPUNodeLink *rgb, *specrgb, *vn, *view;
+	GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb;
+} GPUShadeInput;
+
+typedef struct GPUShadeResult {
+	GPUNodeLink *diff, *spec, *combined, *alpha;
+} GPUShadeResult;
+
+void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi);
+void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr);
+
 #ifdef __cplusplus
 }
 #endif

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-06-17 21:17:11 UTC (rev 15256)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-06-17 21:23:51 UTC (rev 15257)
@@ -1085,7 +1085,7 @@
 		GPU_node_input(node, function->paramtype[i], "", NULL, link, link->dynamic);
 }
 
-GPUNode *GPU_link(GPUMaterial *mat, char *name, ...)
+int GPU_link(GPUMaterial *mat, char *name, ...)
 {
 	GPUNode *node;
 	GPUFunction *function;
@@ -1096,7 +1096,7 @@
 	function = GPU_lookup_function(name);
 	if(!function) {
 		fprintf(stderr, "GPU failed to find function %s\n", name);
-		return NULL;
+		return 0;
 	}
 
 	node = GPU_node_begin(name);
@@ -1118,10 +1118,10 @@
 
 	gpu_material_add_node(mat, node);
 
-	return node;
+	return 1;
 }
 
-GPUNode *GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...)
+int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...)
 {
 	GPUNode *node;
 	GPUFunction *function;
@@ -1132,7 +1132,7 @@
 	function = GPU_lookup_function(name);
 	if(!function) {
 		fprintf(stderr, "GPU failed to find function %s\n", name);
-		return NULL;
+		return 0;
 	}
 
 	node = GPU_node_begin(name);
@@ -1178,7 +1178,7 @@
 
 	gpu_material_add_node(mat, node);
 	
-	return node;
+	return 1;
 }
 
 /* Pass create/free */

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-06-17 21:17:11 UTC (rev 15256)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-06-17 21:23:51 UTC (rev 15257)
@@ -61,6 +61,7 @@
 #include <string.h>
 
 struct GPUMaterial {
+	Material *ma;
 	int profile;
 
 	/* for creating the material */
@@ -75,10 +76,11 @@
 
 /* Functions */
 
-GPUMaterial *GPU_material_construct_begin(int profile)
+static GPUMaterial *GPU_material_construct_begin(Material *ma, int profile)
 {
 	GPUMaterial *material = MEM_callocN(sizeof(GPUMaterial), "GPUMaterial");
 
+	material->ma= ma;
 	material->profile = profile;
 
 	return material;
@@ -127,7 +129,7 @@
 	attribs->totlayer = b;
 }
 
-int GPU_material_construct_end(GPUMaterial *material)
+static int GPU_material_construct_end(GPUMaterial *material)
 {
 	if (material->outlink) {
 		GPUNodeLink *outlink;
@@ -212,18 +214,6 @@
 
 /* Code generation */
 
-typedef struct GPUShadeInput {
-	GPUMaterial *gpumat;
-	Material *mat;
-
-	GPUNodeLink *rgb, *specrgb, *vn, *view;
-	GPUNodeLink *alpha, *refl, *spec, *emit, *har, *amb;
-} GPUShadeInput;
-
-typedef struct GPUShadeResult {
-	GPUNodeLink *diff, *spec, *combined, *alpha;
-} GPUShadeResult;
-
 static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, Object *lampob, Lamp *la, GPUNodeLink **lv, GPUNodeLink **dist)
 {
 	GPUNodeLink *visifac, *inpr;
@@ -686,22 +676,10 @@
 	Tex *tex;
 	GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil = NULL;
 	GPUNodeLink *colfac, *newnor, *varfac, *orn;
-	float one = 1.0f, hard = ma->har;
+	float one = 1.0f;
 	int tex_nr, rgbnor, talpha;
 
-	/* set default values */
-	GPU_link(mat, "set_rgb", GPU_uniform(&ma->r), &shi->rgb);
-	GPU_link(mat, "set_rgb", GPU_uniform(&ma->specr), &shi->specrgb);
 	GPU_link(mat, "texco_norm", &orn);
-	GPU_link(mat, "shade_norm", &shi->vn);
-	GPU_link(mat, "set_value", GPU_uniform(&ma->alpha), &shi->alpha);
-	GPU_link(mat, "set_value", GPU_uniform(&ma->ref), &shi->refl);
-	GPU_link(mat, "set_value", GPU_uniform(&ma->spec), &shi->spec);
-	GPU_link(mat, "set_value", GPU_uniform(&ma->emit), &shi->emit);
-	GPU_link(mat, "set_value", GPU_uniform(&hard), &shi->har);
-	GPU_link(mat, "set_value", GPU_uniform(&ma->amb), &shi->amb);
-	GPU_link(mat, "shade_view", &shi->view);
-
 	GPU_link(mat, "set_value", GPU_uniform(&one), &stencil);
 
 	/* go over texture slots */
@@ -845,43 +823,69 @@
 	}
 }
 
-GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
+void GPU_shadeinput_set(GPUMaterial *mat, Material *ma, GPUShadeInput *shi)
 {
-	GPUShadeInput shi;
-	GPUShadeResult shr;
+	float hard = ma->har;
 
-	memset(&shi, 0, sizeof(shi));
-	memset(&shr, 0, sizeof(shr));
+	memset(shi, 0, sizeof(*shi));
 
-	shi.gpumat = mat;
-	shi.mat = ma;
+	shi->gpumat = mat;
+	shi->mat = ma;
 
-	do_material_tex(&shi);
+	GPU_link(mat, "set_rgb", GPU_uniform(&ma->r), &shi->rgb);
+	GPU_link(mat, "set_rgb", GPU_uniform(&ma->specr), &shi->specrgb);
+	GPU_link(mat, "shade_norm", &shi->vn);
+	GPU_link(mat, "set_value", GPU_uniform(&ma->alpha), &shi->alpha);
+	GPU_link(mat, "set_value", GPU_uniform(&ma->ref), &shi->refl);
+	GPU_link(mat, "set_value", GPU_uniform(&ma->spec), &shi->spec);
+	GPU_link(mat, "set_value", GPU_uniform(&ma->emit), &shi->emit);
+	GPU_link(mat, "set_value", GPU_uniform(&hard), &shi->har);
+	GPU_link(mat, "set_value", GPU_uniform(&ma->amb), &shi->amb);
+	GPU_link(mat, "shade_view", &shi->view);
+}
 
+void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
+{
+	Material *ma= shi->mat;
+	GPUMaterial *mat= shi->gpumat;
+
+	memset(shr, 0, sizeof(*shr));
+
+	do_material_tex(shi);
+
 	if(ma->alpha < 1.0f)
 		GPU_material_enable_alpha(mat);
 
 	if(ma->mode & MA_SHLESS) {
-		shr.combined = shi.rgb;
-		shr.alpha = shi.alpha;
+		shr->combined = shi->rgb;
+		shr->alpha = shi->alpha;
 	}
 	else {
-		GPU_link(mat, "shade_mul_value", shi.emit, shi.rgb, &shr.diff);
-		GPU_link(mat, "set_rgb_zero", &shr.spec);
+		GPU_link(mat, "shade_mul_value", shi->emit, shi->rgb, &shr->diff);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list