Example #1
0
    def __init__(self):

        Texture.__init__(self, gl.GL_TEXTURE_CUBE_MAP)
        if self.shape[0] != 6:
            error = "Texture cube require arrays first dimension to be 6"
            log.error(error)
            raise RuntimeError(error)

        self.shape = [6] + list(self._check_shape(self.shape[1:], 2))
        self._cpu_format = Texture._cpu_formats[self.shape[-1]]
        self._gpu_format = Texture._gpu_formats[self.shape[-1]]
Example #2
0
    def __init__(self):

        Texture.__init__(self, gl.GL_TEXTURE_CUBE_MAP)
        if self.shape[0] != 6:
            error = "Texture cube require arrays first dimension to be 6"
            log.error(error)
            raise RuntimeError(error)

        self.shape = [6] + list(self._check_shape(self.shape[1:], 2))
        self._cpu_format = Texture._cpu_formats[self.shape[-1]]
        self._gpu_format = Texture._gpu_formats[self.shape[-1]]
Example #3
0
    def __init__(self, vertex=None, fragment=None, geometry=None, count=0):
        """
        Initialize the program and optionnaly buffer.
        """

        GLObject.__init__(self)
        self._count = count
        self._buffer = None
        self._vertex =  None
        self._fragment = None
        self._geometry = None
        
        if vertex is not None:
            if isinstance(vertex, str):
                if not '{' in vertex:
                    vertex = library.get(vertex)
                self._vertex = VertexShader(vertex)
            elif isinstance(vertex,VertexShader):
                self._vertex = vertex
            else:
                log.error("vertex must be a string or a VertexShader")

        if fragment is not None:
            if isinstance(fragment, str):
                if not '{' in fragment:
                    fragment = library.get(fragment)
                self._fragment = FragmentShader(fragment)
            elif isinstance(fragment, FragmentShader):
                self._fragment = fragment
            else:
                log.error("fragment must be a string or a FragmentShader")

        if geometry is not None:
            if isinstance(geometry, str):
                if not '{' in geometry:
                    geometry = library.get(geometry)
                self._geometry = GeometryShader(geometry)
            elif isinstance(geometry, GeometryShader):
                self._geometry = geometry
            else:
                log.error("geometry must be a string or a GeometryShader")
                

        self._uniforms = {}
        self._attributes = {}

        # Build hooks, uniforms and attributes
        self._build_hooks()
        self._build_uniforms()
        self._build_attributes()

        # Build associated structured vertex buffer if count is given
        if self._count > 0:
            dtype = []
            for attribute in self._attributes.values():
                dtype.append(attribute.dtype)
            self._buffer = np.zeros(self._count, dtype=dtype).view(VertexBuffer)
            self.bind(self._buffer)
Example #4
0
    def __init__(self, vertex=None, fragment=None, geometry=None, count=0):
        """
        Initialize the program and optionnaly buffer.
        """

        GLObject.__init__(self)
        self._count = count
        self._buffer = None
        self._vertex = None
        self._fragment = None
        self._geometry = None

        if vertex is not None:
            if isinstance(vertex, str):
                if not '{' in vertex:
                    vertex = library.get(vertex)
                self._vertex = VertexShader(vertex)
            elif isinstance(vertex, VertexShader):
                self._vertex = vertex
            else:
                log.error("vertex must be a string or a VertexShader")

        if fragment is not None:
            if isinstance(fragment, str):
                if not '{' in fragment:
                    fragment = library.get(fragment)
                self._fragment = FragmentShader(fragment)
            elif isinstance(fragment, FragmentShader):
                self._fragment = fragment
            else:
                log.error("fragment must be a string or a FragmentShader")

        if geometry is not None:
            if isinstance(geometry, str):
                if not '{' in geometry:
                    geometry = library.get(geometry)
                self._geometry = GeometryShader(geometry)
            elif isinstance(geometry, GeometryShader):
                self._geometry = geometry
            else:
                log.error("geometry must be a string or a GeometryShader")

        self._uniforms = {}
        self._attributes = {}

        # Build hooks, uniforms and attributes
        self._build_hooks()
        self._build_uniforms()
        self._build_attributes()

        # Build associated structured vertex buffer if count is given
        if self._count > 0:
            dtype = []
            for attribute in self._attributes.values():
                dtype.append(attribute.dtype)
            self._buffer = np.zeros(self._count,
                                    dtype=dtype).view(VertexBuffer)
            self.bind(self._buffer)
Example #5
0
    def render(self, draw_data):

        # perf: local for faster access
        io = self.io

        display_width, display_height = io.display_size
        fb_width = int(display_width * io.display_fb_scale[0])
        fb_height = int(display_height * io.display_fb_scale[1])

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

        draw_data.scale_clip_rects(*io.display_fb_scale)

        # backup GL state
        # todo: provide cleaner version of this backup-restore code
        last_program = gl.glGetIntegerv(gl.GL_CURRENT_PROGRAM)
        last_texture = gl.glGetIntegerv(gl.GL_TEXTURE_BINDING_2D)
        last_active_texture = gl.glGetIntegerv(gl.GL_ACTIVE_TEXTURE)
        last_array_buffer = gl.glGetIntegerv(gl.GL_ARRAY_BUFFER_BINDING)
        last_element_array_buffer = gl.glGetIntegerv(
            gl.GL_ELEMENT_ARRAY_BUFFER_BINDING)
        last_vertex_array = gl.glGetIntegerv(gl.GL_VERTEX_ARRAY_BINDING)
        last_blend_src = gl.glGetIntegerv(gl.GL_BLEND_SRC)
        last_blend_dst = gl.glGetIntegerv(gl.GL_BLEND_DST)
        last_blend_equation_rgb = gl.glGetIntegerv(gl.GL_BLEND_EQUATION_RGB)
        last_blend_equation_alpha = gl.glGetIntegerv(
            gl.GL_BLEND_EQUATION_ALPHA)
        last_viewport = gl.glGetIntegerv(gl.GL_VIEWPORT)
        last_scissor_box = gl.glGetIntegerv(gl.GL_SCISSOR_BOX)
        last_enable_blend = gl.glIsEnabled(gl.GL_BLEND)
        last_enable_cull_face = gl.glIsEnabled(gl.GL_CULL_FACE)
        last_enable_depth_test = gl.glIsEnabled(gl.GL_DEPTH_TEST)
        last_enable_scissor_test = gl.glIsEnabled(gl.GL_SCISSOR_TEST)

        gl.glEnable(gl.GL_BLEND)
        gl.glBlendEquation(gl.GL_FUNC_ADD)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
        gl.glDisable(gl.GL_CULL_FACE)
        gl.glDisable(gl.GL_DEPTH_TEST)
        gl.glEnable(gl.GL_SCISSOR_TEST)
        #gl.glActiveTexture(gl.GL_TEXTURE0)

        gl.glViewport(0, 0, int(fb_width), int(fb_height))

        ortho_projection = (ctypes.c_float * 16)(2.0 / display_width, 0.0, 0.0,
                                                 0.0, 0.0,
                                                 2.0 / -display_height, 0.0,
                                                 0.0, 0.0, 0.0, -1.0, 0.0,
                                                 -1.0, 1.0, 0.0, 1.0)

        self.prog["ProjMtx"] = ortho_projection

        for commands in draw_data.commands_lists:

            idx_buffer_offset = 0

            array_type = c_ubyte * commands.vtx_buffer_size * imgui.VERTEX_SIZE
            data_carray = array_type.from_address(commands.vtx_buffer_data)

            if not ( imgui.VERTEX_BUFFER_POS_OFFSET == 0 and \
                     imgui.VERTEX_BUFFER_UV_OFFSET == 8 and \
                     imgui.VERTEX_BUFFER_COL_OFFSET == 16 ):
                log.error(
                    "GlumpyRenderer.render(): imgui vertex buffer layout has changed ! notify the developers ..."
                )

                return

            #TODO: this is a bit convoluted; Imgui delivers uint8 colors, but glumpy wants float32's
            dtype = [('Position', np.float32, 2), ('UV', np.float32, 2),
                     ('Color', np.uint8, 4)]
            vao_content = np.frombuffer(data_carray, dtype=dtype)

            dtype2 = [('Position', np.float32, 2), ('UV', np.float32, 2),
                      ('Color', np.float32, 4)]
            vao_content_f = np.zeros(vao_content.shape, dtype=dtype2)
            for i, val in enumerate(vao_content):
                vao_content_f[i] = vao_content[i]
                vao_content_f[i]['Color'] /= 255

            v_array = vao_content_f.view(gloo.VertexArray)
            self.prog.bind(v_array)

            if imgui.INDEX_SIZE == 1:
                dtype = np.uint8
            if imgui.INDEX_SIZE == 2:
                dtype = np.uint16
            if imgui.INDEX_SIZE == 4:
                dtype = np.uint32

            # gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self._elements_handle)
            # # todo: check this (sizes)
            # gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, commands.idx_buffer_size * imgui.INDEX_SIZE, ctypes.c_void_p(commands.idx_buffer_data), gl.GL_STREAM_DRAW)
            array_type = c_ubyte * commands.idx_buffer_size * imgui.INDEX_SIZE
            data_carray = array_type.from_address(commands.idx_buffer_data)
            idx_content = np.frombuffer(data_carray, dtype=dtype)

            for command in commands.commands:

                # TODO: ImGui Images will not work yet, homogenizing texture id
                # allocation by imgui/glumpy is likely a larger issue
                #
                #accessing command.texture_id crashes the prog
                #
                #gl.glBindTexture(gl.GL_TEXTURE_2D, command.texture_id )

                x, y, z, w = command.clip_rect
                gl.glScissor(int(x), int(fb_height - w), int(z - x),
                             int(w - y))

                idx_array = idx_content[idx_buffer_offset:(
                    idx_buffer_offset + command.elem_count)].view(
                        gloo.IndexBuffer)
                self.prog.draw(mode=gl.GL_TRIANGLES, indices=idx_array)

                idx_buffer_offset += command.elem_count

        # restore modified GL state
        gl.glUseProgram(last_program)
        gl.glActiveTexture(last_active_texture)
        gl.glBindTexture(gl.GL_TEXTURE_2D, last_texture)
        gl.glBindVertexArray(last_vertex_array)
        gl.glBindBuffer(gl.GL_ARRAY_BUFFER, last_array_buffer)
        gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer)
        gl.glBlendEquationSeparate(last_blend_equation_rgb,
                                   last_blend_equation_alpha)
        gl.glBlendFunc(last_blend_src, last_blend_dst)

        if last_enable_blend:
            gl.glEnable(gl.GL_BLEND)
        else:
            gl.glDisable(gl.GL_BLEND)

        if last_enable_cull_face:
            gl.glEnable(gl.GL_CULL_FACE)
        else:
            gl.glDisable(gl.GL_CULL_FACE)

        if last_enable_depth_test:
            gl.glEnable(gl.GL_DEPTH_TEST)
        else:
            gl.glDisable(gl.GL_DEPTH_TEST)

        if last_enable_scissor_test:
            gl.glEnable(gl.GL_SCISSOR_TEST)
        else:
            gl.glDisable(gl.GL_SCISSOR_TEST)

        gl.glViewport(last_viewport[0], last_viewport[1], last_viewport[2],
                      last_viewport[3])
        gl.glScissor(last_scissor_box[0], last_scissor_box[1],
                     last_scissor_box[2], last_scissor_box[3])

        log.debug("----------------------end---------------------------------")