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.");
        }