[Bf-blender-cvs] [0606172] strand_gpu: New option for selecting a fiber rendering primitive.

Lukas Tönne noreply at git.blender.org
Fri Jul 15 12:32:23 CEST 2016


Commit: 060617232d1612b2633411a6c4cc5d2088362b7e
Author: Lukas Tönne
Date:   Fri Jul 15 12:30:04 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB060617232d1612b2633411a6c4cc5d2088362b7e

New option for selecting a fiber rendering primitive.

Currently lines and ribbons (triangle strips) are supported.
The ribbon width can be controlled with a parameter. Ribbons are
oriented toward the camera, similar to billboards, but shaded like lines
with the Kajiya shader imitating a reflective tube.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/editors/space_view3d/drawstrands.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/GPU_strands.h
M	source/blender/gpu/intern/gpu_strands_buffer.c
M	source/blender/gpu/intern/gpu_strands_shader.c
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 c12f894..f122418 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -877,22 +877,26 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
     def STRANDS(self, layout, ob, md):
         layout.operator("object.strands_test_init", text="Test Init")
 
+        layout.label("Display:")
+        layout.prop(md, "show_strands", text="Control Strands")
+        layout.prop(md, "show_fibers", text="Fibers")
+
         split = layout.split()
         col = split.column()
+        
+        col.label("Fibers:")
         col.prop(md, "seed")
         col.prop(md, "num_fibers")
-
-        col = split.column()
-        col.label(text="Display:")
-        col.prop(md, "show_strands", text="Control Strands")
-        col.prop(md, "show_fibers", text="Fibers")
         col.prop(md, "subdivisions")
-        col.prop(md, "use_geometry_shader")
-        col.prop(md, "debug_value")
-        
+
         col.separator()
 
-        col.label("Shader Model:")
+        col.prop(md, "fiber_primitive", text="")
+        if (md.fiber_primitive == 'RIBBON'):
+            col.prop(md, "ribbon_width")
+
+        col = split.column()
+        col.label(text="Shader:")
         col.prop(md, "shader_model", text="")
         
         layout.separator()
@@ -911,6 +915,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
             box.prop(md, "curl_radius")
             box.prop(md, "curl_length")
 
+        layout.separator()
+
+        layout.prop(md, "use_geometry_shader")
+        layout.prop(md, "debug_value")
+
     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 35ae160..6249407 100644
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -79,6 +79,17 @@ static GPUStrands_ShaderModel get_shader_model(int smd_shader_model)
 	return 0;
 }
 
+static GPUStrands_FiberPrimitive get_fiber_primitive(int smd_fiber_primitive)
+{
+	switch (smd_fiber_primitive) {
+		case MOD_STRANDS_FIBER_LINE: return GPU_STRANDS_FIBER_LINE;
+		case MOD_STRANDS_FIBER_RIBBON: return GPU_STRANDS_FIBER_RIBBON;
+	}
+	
+	BLI_assert(false && "Unhandled fiber primitive enum value!");
+	return 0;
+}
+
 static int get_effects(int smd_effects)
 {
 	GPUStrands_Effects effects = 0;
@@ -95,6 +106,7 @@ static void bind_strands_shader(GPUStrandsShader *shader, RegionView3D *rv3d,
 {
 	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);
@@ -115,15 +127,15 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 	params.strands = smd->strands;
 	params.root_dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
 	params.subdiv = smd->subdiv;
+	params.fiber_primitive = get_fiber_primitive(smd->fiber_primitive);
+	params.effects = get_effects(smd->effects);
 	params.use_geomshader = use_geomshader;
+	params.shader_model = get_shader_model(smd->shader_model);
 	
 	if (smd->gpu_buffer == NULL)
 		smd->gpu_buffer = GPU_strands_buffer_create(&params);
 	GPUDrawStrands *buffer = smd->gpu_buffer;
-	GPUStrandsShader *shader = GPU_strand_shader_get(strands,
-	                                                 get_shader_model(smd->shader_model),
-	                                                 get_effects(smd->effects),
-	                                                 use_geomshader);
+	GPUStrandsShader *shader = GPU_strand_shader_get(&params);
 	
 	if (show_controls) {
 		GPU_strands_setup_edges(buffer, &params);
@@ -153,7 +165,7 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 			}
 		}
 		else {
-			if (buffer->fiber_points && buffer->fiber_edges) {
+			if (buffer->fiber_points && buffer->fiber_indices) {
 				struct GPUAttrib *attrib;
 				int num_attrib;
 				GPU_strand_shader_get_fiber_attributes(shader, &attrib, &num_attrib);
@@ -161,8 +173,16 @@ void draw_strands(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 				int elemsize = GPU_attrib_element_size(attrib, num_attrib);
 				GPU_interleaved_attrib_setup(buffer->fiber_points, attrib, num_attrib, elemsize, false);
 				
-				GPU_buffer_draw_elements(buffer->fiber_edges, GL_LINES, 0,
-				                         buffer->fiber_totedges * 2);
+				switch (params.fiber_primitive) {
+					case GPU_STRANDS_FIBER_LINE:
+						GPU_buffer_draw_elements(buffer->fiber_indices, GL_LINES, 0,
+						                         buffer->fiber_totelems);
+						break;
+					case GPU_STRANDS_FIBER_RIBBON:
+						GPU_buffer_draw_elements(buffer->fiber_indices, GL_TRIANGLE_STRIP, 0,
+						                         buffer->fiber_totelems);
+						break;
+				}
 				
 				GPU_interleaved_attrib_unbind();
 			}
@@ -500,15 +520,15 @@ void draw_strands_edit(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 	params.edit = edit;
 	params.root_dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
 	params.subdiv = smd->subdiv;
+	params.fiber_primitive = get_fiber_primitive(smd->fiber_primitive);
+	params.effects = get_effects(smd->effects);
 	params.use_geomshader = use_geomshader;
+	params.shader_model = get_shader_model(smd->shader_model);
 	
 	if (smd->gpu_buffer == NULL)
 		smd->gpu_buffer = GPU_strands_buffer_create(&params);
 	GPUDrawStrands *buffer = smd->gpu_buffer;
-	GPUStrandsShader *shader = GPU_strand_shader_get(smd->strands,
-	                                                 get_shader_model(smd->shader_model),
-	                                                 get_effects(smd->effects),
-	                                                 use_geomshader);
+	GPUStrandsShader *shader = GPU_strand_shader_get(&params);
 	
 	if (show_controls) {
 		GPU_strands_setup_edges(buffer, &params);
@@ -537,7 +557,7 @@ void draw_strands_edit(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 			}
 		}
 		else {
-			if (buffer->fiber_points && buffer->fiber_edges) {
+			if (buffer->fiber_points && buffer->fiber_indices) {
 				struct GPUAttrib *attrib;
 				int num_attrib;
 				GPU_strand_shader_get_fiber_attributes(shader, &attrib, &num_attrib);
@@ -545,8 +565,16 @@ void draw_strands_edit(Scene *scene, View3D *UNUSED(v3d), RegionView3D *rv3d,
 				int elemsize = GPU_attrib_element_size(attrib, num_attrib);
 				GPU_interleaved_attrib_setup(buffer->fiber_points, attrib, num_attrib, elemsize, false);
 				
-				GPU_buffer_draw_elements(buffer->fiber_edges, GL_LINES, 0,
-				                         buffer->fiber_totedges * 2);
+				switch (params.fiber_primitive) {
+					case GPU_STRANDS_FIBER_LINE:
+						GPU_buffer_draw_elements(buffer->fiber_indices, GL_LINES, 0,
+						                         buffer->fiber_totelems);
+						break;
+					case GPU_STRANDS_FIBER_RIBBON:
+						GPU_buffer_draw_elements(buffer->fiber_indices, GL_TRIANGLE_STRIP, 0,
+						                         buffer->fiber_totelems);
+						break;
+				}
 				
 				GPU_interleaved_attrib_unbind();
 			}
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 42f825a..704e480 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -158,7 +158,7 @@ typedef struct GPUDrawStrands {
 	GPUBuffer *control_tangents;
 	GPUBuffer *fibers;
 	GPUBuffer *fiber_points;
-	GPUBuffer *fiber_edges;
+	GPUBuffer *fiber_indices;
 	GPUBuffer *fiber_position;
 	GPUBuffer *fiber_control_index;
 	GPUBuffer *fiber_control_weight;
@@ -178,7 +178,7 @@ typedef struct GPUDrawStrands {
 	unsigned int control_totcurves;
 	unsigned int totfibers;
 	unsigned int fiber_totverts;
-	unsigned int fiber_totedges;
+	unsigned int fiber_totelems;
 } GPUDrawStrands;
 
 
diff --git a/source/blender/gpu/GPU_strands.h b/source/blender/gpu/GPU_strands.h
index b68c104..01bec4b 100644
--- a/source/blender/gpu/GPU_strands.h
+++ b/source/blender/gpu/GPU_strands.h
@@ -54,16 +54,30 @@ typedef enum GPUStrands_Effects {
 	GPU_STRAND_EFFECT_CURL          = (1 << 1),
 } GPUStrands_Effects;
 
-GPUStrandsShader *GPU_strand_shader_get(struct Strands *strands,
-                                        GPUStrands_ShaderModel shader_model,
-                                        int effects,
-                                        bool use_geometry_shader);
+typedef enum GPUStrands_FiberPrimitive {
+	GPU_STRANDS_FIBER_LINE = 0,
+	GPU_STRANDS_FIBER_RIBBON,
+} GPUStrands_FiberPrimitive;
+
+typedef struct GPUDrawStrandsParams {
+	struct Strands *strands;
+	struct BMEditStrands *edit;
+	struct DerivedMesh *root_dm;
+	int subdiv;
+	GPUStrands_FiberPrimitive fiber_primitive;
+	int effects;
+	bool use_geomshader;
+	GPUStrands_ShaderModel shader_model;
+} GPUDrawStrandsParams;
+
+GPUStrandsShader *GPU_strand_shader_get(struct GPUDrawStrandsParams *params);
 
 void GPU_strand_shader_free(struct GPUStrandsShader *gpu_shader);
 
 void GPU_strand_shader_bind(
         GPUStrandsShader *gpu_shader,
         float viewmat[4][4], float viewinv[4][4],
+        float ribbon_width,
         float clump_thickness, float clump_shape,
         float curl_thickness, float curl_shape, float curl_radius, float curl_length,
         int debug_value);
@@ -79,27 +93,19 @@ void GPU_strand_shader_get_fiber_attributes(struct GPUStrandsShader *gpu_shader,
 
 /* Strand Buffers */
 
-typedef struct GPUDrawStrandsParams {
-	struct Strands *strands;
-	struct BMEditStrands *edit;
-	struct DerivedMesh *root_dm;
-	int subdiv;
-	bool use_geomshader;
-} GPUDrawStrandsParams;
-
-typedef enum GPUStrandsComponent {
+typedef enum GPUStrands_Component {
 	GPU_STRANDS_COMPONENT_CONTROLS = (1 << 0),
 	GPU_STRANDS_COMPONENT_FIBER_ATTRIBUTES = (1 << 1),
 	GPU_STRANDS_COMPONENT_FIBERS = (1 << 2) | GPU_STRANDS_COMPONE

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list