Untitled

mail@pastecode.io avatar
unknown
python
2 years ago
2.3 kB
17
Indexable
import bpy
import gpu,threading

def draw(self):
    if self.modal_redraw == True:
        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):
        self.modal_redraw = False
        self.framebuffer = None
 
        if not "buffer_img" in bpy.data.images:
            self.framebuffer_image = bpy.data.images.new("buffer_img", 32, 32, float_buffer=True)
        else:
            self.framebuffer_image = bpy.data.images["buffer_img"]

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

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

        context.window_manager.modal_handler_add(self)
        return {'RUNNING_MODAL'}
    
    
def register():
    bpy.utils.register_class(ModalFramebufferCopy) # the main Error seems to be occuring here


def invoke_draw(override_context,override_area): # if I don't pass them as arguments it says AttributeError: 'NoneType' object has no attribute 'areas'
    
    for area in override_area:
        if area.type == 'VIEW_3D':
            override = override_context.copy()
            override['area'] = area
            bpy.ops.view3d.modal_framebuffer_copy(override,'INVOKE_DEFAULT')
            break

if __name__ == "__main__":
    register()

    server_thread=threading.Thread(target=invoke_draw, args=(bpy.context,bpy.context.screen.areas)) # the Error seems to start from here
    server_thread.start()