# MeshGenerationContext

> Provides methods for generating a visual element's visual content during the VisualElement.generateVisualContent callback.

## Definition

* **Type:** Class
* **Namespace:** [UnityEngine.UIElements](/engine/6000.5/script-reference/unityengine/uielements.md)
* **Assembly:** UnityEngine.UIElementsModule

```csharp
public class MeshGenerationContext
```

## Remarks

Visual content is generated by using the [Painter2D](/engine/6000.5/script-reference/unityengine/uielements/painter2d.md) object, or manually by allocating a mesh using the [MeshGenerationContext.Allocate](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/allocate.md) method and then filling the vertices and indices.

To use the painter object, access the [\_painter2D](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/painter2d.md) property, and then use it to issue drawing commands. You can find an example in the [Painter2D](/engine/6000.5/script-reference/unityengine/uielements/painter2d.md) documentation.

If you manually provide content with [MeshGenerationContext.Allocate](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/allocate.md) and also provide a texture during the allocation, you can use the [\_uv](/engine/6000.5/script-reference/unityengine/uielements/vertex/uv.md) vertex values to map it to the resulting mesh. UI Toolkit might store the texture in an internal atlas.

## Examples

```csharp
//This example creates a custom element that dynamically renders a textured rectangle 
//based on the element’s size. 

using UnityEngine;
using UnityEngine.UIElements;

public class TexturedElement : VisualElement
{
    static readonly Vertex[] k_Vertices = new Vertex[4];
    static readonly ushort[] k_Indices = { 0, 1, 2, 2, 3, 0 };

    static TexturedElement()
    {
        k_Vertices[0].tint = Color.white;
        k_Vertices[1].tint = Color.white;
        k_Vertices[2].tint = Color.white;
        k_Vertices[3].tint = Color.white;

        k_Vertices[0].uv = new Vector2(0, 0);
        k_Vertices[1].uv = new Vector2(0, 1);
        k_Vertices[2].uv = new Vector2(1, 1);
        k_Vertices[3].uv = new Vector2(1, 0);
    }

    Texture2D m_Texture;

    public TexturedElement()
    {
        //This element grows to fill the available space.
        style.flexGrow = 1.0f;

        //Subscribes the OnGenerateVisualContent method to the generateVisualContent delegate.
        generateVisualContent += OnGenerateVisualContent;

        //Create a simple 2x2 checkerboard texture.
        m_Texture = new Texture2D(2, 2);
        m_Texture.SetPixels(new Color[] {
            Color.white, Color.black,
            Color.black, Color.white
        });
        m_Texture.Apply();

        //You can also load a texture from a file.
        //m_Texture = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/tex.png");
    }

    //This method is called when the element needs to render its content.
    void OnGenerateVisualContent(MeshGenerationContext mgc)
    {
        Rect r = contentRect;
        if (r.width < 0.01f || r.height < 0.01f)
            return; // Skip rendering when too small.

        float left = 0;
        float right = r.width;
        float top = 0;
        float bottom = r.height;

        k_Vertices[0].position = new Vector3(left, bottom, Vertex.nearZ);
        k_Vertices[1].position = new Vector3(left, top, Vertex.nearZ);
        k_Vertices[2].position = new Vector3(right, top, Vertex.nearZ);
        k_Vertices[3].position = new Vector3(right, bottom, Vertex.nearZ);

        MeshWriteData mwd = mgc.Allocate(k_Vertices.Length, k_Indices.Length, m_Texture);

        mwd.SetAllVertices(k_Vertices);
        mwd.SetAllIndices(k_Indices);
    }
}
```

## Properties

| Property                                                                                                       | Description                                                                                                                                                 |
| -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [painter2D](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/painter2d.md)         | The painter object used to issue 2D drawing commands. Use this object to draw vector shapes such as lines, arcs and Bezier curves.                          |
| [visualElement](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/visualelement.md) | The element for which [\_generateVisualContent](/engine/6000.5/script-reference/unityengine/uielements/visualelement/generatevisualcontent.md) was invoked. |

## Methods

| Method                                                                                                                               | Description                                                                                                                                                                                                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [AddMeshGenerationJob](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/addmeshgenerationjob.md)         | Instructs the renderer to wait for the completion of the provided JobHandle before beginning processing the meshes.                                                                                                                                                                             |
| [Allocate](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/allocate.md)                                 | Allocates and draws the specified number of vertices and indices required to express geometry for drawing the content of a [VisualElement](/engine/6000.5/script-reference/unityengine/uielements/visualelement.md).                                                                            |
| [AllocateTempMesh](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/allocatetempmesh.md)                 | Allocates the specified number of vertices and indices from a temporary allocator.                                                                                                                                                                                                              |
| [DrawMesh](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/drawmesh.md)                                 | Records a draw command with the provided triangle-list indexed mesh.                                                                                                                                                                                                                            |
| [DrawText](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/drawtext.md)                                 | Draw a string of text.                                                                                                                                                                                                                                                                          |
| [DrawVectorImage](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/drawvectorimage.md)                   | Draws a [VectorImage](/engine/6000.5/script-reference/unityengine/uielements/vectorimage.md) asset.                                                                                                                                                                                             |
| [GetTempMeshAllocator](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/gettempmeshallocator.md)         | Returns an allocator that can be used to safely allocate temporary meshes from the job system. The meshes have the same scope as those allocated by [MeshGenerationContext.AllocateTempMesh](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/allocatetempmesh.md). |
| [InsertMeshGenerationNode](/engine/6000.5/script-reference/unityengine/uielements/meshgenerationcontext/insertmeshgenerationnode.md) | Inserts a node into the rendering tree that can be populated from the job system.                                                                                                                                                                                                               |
