public static void Create(EntityManager entityManager, out NativeHashMap <Entity, bool> itemsColliding) { PerfMarkerTotal.Begin(); var player = Object.FindObjectOfType <Player>(); var playfieldComponent = player.GetComponentInChildren <PlayfieldComponent>(); var itemApis = player.ColliderGenerators.ToArray(); // 1. generate colliders PerfMarkerGenerateColliders.Begin(); var colliderList = new List <ICollider>(); var(playfieldCollider, glassCollider) = player.PlayfieldApi.CreateColliders(); itemsColliding = new NativeHashMap <Entity, bool>(itemApis.Length, Allocator.Persistent); foreach (var itemApi in itemApis) { PerfMarkerCreateColliders.Begin(); if (itemApi.ColliderEntity != Entity.Null) { itemsColliding.Add(itemApi.ColliderEntity, itemApi.IsColliderEnabled); } itemApi.CreateColliders(colliderList, 0); PerfMarkerCreateColliders.End(); } PerfMarkerGenerateColliders.End(); // 2. allocate created colliders PerfMarkerCreateBlobAsset.Begin(); var allocateColliderJob = new ColliderAllocationJob(colliderList, playfieldCollider, glassCollider); allocateColliderJob.Run(); // retrieve result and dispose var colliderBlobAssetRef = allocateColliderJob.BlobAsset[0]; allocateColliderJob.Dispose(); PerfMarkerCreateBlobAsset.End(); // 3. Create quadtree blob (BlobAssetReference<QuadTreeBlob>) from AABBs PerfMarkerCreateQuadTree.Begin(); BlobAssetReference <QuadTreeBlob> quadTreeBlobAssetRef; using (var builder = new BlobBuilder(Allocator.Temp)) { ref var rootQuadTree = ref builder.ConstructRoot <QuadTreeBlob>(); QuadTree.Create(builder, ref colliderBlobAssetRef.Value.Colliders, ref rootQuadTree.QuadTree, playfieldComponent.BoundingBox.ToAabb()); quadTreeBlobAssetRef = builder.CreateBlobAssetReference <QuadTreeBlob>(Allocator.Persistent); }
public static BlobAssetReference <QuadTreeBlob> CreateBlobAssetReference(HitQuadTree hitQuadTree, HitPlane playfield, HitPlane glass) { using (var builder = new BlobBuilder(Allocator.Temp)) { ref var rootQuadTree = ref builder.ConstructRoot <QuadTreeBlob>(); QuadTree.Create(hitQuadTree, ref rootQuadTree.QuadTree, builder); if (playfield != null) { PlaneCollider.Create(builder, playfield, ref rootQuadTree.PlayfieldCollider); } else { ref var playfieldCollider = ref builder.Allocate(ref rootQuadTree.PlayfieldCollider); playfieldCollider.Header = new ColliderHeader { Type = ColliderType.None }; }