Utilisation de SurfaceTool

SurfaceTool fournit une interface utile pour construire la géométrie. L'interface est similaire au nœud ImmediateGeometry. Vous définissez chaque attribut par vertex (par exemple normal, uv, couleur) et ensuite, lorsque vous ajoutez un vertex, il capture les attributs.

SurfaceTool fournit également quelques fonctions d'aide utiles comme index() et generate_normals().

Les attributs sont ajoutés avant l'ajout de chaque sommet :

st.add_normal() # Overwritten by normal below.
st.add_normal() # Added to next vertex.
st.add_color() # Added to next vertex.
st.add_vertex() # Captures normal and color above.
st.add_normal() # Normal never added to a vertex.

Lorsque vous avez fini de générer votre géométrie avec SurfaceTool appelez commit() pour finir de générer le maillage. Si un ArrayMesh est passé à commit() alors il ajoute une nouvelle surface à l'extrémité de l'ArrayMesh. Alors que si rien n'est passé, commit() renvoie un ArrayMesh.

st.commit(mesh)
# Or:
var mesh = st.commit()

Le code crée un triangle avec des indices

var st = SurfaceTool.new()

st.begin(Mesh.PRIMITIVE_TRIANGLES)

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

st.add_normal(Vector3(0, 0, 1))
st.add_uv(Vector2(0, 1))
st.add_vertex(Vector3(-1, 1, 0))

st.add_normal(Vector3(0, 0, 1))
st.add_uv(Vector2(1, 1))
st.add_vertex(Vector3(1, 1, 0))

# Commit to a mesh.
var mesh = st.commit()

Vous pouvez éventuellement ajouter un tableau d'index, soit en appelant add_index() et en ajoutant des sommets au tableau d'index, soit en appelant index() qui réduit le tableau de sommets pour supprimer les sommets en double.

# Creates a quad from four corner vertices.
# Add_index does not need to be called before add_vertex.
st.add_index(0)
st.add_index(1)
st.add_index(2)

st.add_index(1)
st.add_index(3)
st.add_index(2)

# Alternatively:
st.index()

De même, si vous avez un tableau d'index, mais que vous voulez que chaque sommet soit unique (par exemple parce que vous voulez utiliser des normales ou des couleurs uniques par face au lieu de par vertex), vous pouvez appeler deindex().

st.deindex()

Si vous n'ajoutez pas de normales personnalisées vous-même, vous pouvez les ajouter en utilisant generate_normals(). Il en va de même pour les tangentes.

st.generate_normals()
st.generate_tangents()

Par défaut, lors de la génération des normales, elles seront calculées par face de base. Si vous voulez des normales de vertex lisses, lors de l'ajout de vertex, appelez add_smooth_group(). add_smooth_group() doit être appelé pendant la construction de la géométrie, par exemple avant l'appel à add_vertex() (si non indexé) ou add_index() (si indexé).