docs.unity3d.com
    Show / Hide Table of Contents

    Class MeshGenerationContext

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

    Inheritance
    Object
    MeshGenerationContext
    Namespace: UnityEngine.UIElements
    Syntax
    public class MeshGenerationContext : object
    Remarks

    Visual content is generated by first allocating a mesh, using Allocate(Int32, Int32, Texture), and then filling the vertices and indices.

    If a texture is provided during the allocation, you can use the uv vertex values to map it to the resulting mesh. To improve performance, the renderer can store the texture in an internal atlas. In that case, you must remap the UVs inside the uvRegion rectangle. If you do not remap the UVs, the texture may display incorrectly when atlassed. The following example demonstrates the correct way to generate UVs.

    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;
        }
    
        public TexturedElement()
        {
            generateVisualContent += OnGenerateVisualContent;
            m_Texture = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/tex.png");
        }
    
        Texture2D m_Texture;
    
        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);
    
            // Since the texture may be stored in an atlas, the UV coordinates need to be
            // adjusted. Simply rescale them in the provided uvRegion.
            Rect uvRegion = mwd.uvRegion;
            k_Vertices[0].uv = new Vector2(0, 0) * uvRegion.size + uvRegion.min;
            k_Vertices[1].uv = new Vector2(0, 1) * uvRegion.size + uvRegion.min;
            k_Vertices[2].uv = new Vector2(1, 1) * uvRegion.size + uvRegion.min;
            k_Vertices[3].uv = new Vector2(1, 0) * uvRegion.size + uvRegion.min;
    
            mwd.SetAllVertices(k_Vertices);
            mwd.SetAllIndices(k_Indices);
        }
    }

    Properties

    visualElement

    The element for which generateVisualContent was invoked.

    Declaration
    public VisualElement visualElement { get; }
    Property Value
    Type Description
    VisualElement

    Methods

    Allocate(Int32, Int32, Texture)

    Allocates the specified number of vertices and indices required to express geometry for drawing the content of a VisualElement.

    Declaration
    public MeshWriteData Allocate(int vertexCount, int indexCount, Texture texture = null)
    Parameters
    Type Name Description
    Int32 vertexCount

    The number of vertices to allocate. The maximum is 65535 (or UInt16.MaxValue).

    Int32 indexCount

    The number of triangle list indices to allocate. Each 3 indices represent one triangle, so this value should be multiples of 3.

    Texture texture

    An optional texture to be applied on the triangles allocated. Pass null to rely on vertex colors only.

    Returns
    Type Description
    MeshWriteData

    An object that gives access to the newely allocated data. If the returned vertex count is 0, then allocation failed (the system ran out of memory).

    Remarks

    See position for details on geometry generation conventions. If a valid texture was passed, then the returned MeshWriteData will also describe a rectangle for the UVs to use to sample the passed texture. This is needed because textures passed to this API can be internally copied into a larger atlas.

    In This Article
    • Properties
      • visualElement
    • Methods
      • Allocate(Int32, Int32, Texture)
    Back to top
    Copyright © 2023 Unity Technologies — Terms of use
    • Legal
    • Privacy Policy
    • Cookies
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)
    "Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
    Generated by DocFX on 18 October 2023