Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 void DestroyLayer(LayerRender layer)
 {
     foreach (var o in layer.objects)
     {
         if (o.meshFilter.mesh != null)
         {
             Destroy(o.meshFilter.mesh);
         }
         Destroy(o.meshFilter.gameObject);
     }
 }
Ejemplo n.º 3
0
    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);
        }
    }
Ejemplo n.º 4
0
    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;
        }
    }