Class MeshGenerationContext
Provides methods for generating a VisualElement's visual content during the
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.