[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