diff --git a/CHANGELOG.md b/CHANGELOG.md index 40f0023..f1d5509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +3.0.0 + +- Update for Blender 4.0 (Breaking release, removed bgl to use gpu) +- fixed: openGL draw camera frame and passepartout + 2.5.0 - added: Animation manager new button `Frame Select Step` (sort of a checker deselect, but in GP dopesheet) diff --git a/OP_eraser_brush.py b/OP_eraser_brush.py index 3eccabf..b826d9c 100644 --- a/OP_eraser_brush.py +++ b/OP_eraser_brush.py @@ -1,6 +1,5 @@ import bpy from bpy.types import Operator -import bgl from gpu_extras.presets import draw_circle_2d from gpu_extras.batch import batch_for_shader import gpu @@ -190,7 +189,7 @@ class GPTB_OT_eraser(Operator): bl_options = {'REGISTER', 'UNDO'} def draw_callback_px(self): - bgl.glEnable(bgl.GL_BLEND) + gpu.state.blend_set('ALPHA') #bgl.glBlendFunc(bgl.GL_CONSTANT_ALPHA, bgl.GL_ONE_MINUS_CONSTANT_ALPHA) #bgl.glBlendColor(1.0, 1.0, 1.0, 0.1) @@ -201,7 +200,7 @@ class GPTB_OT_eraser(Operator): bg_color = area.spaces.active.shading.background_color #print(bg_color) - shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR') + shader = gpu.shader.from_builtin('POLYLINE_UNIFORM_COLOR') shader.bind() shader.uniform_float("color", (1, 1, 1, 1)) for mouse, radius in self.mouse_path: @@ -210,7 +209,7 @@ class GPTB_OT_eraser(Operator): batch.draw(shader) draw_circle_2d(self.mouse, (0.75, 0.25, 0.35, 1.0), self.radius, 24) - bgl.glDisable(bgl.GL_BLEND) + gpu.state.blend_set('NONE') diff --git a/__init__.py b/__init__.py index 805f01a..97268fa 100755 --- a/__init__.py +++ b/__init__.py @@ -4,8 +4,8 @@ bl_info = { "name": "GP toolbox", "description": "Tool set for Grease Pencil in animation production", "author": "Samuel Bernou, Christophe Seux", -"version": (2, 5, 0), -"blender": (3, 0, 0), +"version": (3, 0, 0), +"blender": (4, 0, 0), "location": "Sidebar (N menu) > Gpencil > Toolbox / Gpencil properties", "warning": "", "doc_url": "https://gitlab.com/autour-de-minuit/blender/gp_toolbox", diff --git a/functions.py b/functions.py index d3c06af..15690ec 100644 --- a/functions.py +++ b/functions.py @@ -165,7 +165,6 @@ def randomise_points(mat, points, attr, strength) : setattr(point,attr,value+random*strength) - def zoom_to_object(cam, resolution, box, margin=0.01) : min_x= box[0] max_x= box[1] @@ -216,25 +215,6 @@ def zoom_to_object(cam, resolution, box, margin=0.01) : #print(matrix,resolution) return modelview_matrix,projection_matrix,frame,resolution - - -def set_viewport_matrix(width, height, mat): - from bgl import glViewport,glMatrixMode,GL_PROJECTION,glLoadMatrixf,Buffer,GL_FLOAT,glMatrixMode,GL_MODELVIEW,glLoadIdentity - - glViewport(0,0,width,height) - - #glLoadIdentity() - - glMatrixMode(GL_PROJECTION) - - projection = [mat[j][i] for i in range(4) for j in range(4)] - glLoadMatrixf(Buffer(GL_FLOAT, 16, projection)) - - #glMatrixMode( GL_MODELVIEW ) - #glLoadIdentity() - - - # get object info def get_object_info(mesh_groups, order_list = []) : scene = bpy.context.scene diff --git a/handler_draw_cam.py b/handler_draw_cam.py index ef4fffc..43571f1 100644 --- a/handler_draw_cam.py +++ b/handler_draw_cam.py @@ -1,6 +1,5 @@ import bpy import gpu -import bgl # import blf from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d @@ -30,6 +29,20 @@ def view3d_camera_border_2d(context, cam): frame_px = [location_3d_to_region_2d(region, rv3d, v) for v in frame] return frame_px +def vertices_to_line_loop(v_list, closed=True) -> list: + '''Take a sequence of vertices + return a position lists of segments to create a line loop passing in all points + the result is usable with gpu_shader 'LINES' + ex: vlist = [a,b,c] -> closed=True return [a,b,b,c,c,a], closed=False return [a,b,b,c] + ''' + loop = [] + for i in range(len(v_list) - 1): + loop += [v_list[i], v_list[i + 1]] + if closed: + # Add segment between last and first to close loop + loop += [v_list[-1], v_list[0]] + return loop + def draw_cam_frame_callback_2d(): context = bpy.context if context.region_data.view_perspective != 'CAMERA': @@ -41,11 +54,12 @@ def draw_cam_frame_callback_2d(): if not main_cam: return - bgl.glEnable(bgl.GL_BLEND) + gpu.state.blend_set('ALPHA') frame_point = view3d_camera_border_2d( context, context.scene.camera.parent) - shader_2d = gpu.shader.from_builtin('2D_UNIFORM_COLOR') + shader_2d = gpu.shader.from_builtin('UNIFORM_COLOR') # POLYLINE_FLAT_COLOR + # gpu.shader.from_builtin('2D_UNIFORM_COLOR') if context.scene.gptoolprops.drawcam_passepartout: ### PASSEPARTOUT @@ -109,8 +123,8 @@ def draw_cam_frame_callback_2d(): ### Camera framing trace over - bgl.glLineWidth(1) - bgl.glEnable(bgl.GL_LINE_SMOOTH) + gpu.state.line_width_set(1.0) + # bgl.glEnable(bgl.GL_LINE_SMOOTH) # old smooth """ ## need to accurately detect viewport background color (difficult) @@ -135,15 +149,14 @@ def draw_cam_frame_callback_2d(): frame_color = (0.0, 0.0, 0.25, 1.0) screen_framing = batch_for_shader( - shader_2d, 'LINE_LOOP', {"pos": frame_point}) + shader_2d, 'LINES', {"pos": vertices_to_line_loop(frame_point)}) shader_2d.bind() shader_2d.uniform_float("color", frame_color) screen_framing.draw(shader_2d) - # bgl.glLineWidth(1) - bgl.glDisable(bgl.GL_LINE_SMOOTH) - bgl.glDisable(bgl.GL_BLEND) + # bgl.glDisable(bgl.GL_LINE_SMOOTH) # old smooth + gpu.state.blend_set('NONE') draw_handle = None