Использование ImmediateGeometry

В отличие от SurfaceTool или ArrayMesh, ImmediateGeometry является фактическим узлом. Наличие узла позволяет быстро добавлять элементы в сцену и получать визуальный результат. Он использует API в стиле OpenGL 1.x, такой как SurfaceTool, но на самом деле он предназначен для создания сеток на лету.

Генерация сложной геометрии (несколько тысяч вершин) с помощью этого узла неэффективна, даже если это делается только один раз. Вместо этого он предназначен для создания простой геометрии, которая меняется в каждом кадре.

Перед началом работы вы должны очистить геометрию, вызвав clear(). Это гарантирует, что вы не опираетесь на геометрию предыдущего кадра. Если вы хотите сохранить геометрию между кадрами, не вызывайте clear().

Чтобы начать генерировать геометрию, вы должны вызвать begin(). begin() принимает PrimitiveType в качестве аргумента. PrimitiveType - это концепция OpenGL, которая инструктирует графический процессор, как расположить примитив на основе заданных вершин, будь то треугольники, линии, точки и т.д. Полный список можно найти на странице ссылок на классы Mesh.

После того, как вы вызвали begin(), вы готовы начать добавлять вершины. Вы добавляете вершины по одной за раз. Сначала вы добавляете атрибуты, специфичные для вершин, такие как нормали или UVS, используя set_****() (например, set_normal()). Затем вы вызываете add_vertex(), чтобы добавить вершину с этими атрибутами. Например:

# Add a vertex with normal and uv.
set_normal(Vector3(0, 1, 0))
set_uv(Vector2(1, 1))
add_vertex(Vector3(0, 0, 1))

В эту вершину будут включены только атрибуты, добавленные до вызова add_vertex().

Наконец, как только вы добавили все свои вершины, вызовите end(), чтобы сигнализировать о том, что вы закончили генерировать сетку.

Приведенный ниже пример кода рисует один треугольник.

extends ImmediateGeometry

func _process(_delta):
    # Clean up before drawing.
    clear()

    # Begin draw.
    begin(Mesh.PRIMITIVE_TRIANGLES)

    # Prepare attributes for add_vertex.
    set_normal(Vector3(0, 0, 1))
    set_uv(Vector2(0, 0))
    # Call last for each vertex, adds the above attributes.
    add_vertex(Vector3(-1, -1, 0))

    set_normal(Vector3(0, 0, 1))
    set_uv(Vector2(0, 1))
    add_vertex(Vector3(-1, 1, 0))

    set_normal(Vector3(0, 0, 1))
    set_uv(Vector2(1, 1))
    add_vertex(Vector3(1, 1, 0))

    # End drawing.
    end()