Usando ImmediateGeometry

A diferencia de SurfaceTool o ArrayMesh, ImmediateGeometry es un nodo real. Al ser un nodo, es rápido agregarlo a una escena y obtener una salida visual. Utiliza una API de estilo OpenGL 1.x como SurfaceTool, pero está diseñado para crear mallas sobre la marcha.

Generar geometría compleja (varios miles de vértices) con este nodo es ineficiente, incluso si se hace solo una vez. En cambio, está diseñado para generar geometría simple que cambia en cada cuadro (frame).

Antes de comenzar, debes borrar la geometría llamando a clear(). Esto asegura que no estés construyendo sobre la geometría del cuadro anterior. Si deseas mantener la geometría entre cuadros, no llames a clear().

Para comenzar a generar geometría, debes llamar a begin(). begin() toma un argumento de tipo PrimitiveType. PrimitiveType es un concepto de OpenGL que indica a la GPU cómo organizar el primitivo en base a los vértices proporcionados, ya sea triángulos, líneas, puntos, etc. Puedes encontrar una lista completa en la página de Mesh.

Una vez que hayas llamado a begin(), estarás listo para comenzar a agregar vértices. Agregas vértices uno por uno. Primero agregas atributos específicos del vértice, como normales o coordenadas UV, usando set_****() (por ejemplo, set_normal()). Luego llamas a add_vertex() para agregar un vértice con esos atributos. Por ejemplo:

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

Solo los atributos agregados antes de llamar a add_vertex() se incluirán en ese vértice.

Finalmente, una vez que hayas agregado todos tus vértices, llama a end() para indicar que has terminado de generar la malla.

El ejemplo de código siguiente dibuja un triángulo simple.

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()