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);
                }
            }
Exemple #3
0
        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;
Exemple #4
0
        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
                    };
                }
Exemple #5
0
        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.");
        }