[Bf-blender-cvs] [71fce3c] strand_gpu: Augmentation of the strand shader with a debugging shader.

Lukas Tönne noreply at git.blender.org
Sun Jul 17 11:47:44 CEST 2016


Commit: 71fce3c784681ffbe165949f0f37982ff072e023
Author: Lukas Tönne
Date:   Sun Jul 17 11:46:40 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB71fce3c784681ffbe165949f0f37982ff072e023

Augmentation of the strand shader with a debugging shader.

The debug shader shares most code with the regular shader. It uses a
geometry shader pass to create extra vector lines.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/editors/space_view3d/drawstrands.c
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/GPU_strands.h
M	source/blender/gpu/intern/gpu_strands_shader.c
A	source/blender/gpu/shaders/gpu_shader_strand_debug_frag.glsl
A	source/blender/gpu/shaders/gpu_shader_strand_debug_geom.glsl
A	source/blender/gpu/shaders/gpu_shader_strand_debug_vert.glsl
M	source/blender/gpu/shaders/gpu_shader_strand_frag.glsl
M	source/blender/gpu/shaders/gpu_shader_strand_geom.glsl
M	source/blender/gpu/shaders/gpu_shader_strand_util.glsl
M	source/blender/gpu/shaders/gpu_shader_strand_vert.glsl
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_strands.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index f122418..2422557 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -919,6 +919,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
 
         layout.prop(md, "use_geometry_shader")
         layout.prop(md, "debug_value")
+        layout.prop(md, "debug_scale")
 
     def SUBSURF(self, layout, ob, md):
         layout.row().prop(md, "subdivision_type", expand=True)
diff --git a/source/blender/editors/space_view3d/drawstrands.c b/source/blender/editors/space_view3d/drawstrands.c
index 2ad3471..4c2f56d 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -102,14 +102,14 @@ static int get_effects(int smd_effects)
 }
 
 static void bind_strands_shader(GPUStrandsShader *shader, RegionView3D *rv3d,
-                                Object *ob, StrandsModifierData *smd)
+                                Object *ob, StrandsModifierData *smd, int debug_value)
 {
 	GPU_strand_shader_bind_uniforms(shader, ob->obmat, rv3d->viewmat);
 	GPU_strand_shader_bind(shader, rv3d->viewmat, rv3d->viewinv,
 	                       smd->ribbon_width,
 	                       smd->clump_thickness, smd->clump_shape,
 	                       smd->curl_thickness, smd->curl_shape, smd->curl_radius, smd->curl_length,
-	                       smd->debug_value);
+	                       debug_value, smd->debug_scale);
 }
 
 void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
@@ -122,6 +122,7 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 	bool show_strands = smd->flag & MOD_STRANDS_SHOW_FIBERS;
 	bool use_geomshader = smd->flag & MOD_STRANDS_USE_GEOMSHADER;
 	GPUStrands_FiberPrimitive fiber_primitive = get_fiber_primitive(smd->fiber_primitive);
+	bool enable_debugging = (smd->debug_value != 0);
 	
 	if (strands == NULL)
 		return;
@@ -155,14 +156,14 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 	}
 	
 	if (show_strands) {
-		bind_strands_shader(shader, rv3d, ob, smd);
+		bind_strands_shader(shader, rv3d, ob, smd, 0);
 		
 		GPU_strands_setup_fibers(buffer, converter);
 		if (use_geomshader) {
 			if (buffer->fibers) {
 				struct GPUAttrib *attrib;
 				int num_attrib;
-				GPU_strand_shader_get_fiber_attributes(shader, &attrib, &num_attrib);
+				GPU_strand_shader_get_fiber_attributes(shader, false, &attrib, &num_attrib);
 				
 				int elemsize = GPU_attrib_element_size(attrib, num_attrib);
 				GPU_interleaved_attrib_setup(buffer->fibers, attrib, num_attrib, elemsize, false);
@@ -176,7 +177,7 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 			if (buffer->fiber_points && buffer->fiber_indices) {
 				struct GPUAttrib *attrib;
 				int num_attrib;
-				GPU_strand_shader_get_fiber_attributes(shader, &attrib, &num_attrib);
+				GPU_strand_shader_get_fiber_attributes(shader, false, &attrib, &num_attrib);
 				
 				int elemsize = GPU_attrib_element_size(attrib, num_attrib);
 				GPU_interleaved_attrib_setup(buffer->fiber_points, attrib, num_attrib, elemsize, false);
@@ -200,5 +201,26 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 		GPU_strand_shader_unbind(shader);
 	}
 	
+	if (enable_debugging) {
+		bind_strands_shader(shader, rv3d, ob, smd, smd->debug_value);
+		
+		GPU_strands_setup_fibers(buffer, converter);
+		if (buffer->fiber_points && buffer->fiber_indices) {
+			struct GPUAttrib *attrib;
+			int num_attrib;
+			GPU_strand_shader_get_fiber_attributes(shader, true, &attrib, &num_attrib);
+			
+			int elemsize = GPU_attrib_element_size(attrib, num_attrib);
+			GPU_interleaved_attrib_setup(buffer->fiber_points, attrib, num_attrib, elemsize, false);
+			
+			glDrawArrays(GL_POINTS, 0, buffer->fiber_totverts * elemsize);
+			
+			GPU_interleaved_attrib_unbind();
+		}
+		GPU_strands_buffer_unbind();
+		
+		GPU_strand_shader_unbind(shader);
+	}
+	
 	converter->free(converter);
 }
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index f832bcd..e0ac32e 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -129,6 +129,9 @@ data_to_c_simple(shaders/gpu_shader_fx_lib.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_strand_frag.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_strand_geom.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_strand_vert.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_strand_debug_frag.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_strand_debug_geom.glsl SRC)
+data_to_c_simple(shaders/gpu_shader_strand_debug_vert.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_strand_effects.glsl SRC)
 data_to_c_simple(shaders/gpu_shader_strand_util.glsl SRC)
 
diff --git a/source/blender/gpu/GPU_strands.h b/source/blender/gpu/GPU_strands.h
index ec74196..e85bd65 100644
--- a/source/blender/gpu/GPU_strands.h
+++ b/source/blender/gpu/GPU_strands.h
@@ -78,14 +78,14 @@ void GPU_strand_shader_bind(
         float ribbon_width,
         float clump_thickness, float clump_shape,
         float curl_thickness, float curl_shape, float curl_radius, float curl_length,
-        int debug_value);
+        int debug_value, float debug_scale);
 void GPU_strand_shader_bind_uniforms(
         GPUStrandsShader *gpu_shader,
         float obmat[4][4], float viewmat[4][4]);
 void GPU_strand_shader_unbind(GPUStrandsShader *gpu_shader);
 bool GPU_strand_shader_bound(GPUStrandsShader *gpu_shader);
 
-void GPU_strand_shader_get_fiber_attributes(struct GPUStrandsShader *gpu_shader,
+void GPU_strand_shader_get_fiber_attributes(struct GPUStrandsShader *gpu_shader, bool debug,
                                             struct GPUAttrib **r_attrib, int *r_num);
 
 
diff --git a/source/blender/gpu/intern/gpu_strands_shader.c b/source/blender/gpu/intern/gpu_strands_shader.c
index 92da50a..6a1fce3 100644
--- a/source/blender/gpu/intern/gpu_strands_shader.c
+++ b/source/blender/gpu/intern/gpu_strands_shader.c
@@ -48,6 +48,7 @@
 #include "GPU_strands.h"
 #include "GPU_shader.h"
 
+#define MAX_DEFINES 1024
 
 struct GPUStrandsShader {
 	bool bound;
@@ -55,19 +56,28 @@ struct GPUStrandsShader {
 	GPUShader *shader;
 	GPUAttrib attributes[GPU_MAX_ATTRIB];
 	int num_attributes;
-	
 	char *fragmentcode;
 	char *geometrycode;
 	char *vertexcode;
+	
+	GPUShader *debug_shader;
+	GPUAttrib debug_attributes[GPU_MAX_ATTRIB];
+	int num_debug_attributes;
+	char *debug_fragmentcode;
+	char *debug_geometrycode;
+	char *debug_vertexcode;
 };
 
 extern char datatoc_gpu_shader_strand_frag_glsl[];
 extern char datatoc_gpu_shader_strand_geom_glsl[];
 extern char datatoc_gpu_shader_strand_vert_glsl[];
+extern char datatoc_gpu_shader_strand_debug_frag_glsl[];
+extern char datatoc_gpu_shader_strand_debug_geom_glsl[];
+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_vertex(void)
+static char *codegen(const char *basecode)
 {
 	char *code;
 	
@@ -75,7 +85,7 @@ static char *codegen_vertex(void)
 	
 	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_util_glsl);
 	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_effects_glsl);
-	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_vert_glsl);
+	BLI_dynstr_append(ds, basecode);
 	
 	code = BLI_dynstr_get_cstring(ds);
 	BLI_dynstr_free(ds);
@@ -83,39 +93,120 @@ static char *codegen_vertex(void)
 	return code;
 }
 
-static char *codegen_geometry(void)
+static void get_defines(GPUStrandsShaderParams *params, char *defines)
 {
-	char *code;
-	
-	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);
-	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_geom_glsl);
+	switch (params->shader_model) {
+		case GPU_STRAND_SHADER_CLASSIC_BLENDER:
+			strcat(defines, "#define SHADING_CLASSIC_BLENDER\n");
+			break;
+		case GPU_STRAND_SHADER_KAJIYA:
+			strcat(defines, "#define SHADING_KAJIYA\n");
+			break;
+		case GPU_STRAND_SHADER_MARSCHNER:
+			strcat(defines, "#define SHADING_MARSCHNER\n");
+			break;
+	}
+	switch (params->fiber_primitive) {
+		case GPU_STRANDS_FIBER_LINE:
+			strcat(defines, "#define FIBER_LINE\n");
+			break;
+		case GPU_STRANDS_FIBER_RIBBON:
+			strcat(defines, "#define FIBER_RIBBON\n");
+			break;
+	}
 	
-	code = BLI_dynstr_get_cstring(ds);
-	BLI_dynstr_free(ds);
+	if (params->effects & GPU_STRAND_EFFECT_CLUMP)
+		strcat(defines, "#define USE_EFFECT_CLUMPING\n");
+	if (params->effects & GPU_STRAND_EFFECT_CURL)
+		strcat(defines, "#define USE_EFFECT_CURL\n");
 	
-	return code;
+	if (params->use_geomshader) {
+		strcat(defines, "#define USE_GEOMSHADER\n");
+	}
 }
 
-static char *codegen_fragment(void)
+static void set_texture_uniforms(GPUShader *shader)
 {
-	char *code;
-	
-	DynStr *ds = BLI_dynstr_new();
-	
-	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_util_glsl);
-	BLI_dynstr_append(ds, datatoc_gpu_shader_strand_frag_glsl);
+	GPU_shader_bind(shader);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_curves"), 0);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_points"), 1);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_normals"), 2);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.control_tangents"), 3);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.fiber_position"), 4);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.fiber_control_index"), 5);
+	GPU_shader_uniform_int(shader, GPU_shader_get_uniform(shader, "samplers.fiber_control_weight"), 6);
+	GPU_shader_unbind();
+}
+
+static void get_shader_attributes(GPUShader *shader, bool use_geomshader,
+                                  GPUAttrib *r_attributes, int *r_num_attributes)
+{
+	GPUAttrib *attr = r_attributes;
 	
-	code = BLI_dynstr_get_cstring(ds);
-	BLI_dynstr_free(ds);
+	if (use_geomshader) {
+		/* position */
+		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list