Untitled

 avatar
unknown
plain_text
3 years ago
1.8 kB
4
Indexable
import bpy
import gpu

def draw(self, context):
    if not self.modal_redraw:
        return

    self.framebuffer = gpu.state.active_framebuffer_get()

    self.viewport_info = gpu.state.viewport_get()
    self.width = self.viewport_info[2]
    self.height = self.viewport_info[3]

    self.framebuffer_image.scale(self.width, self.height)
    
    self.pixelBuffer = self.framebuffer.read_color(0, 0, self.width, self.height, 4, 0, 'FLOAT')
    
    self.pixelBuffer.dimensions = self.width * self.height * 4
    self.framebuffer_image.pixels.foreach_set(self.pixelBuffer)

    self.modal_redraw = False

class ModalFramebufferCopy(bpy.types.Operator):
    bl_idname = "view3d.modal_framebuffer_copy"
    bl_label = "Draw 3D View Framebuffer"

    def __init__(self):
        print("Start example code")

        self.modal_redraw = False
        self.framebuffer = None

        if not "color_buffer_copy" in bpy.data.images:
            self.framebuffer_image = bpy.data.images.new("color_buffer_copy" , 32, 32, float_buffer=True)
        else:
            self.framebuffer_image = bpy.data.images["color_buffer_copy"]

    def modal(self, context, event):
        if event.type in {'ESC'}:
            bpy.types.SpaceView3D.draw_handler_remove(self._handle_3d, 'WINDOW')
            return {'CANCELLED'}
        
        self.modal_redraw = True

        return {'PASS_THROUGH'}

    def invoke(self, context, event):
        self._handle_3d = bpy.types.SpaceView3D.draw_handler_add(draw, (self, context), 'WINDOW', 'PRE_VIEW')

        context.window_manager.modal_handler_add(self)
        return {'RUNNING_MODAL'}

def register():
    bpy.utils.register_class(ModalFramebufferCopy)


if __name__ == "__main__":
    register()
    
    bpy.ops.view3d.modal_framebuffer_copy('INVOKE_DEFAULT')
Editor is loading...