Utilisation de ImmediateGeometry

Contrairement à SurfaceTool ou à ArrayMesh, ImmediateGeometry est un noeud réel. Être un noeud permet d’être ajouter rapidement à une scène et d’obtenir une sortie visuelle. Il utilise une API de style OpenGL 1.x comme SurfaceTool, mais il est en fait conçu pour créer des maillages à la volée.

Générer une géométrie complexe (plusieurs milliers de sommets) avec ce nœud est inefficace, même si cela n’est fait qu’une seule fois. Il est plutôt conçu pour générer une géométrie simple qui change à chaque image.

Avant de commencer, vous devez effacer la géométrie en appelant clear(). Cela permet de s’assurer que vous ne construisez pas sur la géométrie de l’image précédente. Si vous voulez conserver la géométrie entre les blocs, n’appelez pas clear().

Pour commencer à générer la géométrie, vous devez appeler begin(). Le begin() prend un PrimitiveType comme argument. PrimitiveType est un concept OpenGL qui indique au GPU comment organiser la primitive en fonction des sommets, qu’il s’agisse de triangles, de droites, de points, etc. Une liste complète peut être trouvée sur la page de référence de la classe Mesh.

Une fois que vous avez appelé begin(), vous êtes prêt à commencer à ajouter des sommets. Vous ajoutez les sommets un par un. Tout d’abord, vous ajoutez des attributs spécifiques aux sommets tels que les normales ou les UV en utilisant set_****() (par exemple set_normal()). Ensuite, vous appelez add_vertex() pour ajouter un sommet avec ces attributs. Par exemple :

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

Seuls les attributs ajoutés avant l’appel de add_vertex() seront inclus dans ce sommet.

Enfin, une fois que vous avez ajouté tous vos sommets, appelez end() pour signaler que vous avez fini de générer le maillage.

L’exemple de code ci-dessous dessine un seul triangle.

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