Esempio n. 1
0
 def useAdditiveBlending(self, enable):
     if enable:
         gloo.set_blend_func('one', 'one')
         gloo.set_blend_equation('func_add')
         gloo.set_state(depth_test=False, blend=True)
     else:
         gloo.set_state(depth_test=True, blend=False)
Esempio n. 2
0
    def on_draw(self, event):
        """ canvas update callback """

        # config
        gloo.clear(color=C0)
        gloo.set_state(preset=None,
                       depth_test=True,
                       blend=True,
                       depth_mask=False)

        # draw framebuffers
        # pass 0
        self.quads['u_pass'] = 0.0
        self.framebuffer.color_buffer = self.accum
        self.framebuffer.activate()
        gloo.clear(color=(0, 0, 0, 0))
        gloo.set_blend_func('one', 'one')
        self.quads.draw('triangles', self.indices)
        self.framebuffer.deactivate()

        # pass 1
        self.quads['u_pass'] = 1.0
        self.framebuffer.color_buffer = self.reveal
        self.framebuffer.activate()
        gloo.clear(color=(1, 1, 1, 1))
        gloo.set_blend_func('zero', 'one_minus_src_color')
        self.quads.draw('triangles', self.indices)
        self.framebuffer.deactivate()

        # render
        gloo.set_blend_func('src_alpha', 'one_minus_src_alpha')
        self.post.draw('triangles', self.indices)
Esempio n. 3
0
    def __init__(self, mesh, vertexShader, fragShader):
        app.Canvas.__init__(self, keys='interactive', size=(1600, 900))
        self.mesh = mesh
        self.data = mesh.buildBuffer()

        self.program = gloo.Program(vertexShader, fragShader)

        self.model = np.eye(4, dtype=np.float32)
        self.projection = perspective(45.0, self.size[0] / float(self.size[1]),
                                      1.0, 1000.0)

        gloo.set_viewport(0, 0, self.size[0], self.size[1])

        self.camera = camera.Camera(np.array([0, 0, -5], dtype=np.float32),
                                    np.array([0, 0, 0], dtype=np.float32),
                                    45.0, self.size)

        self.view = self.camera.view

        self.program.bind(gloo.VertexBuffer(mesh.buildBuffer()))
        self.program['u_model'] = self.model
        self.program['u_view'] = self.view
        self.program['u_projection'] = self.projection

        self.program['u_lightPos'] = np.array([20, 20, -20], dtype=np.float32)
        self.program['u_lightColor'] = np.array([1, 1, 1], dtype=np.float32)

        gloo.set_depth_mask(True)
        gloo.set_blend_func('src_alpha', 'one_minus_src_alpha')
        gloo.set_blend_equation('func_add')
        gloo.set_cull_face('back')
        gloo.set_front_face('cw')

        gloo.set_state(blend=True, depth_test=True, polygon_offset_fill=True)

        self.show()

        self.theta = 0
        self.phi = 0
Esempio n. 4
0
	def __init__(self, mesh, vertexShader, fragShader):
		app.Canvas.__init__(self, keys='interactive', size=(1600,900))
		self.mesh = mesh
		self.data = mesh.buildBuffer()

		self.program = gloo.Program(vertexShader, fragShader)

		self.model = np.eye(4, dtype=np.float32)
		self.projection = perspective(45.0, self.size[0] /
                                      float(self.size[1]), 1.0, 1000.0)

		gloo.set_viewport(0, 0, self.size[0], self.size[1])

		self.camera = camera.Camera(np.array([0,0,-5], dtype = np.float32), np.array([0,0,0], dtype = np.float32), 45.0, self.size)

		self.view = self.camera.view

		self.program.bind(gloo.VertexBuffer(mesh.buildBuffer()))
		self.program['u_model'] = self.model
		self.program['u_view'] = self.view
		self.program['u_projection'] = self.projection

		self.program['u_lightPos'] = np.array([20, 20, -20], dtype = np.float32);
		self.program['u_lightColor'] = np.array([1, 1, 1], dtype = np.float32);

		gloo.set_depth_mask(True)
		gloo.set_blend_func('src_alpha', 'one_minus_src_alpha') 
		gloo.set_blend_equation('func_add')
		gloo.set_cull_face('back')
		gloo.set_front_face('cw')

		gloo.set_state(blend=True, depth_test=True, polygon_offset_fill=True)

		self.show()

		self.theta = 0
		self.phi = 0
Esempio n. 5
0
    def on_draw(self, *args, **kwargs):
        self.set_current()

        clear_color = (1, 1, 1, 1)
        gloo.set_depth_func('lequal')

        if 'additive_rendering' in self._scene.enabled_features:
            config = self._scene.get_feature_config('additive_rendering')

            if config.get('invert', False):
                clear_color = (1, 1, 1, 1)
                gloo.set_state(preset='additive',
                               depth_test=False,
                               blend=True,
                               depth_mask=False)
                gloo.set_blend_func('one', 'one', 'zero', 'one')
                gloo.set_blend_equation('func_reverse_subtract')
            else:
                clear_color = (0, 0, 0, 1)
                gloo.set_state(preset='additive',
                               depth_test=False,
                               blend=True,
                               depth_mask=False)
                gloo.set_blend_func('one', 'one')
                gloo.set_blend_equation('func_add')
        else:
            gloo.set_state(preset='opaque',
                           depth_test=True,
                           blend=True,
                           depth_mask=True)
            gloo.set_blend_func('src_alpha', 'one_minus_src_alpha')
        gloo.clear(color=clear_color, depth=True)

        if 'translucency' in self._scene.enabled_features:
            with self._fbos['translucency_opaque']:
                gloo.clear(color=clear_color)
                for prim in self._scene._primitives:
                    prim.render_translucency(pass_=-1)

            with self._fbos['translucency_accum']:
                gloo.clear(color=(0, 0, 0, 0), depth=False)
                gloo.set_state(preset=None,
                                   depth_test=True,
                                   blend=True,
                                   depth_mask=False)
                gloo.set_blend_func('one', 'one')

                # Pass 1
                for prim in self._scene._primitives:
                    prim.render_translucency(pass_=1)

            with self._fbos['translucency_reveal']:
                gloo.clear(color=(1, 1, 1, 1), depth=False)
                gloo.set_blend_func('zero', 'one_minus_src_alpha')

                # Pass 2
                for prim in self._scene._primitives:
                    prim.render_translucency(pass_=2)

            # Final compositing
            gloo.set_state(preset='opaque',
                               depth_test=False,
                               blend=False,
                               depth_mask=False)
            with self._final_render_target:
                self._programs['translucency_post'].draw('triangle_strip')
        elif 'outlines' in self._scene.enabled_features:
            gloo.set_state(preset='opaque',
                           depth_test=True,
                           blend=False,
                           depth_mask=True)
            with self._fbos['outlines_color']:
                gloo.clear(color=True, depth=True)
                for prim in self._scene._primitives:
                    prim.render_color()

            with self._fbos['outlines_plane']:
                gloo.clear(color=True, depth=True)
                for prim in self._scene._primitives:
                    prim.render_planes()

            with self._final_render_target:
                gloo.clear(color=True, depth=True)
                self._programs['outlines_post']['camera'] = prim.camera
                self._programs['outlines_post'].draw('triangle_strip')
        elif 'render_normals' in self._scene.enabled_features:
            with self._final_render_target:
                gloo.clear(color=True, depth=True)
                for prim in self._scene._primitives:
                    prim.render_normals()
        else:
            with self._final_render_target:
                gloo.clear(color=clear_color, depth=True)
                for prim in self._scene._primitives:
                    prim.render_color()

        if 'ssao' in self._scene.enabled_features:
            with self._fbos['ssao_plane']:
                gloo.set_state(preset='opaque',
                                   depth_test=True,
                                   blend=False,
                                   depth_mask=True)
                gloo.clear(color=True, depth=True)
                for prim in self._scene._primitives:
                    prim.render_positions()

            gloo.set_state(preset='opaque',
                               depth_test=False,
                               blend=False,
                               depth_mask=False)
            if 'fxaa' in self._scene.enabled_features:
                with self._fbos['fxaa_target']:
                    self._programs['ssao_post'].draw('triangle_strip')
            else:
                self._programs['ssao_post'].draw('triangle_strip')

        if 'fxaa' in self._scene.enabled_features:
            gloo.set_state(preset='opaque',
                               depth_test=False,
                               blend=False,
                               depth_mask=False)
            self._programs['fxaa_post'].draw('triangle_strip')
Esempio n. 6
0
def render_with_gloo(draw_data):
    """draw ImGui's drawlists with vispy's gloo interface

    Parameters
    ----------
    draw_data: ImDrawData

    """
    global device_objects

    # adapted from imgui_impl_ios.cpp in imgui, to target the minimal GLES API
    d = pymgui.ImDrawData(draw_data)
    io = pymgui.get_io()

    fb_scale = io.display_framebuffer_scale
    fb_width, fb_height = io.display_size

    if fb_width == 0 or fb_height == 0:
        return

    conf = gloo.get_gl_configuration()

    # backup GL state
    last_program = gl.glGetParameter(gl.GL_CURRENT_PROGRAM)
    last_texture = gl.glGetParameter(gl.GL_TEXTURE_BINDING_2D)
    last_array_buffer = gl.glGetParameter(gl.GL_ARRAY_BUFFER_BINDING)
    last_element_array_buffer = gl.glGetParameter(gl.GL_ELEMENT_ARRAY_BUFFER_BINDING)
    last_viewport = gl.glGetParameter(gl.GL_VIEWPORT)

    last_enable_blend = gl.glIsEnabled(gl.GL_BLEND),
    last_blend_equation = gl.glGetParameter(gl.GL_BLEND_EQUATION_RGB),

    last_blend_func = dict(
        last_blend_equation_alpha=gl.glGetParameter(gl.GL_BLEND_EQUATION_ALPHA),
    )

    last_gl_states = dict(
        cull_face = gl.glIsEnabled(gl.GL_CULL_FACE),
        depth_test = gl.glIsEnabled(gl.GL_DEPTH_TEST),
        scissor_test = gl.glIsEnabled(gl.GL_SCISSOR_TEST))

    gloo.set_state(blend=True)
    gloo.set_blend_equation('func_add')
    gloo.set_blend_func(salpha='src_alpha', dalpha='one_minus_src_alpha')
    gloo.set_state(cull_face=False, depth_test=False, scissor_test=True)

    gl.glActiveTexture(gl.GL_TEXTURE0)

    # Setup viewport, orthographic projection matrix
    gloo.set_viewport(0, 0, int(fb_width), int(fb_height))

    p = device_objects['program'] # type: gloo.Program

    ortho_projection = np.array([
        [2./fb_width,   0,                  0,      0],
        [0.,             2./-fb_height,     0,      0],
        [0.,             0.,                -1.,    0],
        [-1.,            1.,                0,      0]
    ])

    vtype = [('a_position', np.float32, 2),
             ('a_uv', np.float32, 2),
             # ('a_color', np.uint8, 4)]
             ('a_color', np.uint32, 1)]

             # pos_dtype = [('a_position', np.float32, 2)]
    # uv_dtype =  [('a_uv', np.float32, 2)]
    # color_dtype = [('a_color', np.uint8, 4)]
    itype = np.uint16

    display_scale = 1.0

    p['u_mvp'] = ortho_projection


    # print("draw {} cmd_list".format(len(d.cmd_lists)))
    for cmd_list in d.cmd_lists:
        vertex_count =C.ImDrawList_GetVertexBufferSize(cmd_list)
        index_count = C.ImDrawList_GetIndexBufferSize(cmd_list)

        vertex_buffer_ptr = C.ImDrawList_GetVertexPtr(cmd_list, 0)
        index_buffer_ptr = C.ImDrawList_GetIndexPtr(cmd_list, 0)

        def to_nparray(ptr, item_count, dtype):
            byte_count = item_count * dtype.itemsize
            as_bytes = ffi.buffer(ptr, byte_count)
            return np.frombuffer(as_bytes, dtype=dtype)

        ig_vertices = to_nparray(vertex_buffer_ptr, vertex_count, np.dtype(vtype))
        ig_indices = to_nparray(index_buffer_ptr, index_count, np.dtype(itype))
        # print("{} vertices to draw".format(len(ig_vertices)))
    #
        p['a_position'] = ig_vertices[:]
        # p['a_uv'] = ig_vertices['a_uv']
        # p['a_color'] = ig_vertices['a_color']
        # device_objects['geometry'] = ig_vertices
    #
    #     gl.glBufferData(gl.GL_ARRAY_BUFFER, ig_vertices, gl.GL_STREAM_DRAW)
    #     gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, indices, gl.GL_STREAM_DRAW)
    #
    #     index_buffer_offset = 0
    #     cmd_size = C.ImDrawList_GetCmdSize(cmd_list)
    #     for cmd_index in range(cmd_size):
    #         draw_cmd_ptr = C.ImDrawList_GetCmdPtr(cmd_list, cmd_index)
    #         draw_cmd = pymgui.ImDrawCmd(draw_cmd_ptr)
    #
    #         if draw_cmd.texture_id:
    #             gl.glBindTexture(gl.GL_TEXTURE_2D, draw_cmd.texture_id)
    #         x1, y1, x2, y2 = draw_cmd.clip_rect
    #
    #         gl.glScissor(
    #             x=int(x1 * display_scale),
    #             y=int(y1 * display_scale),
    #             width=int((x2 - x1) * display_scale),
    #             height=int((y2 - y1) * display_scale)
    #         )
    #
    #         start, stop = index_buffer_offset, draw_cmd.elem_count
    #         # gl.glDrawElements(gl.GL_TRIANGLES, draw_cmd.elem_count, gl.GL_UNSIGNED_SHORT, indices[index_buffer_offset:])
    #         p.draw('triangles', gloo.IndexBuffer(ig_indices[start:stop]))
    #         index_buffer_offset += draw_cmd.elem_count
    #
    # # Restore modified state
    gloo.set_state(**last_gl_states)
    gloo.set_state(blend=last_enable_blend)
    # gloo.set_blend_equation(last_blend_equation)
    # # gl.glBindVertexArray(0)
    # gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
    gl.glUseProgram(last_program)
               [0, 0, 0, 0, 0]],
              [[0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0]]])

# Create a canvas with a 3D viewport
canvas = scene.SceneCanvas(keys='interactive', bgcolor=(1, 1, 1))
view = canvas.central_widget.add_view()

## Define a scalar field from which we will generate an isosurface

print("Generating scalar field..")

gloo.set_blend_func('src_alpha', 'one_minus_src_alpha')

surface1 = scene.visuals.Isosurface(c2, level=c.max() / 4., color=(0.5, 0.5, 1),
                                    shading='smooth',
                                    parent=view.scene)
surface1.transform = scene.transforms.STTransform(translate=(-2, -2, -2))


surface2 = scene.visuals.Mesh(None, mode='lines')

# Add a 3D axis to keep us oriented
axis = scene.visuals.XYZAxis(parent=view.scene)

# Use a 3D camera
# Manual bounds; Mesh visual does not provide bounds yet
# Note how you can set bounds before assigning the camera to the viewbox
Esempio n. 8
0
def render_with_gloo(draw_data):
    """draw ImGui's drawlists with vispy's gloo interface

    Parameters
    ----------
    draw_data: ImDrawData

    """
    global device_objects

    # adapted from imgui_impl_ios.cpp in imgui, to target the minimal GLES API
    d = pymgui.ImDrawData(draw_data)
    io = pymgui.get_io()

    fb_scale = io.display_framebuffer_scale
    fb_width, fb_height = io.display_size

    if fb_width == 0 or fb_height == 0:
        return

    conf = gloo.get_gl_configuration()

    # backup GL state
    last_program = gl.glGetParameter(gl.GL_CURRENT_PROGRAM)
    last_texture = gl.glGetParameter(gl.GL_TEXTURE_BINDING_2D)
    last_array_buffer = gl.glGetParameter(gl.GL_ARRAY_BUFFER_BINDING)
    last_element_array_buffer = gl.glGetParameter(
        gl.GL_ELEMENT_ARRAY_BUFFER_BINDING)
    last_viewport = gl.glGetParameter(gl.GL_VIEWPORT)

    last_enable_blend = gl.glIsEnabled(gl.GL_BLEND),
    last_blend_equation = gl.glGetParameter(gl.GL_BLEND_EQUATION_RGB),

    last_blend_func = dict(last_blend_equation_alpha=gl.glGetParameter(
        gl.GL_BLEND_EQUATION_ALPHA), )

    last_gl_states = dict(cull_face=gl.glIsEnabled(gl.GL_CULL_FACE),
                          depth_test=gl.glIsEnabled(gl.GL_DEPTH_TEST),
                          scissor_test=gl.glIsEnabled(gl.GL_SCISSOR_TEST))

    gloo.set_state(blend=True)
    gloo.set_blend_equation('func_add')
    gloo.set_blend_func(salpha='src_alpha', dalpha='one_minus_src_alpha')
    gloo.set_state(cull_face=False, depth_test=False, scissor_test=True)

    gl.glActiveTexture(gl.GL_TEXTURE0)

    # Setup viewport, orthographic projection matrix
    gloo.set_viewport(0, 0, int(fb_width), int(fb_height))

    p = device_objects['program']  # type: gloo.Program

    ortho_projection = np.array([[2. / fb_width, 0, 0, 0],
                                 [0., 2. / -fb_height, 0, 0], [0., 0., -1., 0],
                                 [-1., 1., 0, 0]])

    vtype = [
        ('a_position', np.float32, 2),
        ('a_uv', np.float32, 2),
        # ('a_color', np.uint8, 4)]
        ('a_color', np.uint32, 1)
    ]

    # pos_dtype = [('a_position', np.float32, 2)]
    # uv_dtype =  [('a_uv', np.float32, 2)]
    # color_dtype = [('a_color', np.uint8, 4)]
    itype = np.uint16

    display_scale = 1.0

    p['u_mvp'] = ortho_projection

    # print("draw {} cmd_list".format(len(d.cmd_lists)))
    for cmd_list in d.cmd_lists:
        vertex_count = C.ImDrawList_GetVertexBufferSize(cmd_list)
        index_count = C.ImDrawList_GetIndexBufferSize(cmd_list)

        vertex_buffer_ptr = C.ImDrawList_GetVertexPtr(cmd_list, 0)
        index_buffer_ptr = C.ImDrawList_GetIndexPtr(cmd_list, 0)

        def to_nparray(ptr, item_count, dtype):
            byte_count = item_count * dtype.itemsize
            as_bytes = ffi.buffer(ptr, byte_count)
            return np.frombuffer(as_bytes, dtype=dtype)

        ig_vertices = to_nparray(vertex_buffer_ptr, vertex_count,
                                 np.dtype(vtype))
        ig_indices = to_nparray(index_buffer_ptr, index_count, np.dtype(itype))
        # print("{} vertices to draw".format(len(ig_vertices)))
        #
        p['a_position'] = ig_vertices[:]
        # p['a_uv'] = ig_vertices['a_uv']
        # p['a_color'] = ig_vertices['a_color']
        # device_objects['geometry'] = ig_vertices
    #
    #     gl.glBufferData(gl.GL_ARRAY_BUFFER, ig_vertices, gl.GL_STREAM_DRAW)
    #     gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, indices, gl.GL_STREAM_DRAW)
    #
    #     index_buffer_offset = 0
    #     cmd_size = C.ImDrawList_GetCmdSize(cmd_list)
    #     for cmd_index in range(cmd_size):
    #         draw_cmd_ptr = C.ImDrawList_GetCmdPtr(cmd_list, cmd_index)
    #         draw_cmd = pymgui.ImDrawCmd(draw_cmd_ptr)
    #
    #         if draw_cmd.texture_id:
    #             gl.glBindTexture(gl.GL_TEXTURE_2D, draw_cmd.texture_id)
    #         x1, y1, x2, y2 = draw_cmd.clip_rect
    #
    #         gl.glScissor(
    #             x=int(x1 * display_scale),
    #             y=int(y1 * display_scale),
    #             width=int((x2 - x1) * display_scale),
    #             height=int((y2 - y1) * display_scale)
    #         )
    #
    #         start, stop = index_buffer_offset, draw_cmd.elem_count
    #         # gl.glDrawElements(gl.GL_TRIANGLES, draw_cmd.elem_count, gl.GL_UNSIGNED_SHORT, indices[index_buffer_offset:])
    #         p.draw('triangles', gloo.IndexBuffer(ig_indices[start:stop]))
    #         index_buffer_offset += draw_cmd.elem_count
    #
    # # Restore modified state
    gloo.set_state(**last_gl_states)
    gloo.set_state(blend=last_enable_blend)
    # gloo.set_blend_equation(last_blend_equation)
    # # gl.glBindVertexArray(0)
    # gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
    gl.glUseProgram(last_program)