private void StartTask()
        {
            if (currentJob == null || currentTask != null)
            {
                return;
            }

            Debug.Log("Starting Octree Update job");

            currentJob.Root.Locked = true;
            Action <object> job = (object data) => {
                OctreeUpdateJob cData    = (OctreeUpdateJob)data;
                Root            realRoot = Root;
                Root            copy     = realRoot.DeepCopy();

                Root = copy;
                SE.Octree.Ops.Adapt(realRoot, cData.Position, cData.MaxDepth, 100);
                Root = realRoot;

                Debug.Log("Adapt finished");

                //Root = copy;
            };

            currentTask = Task.Factory.StartNew(job, currentJob);
        }
        public void EnqueueUpdate(Vector3 position, int maxDepth)
        {
            OctreeUpdateJob jobData = new OctreeUpdateJob();

            jobData.Root     = Root;
            jobData.Position = position;
            jobData.MaxDepth = maxDepth;

            nextJob = jobData;
            Update();
        }
        public void Update()
        {
            if (currentTask != null && currentTask.Status == TaskStatus.RanToCompletion)
            {
                Debug.Log("Current task completed execution ");
            }

            if (currentTask == null || currentTask.Status == TaskStatus.RanToCompletion)
            {
                currentTask = null;
                currentJob  = nextJob;
                nextJob     = null;
                StartTask();
            }
        }