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(); }
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); } }
public static void UpdateGPUEmittersTransform(MyGPUEmitterTransformUpdate[] emitters) { var message = MessagePool.Get<MyRenderMessageUpdateGPUEmittersTransform>(MyRenderMessageEnum.UpdateGPUEmittersTransform); message.Emitters = emitters; EnqueueMessage(message); }