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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to