Files
test2/scripts/templates_py/operator_modal_draw.py
Jeroen Bakker e83cce910d Fix #144700: Incorrect operator model draw example
The example script for the Model Draw Operator was out of date. It
didn't used the polyline shader. This PR updates the example to use the
polyline shader.

Pull Request: https://projects.blender.org/blender/blender/pulls/144722
2025-08-19 07:42:44 +02:00

84 lines
2.6 KiB
Python

import bpy
import blf
import gpu
from gpu_extras.batch import batch_for_shader
def draw_callback_px(self, context):
print("mouse points", len(self.mouse_path))
font_id = 0 # XXX, need to find out how best to get this.
# draw some text
blf.position(font_id, 15, 30, 0)
blf.size(font_id, 20.0)
blf.draw(font_id, "Hello Word " + str(len(self.mouse_path)))
# 50% alpha, 2 pixel width line
gpu.state.blend_set('ALPHA')
shader = gpu.shader.from_builtin('POLYLINE_UNIFORM_COLOR')
shader.uniform_float("color", (0.0, 0.0, 0.0, 0.5))
shader.uniform_float("viewportSize", (context.area.width, context.area.height))
shader.uniform_float('lineWidth', 2.0)
batch = batch_for_shader(shader, 'LINE_STRIP', {"pos": self.mouse_path})
batch.draw(shader)
# restore gpu defaults
gpu.state.blend_set('NONE')
class ModalDrawOperator(bpy.types.Operator):
"""Draw a line with the mouse"""
bl_idname = "view3d.modal_draw_operator"
bl_label = "Simple Modal View3D Operator"
def modal(self, context, event):
context.area.tag_redraw()
if event.type == 'MOUSEMOVE':
self.mouse_path.append((event.mouse_region_x, event.mouse_region_y))
elif event.type == 'LEFTMOUSE':
bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}:
bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
return {'CANCELLED'}
return {'RUNNING_MODAL'}
def invoke(self, context, event):
if context.area.type == 'VIEW_3D':
# The arguments we pass the callback.
args = (self, context)
# Add the region OpenGL drawing callback draw in view space with `POST_VIEW` and `PRE_VIEW`.
self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL')
self.mouse_path = []
context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'}
else:
self.report({'WARNING'}, "View3D not found, cannot run operator")
return {'CANCELLED'}
def menu_func(self, context):
self.layout.operator(ModalDrawOperator.bl_idname, text="Modal Draw Operator")
# Register and add to the "view" menu (required to also use F3 search "Modal Draw Operator" for quick access).
def register():
bpy.utils.register_class(ModalDrawOperator)
bpy.types.VIEW3D_MT_view.append(menu_func)
def unregister():
bpy.utils.unregister_class(ModalDrawOperator)
bpy.types.VIEW3D_MT_view.remove(menu_func)
if __name__ == "__main__":
register()