File: Renderer.py

package info (click to toggle)
uranium 3.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 5,876 kB
  • sloc: python: 22,349; sh: 111; makefile: 11
file content (77 lines) | stat: -rw-r--r-- 2,874 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Copyright (c) 2015 Ultimaker B.V.
# Uranium is released under the terms of the LGPLv3 or higher.
from typing import Optional

from UM.SortedList import SortedListWithKey

MYPY = False
if MYPY:
    from UM.View.RenderPass import RenderPass
    from UM.Scene.SceneNode import SceneNode


##  Abstract base class for different rendering implementations.
#
#   The renderer is used to perform rendering of objects. It abstracts away any
#   details about the underlying graphics API that is used to render. It is designed
#   to perform different stages of rendering, with the application indicating which
#   objects should be rendered but the actual rendering process happening after a
#   sorting step.
class Renderer:
    def __init__(self):
        super().__init__()

        self._render_passes = SortedListWithKey(key = lambda k: k.getPriority())

    ##  Signal the beginning of the rendering process.
    #
    #   This should set up any required state before any actual rendering happens.
    def beginRendering(self):
        raise NotImplementedError()

    ##  Queue a node to be rendered.
    #
    #   \param node The node to queue for rendering.
    #   \param kwargs Keyword arguments.
    #                 Most of these are passed to the RenderBatch constructor directly. See RenderBatch for all available options.
    #                 In addition, the parameter "shader" is available, which determines the shader to render with. When not specified,
    #                 it defaults to a simple vertex color shader.
    def queueNode(self, node: "SceneNode", **kwargs):
        raise NotImplementedError()

    ##  Render everything that was set up to be rendered.
    def render(self):
        raise NotImplementedError()

    ##  Finish rendering, finalize and clear state.
    def endRendering(self):
        raise NotImplementedError()

    ##  Add a render pass that should be rendered.
    #
    #   \param render_pass The render pass to add.
    def addRenderPass(self, render_pass: "RenderPass"):
        self._render_passes.add(render_pass)

    ##  Remove a render pass from the list of render passes to render.
    #
    #   \param render_pass The render pass to remove.
    def removeRenderPass(self, render_pass: "RenderPass"):
        if render_pass in self._render_passes:
            self._render_passes.remove(render_pass)

    ##  Get a render pass by name.
    #
    #   \param name The name of the render pass to get.
    #
    #   \return The named render pass or None if not found.
    def getRenderPass(self, name: str) -> Optional["RenderPass"]:
        for render_pass in self._render_passes:
            if render_pass.getName() == name:
                return render_pass

        return None

    ##  Get the list of all render passes that should be rendered.
    def getRenderPasses(self):
        return self._render_passes