[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(¶ms);
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(¶ms);
if (show_controls) {
GPU_strands_setup_edges(buffer, ¶ms);
@@ -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(¶ms);
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(¶ms);
if (show_controls) {
GPU_strands_setup_edges(buffer, ¶ms);
@@ -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