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);
}
}
}
}