Since rB6269d66da, creating formats no longer depends solely on the shader, but now depends on the dimensions used to fill the VBOs. This allows 3D shaders to work flawlessly when assigned dimensions are 2D. So there's no real benefit to us having shaders that are limited to 2D use anymore. This limitation makes it difficult to implement other builtin shaders as they indirectly require a 2D version. So this commit removes the 2D versions of the builtin sahders used in Python , renames the string enums but keeps the old enums working for backward compatibility. (This brings parts of the changes reviewed in D15836).
86 lines
2.6 KiB
Python
86 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, 72)
|
|
blf.draw(font_id, "Hello Word " + str(len(self.mouse_path)))
|
|
|
|
# 50% alpha, 2 pixel width line
|
|
shader = gpu.shader.from_builtin('UNIFORM_COLOR')
|
|
gpu.state.blend_set('ALPHA')
|
|
gpu.state.line_width_set(2.0)
|
|
batch = batch_for_shader(shader, 'LINE_STRIP', {"pos": self.mouse_path})
|
|
shader.bind()
|
|
shader.uniform_float("color", (0.0, 0.0, 0.0, 0.5))
|
|
batch.draw(shader)
|
|
|
|
# restore opengl defaults
|
|
gpu.state.line_width_set(1.0)
|
|
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 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()
|