Class SurfaceTool
- Namespace
- Godot
- Assembly
- GodotSharp.dll
The SurfaceTool is used to construct a Mesh by specifying vertex attributes individually. It can be used to construct a Mesh from a script. All properties except indices need to be added before calling AddVertex(Vector3). For example, to add vertex colors and UVs:
var st = new SurfaceTool();
st.Begin(Mesh.PrimitiveType.Triangles);
st.SetColor(new Color(1, 0, 0));
st.SetUV(new Vector2(0, 0));
st.AddVertex(new Vector3(0, 0, 0));
The above SurfaceTool now contains one vertex of a triangle which has a UV coordinate and a specified Color. If another vertex were added without calling SetUV(Vector2) or SetColor(Color), then the last values would be used.
Vertex attributes must be passed before calling AddVertex(Vector3). Failure to do so will result in an error when committing the vertex information to a mesh.
Additionally, the attributes used before the first vertex is added determine the format of the mesh. For example, if you only add UVs to the first vertex, you cannot add color to any of the subsequent vertices.
See also ArrayMesh, ImmediateMesh and MeshDataTool for procedural geometry generation.
Note: Godot uses clockwise winding order for front faces of triangle primitive modes.
public class SurfaceTool : RefCounted, IDisposable
- Inheritance
-
SurfaceTool
- Implements
- Inherited Members
Constructors
SurfaceTool()
public SurfaceTool()
Methods
AddIndex(int)
Adds a vertex to index array if you are using indexed vertices. Does not need to be called before adding vertices.
public void AddIndex(int index)
Parameters
indexint
AddTriangleFan(Vector3[], Vector2[], Color[], Vector2[], Vector3[], Array<Plane>)
Inserts a triangle fan made of array data into Mesh being constructed.
Requires the primitive type be set to Triangles.
public void AddTriangleFan(Vector3[] vertices, Vector2[] uvs = null, Color[] colors = null, Vector2[] uv2S = null, Vector3[] normals = null, Array<Plane> tangents = null)
Parameters
verticesVector3[]uvsVector2[]If the parameter is null, then the default value is
Array.Empty<Vector2>().colorsColor[]If the parameter is null, then the default value is
Array.Empty<Color>().uv2SVector2[]If the parameter is null, then the default value is
Array.Empty<Vector2>().normalsVector3[]If the parameter is null, then the default value is
Array.Empty<Vector3>().tangentsArray<Plane>
AddVertex(Vector3)
Specifies the position of current vertex. Should be called after specifying other vertex properties (e.g. Color, UV).
public void AddVertex(Vector3 vertex)
Parameters
vertexVector3
AppendFrom(Mesh, int, Transform3D)
Append vertices from a given Mesh surface onto the current vertex array with specified Transform3D.
public void AppendFrom(Mesh existing, int surface, Transform3D transform)
Parameters
existingMeshsurfaceinttransformTransform3D
Begin(PrimitiveType)
Called before adding any vertices. Takes the primitive type as an argument (e.g. Triangles).
public void Begin(Mesh.PrimitiveType primitive)
Parameters
primitiveMesh.PrimitiveType
Clear()
Clear all information passed into the surface tool so far.
public void Clear()
Commit(ArrayMesh, ulong)
Returns a constructed ArrayMesh from current information passed in. If an existing ArrayMesh is passed in as an argument, will add an extra surface to the existing ArrayMesh.
FIXME: Document possible values for flags, it changed in 4.0. Likely some combinations of Mesh.ArrayFormat.
public ArrayMesh Commit(ArrayMesh existing = null, ulong flags = 0)
Parameters
Returns
CommitToArrays()
Commits the data to the same format used by AddSurfaceFromArrays(PrimitiveType, Array, Array<Array>, Dictionary, ArrayFormat), AddSurface(PrimitiveType, Array, Array<Array>, Dictionary, Material, string, ulong), and CreateFromArrays(Array, PrimitiveType). This way you can further process the mesh data using the ArrayMesh or ImporterMesh APIs.
public Array CommitToArrays()
Returns
CreateFrom(Mesh, int)
Creates a vertex array from an existing Mesh.
public void CreateFrom(Mesh existing, int surface)
Parameters
CreateFromArrays(Array, PrimitiveType)
Creates this SurfaceTool from existing vertex arrays such as returned by CommitToArrays(), SurfaceGetArrays(int), SurfaceGetBlendShapeArrays(int), GetSurfaceArrays(int), and GetSurfaceBlendShapeArrays(int, int). primitiveType controls the type of mesh data, defaulting to Triangles.
public void CreateFromArrays(Array arrays, Mesh.PrimitiveType primitiveType = PrimitiveType.Triangles)
Parameters
arraysArrayprimitiveTypeMesh.PrimitiveType
CreateFromBlendShape(Mesh, int, string)
Creates a vertex array from the specified blend shape of an existing Mesh. This can be used to extract a specific pose from a blend shape.
public void CreateFromBlendShape(Mesh existing, int surface, string blendShape)
Parameters
Deindex()
Removes the index array by expanding the vertex array.
public void Deindex()
GenerateLod(float, int)
Generates an LOD for a given ndThreshold in linear units (square root of quadric error metric), using at most targetIndexCount indices.
[Obsolete("This method is unused internally, as it does not preserve normals or UVs. Consider using 'Godot.ImporterMesh.GenerateLods(float, float, Godot.Collections.Array)' instead.")]
public int[] GenerateLod(float ndThreshold, int targetIndexCount = 3)
Parameters
Returns
- int[]
GenerateNormals(bool)
Generates normals from vertices so you do not have to do it manually. If flip is true, the resulting normals will be inverted. GenerateNormals(bool) should be called after generating geometry and before committing the mesh using Commit(ArrayMesh, ulong) or CommitToArrays(). For correct display of normal-mapped surfaces, you will also have to generate tangents using GenerateTangents().
Note: GenerateNormals(bool) only works if the primitive type to be set to Triangles.
Note:
GenerateNormals(bool) takes smooth groups into account. To generate smooth normals, set the smooth group to a value greater than or equal to 0 using SetSmoothGroup(uint) or leave the smooth group at the default of 0. To generate flat normals, set the smooth group to -1 using SetSmoothGroup(uint) prior to adding vertices.
public void GenerateNormals(bool flip = false)
Parameters
flipbool
GenerateTangents()
Generates a tangent vector for each vertex. Requires that each vertex have UVs and normals set already (see GenerateNormals(bool)).
public void GenerateTangents()
GetAabb()
Returns the axis-aligned bounding box of the vertex positions.
public Aabb GetAabb()
Returns
GetCustomFormat(int)
Returns the format for custom channelIndex (currently up to 4). Returns Max if this custom channel is unused.
public SurfaceTool.CustomFormat GetCustomFormat(int channelIndex)
Parameters
channelIndexint
Returns
GetPrimitiveType()
Returns the type of mesh geometry, such as Triangles.
public Mesh.PrimitiveType GetPrimitiveType()
Returns
GetSkinWeightCount()
By default, returns Skin4Weights to indicate only 4 bone influences per vertex are used.
Returns Skin8Weights if up to 8 influences are used.
Note: This function returns an enum, not the exact number of weights.
public SurfaceTool.SkinWeightCount GetSkinWeightCount()
Returns
HasGodotClassMethod(in godot_string_name)
Check if the type contains a method with the given name. This method is used by Godot to check if a method exists before invoking it. Do not call or override this method.
protected override bool HasGodotClassMethod(in godot_string_name method)
Parameters
methodgodot_string_nameName of the method to check for.
Returns
HasGodotClassSignal(in godot_string_name)
Check if the type contains a signal with the given name. This method is used by Godot to check if a signal exists before raising it. Do not call or override this method.
protected override bool HasGodotClassSignal(in godot_string_name signal)
Parameters
signalgodot_string_nameName of the signal to check for.
Returns
Index()
Shrinks the vertex array by creating an index array. This can improve performance by avoiding vertex reuse.
public void Index()
InvokeGodotClassMethod(in godot_string_name, NativeVariantPtrArgs, out godot_variant)
Invokes the method with the given name, using the given arguments. This method is used by Godot to invoke methods from the engine side. Do not call or override this method.
protected override bool InvokeGodotClassMethod(in godot_string_name method, NativeVariantPtrArgs args, out godot_variant ret)
Parameters
methodgodot_string_nameName of the method to invoke.
argsNativeVariantPtrArgsArguments to use with the invoked method.
retgodot_variantValue returned by the invoked method.
Returns
OptimizeIndicesForCache()
Optimizes triangle sorting for performance. Requires that GetPrimitiveType() is Triangles.
public void OptimizeIndicesForCache()
SetBones(int[])
Specifies an array of bones to use for the next vertex. bones must contain 4 integers.
public void SetBones(int[] bones)
Parameters
bonesint[]
SetColor(Color)
Specifies a Color to use for the next vertex. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
Note: The material must have VertexColorUseAsAlbedo enabled for the vertex color to be visible.
public void SetColor(Color color)
Parameters
colorColor
SetCustom(int, Color)
Sets the custom value on this vertex for channelIndex.
SetCustomFormat(int, CustomFormat) must be called first for this channelIndex. Formats which are not RGBA will ignore other color channels.
public void SetCustom(int channelIndex, Color customColor)
Parameters
SetCustomFormat(int, CustomFormat)
Sets the color format for this custom channelIndex. Use Max to disable.
Must be invoked after Begin(PrimitiveType) and should be set before Commit(ArrayMesh, ulong) or CommitToArrays().
public void SetCustomFormat(int channelIndex, SurfaceTool.CustomFormat format)
Parameters
channelIndexintformatSurfaceTool.CustomFormat
SetMaterial(Material)
public void SetMaterial(Material material)
Parameters
materialMaterial
SetNormal(Vector3)
Specifies a normal to use for the next vertex. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
public void SetNormal(Vector3 normal)
Parameters
normalVector3
SetSkinWeightCount(SkinWeightCount)
Set to Skin8Weights to indicate that up to 8 bone influences per vertex may be used.
By default, only 4 bone influences are used (Skin4Weights)
Note: This function takes an enum, not the exact number of weights.
public void SetSkinWeightCount(SurfaceTool.SkinWeightCount count)
Parameters
countSurfaceTool.SkinWeightCount
SetSmoothGroup(uint)
Specifies the smooth group to use for the next vertex. If this is never called, all vertices will have the default smooth group of 0 and will be smoothed with adjacent vertices of the same group. To produce a mesh with flat normals, set the smooth group to -1.
Note: This function actually takes a uint32_t, so C# users should use uint32.MaxValue instead of -1 to produce a mesh with flat normals.
public void SetSmoothGroup(uint index)
Parameters
indexuint
SetTangent(Plane)
Specifies a tangent to use for the next vertex. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
public void SetTangent(Plane tangent)
Parameters
tangentPlane
SetUV(Vector2)
Specifies a set of UV coordinates to use for the next vertex. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
public void SetUV(Vector2 uV)
Parameters
uVVector2
SetUV2(Vector2)
Specifies an optional second set of UV coordinates to use for the next vertex. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
public void SetUV2(Vector2 uV2)
Parameters
uV2Vector2
SetWeights(float[])
Specifies weight values to use for the next vertex. weights must contain 4 values. If every vertex needs to have this information set and you fail to submit it for the first vertex, this information may not be used at all.
public void SetWeights(float[] weights)
Parameters
weightsfloat[]