private static void OnGenerateCollider(ref SGenerateColliderWorkItem item)
        {
            ChunkStateManagerClient stateManager = item.StateManager;

            stateManager.chunk.ChunkColliderGeometryHandler.Build(item.MinX, item.MaxX, item.MinY, item.MaxY, item.MinZ, item.MaxZ);
            OnGenerateColliderDone(stateManager);
        }
        /// <summary>
        ///     Build this chunk's collision geometry
        /// </summary>
        private bool GenerateCollider()
        {
            if (!m_completedStates.Check(ChunkState.LoadData))
            {
                return(true);
            }

            if (!SynchronizeChunk())
            {
                return(true);
            }

            m_pendingStates       = m_pendingStates.Reset(CurrStateGenerateCollider);
            m_completedStates     = m_completedStates.Reset(CurrStateGenerateCollider);
            m_completedStatesSafe = m_completedStates;

            if (chunk.blocks.NonEmptyBlocks > 0)
            {
                var workItem = new SGenerateColliderWorkItem(
                    this,
                    m_minRenderX, m_maxRenderX,
                    m_minRenderY, m_maxRenderY,
                    m_minRenderZ, m_maxRenderZ
                    );

                m_taskRunning = true;
                WorkPoolManager.Add(
                    new ThreadPoolItem(
                        chunk.ThreadID,
                        arg =>
                {
                    SGenerateColliderWorkItem item = (SGenerateColliderWorkItem)arg;
                    OnGenerateCollider(ref item);
                },
                        workItem)
                    );

                return(true);
            }

            OnGenerateColliderDone(this);
            return(false);
        }