public static void Create(EntityManager entityManager) { var table = Object.FindObjectOfType <TableAuthoring>().Table; foreach (var playable in table.Playables) { playable.Init(table); } // index hittables var hittables = table.Hittables.Where(hittable => hittable.IsCollidable).ToArray(); var hitObjects = new List <HitObject>(); var id = 0; foreach (var item in hittables) { foreach (var hitObject in item.GetHitShapes()) { hitObject.SetIndex(item.Index, item.Version); hitObject.Id = id++; hitObject.CalcHitBBox(); hitObjects.Add(hitObject); } } // construct quad tree var quadTree = new Engine.Physics.QuadTree(hitObjects, table.BoundingBox); var quadTreeBlobAssetRef = QuadTreeBlob.CreateBlobAssetReference( quadTree, table.GeneratePlayfieldHit(), // todo use `null` if separate playfield mesh exists table.GenerateGlassHit() ); // playfield and glass need special treatment, since not part of the quad tree var playfieldHitObject = table.GeneratePlayfieldHit(); var glassHitObject = table.GenerateGlassHit(); playfieldHitObject.Id = id++; glassHitObject.Id = id; hitObjects.Add(playfieldHitObject); hitObjects.Add(glassHitObject); // construct collider blob var colliderBlob = ColliderBlob.CreateBlobAssetReference(hitObjects, playfieldHitObject.Id, glassHitObject.Id); // save it to entity var collEntity = entityManager.CreateEntity(ComponentType.ReadOnly <QuadTreeData>(), ComponentType.ReadOnly <ColliderData>()); //DstEntityManager.SetName(collEntity, "Collision Data Holder"); entityManager.SetComponentData(collEntity, new QuadTreeData { Value = quadTreeBlobAssetRef }); entityManager.SetComponentData(collEntity, new ColliderData { Value = colliderBlob }); Logger.Info("Static QuadTree initialized."); }
protected override void OnUpdate() { // fixme if (DstEntityManager.CreateEntityQuery(typeof(QuadTreeData)).CalculateEntityCount() > 0) { return; } var table = Object.FindObjectOfType <TableBehavior>().Table; foreach (var playable in table.Playables) { playable.Init(table); } // index hittables var hitObjects = new List <HitObject>(); var id = 0; foreach (var item in table.Hittables) { foreach (var hitObject in item.GetHitShapes()) { hitObject.SetIndex(item.Index, item.Version); hitObject.Id = id++; hitObject.CalcHitBBox(); hitObjects.Add(hitObject); } } // construct quad tree var quadTree = new HitQuadTree(hitObjects, table.Data.BoundingBox); var quadTreeBlobAssetRef = QuadTreeBlob.CreateBlobAssetReference( quadTree, table.GeneratePlayfieldHit(), // todo use `null` if separate playfield mesh exists table.GenerateGlassHit() ); // playfield and glass need special treatment, since not part of the quad tree var playfieldHitObject = table.GeneratePlayfieldHit(); var glassHitObject = table.GenerateGlassHit(); playfieldHitObject.Id = id++; glassHitObject.Id = id; hitObjects.Add(playfieldHitObject); hitObjects.Add(glassHitObject); // construct collider blob var colliderBlob = ColliderBlob.CreateBlobAssetReference(hitObjects, playfieldHitObject.Id, glassHitObject.Id); // save it to entity var collEntity = DstEntityManager.CreateEntity(ComponentType.ReadOnly <QuadTreeData>(), ComponentType.ReadOnly <ColliderData>()); //DstEntityManager.SetName(collEntity, "Collision Data Holder"); DstEntityManager.SetComponentData(collEntity, new QuadTreeData { Value = quadTreeBlobAssetRef }); DstEntityManager.SetComponentData(collEntity, new ColliderData { Value = colliderBlob }); Logger.Info("Static QuadTree initialized."); }