using GarmentButton.Culling; using Unity.Burst; using Unity.Collections; using Unity.Entities; using Unity.Jobs; using Unity.Mathematics; using Unity.Rendering; using Unity.Transforms; using UnityEngine; using Vector3 = UnityEngine.Vector3; namespace GarmentButton.VerletIntegration.Render { [UpdateInGroup(typeof(VerletIntegrationGroupSystems))] public partial struct EditPointsToRender : ISystem { public void OnCreate(ref SystemState state) { var query = SystemAPI.QueryBuilder().WithAll().Build(); state.RequireForUpdate(query); } public void OnUpdate(ref SystemState state) { foreach (var (points, renderMeshArray, renderInfo, transform) in SystemAPI .Query, RenderMeshArray, MaterialMeshInfo, RefRO>() .WithAll()) { var mesh = renderMeshArray.GetMesh(renderInfo); var pointsNative = points.AsNativeArray().AsReadOnly(); NativeArray positions = new NativeArray(points.Length, Allocator.TempJob); var job = new EditPoints { VertexPoints = positions, Points = pointsNative, EntityPosition = transform.ValueRO.Position, EntityRotation = transform.ValueRO.Rotation, }.ScheduleParallel(pointsNative.Length, 16, new JobHandle()); job.Complete(); var v3 = positions.Reinterpret(); mesh.SetVertices(v3); positions.Dispose(); } } [BurstCompile] public partial struct EditPoints : IJobFor { [NativeDisableParallelForRestriction] public NativeArray VertexPoints; [ReadOnly] public NativeArray.ReadOnly Points; [ReadOnly] public float3 EntityPosition; [ReadOnly] public quaternion EntityRotation; public void Execute(int index) { float3 worldOffset = Points[index].Position - EntityPosition; VertexPoints[index] = math.rotate(math.inverse(EntityRotation), worldOffset); } } public static NativeArray GetVertices(Mesh.MeshData meshData) { int vertexCount = meshData.vertexCount; var vertices = new NativeArray(vertexCount, Allocator.TempJob); meshData.GetVertices(vertices.Reinterpret()); return vertices; } } }