<?xml version="1.0" encoding="UTF-8" ?>
<class name="MeshInstance" inherits="GeometryInstance" version="3.6" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		Node that instances meshes into a scenario.
	</brief_description>
	<description>
		MeshInstance is a node that takes a [Mesh] resource and adds it to the current scenario by creating an instance of it. This is the class most often used to get 3D geometry rendered and can be used to instance a single [Mesh] in many places. This allows reusing geometry, which can save on resources. When a [Mesh] has to be instanced more than thousands of times at close proximity, consider using a [MultiMesh] in a [MultiMeshInstance] instead.
	</description>
	<tutorials>
		<link title="3D Material Testers Demo">https://godotengine.org/asset-library/asset/123</link>
		<link title="3D Kinematic Character Demo">https://godotengine.org/asset-library/asset/126</link>
		<link title="3D Platformer Demo">https://godotengine.org/asset-library/asset/125</link>
		<link title="Third Person Shooter Demo">https://godotengine.org/asset-library/asset/678</link>
	</tutorials>
	<methods>
		<method name="create_convex_collision">
			<return type="void" />
			<argument index="0" name="clean" type="bool" default="true" />
			<argument index="1" name="simplify" type="bool" default="false" />
			<description>
				This helper creates a [StaticBody] child node with a [ConvexPolygonShape] collision shape calculated from the mesh geometry. It's mainly used for testing.
				If [code]clean[/code] is [code]true[/code] (default), duplicate and interior vertices are removed automatically. You can set it to [code]false[/code] to make the process faster if not needed.
				If [code]simplify[/code] is [code]true[/code], the geometry can be further simplified to reduce the amount of vertices. Disabled by default.
			</description>
		</method>
		<method name="create_debug_tangents">
			<return type="void" />
			<description>
				This helper creates a [MeshInstance] child node with gizmos at every vertex calculated from the mesh geometry. It's mainly used for testing.
			</description>
		</method>
		<method name="create_multiple_convex_collisions">
			<return type="void" />
			<description>
				This helper creates a [StaticBody] child node with multiple [ConvexPolygonShape] collision shapes calculated from the mesh geometry via convex decomposition. It's mainly used for testing.
			</description>
		</method>
		<method name="create_trimesh_collision">
			<return type="void" />
			<description>
				This helper creates a [StaticBody] child node with a [ConcavePolygonShape] collision shape calculated from the mesh geometry. It's mainly used for testing.
			</description>
		</method>
		<method name="get_active_material" qualifiers="const">
			<return type="Material" />
			<argument index="0" name="surface" type="int" />
			<description>
				Returns the [Material] that will be used by the [Mesh] when drawing. This can return the [member GeometryInstance.material_override], the surface override [Material] defined in this [MeshInstance], or the surface [Material] defined in the [Mesh]. For example, if [member GeometryInstance.material_override] is used, all surfaces will return the override material.
			</description>
		</method>
		<method name="get_surface_material" qualifiers="const">
			<return type="Material" />
			<argument index="0" name="surface" type="int" />
			<description>
				Returns the override [Material] for a surface of the [Mesh] resource.
				[b]Note:[/b] This function only returns [i]override[/i] materials associated with this [MeshInstance]. Consider using [method get_active_material] or [method Mesh.surface_get_material] to get materials associated with the [Mesh] resource.
			</description>
		</method>
		<method name="get_surface_material_count" qualifiers="const">
			<return type="int" />
			<description>
				Returns the number of surface override materials.
			</description>
		</method>
		<method name="is_mergeable_with" qualifiers="const">
			<return type="bool" />
			<argument index="0" name="other_mesh_instance" type="Node" />
			<argument index="1" name="shadows_only" type="bool" default="false" />
			<description>
				Returns [code]true[/code] if this [MeshInstance] can be merged with the specified [code]other_mesh_instance[/code], using the [method MeshInstance.merge_meshes] function.
				In order to be mergeable, properties of the [MeshInstance] must match, and each surface must match, in terms of material, attributes and vertex format.
			</description>
		</method>
		<method name="merge_meshes">
			<return type="bool" />
			<argument index="0" name="mesh_instances" type="Array" />
			<argument index="1" name="use_global_space" type="bool" default="false" />
			<argument index="2" name="check_compatibility" type="bool" default="true" />
			<argument index="3" name="shadows_only" type="bool" default="false" />
			<description>
				This function can merge together the data from several source [MeshInstance]s into a single destination [MeshInstance] (the MeshInstance the function is called from). This is primarily useful for improving performance by reducing the number of drawcalls and [Node]s.
				Merging should only be attempted for simple meshes that do not contain animation.
				The final vertices can either be returned in global space, or in local space relative to the destination [MeshInstance] global transform (the destination Node must be inside the [SceneTree] for local space to work).
				The function will make a final check for compatibility between the [MeshInstance]s by default, this should always be used unless you have previously checked for compatibility using [method MeshInstance.is_mergeable_with]. If the compatibility check is omitted and the meshes are merged, you may see rendering errors.
				[b]Note:[/b] The requirements for similarity between meshes are quite stringent. They can be checked using the [method MeshInstance.is_mergeable_with] function prior to calling [method MeshInstance.merge_meshes].
				Also note that any initial data in the destination [MeshInstance] data will be discarded.
			</description>
		</method>
		<method name="set_surface_material">
			<return type="void" />
			<argument index="0" name="surface" type="int" />
			<argument index="1" name="material" type="Material" />
			<description>
				Sets the override [Material] for the specified surface of the [Mesh] resource. This material is associated with this [MeshInstance] rather than with the [Mesh] resource.
			</description>
		</method>
	</methods>
	<members>
		<member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh">
			The [Mesh] resource for the instance.
		</member>
		<member name="skeleton" type="NodePath" setter="set_skeleton_path" getter="get_skeleton_path" default="NodePath(&quot;..&quot;)">
			[NodePath] to the [Skeleton] associated with the instance.
		</member>
		<member name="skin" type="Skin" setter="set_skin" getter="get_skin">
			Sets the skin to be used by this instance.
		</member>
		<member name="software_skinning_transform_normals" type="bool" setter="set_software_skinning_transform_normals" getter="is_software_skinning_transform_normals_enabled" default="true">
			If [code]true[/code], normals are transformed when software skinning is used. Set to [code]false[/code] when normals are not needed for better performance.
			See [member ProjectSettings.rendering/quality/skinning/software_skinning_fallback] for details about how software skinning is enabled.
		</member>
	</members>
	<constants>
	</constants>
</class>
