Використання ImmediateGeometry

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

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

Перед початком слід очистити геометрію, зателефонувавши clear(). Це гарантує, що ви не будете опиратися на геометрію з попереднього кадру. Якщо ви хочете зберегти геометрію між кадрами, не викликайте clear().

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

Після виклику begin() ви будете готові почати додавати вершини. Ви додаєте вершини по одній. Спочатку специфічні атрибути вершини, такі як нормалі, або текстурні координати, за допомогою 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()