public override EffectLayer Render(IGameState gameState) { var layer = new EffectLayer(); // Get elapsed time since last render var dt = stopwatch.ElapsedMilliseconds / 1000d; stopwatch.Restart(); // Update and render all particles using (var gfx = layer.GetGraphics()) { foreach (var particle in particles) { particle.Update(dt, Properties, gameState); if (particle.IsAlive(Properties, gameState)) { particle.Render(gfx, Properties, gameState); } } } // Spawn new particles if required SpawnParticles(dt); // Remove any particles that have expired particles.RemoveAll(p => !p.IsAlive(Properties, gameState)); // Call the render event LayerRender?.Invoke(this, layer.GetBitmap()); return(layer); }
void DestroyLayer(LayerRender layer) { foreach (var o in layer.objects) { if (o.meshFilter.mesh != null) { Destroy(o.meshFilter.mesh); } Destroy(o.meshFilter.gameObject); } }
void UpdateLayer(LayerRender layer) { int jobID = ChunkRendererPool.instance.AddJob(m_x, m_z, layer.layerIndex, m_chunk.world); var item = m_waitingJobs.Find(x => { return(x.jobID == jobID); }); if (item == null) { WaitingJob job = new WaitingJob(); job.jobID = jobID; job.layerIndex = layer.layerIndex; m_waitingJobs.Add(job); } }
public void Update() { if (m_chunk == null) { return; } for (int i = 0; i < m_waitingJobs.Count(); i++) { if (CheckLayerUpdated(m_waitingJobs[i])) { m_waitingJobs.RemoveAt(i); i--; } } for (int i = 0; i < m_layers.Count; i++) { if (!m_chunk.HaveLayer(m_layers[i].layerIndex)) { DestroyLayer(m_layers[i]); i--; } } var updatedLayers = m_chunk.GetLayersUptatedAfter(m_fUpdateTime); foreach (var index in updatedLayers) { var layer = m_layers.Find(x => { return(x.layerIndex == index); }); if (layer == null) { layer = new LayerRender(); layer.layerIndex = index; m_layers.Add(layer); } UpdateLayer(layer); } m_fUpdateTime = Time.time; if (!m_chunkInitialized) { m_chunkInitialized = m_waitingJobs.Count == 0; } }