Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-08-26 16:25:55 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-08-26 19:06:46 +0300
commit5b76cb1d313cb2ca72c477a62b59e6718481b00b (patch)
treea944d6ab0cc0d8f58e4fe02e10f47c7b12dc2818
parent64eeb14bf27dd64074cedaae02c00a2227849152 (diff)
Snap_Utilities_Line: update clip distance API
-rw-r--r--mesh_snap_utilities_line/__init__.py2
-rw-r--r--mesh_snap_utilities_line/common_classes.py4
-rw-r--r--mesh_snap_utilities_line/drawing_utilities.py118
-rw-r--r--mesh_snap_utilities_line/snap_context_l/mesh_drawing.py6
-rw-r--r--mesh_snap_utilities_line/snap_context_l/shaders/ID_color_frag.glsl17
-rw-r--r--mesh_snap_utilities_line/snap_context_l/shaders/ID_color_vert.glsl10
6 files changed, 82 insertions, 75 deletions
diff --git a/mesh_snap_utilities_line/__init__.py b/mesh_snap_utilities_line/__init__.py
index 0b1b7a15..9b93ba55 100644
--- a/mesh_snap_utilities_line/__init__.py
+++ b/mesh_snap_utilities_line/__init__.py
@@ -21,7 +21,7 @@
bl_info = {
"name": "Snap_Utilities_Line",
"author": "Germano Cavalcante",
- "version": (6, 9, 3),
+ "version": (6, 9, 4),
"blender": (3, 0, 0),
"location": "View3D > TOOLS > Line Tool",
"description": "Extends Blender Snap controls",
diff --git a/mesh_snap_utilities_line/common_classes.py b/mesh_snap_utilities_line/common_classes.py
index 611b07da..f0e2a8ed 100644
--- a/mesh_snap_utilities_line/common_classes.py
+++ b/mesh_snap_utilities_line/common_classes.py
@@ -471,6 +471,7 @@ class SnapUtilities:
preferences = context.preferences.addons[__package__].preferences
self.preferences = preferences
+
#Init DrawCache
self.draw_cache = SnapDrawn(
preferences.out_color,
@@ -482,7 +483,8 @@ class SnapUtilities:
preferences.constrain_shift_color,
tuple(context.preferences.themes[0].user_interface.axis_x) + (1.0,),
tuple(context.preferences.themes[0].user_interface.axis_y) + (1.0,),
- tuple(context.preferences.themes[0].user_interface.axis_z) + (1.0,))
+ tuple(context.preferences.themes[0].user_interface.axis_z) + (1.0,),
+ self.sctx.rv3d)
self.snap_vert = self.snap_edge = snap_edge_and_vert
diff --git a/mesh_snap_utilities_line/drawing_utilities.py b/mesh_snap_utilities_line/drawing_utilities.py
index cf67db4b..b4e53a00 100644
--- a/mesh_snap_utilities_line/drawing_utilities.py
+++ b/mesh_snap_utilities_line/drawing_utilities.py
@@ -15,7 +15,7 @@
#
# ##### END GPL LICENSE BLOCK #####
import gpu
-from mathutils import Vector
+from mathutils import Vector, Matrix
class SnapDrawn():
@@ -30,6 +30,7 @@ class SnapDrawn():
'axis_x_color',
'axis_y_color',
'axis_z_color',
+ 'rv3d',
'_format_pos',
'_format_pos_and_color',
'_program_unif_col',
@@ -39,7 +40,7 @@ class SnapDrawn():
def __init__(self, out_color, face_color,
edge_color, vert_color, center_color,
perpendicular_color, constrain_shift_color,
- axis_x_color, axis_y_color, axis_z_color):
+ axis_x_color, axis_y_color, axis_z_color, rv3d):
import gpu
@@ -55,6 +56,8 @@ class SnapDrawn():
self.axis_y_color = axis_y_color
self.axis_z_color = axis_z_color
+ self.rv3d = rv3d
+
self._format_pos = gpu.types.GPUVertFormat()
self._format_pos.attr_add(id="pos", comp_type='F32', len=3, fetch_mode='FLOAT')
@@ -62,18 +65,38 @@ class SnapDrawn():
self._format_pos_and_color.attr_add(id="pos", comp_type='F32', len=3, fetch_mode='FLOAT')
self._format_pos_and_color.attr_add(id="color", comp_type='F32', len=4, fetch_mode='FLOAT')
- self._program_unif_col = gpu.shader.from_builtin("3D_UNIFORM_COLOR")
- self._program_smooth_col = gpu.shader.from_builtin("3D_SMOOTH_COLOR")
-
self._batch_point = None
+ def _gl_state_push(self, ob_mat=None):
+ clip_planes = gpu.types.Buffer('FLOAT', (6, 4), self.rv3d.clip_planes) if self.rv3d.use_clip_planes else None
+
+ config = 'CLIPPED' if clip_planes else 'DEFAULT'
+ self._program_unif_col = gpu.shader.from_builtin("3D_UNIFORM_COLOR", config=config)
+ self._program_smooth_col = gpu.shader.from_builtin("3D_SMOOTH_COLOR", config=config)
- def _gl_state_push(self):
gpu.state.program_point_size_set(False)
gpu.state.blend_set('ALPHA')
+ gpu.matrix.push()
+ if ob_mat:
+ gpu.matrix.multiply_matrix(ob_mat)
+
+ if clip_planes:
+ gpu.state.clip_distances_set(4)
+ mat = ob_mat if ob_mat else Matrix.Identity(4)
+
+ self._program_unif_col.bind()
+ self._program_unif_col.uniform_float("ModelMatrix", mat)
+ self._program_unif_col.uniform_vector_float(self._program_unif_col.uniform_from_name("WorldClipPlanes"), clip_planes, 4, 4)
+
+ self._program_smooth_col.bind()
+ self._program_smooth_col.uniform_float("ModelMatrix", mat)
+ self._program_smooth_col.uniform_vector_float(self._program_smooth_col.uniform_from_name("WorldClipPlanes"), clip_planes, 4, 4)
def _gl_state_restore(self):
gpu.state.blend_set('NONE')
+ gpu.matrix.pop()
+ if self.rv3d.use_clip_planes:
+ gpu.state.clip_distances_set(0)
def batch_line_strip_create(self, coords):
from gpu.types import (
@@ -124,7 +147,6 @@ class SnapDrawn():
import gpu
self._gl_state_push()
- gpu.matrix.push()
self._program_unif_col.bind()
if list_verts_co:
@@ -139,6 +161,7 @@ class SnapDrawn():
self._program_unif_col.bind()
self._program_unif_col.uniform_float("color", (1.0, 0.8, 0.0, 0.5))
+
batch.draw(self._program_unif_col)
gpu.matrix.pop_projection()
del batch
@@ -153,6 +176,7 @@ class SnapDrawn():
self._program_unif_col.bind()
self._program_unif_col.uniform_float("color", (1.0, 1.0, 1.0, 0.5))
+
point_batch.draw(self._program_unif_col)
gpu.matrix.translate(-prevloc)
@@ -192,7 +216,6 @@ class SnapDrawn():
gpu.state.line_width_set(1.0)
gpu.state.depth_test_set('LESS_EQUAL')
- gpu.matrix.pop()
self._gl_state_restore()
def draw_elem(self, snap_obj, bm, elem):
@@ -204,53 +227,48 @@ class SnapDrawn():
BMFace,
)
- with gpu.matrix.push_pop():
- self._gl_state_push()
- gpu.state.depth_test_set('NONE')
-
- gpu.matrix.multiply_matrix(snap_obj.mat)
-
- if isinstance(elem, BMVert):
- if elem.link_edges:
- import numpy as np
-
- color = self.vert_color
- edges = np.empty((len(elem.link_edges), 2), [("pos", "f4", 3), ("color", "f4", 4)])
- edges["pos"][:, 0] = elem.co
- edges["pos"][:, 1] = [e.other_vert(elem).co for e in elem.link_edges]
- edges["color"][:, 0] = color
- edges["color"][:, 1] = (color[0], color[1], color[2], 0.0)
- edges.shape = -1
-
- self._program_smooth_col.bind()
- gpu.state.line_width_set(3.0)
- batch = self.batch_lines_smooth_color_create(edges["pos"], edges["color"])
- batch.draw(self._program_smooth_col)
- gpu.state.line_width_set(1.0)
- else:
+ self._gl_state_push(snap_obj.mat)
+ gpu.state.depth_test_set('NONE')
+
+ if isinstance(elem, BMVert):
+ if elem.link_edges:
+ import numpy as np
+
+ color = self.vert_color
+ edges = np.empty((len(elem.link_edges), 2), [("pos", "f4", 3), ("color", "f4", 4)])
+ edges["pos"][:, 0] = elem.co
+ edges["pos"][:, 1] = [e.other_vert(elem).co for e in elem.link_edges]
+ edges["color"][:, 0] = color
+ edges["color"][:, 1] = (color[0], color[1], color[2], 0.0)
+ edges.shape = -1
+
+ self._program_smooth_col.bind()
+ gpu.state.line_width_set(3.0)
+ batch = self.batch_lines_smooth_color_create(edges["pos"], edges["color"])
+ batch.draw(self._program_smooth_col)
+ gpu.state.line_width_set(1.0)
+ else:
+ if isinstance(elem, BMEdge):
self._program_unif_col.bind()
+ self._program_unif_col.uniform_float("color", self.edge_color)
- if isinstance(elem, BMEdge):
+ gpu.state.line_width_set(3.0)
+ batch = self.batch_line_strip_create([v.co for v in elem.verts])
+ batch.draw(self._program_unif_col)
+ gpu.state.line_width_set(1.0)
+
+ elif isinstance(elem, BMFace):
+ if len(snap_obj.data) == 2:
+ face_color = self.face_color[0], self.face_color[1], self.face_color[2], self.face_color[3] * 0.2
self._program_unif_col.bind()
- self._program_unif_col.uniform_float("color", self.edge_color)
+ self._program_unif_col.uniform_float("color", face_color)
- gpu.state.line_width_set(3.0)
- batch = self.batch_line_strip_create([v.co for v in elem.verts])
+ tris = snap_obj.data[1].get_loop_tri_co_by_bmface(bm, elem)
+ tris.shape = (-1, 3)
+ batch = self.batch_triangles_create(tris)
batch.draw(self._program_unif_col)
- gpu.state.line_width_set(1.0)
-
- elif isinstance(elem, BMFace):
- if len(snap_obj.data) == 2:
- face_color = self.face_color[0], self.face_color[1], self.face_color[2], self.face_color[3] * 0.2
- self._program_unif_col.bind()
- self._program_unif_col.uniform_float("color", face_color)
-
- tris = snap_obj.data[1].get_loop_tri_co_by_bmface(bm, elem)
- tris.shape = (-1, 3)
- batch = self.batch_triangles_create(tris)
- batch.draw(self._program_unif_col)
- # restore opengl defaults
- gpu.state.depth_test_set('LESS_EQUAL')
+ # restore opengl defaults
+ gpu.state.depth_test_set('LESS_EQUAL')
self._gl_state_restore()
diff --git a/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py b/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py
index bd324afd..679ee932 100644
--- a/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py
+++ b/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py
@@ -336,6 +336,7 @@ class GPU_Indices_Mesh():
self.shader.bind()
if GPU_Indices_Mesh.use_clip_planes:
+ gpu.state.clip_distances_set(4)
self.shader.uniform_float("ModelMatrix", ob_mat)
if self.draw_tris:
@@ -374,6 +375,9 @@ class GPU_Indices_Mesh():
self.shader.uniform_int("offset", (index_offset,))
self.batch_lverts.draw(self.shader)
+ if GPU_Indices_Mesh.use_clip_planes:
+ gpu.state.clip_distances_set(0)
+
gpu.matrix.pop()
gpu.matrix.pop_projection()
@@ -436,7 +440,7 @@ def gpu_Indices_use_clip_planes(rv3d, value):
if value and rv3d.use_clip_planes:
GPU_Indices_Mesh.use_clip_planes = True
planes = gpu.types.Buffer('FLOAT', (6, 4), rv3d.clip_planes)
- shader.uniform_vector_float(shader.uniform_from_name("clip_plane"), planes, 4, 4)
+ shader.uniform_vector_float(shader.uniform_from_name("WorldClipPlanes"), planes, 4, 4)
else:
GPU_Indices_Mesh.use_clip_planes = False
diff --git a/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_frag.glsl b/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_frag.glsl
index 3e01f7b0..e28368be 100644
--- a/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_frag.glsl
+++ b/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_frag.glsl
@@ -1,24 +1,7 @@
uniform int offset;
-
-#ifdef USE_CLIP_PLANES
-uniform bool use_clip_planes;
-in vec4 clip_distance;
-#endif
-
out uint FragColor;
void main()
{
-#ifdef USE_CLIP_PLANES
- if (use_clip_planes &&
- ((clip_distance[0] < 0) ||
- (clip_distance[1] < 0) ||
- (clip_distance[2] < 0) ||
- (clip_distance[3] < 0)))
- {
- discard;
- }
-#endif
-
FragColor = uint(gl_PrimitiveID + offset);
}
diff --git a/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_vert.glsl b/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_vert.glsl
index 6fb7cbb9..747b33e9 100644
--- a/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_vert.glsl
+++ b/mesh_snap_utilities_line/snap_context_l/shaders/ID_color_vert.glsl
@@ -3,8 +3,7 @@ uniform mat4 ModelViewProjectionMatrix;
#ifdef USE_CLIP_PLANES
uniform mat4 ModelMatrix;
uniform bool use_clip_planes;
-uniform vec4 clip_plane[4];
-out vec4 clip_distance;
+uniform vec4 WorldClipPlanes[4];
#endif
in vec3 pos;
@@ -15,9 +14,10 @@ void main()
if (use_clip_planes) {
vec4 g_pos = ModelMatrix * vec4(pos, 1.0);
- for (int i = 0; i != 4; i++) {
- clip_distance[i] = dot(clip_plane[i], g_pos);
- }
+ gl_ClipDistance[0] = dot(WorldClipPlanes[0], g_pos);
+ gl_ClipDistance[1] = dot(WorldClipPlanes[1], g_pos);
+ gl_ClipDistance[2] = dot(WorldClipPlanes[2], g_pos);
+ gl_ClipDistance[3] = dot(WorldClipPlanes[3], g_pos);
}
#endif