From ecfacda1144f1428b5d61b75a0b1f8291ff3566f Mon Sep 17 00:00:00 2001 From: zeffii Date: Tue, 15 Oct 2019 16:28:11 +0200 Subject: [PATCH 1/6] remove matrix input --- nodes/viz/vd_basic_lines.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/nodes/viz/vd_basic_lines.py b/nodes/viz/vd_basic_lines.py index d438670ed..4f6145bb6 100644 --- a/nodes/viz/vd_basic_lines.py +++ b/nodes/viz/vd_basic_lines.py @@ -17,14 +17,8 @@ from bpy.props import StringProperty, BoolProperty, FloatVectorProperty from sverchok.node_tree import SverchCustomTreeNode from sverchok.data_structure import node_id, updateNode from sverchok.ui.bgl_callback_3dview import callback_disable, callback_enable -from sverchok.utils.sv_batch_primitives import MatrixDraw28 -def screen_v3dMatrix(context, args): - mdraw = MatrixDraw28() - for matrix in args[0]: - mdraw.draw_matrix(matrix) - def screen_v3dBGL(context, args): # region = context.region # region3d = context.space_data.region_3d @@ -69,7 +63,6 @@ class SvVDBasicLines(bpy.types.Node, SverchCustomTreeNode): inew = self.inputs.new inew('SvVerticesSocket', 'verts') inew('SvStringsSocket', 'edges') - inew('SvMatrixSocket', 'matrix') def draw_buttons(self, context, layout): layout.row().prop(self, "activate", text="ACTIVATE") @@ -105,20 +98,6 @@ class SvVDBasicLines(bpy.types.Node, SverchCustomTreeNode): 'args': (shader, batch, line4f) } - callback_enable(n_id, draw_data) - return - - matrix_socket = self.inputs['matrix'] - if matrix_socket.is_linked: - matrices = matrix_socket.sv_get(deepcopy=False, default=[Matrix()]) - - draw_data = { - 'tree_name': self.id_data.name[:], - 'custom_function': screen_v3dMatrix, - 'args': (matrices,) - } - - callback_enable(n_id, draw_data) def copy(self, node): self.n_id = '' -- GitLab From abb3128d8be36498e46d487cf81300fca2c0961c Mon Sep 17 00:00:00 2001 From: zeffii Date: Tue, 15 Oct 2019 17:51:18 +0200 Subject: [PATCH 2/6] add files, prepare for geometry shader --- utils/modules/line_shader.py | 67 ++++++++++++++++++++++++++++++++++++ utils/sv_shader_sources.py | 11 ++++++ 2 files changed, 78 insertions(+) create mode 100644 utils/modules/line_shader.py diff --git a/utils/modules/line_shader.py b/utils/modules/line_shader.py new file mode 100644 index 000000000..8b53079d1 --- /dev/null +++ b/utils/modules/line_shader.py @@ -0,0 +1,67 @@ +# This file is part of project Sverchok. It's copyrighted by the contributors +# recorded in the version control history of the file, available from +# its original location https://github.com/nortikin/sverchok/commit/master +# +# SPDX-License-Identifier: GPL3 +# License-Filename: LICENSE + + + +vertex_shader = ''' + layout (location = 0) in vec3 inPos; + + flat out vec3 startPos; + out vec3 vertPos; + + uniform mat4 u_mvp; + + void main() + { + vec4 pos = u_mvp * vec4(inPos, 1.0); + gl_Position = pos; + vertPos = pos.xyz / pos.w; + startPos = vertPos; + } +''' + +geometry_shader = ''' + + + + +''' + +fragment_shader = ''' + flat in vec3 startPos; + in vec3 vertPos; + + out vec4 fragColor; + + uniform vec2 u_resolution; + uniform vec4 m_color; + uniform float u_dashSize; + uniform float u_gapSize; + + void main() + { + vec2 dir = (vertPos.xy-startPos.xy) * u_resolution/2.0; + float dist = length(dir); + + if (fract(dist / (u_dashSize + u_gapSize)) > u_dashSize/(u_dashSize + u_gapSize)) + discard; + fragColor = m_color; + } +''' + +def draw_function(context, args): + ... + + +def get_shader(): + shader = lambda: None + shader.vertex_shader = vertex_shader + shader.geometry_shader = geometry_shader + shader.fragment_shader = fragment_shader + shader.draw_function = draw_function + return shader + diff --git a/utils/sv_shader_sources.py b/utils/sv_shader_sources.py index 4c58e2bae..530416ad0 100644 --- a/utils/sv_shader_sources.py +++ b/utils/sv_shader_sources.py @@ -9,6 +9,8 @@ # shader hoisted from https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 # +import sverchok + dashed_vertex_shader = ''' layout (location = 0) in vec3 inPos; @@ -65,3 +67,12 @@ def screen_v3dBGL_dashed(context, args): shader.uniform_float("m_color", args.line4f) batch.draw(shader) + + +##### ----------------------------------------------------------------------- +# +# line thickness shader .woohooo! +# +##### ----------------------------------------------------------------------- + +line_shader = sverchok.utils.modules.line_shader.get_shader() -- GitLab From 406cf6b29f120ad5a675a09cfc171c3ebf51670b Mon Sep 17 00:00:00 2001 From: zeffii Date: Tue, 15 Oct 2019 18:23:01 +0200 Subject: [PATCH 3/6] adding stub code --- utils/modules/line_shader.py | 22 +++++++++++++++++++++- utils/sv_shader_sources.py | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/utils/modules/line_shader.py b/utils/modules/line_shader.py index 8b53079d1..f54f95a65 100644 --- a/utils/modules/line_shader.py +++ b/utils/modules/line_shader.py @@ -5,6 +5,8 @@ # SPDX-License-Identifier: GPL3 # License-Filename: LICENSE +import gpu + vertex_shader = ''' @@ -53,8 +55,26 @@ fragment_shader = ''' } ''' + +# gpu.types.GPUShader(vertexcode, fragcode, geocode=None, libcode=None, defines=None) +# gpu.types.GPUShader(vertexcode, fragcode, geocode=None) +# batch = batch_for_shader(shader, 'LINES', {"pos" : coords}, indices=indices) + + def draw_function(context, args): - ... + matrix = context.region_data.perspective_matrix + + shader = args.shader + batch = args.batch + + shader.bind() + shader.uniform_float("u_mvp", matrix) + shader.uniform_float("u_resolution", args.u_resolution) + shader.uniform_float("u_dashSize", args.u_dash_size) + shader.uniform_float("u_gapSize", args.u_gap_size) + shader.uniform_float("m_color", args.line4f) + + batch.draw(shader) def get_shader(): diff --git a/utils/sv_shader_sources.py b/utils/sv_shader_sources.py index 530416ad0..885926876 100644 --- a/utils/sv_shader_sources.py +++ b/utils/sv_shader_sources.py @@ -73,6 +73,9 @@ def screen_v3dBGL_dashed(context, args): # # line thickness shader .woohooo! # +# https://docs.blender.org/api/blender2.8/gpu.types.html#gpu.types.GPUShader +# ##### ----------------------------------------------------------------------- + line_shader = sverchok.utils.modules.line_shader.get_shader() -- GitLab From 10cc0d81a3fbc06e58286e9cc5ed1a7055e9510a Mon Sep 17 00:00:00 2001 From: zeffii Date: Tue, 15 Oct 2019 18:25:43 +0200 Subject: [PATCH 4/6] expand line shader --- utils/modules/line_shader.py | 2 +- utils/sv_shader_sources.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/modules/line_shader.py b/utils/modules/line_shader.py index f54f95a65..67c1b7202 100644 --- a/utils/modules/line_shader.py +++ b/utils/modules/line_shader.py @@ -77,7 +77,7 @@ def draw_function(context, args): batch.draw(shader) -def get_shader(): +def get_shader_config(): shader = lambda: None shader.vertex_shader = vertex_shader shader.geometry_shader = geometry_shader diff --git a/utils/sv_shader_sources.py b/utils/sv_shader_sources.py index 885926876..631965154 100644 --- a/utils/sv_shader_sources.py +++ b/utils/sv_shader_sources.py @@ -78,4 +78,4 @@ def screen_v3dBGL_dashed(context, args): ##### ----------------------------------------------------------------------- -line_shader = sverchok.utils.modules.line_shader.get_shader() +line_shader_config = sverchok.utils.modules.line_shader.get_shader_config() -- GitLab From b68cc4979c4bd3701e41331b7acf206f715a4a44 Mon Sep 17 00:00:00 2001 From: zeffii Date: Tue, 15 Oct 2019 18:33:21 +0200 Subject: [PATCH 5/6] fill out stub code more --- utils/modules/line_shader.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/utils/modules/line_shader.py b/utils/modules/line_shader.py index 67c1b7202..3c5e6f695 100644 --- a/utils/modules/line_shader.py +++ b/utils/modules/line_shader.py @@ -6,7 +6,7 @@ # License-Filename: LICENSE import gpu - +from gpu_extras.batch import batch_for_shader vertex_shader = ''' @@ -56,18 +56,13 @@ fragment_shader = ''' ''' -# gpu.types.GPUShader(vertexcode, fragcode, geocode=None, libcode=None, defines=None) -# gpu.types.GPUShader(vertexcode, fragcode, geocode=None) -# batch = batch_for_shader(shader, 'LINES', {"pos" : coords}, indices=indices) - - def draw_function(context, args): - matrix = context.region_data.perspective_matrix - shader = args.shader - batch = args.batch + shader = gpu.types.GPUShader(args.v_shader, args.f_shader, geocode=args.g_shader) + batch = batch_for_shader(shader, 'LINES', {"pos" : args.coords}, indices=args.indices) shader.bind() + matrix = context.region_data.perspective_matrix shader.uniform_float("u_mvp", matrix) shader.uniform_float("u_resolution", args.u_resolution) shader.uniform_float("u_dashSize", args.u_dash_size) @@ -79,9 +74,9 @@ def draw_function(context, args): def get_shader_config(): shader = lambda: None - shader.vertex_shader = vertex_shader - shader.geometry_shader = geometry_shader - shader.fragment_shader = fragment_shader + shader.v_shader = vertex_shader + shader.g_shader = geometry_shader + shader.f_shader = fragment_shader shader.draw_function = draw_function return shader -- GitLab From 60133fb5b3257cd9b4b0d47920519c812d8ea0a5 Mon Sep 17 00:00:00 2001 From: zeffii Date: Thu, 17 Oct 2019 11:26:17 +0200 Subject: [PATCH 6/6] add more stub geocode --- nodes/viz/vd_basic_lines.py | 39 ++++++++++++++++++++++++------------ utils/modules/line_shader.py | 35 +++++++++++++++++++++++++------- utils/sv_shader_sources.py | 4 ++-- 3 files changed, 56 insertions(+), 22 deletions(-) diff --git a/nodes/viz/vd_basic_lines.py b/nodes/viz/vd_basic_lines.py index 4f6145bb6..a205fb6e1 100644 --- a/nodes/viz/vd_basic_lines.py +++ b/nodes/viz/vd_basic_lines.py @@ -13,11 +13,11 @@ from gpu_extras.batch import batch_for_shader # import mathutils from mathutils import Vector, Matrix import sverchok -from bpy.props import StringProperty, BoolProperty, FloatVectorProperty +from bpy.props import StringProperty, BoolProperty, FloatVectorProperty, FloatProperty, IntProperty from sverchok.node_tree import SverchCustomTreeNode from sverchok.data_structure import node_id, updateNode from sverchok.ui.bgl_callback_3dview import callback_disable, callback_enable - +from sverchok.utils.sv_shader_sources import line_shader_config def screen_v3dBGL(context, args): # region = context.region @@ -55,6 +55,13 @@ class SvVDBasicLines(bpy.types.Node, SverchCustomTreeNode): subtype='COLOR', min=0, max=1, default=(0.3, 0.3, 0.3, 1.0), name='edge color', size=4, update=updateNode) + u_dash_size: FloatProperty(default=0.12, min=0.0001, name="dash size", update=updateNode) + u_gap_size: FloatProperty(default=0.19, min=0.0001, name="gap size", update=updateNode) + u_resolution: FloatVectorProperty(default=(25.0, 18.0), size=2, min=0.01, name="resolution", update=updateNode) + + u_num_segs: IntProperty(default=2, name='num segs', update=updateNode) + u_offset: FloatProperty(default=0.2, name='offset', update=updateNode) + @property def fully_enabled(self): return "edges" in self.inputs @@ -85,18 +92,24 @@ class SvVDBasicLines(bpy.types.Node, SverchCustomTreeNode): propv = verts_socket.sv_get(deepcopy=False, default=[]) prope = edges_socket.sv_get(deepcopy=False, default=[]) - coords = propv[0] - indices = prope[0] - shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR') - batch = batch_for_shader(shader, 'LINES', {"pos" : coords}, indices=indices) - - line4f = self.edge_color[:] - - draw_data = { + args = lambda: None + args.coords = propv[0] + args.indices = prope[0] + args.line4f = self.edge_color[:] + args.u_resolution = self.u_resolution[:] + args.u_dash_size = self.u_dash_size + args.u_gap_size = self.u_gap_size + args.u_offset = self.u_offset + args.u_num_segs = self.u_num_segs + + config = line_shader_config() + + gl_instructions = { 'tree_name': self.id_data.name[:], - 'custom_function': screen_v3dBGL, - 'args': (shader, batch, line4f) - } + 'custom_function': config.draw_function, + 'args': (args, config) + } + callback_enable(n_id, gl_instructions) def copy(self, node): diff --git a/utils/modules/line_shader.py b/utils/modules/line_shader.py index 3c5e6f695..80f383353 100644 --- a/utils/modules/line_shader.py +++ b/utils/modules/line_shader.py @@ -27,7 +27,25 @@ vertex_shader = ''' ''' geometry_shader = ''' + /* + takes an edge + takes a quantity "number of segments" + + returns several perpendicular edges, to thicken lines + + */ + + layout(lines) in; + layout(line_strip, max_vertices = 2) out; + + void main() { + for(int i = 0; i < 2; i++) { + gl_Position = gl_in[i].gl_Position + vec4(1.0, 0.0, 0.0, 0.0); + EmitVertex(); + } + EndPrimitive(); + } @@ -57,8 +75,9 @@ fragment_shader = ''' def draw_function(context, args): + args, config = args - shader = gpu.types.GPUShader(args.v_shader, args.f_shader, geocode=args.g_shader) + shader = gpu.types.GPUShader(config.v_shader, config.f_shader, geocode=config.g_shader) batch = batch_for_shader(shader, 'LINES', {"pos" : args.coords}, indices=args.indices) shader.bind() @@ -68,15 +87,17 @@ def draw_function(context, args): shader.uniform_float("u_dashSize", args.u_dash_size) shader.uniform_float("u_gapSize", args.u_gap_size) shader.uniform_float("m_color", args.line4f) + # shader.uniform_float("u_offset", args.u_offset) + # shader.uniform_float("u_num_segs", args.u_num_segs) batch.draw(shader) def get_shader_config(): - shader = lambda: None - shader.v_shader = vertex_shader - shader.g_shader = geometry_shader - shader.f_shader = fragment_shader - shader.draw_function = draw_function - return shader + config = lambda: None + config.v_shader = vertex_shader + config.g_shader = geometry_shader + config.f_shader = fragment_shader + config.draw_function = draw_function + return config diff --git a/utils/sv_shader_sources.py b/utils/sv_shader_sources.py index 631965154..d27bf9c9c 100644 --- a/utils/sv_shader_sources.py +++ b/utils/sv_shader_sources.py @@ -10,7 +10,7 @@ # import sverchok - +from sverchok.utils.modules import line_shader dashed_vertex_shader = ''' layout (location = 0) in vec3 inPos; @@ -78,4 +78,4 @@ def screen_v3dBGL_dashed(context, args): ##### ----------------------------------------------------------------------- -line_shader_config = sverchok.utils.modules.line_shader.get_shader_config() +line_shader_config = sverchok.utils.modules.line_shader.get_shader_config -- GitLab