[Bf-blender-cvs] [f53dc5a] strand_nodes: Incorporate the generated GLSL code for hair displacement into the strands vertex shader.

Lukas Tönne noreply at git.blender.org
Thu Jul 21 20:17:08 CEST 2016


Commit: f53dc5a34bc47ae948bcc2263ac252a243ce53fa
Author: Lukas Tönne
Date:   Thu Jul 21 18:32:19 2016 +0200
Branches: strand_nodes
https://developer.blender.org/rBf53dc5a34bc47ae948bcc2263ac252a243ce53fa

Incorporate the generated GLSL code for hair displacement into the strands vertex shader.

===================================================================

M	source/blender/blenvm/glsl/glsl_codegen.cc
M	source/blender/gpu/intern/gpu_strands_shader.c

===================================================================

diff --git a/source/blender/blenvm/glsl/glsl_codegen.cc b/source/blender/blenvm/glsl/glsl_codegen.cc
index 6922b0e..c5a175d 100644
--- a/source/blender/blenvm/glsl/glsl_codegen.cc
+++ b/source/blender/blenvm/glsl/glsl_codegen.cc
@@ -43,14 +43,21 @@ extern "C" {
 
 namespace blenvm {
 
-/* replace non-alphanumeric chars with underscore */
+/* Remove non-alphanumeric chars
+ * Note: GLSL does not allow double underscores __
+ *       so just remove them to avoid issues.
+ */
 static string sanitize_name(const string &name)
 {
 	string s = name;
-	for (string::iterator it = s.begin(); it != s.end(); ++it) {
-		char &c = *it;
-		if (c != '_' && !isalnum(c))
-			c = '_';
+	string::const_iterator it = s.begin();
+	string::iterator nit = s.begin();
+	for (; it != s.end(); ++it) {
+		const char &c = *it;
+		if (isalnum(c)) {
+			*nit = c;
+			++nit;
+		}
 	}
 	return s;
 }
diff --git a/source/blender/gpu/intern/gpu_strands_shader.c b/source/blender/gpu/intern/gpu_strands_shader.c
index ef71129..f4e2d2b 100644
--- a/source/blender/gpu/intern/gpu_strands_shader.c
+++ b/source/blender/gpu/intern/gpu_strands_shader.c
@@ -79,14 +79,21 @@ extern char datatoc_gpu_shader_strand_debug_vert_glsl[];
 extern char datatoc_gpu_shader_strand_effects_glsl[];
 extern char datatoc_gpu_shader_strand_util_glsl[];
 
-static char *codegen(const char *basecode)
+static char *codegen(const char *basecode, const char *nodecode)
 {
 	char *code;
 	
+	if (!basecode)
+		return NULL;
+	
 	DynStr *ds = BLI_dynstr_new();
 	
 	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_util_glsl);
 	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_effects_glsl);
+	
+	if (nodecode)
+		BLI_dynstr_append(ds, nodecode);
+	
 	BLI_dynstr_append(ds, basecode);
 	
 	code = BLI_dynstr_get_cstring(ds);
@@ -211,7 +218,14 @@ GPUStrandsShader *GPU_strand_shader_create(GPUStrandsShaderParams *params)
 {
 	bool use_geometry_shader = params->use_geomshader;
 	
-	BVM_gen_hair_deform_function_glsl(params->nodes, "displace_vertex");
+	char *vertex_basecode = datatoc_gpu_shader_strand_vert_glsl;
+	char *geometry_basecode = use_geometry_shader ? datatoc_gpu_shader_strand_geom_glsl : NULL;
+	char *fragment_basecode = datatoc_gpu_shader_strand_frag_glsl;
+	char *vertex_debug_basecode = datatoc_gpu_shader_strand_debug_vert_glsl;
+	char *geometry_debug_basecode = use_geometry_shader ? datatoc_gpu_shader_strand_debug_geom_glsl : NULL;
+	char *fragment_debug_basecode = datatoc_gpu_shader_strand_debug_frag_glsl;
+	
+	char *nodecode = BVM_gen_hair_deform_function_glsl(params->nodes, "displace_vertex");
 	
 	GPUStrandsShader *gpu_shader = MEM_callocN(sizeof(GPUStrandsShader), "GPUStrands");
 	
@@ -220,9 +234,9 @@ GPUStrandsShader *GPU_strand_shader_create(GPUStrandsShaderParams *params)
 	get_defines(params, defines);
 	
 	/* Main shader */
-	char *vertexcode = codegen(datatoc_gpu_shader_strand_vert_glsl);
-	char *geometrycode = use_geometry_shader ? codegen(datatoc_gpu_shader_strand_geom_glsl) : NULL;
-	char *fragmentcode = codegen(datatoc_gpu_shader_strand_frag_glsl);
+	char *vertexcode = codegen(vertex_basecode, nodecode);
+	char *geometrycode = codegen(geometry_basecode, NULL);
+	char *fragmentcode = codegen(fragment_basecode, NULL);
 	GPUShader *shader = GPU_shader_create_ex(vertexcode, fragmentcode, geometrycode, NULL,
 	                                         defines, 0, 0, 0, flags);
 	if (shader) {
@@ -244,9 +258,9 @@ GPUStrandsShader *GPU_strand_shader_create(GPUStrandsShaderParams *params)
 	}
 	
 	/* Debug shader */
-	char *debug_vertexcode = codegen(datatoc_gpu_shader_strand_debug_vert_glsl);
-	char *debug_geometrycode = codegen(datatoc_gpu_shader_strand_debug_geom_glsl);
-	char *debug_fragmentcode = codegen(datatoc_gpu_shader_strand_debug_frag_glsl);
+	char *debug_vertexcode = codegen(vertex_debug_basecode, nodecode);
+	char *debug_geometrycode = codegen(geometry_debug_basecode, NULL);
+	char *debug_fragmentcode = codegen(fragment_debug_basecode, NULL);
 	GPUShader *debug_shader = GPU_shader_create_ex(debug_vertexcode, debug_fragmentcode, debug_geometrycode, NULL,
 	                                         defines, 0, 0, 0, flags);
 	if (debug_shader) {




More information about the Bf-blender-cvs mailing list