コード例 #1
0
        public override void Update()
        {
            if (m_stateExternal != ChunkStateExternal.None)
            {
                // Notify everyone listening
                NotifyAll(m_stateExternal);

                m_stateExternal = ChunkStateExternal.None;
            }

            // If removal was requested before we got to generating the chunk at all we can safely mark
            // it as removed right away
            if (m_removalRequested && !m_completedStates.Check(ChunkState.Generate))
            {
                m_completedStates = m_completedStates.Set(ChunkState.Remove);
                return;
            }

            // If there is no pending task, there is nothing for us to do
            ProcessNotifyState();
            if (m_pendingStates == 0)
            {
                return;
            }

            // Go from the least important bit to most important one. If a given bit it set
            // we execute the task tied with it
            {
                if (m_pendingStates.Check(ChunkState.Generate) && GenerateData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.LoadData) && LoadData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.GenericWork) && PerformGenericWork())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.SaveData) && SaveData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.Remove) && RemoveChunk())
                {
                    return;
                }
            }
        }
コード例 #2
0
        public override void Reset()
        {
            base.Reset();

            // Unsubscribe from neighbors
            SubscribeNeighbors(false);

            m_stateExternal = ChunkStateExternal.None;
        }
コード例 #3
0
        public override void Reset()
        {
            base.Reset();

            SubscribeNeighbors(false);

            m_stateExternal = ChunkStateExternal.None;

            Visible         = false;
            PossiblyVisible = false;

            ResetGeometryBounds();
        }
コード例 #4
0
        public void NotifyAll(ChunkStateExternal evt)
        {
            // Retrieve a list of listeners for a given event
            List <IEventListener <ChunkStateExternal> > evtListeners;

            m_listenersExternal.TryGetValue(evt, out evtListeners);

            // Nofity each listener
            for (int i = 0; i < evtListeners.Count; i++)
            {
                IEventListener <ChunkStateExternal> listener = evtListeners[i];
                listener.OnNotified(this, evt);
            }
        }
コード例 #5
0
        public override void Reset()
        {
            base.Reset();

            SubscribeNeighbors(false);

            m_stateExternal = ChunkStateExternal.None;

            Visible         = false;
            PossiblyVisible = false;

            m_syncEdgeBlocks = true;

            m_poolState      = m_poolState.Reset();
            m_threadPoolItem = null;
        }
コード例 #6
0
        public void NotifyOne(IEventListener <ChunkStateExternal> listener, ChunkStateExternal evt)
        {
            // Retrieve a list of listeners for a given event
            List <IEventListener <ChunkStateExternal> > evtListeners;

            m_listenersExternal.TryGetValue(evt, out evtListeners);

            // Notify our listener
            for (int i = 0; i < evtListeners.Count; i++)
            {
                IEventListener <ChunkStateExternal> l = evtListeners[i];
                if (l == listener)
                {
                    listener.OnNotified(this, evt);
                    return;
                }
            }
        }
コード例 #7
0
        public bool Subscribe(IEventListener <ChunkStateExternal> listener, ChunkStateExternal evt, bool register)
        {
            // Retrieve a list of listeners for a given event
            List <IEventListener <ChunkStateExternal> > evtListeners;

            m_listenersExternal.TryGetValue(evt, out evtListeners);

            // Add/remove listener if possible
            bool listenerRegistered = evtListeners.Contains(listener);

            if (register && !listenerRegistered)
            {
                evtListeners.Add(listener);
                return(true);
            }
            if (!register && listenerRegistered)
            {
                evtListeners.Remove(listener);
                return(true);
            }

            return(false);
        }
コード例 #8
0
        public override void Update()
        {
            // Return processed work items back to the pool
            ReturnPoolItems();

            if (m_stateExternal != ChunkStateExternal.None)
            {
                // Notify everyone listening
                NotifyAll(m_stateExternal);

                m_stateExternal = ChunkStateExternal.None;
            }

            // If removal was requested before we got to loading the chunk at all we can safely mark
            // it as removed right away
            if (m_removalRequested && !m_completedStates.Check(ChunkState.LoadData))
            {
                m_completedStates = m_completedStates.Set(ChunkState.Remove);
                return;
            }

            // Go from the least important bit to most important one. If a given bit it set
            // we execute the task tied with it
            ProcessNotifyState();
            if (m_pendingStates != 0)
            {
                // In order to save performance, we generate chunk data on-demand - when the chunk can be seen
                if (PossiblyVisible)
                {
                    if (m_pendingStates.Check(ChunkState.LoadData) && LoadData())
                    {
                        return;
                    }

                    ProcessNotifyState();
                }

                if (m_pendingStates.Check(ChunkState.PrepareGenerate) && PrepareGenerate())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.Generate) && GenerateData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.PrepareSaveData) && PrepareSaveData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.SaveData) && SaveData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.Remove) && RemoveChunk())
                {
                    return;
                }

                // TODO: Having some sort of condition for colliders would be nice
                if (true)
                {
                    ProcessNotifyState();
                    if (m_pendingStates.Check(ChunkStates.CurrStateBuildCollider) && BuildCollider())
                    {
                        return;
                    }
                }

                // In order to save performance, we generate geometry on-demand - when the chunk can be seen
                if (Visible)
                {
                    ProcessNotifyState();
                    if (m_pendingStates.Check(ChunkStates.CurrStateBuildVertices) && BuildVertices())
                    {
                        return;
                    }
                }
            }
        }
コード例 #9
0
        public override void Update()
        {
            if (m_stateExternal != ChunkStateExternal.None)
            {
                // Notify everyone listening
                NotifyAll(m_stateExternal);

                m_stateExternal = ChunkStateExternal.None;
            }

            // If removal was requested before we got to generating the chunk at all we can safely mark
            // it as removed right away
            if (m_removalRequested && !m_completedStates.Check(ChunkState.Generate))
            {
                m_completedStates = m_completedStates.Set(ChunkState.Remove);
                return;
            }

            // If there is no pending task, there is nothing for us to do
            ProcessNotifyState();
            if (m_pendingStates == 0)
            {
                return;
            }

            // Go from the least important bit to most important one. If a given bit it set
            // we execute the task tied with it
            {
                // In order to save performance, we generate chunk data on-demand - when the chunk can be seen
                if (PossiblyVisible)
                {
                    if (m_pendingStates.Check(ChunkState.Generate) && GenerateData())
                    {
                        return;
                    }

                    ProcessNotifyState();
                }

                if (m_pendingStates.Check(ChunkState.LoadData) && LoadData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.GenericWork) && PerformGenericWork())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.SaveData) && SaveData())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.Remove) && RemoveChunk())
                {
                    return;
                }

                ProcessNotifyState();
                if (m_pendingStates.Check(ChunkState.BuildCollider) && GenerateCollider())
                {
                    return;
                }

                // In order to save performance, we generate geometry on-demand - when the chunk can be seen
                if (PossiblyVisible)
                {
                    ProcessNotifyState();
                    if (m_pendingStates.Check(CurrStateGenerateVertices) && GenerateVertices())
                    {
                        return;
                    }
                }
            }
        }
コード例 #10
0
        public override void Reset()
        {
            base.Reset();

            m_stateExternal = ChunkStateExternal.None;
        }