using System.Collections.Generic; using Unity.Entities; using Unity.Transforms; using UnityEngine.Rendering; using UnityEngine; using Unity.Rendering; using Unity.Collections; namespace GarmentButton.VerletIntegration.Render { [RequireMatchingQueriesForUpdate] [UpdateInGroup(typeof(VerletIntegrationRenderGroupSystems))] public partial class CreateMeshForFlagSystem : SystemBase { protected override void OnUpdate() { var query = SystemAPI.QueryBuilder().WithAll().WithNone().Build(); var count = query.CalculateEntityCount(); // Collect work to do after iteration var entities = new NativeList(count,Allocator.Temp); var meshes = new List(count); var mats = new List(count); var desc = new RenderMeshDescription( ShadowCastingMode.On, receiveShadows: true, MotionVectorGenerationMode.Object, layer: 0, renderingLayerMask: 1 ); foreach (var (points, triangles, transform, material, entity) in SystemAPI .Query, DynamicBuffer, RefRO, RefRO>().WithNone().WithEntityAccess()) { Mesh mesh = new(); mesh.name = "Flag"; mesh.MarkDynamic(); NativeArray vertices = new NativeArray(points.Length, Allocator.Temp); for (int i = 0; i < points.Length; i++) vertices[i] = points[i].Position - transform.ValueRO.Position; Vector2[] uvs = new Vector2[vertices.Length]; // Calculate UVs based on vertex positions for (int i = 0; i < uvs.Length; i++) uvs[i] = new Vector2(vertices[i].x, vertices[i].y); mesh.SetVertices(vertices); mesh.SetTriangles(triangles.Reinterpret().AsNativeArray().ToArray(), 0); mesh.uv = uvs; mesh.RecalculateBounds(); mesh.RecalculateNormals(); entities.Add(entity); meshes.Add(mesh); mats.Add(material.ValueRO.Value.Value); var meshDataArray = Mesh.AllocateWritableMeshData(1); var meshData = meshDataArray[0]; vertices.Dispose(); } for (var i = 0; i < entities.Length; i++) { var rma = new RenderMeshArray(new[] { mats[i] }, new[] { meshes[i] }); var mmi = MaterialMeshInfo.FromRenderMeshArrayIndices(0, 0); EntityManager.RemoveComponent(entities[i]); RenderMeshUtility.AddComponents(entities[i], EntityManager, desc, rma, mmi); } } } }