private void InitOcTree(Table table) { _hitOcTree = new HitQuadTree(_hitObjects, table.Data.BoundingBox); // initialize hit structure for dynamic objects _hitOcTreeDynamic.FillFromVector(_hitObjectsDynamic); }
public static void Create(HitQuadTree src, ref QuadTree dest, BlobBuilder builder) { var children = builder.Allocate(ref dest.Children, 4); for (var i = 0; i < 4; i++) { if (src.Children[i] != null) { ref var child = ref builder.Allocate(ref children[i]); Create(src.Children[i], ref child, builder); } }
public unsafe void ShouldSerializeCorrectly() { var bounds = new Rect3D(true); var hitQuad = new HitQuadTree(new List <HitObject> { new LineSeg(new Vertex2D(1f, 2f), new Vertex2D(3f, 4f), 5f, 6f, ItemType.Table), new HitCircle(new Vertex2D(7f, 8f), 9f, 10f, 11f, ItemType.Table), new LineSeg(new Vertex2D(12f, 13f), new Vertex2D(14f, 15f), 16f, 17f, ItemType.Table), }, bounds); var quadTreeBlobAssetRef = QuadTreeBlob.CreateBlobAssetReference( hitQuad, new HitPlane(new Vertex3D(0, 0, 1), 10f), new HitPlane(new Vertex3D(0, 0, -1), 20f) ); ref var collider1 = ref quadTreeBlobAssetRef.Value.QuadTree.Bounds[0].Value;
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 }; }
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.ItemIndex = item.Index; hitObject.ItemVersion = 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."); }