public void Draw(List <VRageRender.MyBillboard> collectedBillboards)
        {
            if (m_renderId == MyRenderProxy.RENDER_ID_UNASSIGNED)
            {
                m_renderId = MyRenderProxy.CreateGPUEmitter();
            }
            if (IsDirty)
            {
                MyGPUEmitter emitter = new MyGPUEmitter();
                FillData(ref emitter);
                MyParticlesManager.GPUEmitters.Add(emitter);

                m_dirty = false;
            }
            else if (m_effect.IsPositionDirty)
            {
                var transform = new MyGPUEmitterTransformUpdate()
                {
                    GID       = m_renderId,
                    Transform = CalculateWorldMatrix()
                };
                MyParticlesManager.GPUEmitterTransforms.Add(transform);

                m_positionDirty = false;
            }
        }
        public void Draw(List <VRageRender.MyBillboard> collectedBillboards)
        {
            VRage.Profiler.ProfilerShort.Begin("GPU_Draw");
            if (m_renderId == MyRenderProxy.RENDER_ID_UNASSIGNED)
            {
                m_renderId = MyRenderProxy.CreateGPUEmitter();
            }

            if (IsDirty)
            {
                ProfilerShort.Begin("GPU_FillDataComplete");
                m_emitter = new MyGPUEmitter();
                FillDataComplete(ref m_emitter);
                MyParticlesManager.GPUEmitters.Add(m_emitter);
                ProfilerShort.End();
                m_dirty = m_animDirty = m_positionDirty = false;
            }
            else if (m_animatedTimeValues || m_animDirty)
            {
                ProfilerShort.Begin("GPU_FillData");
                FillData(ref m_emitter);
                MyParticlesManager.GPUEmitters.Add(m_emitter);
                ProfilerShort.End();
                m_animDirty = false;
            }
            else if (IsPositionDirty)
            {
                ProfilerShort.Begin("GPU_FillPosition");
                var transform = new MyGPUEmitterTransformUpdate()
                {
                    GID                = m_renderId,
                    Transform          = CalculateWorldMatrix(),
                    Scale              = m_effect.GetEmitterScale(),
                    Gravity            = m_effect.Gravity * Gravity,
                    ParticlesPerSecond = GetParticlesPerSecond()
                };
                MyParticlesManager.GPUEmitterTransforms.Add(transform);
                ProfilerShort.End();

                m_positionDirty = false;
            }
            else if (ParticlesPerSecond.GetKeysCount() > 1)
            {
                ProfilerShort.Begin("GPU_FillLight");
                MyParticlesManager.GPUEmittersLight.Add(new MyGPUEmitterLight()
                {
                    GID = m_renderId,
                    ParticlesPerSecond = GetParticlesPerSecond()
                });
                ProfilerShort.End();
            }
            ProfilerShort.End();
        }
Example #3
0
 internal static void UpdateTransforms(MyGPUEmitterTransformUpdate[] emitters)
 {
     for (int i = 0; i < emitters.Length; i++)
     {
         MyLiveData emitter;
         if (m_emitters.TryGetValue(emitters[i].GID, out emitter))
         {
             emitter.GPUEmitter.WorldPosition = emitters[i].Transform.Translation;
             emitter.GPUEmitter.Data.RotationMatrix = MatrixD.Transpose(emitters[i].Transform);
             emitter.GPUEmitter.Data.Gravity = emitters[i].Gravity;
             emitter.GPUEmitter.Data.Scale = emitters[i].Scale;
             emitter.GPUEmitter.ParticlesPerSecond = emitters[i].ParticlesPerSecond;
         }
         else MyRenderProxy.Assert(false, "invalid emitter id: " + emitters[i].GID);
     }
 }
Example #4
0
 public static void UpdateGPUEmittersTransform(MyGPUEmitterTransformUpdate[] emitters)
 {
     var message = MessagePool.Get<MyRenderMessageUpdateGPUEmittersTransform>(MyRenderMessageEnum.UpdateGPUEmittersTransform);
     message.Emitters = emitters;
     EnqueueMessage(message);
 }