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; } } }
public override void Reset() { base.Reset(); // Unsubscribe from neighbors SubscribeNeighbors(false); m_stateExternal = ChunkStateExternal.None; }
public override void Reset() { base.Reset(); SubscribeNeighbors(false); m_stateExternal = ChunkStateExternal.None; Visible = false; PossiblyVisible = false; ResetGeometryBounds(); }
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); } }
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; }
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; } } }
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); }
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; } } } }
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; } } } }
public override void Reset() { base.Reset(); m_stateExternal = ChunkStateExternal.None; }