Protfolio-Emanuel-Polsky / Assets / _Project / Code / VerletIntegration / RenderFlag / System / CreateMeshForFlagSystem.cs
CreateMeshForFlagSystem.cs
Raw
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<Point,Tringle, MaterialFlag, LocalTransform>().WithNone<MaterialMeshInfo>().Build();

            var count = query.CalculateEntityCount();
            // Collect work to do after iteration
            var entities = new NativeList<Entity>(count,Allocator.Temp);
            var meshes = new List<Mesh>(count);
            var mats = new List<Material>(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<Point>, DynamicBuffer<Tringle>, RefRO<LocalTransform>,
                             RefRO<MaterialFlag>>().WithNone<MaterialMeshInfo>().WithEntityAccess())
            {
                Mesh mesh = new();
                mesh.name = "Flag";
                mesh.MarkDynamic();
                NativeArray<Vector3> vertices = new NativeArray<Vector3>(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<ushort>().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<MaterialFlag>(entities[i]);
                RenderMeshUtility.AddComponents(entities[i], EntityManager, desc, rma, mmi);
            }
        }
    }
}