public void InitDefault() { ArraySize.SetValue(Vector3.One); ArrayModulo.SetValue(1); var colorAnim = new MyAnimatedPropertyVector4(); colorAnim.AddKey(0, Vector4.One); colorAnim.AddKey(0.33f, Vector4.One); colorAnim.AddKey(0.66f, Vector4.One); colorAnim.AddKey(1, Vector4.One); Color.AddKey(0, colorAnim); var colorIntensityAnim = new MyAnimatedPropertyFloat(); colorIntensityAnim.AddKey(0, 1.0f); colorIntensityAnim.AddKey(0.33f, 1.0f); colorIntensityAnim.AddKey(0.66f, 1.0f); colorIntensityAnim.AddKey(1, 1.0f); ColorIntensity.AddKey(0, colorIntensityAnim); Offset.SetValue(new Vector3(0, 0, 0)); Direction.SetValue(new Vector3(0, 0, -1)); var radiusAnim = new MyAnimatedPropertyFloat(); radiusAnim.AddKey(0, 0.1f); radiusAnim.AddKey(0.33f, 0.1f); radiusAnim.AddKey(0.66f, 0.1f); radiusAnim.AddKey(1, 0.1f); Radius.AddKey(0, radiusAnim); Life.SetValue(1); StreakMultiplier.SetValue(4); AnimationFrameTime.SetValue(1); Enabled.SetValue(true); EmitterSize.AddKey(0, new Vector3(0.0f, 0.0f, 0.0f)); EmitterSizeMin.AddKey(0, 0.0f); DirectionCone.AddKey(0, 0.0f); DirectionConeVar.AddKey(0, 0.0f); Velocity.AddKey(0, 1.0f); VelocityVar.AddKey(0, 0.0f); ParticlesPerSecond.AddKey(0, 1000.0f); Material.SetValue(MyTransparentMaterials.GetMaterial("WhiteBlock")); SoftParticleDistanceScale.SetValue(1); Bounciness.SetValue(0.5f); ColorVar.SetValue(0); HueVar.SetValue(0); OITWeightFactor.SetValue(1f); TargetCoverage.SetValue(1f); }
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(); }
private float GetParticlesPerSecond() { float particlesPerSecond; if ((Enabled.GetValue <bool>() || (m_show && m_effect.ShowOnlyThisGeneration >= 0)) && !m_effect.IsEmittingStopped) { ParticlesPerSecond.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out particlesPerSecond); particlesPerSecond *= m_effect.UserBirthMultiplier; } else { particlesPerSecond = 0; } return(particlesPerSecond); }
public void DeserializeFromObjectBuilder(ParticleGeneration generation) { m_name = generation.Name; foreach (GenerationProperty property in generation.Properties) { for (int i = 0; i < m_properties.Length; i++) { if (m_properties[i].Name.Equals(property.Name)) { m_properties[i].DeserializeFromObjectBuilder(property); } } } Debug.WriteLine("ParticlesPerSecond {0}, Velocity {1}", ParticlesPerSecond.GetKeysCount(), Velocity.GetKeysCount()); }
public void InitDefault() { ArraySize.SetValue(Vector3.One); ArrayModulo.SetValue(1); var colorAnim = new MyAnimatedPropertyVector4(); colorAnim.AddKey(0, Vector4.One); colorAnim.AddKey(0.33f, Vector4.One); colorAnim.AddKey(0.66f, Vector4.One); colorAnim.AddKey(1, Vector4.One); Color.AddKey(0, colorAnim); Velocity.SetValue(new Vector3(0, 0, -1)); var radiusAnim = new MyAnimatedPropertyFloat(); radiusAnim.AddKey(0, 0.1f); radiusAnim.AddKey(0.33f, 0.1f); radiusAnim.AddKey(0.66f, 0.1f); radiusAnim.AddKey(1, 0.1f); Radius.AddKey(0, radiusAnim); Life.SetValue(1); StreakMultiplier.SetValue(4); AnimationFrameTime.SetValue(1); Enabled.SetValue(true); ParticlesPerSecond.SetValue(30000); Material.SetValue(MyTransparentMaterials.GetMaterial("WhiteBlock")); SoftParticleDistanceScale.SetValue(1); Bounciness.SetValue(0.5f); OITWeightFactor.SetValue(1f); }
protected override XmlElement VCreateInheritedElement(XmlElement baseElement) { var textureElement = baseElement.OwnerDocument.CreateElement("Texture"); textureElement.SetAttribute("resource", Texture); baseElement.AppendChild(textureElement); var velocityElement = baseElement.OwnerDocument.CreateElement("EmitterVelocity"); velocityElement.SetAttribute("x", EmitterVelocity.X.ToString(CultureInfo.InvariantCulture)); velocityElement.SetAttribute("y", EmitterVelocity.Y.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(velocityElement); var variationElement = baseElement.OwnerDocument.CreateElement("EmitterVariation"); variationElement.SetAttribute("x", EmitterVariation.X.ToString(CultureInfo.InvariantCulture)); variationElement.SetAttribute("y", EmitterVariation.Y.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(variationElement); var gravityElement = baseElement.OwnerDocument.CreateElement("Gravity"); gravityElement.SetAttribute("x", Gravity.X.ToString(CultureInfo.InvariantCulture)); gravityElement.SetAttribute("y", Gravity.Y.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(gravityElement); var particlesPerSecondElement = baseElement.OwnerDocument.CreateElement("ParticlesPerSecond"); particlesPerSecondElement.SetAttribute("value", ParticlesPerSecond.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(particlesPerSecondElement); var particlesLifetimeElement = baseElement.OwnerDocument.CreateElement("ParticleLifetime"); particlesLifetimeElement.SetAttribute("value", ParticleLifeTime.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(particlesLifetimeElement); var maxParticlesElement = baseElement.OwnerDocument.CreateElement("MaxParticles"); maxParticlesElement.SetAttribute("value", MaxParticles.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(maxParticlesElement); XmlElement finalColorElement = baseElement.OwnerDocument.CreateElement("FinalColor"); finalColorElement.SetAttribute("r", FinalColor.R.ToString(CultureInfo.InvariantCulture)); finalColorElement.SetAttribute("g", FinalColor.G.ToString(CultureInfo.InvariantCulture)); finalColorElement.SetAttribute("b", FinalColor.B.ToString(CultureInfo.InvariantCulture)); finalColorElement.SetAttribute("a", FinalColor.A.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(finalColorElement); var colorEaseBiasElement = baseElement.OwnerDocument.CreateElement("ColorEaseBias"); colorEaseBiasElement.SetAttribute("value", ColorChangePoint.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(colorEaseBiasElement); var initialScaleElement = baseElement.OwnerDocument.CreateElement("InitialParticleScale"); initialScaleElement.SetAttribute("x", InitialScale.X.ToString(CultureInfo.InvariantCulture)); initialScaleElement.SetAttribute("y", InitialScale.Y.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(initialScaleElement); var finalScaleElement = baseElement.OwnerDocument.CreateElement("FinalParticleScale"); finalScaleElement.SetAttribute("x", FinalScale.X.ToString(CultureInfo.InvariantCulture)); finalScaleElement.SetAttribute("y", FinalScale.Y.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(finalScaleElement); var scaleEaseBiasElement = baseElement.OwnerDocument.CreateElement("ScaleEaseBias"); scaleEaseBiasElement.SetAttribute("value", ScaleChangePoint.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(scaleEaseBiasElement); var initialRotationElement = baseElement.OwnerDocument.CreateElement("InitialParticleRotation"); initialRotationElement.SetAttribute("value", InitialRotation.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(initialRotationElement); var finalRotationElement = baseElement.OwnerDocument.CreateElement("FinalParticleRotation"); finalRotationElement.SetAttribute("value", FinalRotation.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(finalRotationElement); var rotationEaseBiasElement = baseElement.OwnerDocument.CreateElement("RotationEaseBias"); rotationEaseBiasElement.SetAttribute("value", RotationChangePoint.ToString(CultureInfo.InvariantCulture)); baseElement.AppendChild(rotationEaseBiasElement); return(baseElement); }
void FillData(ref MyGPUEmitter emitter) { float time; MyAnimatedPropertyVector4 color; MyAnimatedPropertyFloat radius; MyAnimatedPropertyFloat colorIntensity; Color.GetKey(0, out time, out color); Radius.GetKey(0, out time, out radius); ColorIntensity.GetKey(0, out time, out colorIntensity); emitter.GID = m_renderId; if (Enabled.GetValue <bool>() && !m_effect.IsEmittingStopped) { ParticlesPerSecond.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.ParticlesPerSecond); emitter.ParticlesPerSecond *= m_effect.UserBirthMultiplier; } else { emitter.ParticlesPerSecond = 0; } float intensity; color.GetKey(0, out time, out emitter.Data.Color0); color.GetKey(1, out emitter.Data.ColorKey1, out emitter.Data.Color1); color.GetKey(2, out emitter.Data.ColorKey2, out emitter.Data.Color2); color.GetKey(3, out time, out emitter.Data.Color3); // unmultiply colors and factor by intensity colorIntensity.GetInterpolatedValue <float>(0, out intensity); emitter.Data.Color0.X *= intensity; emitter.Data.Color0.Y *= intensity; emitter.Data.Color0.Z *= intensity; emitter.Data.Color0 *= m_effect.UserColorMultiplier; colorIntensity.GetInterpolatedValue <float>(emitter.Data.ColorKey1, out intensity); emitter.Data.Color1.X *= intensity; emitter.Data.Color1.Y *= intensity; emitter.Data.Color1.Z *= intensity; emitter.Data.Color1 *= m_effect.UserColorMultiplier; colorIntensity.GetInterpolatedValue <float>(emitter.Data.ColorKey2, out intensity); emitter.Data.Color2.X *= intensity; emitter.Data.Color2.Y *= intensity; emitter.Data.Color2.Z *= intensity; emitter.Data.Color2 *= m_effect.UserColorMultiplier; colorIntensity.GetInterpolatedValue <float>(1.0f, out intensity); emitter.Data.Color3.X *= intensity; emitter.Data.Color3.Y *= intensity; emitter.Data.Color3.Z *= intensity; emitter.Data.Color3 *= m_effect.UserColorMultiplier; emitter.Data.ColorVar = ColorVar; if (emitter.Data.ColorVar > 1.0f) { emitter.Data.ColorVar = 1.0f; } else if (emitter.Data.ColorVar < 0) { emitter.Data.ColorVar = 0; } emitter.Data.HueVar = HueVar; if (emitter.Data.HueVar > 1.0f) { emitter.Data.HueVar = 1.0f; } else if (emitter.Data.HueVar < 0) { emitter.Data.HueVar = 0; } emitter.Data.Bounciness = Bounciness; MatrixD mat = CalculateWorldMatrix(); emitter.Data.RotationMatrix = mat; emitter.Data.Direction = Direction; Velocity.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.Data.Velocity); VelocityVar.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.Data.VelocityVar); float cone; DirectionCone.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out cone); emitter.Data.DirectionCone = MathHelper.ToRadians(cone); DirectionConeVar.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out cone); emitter.Data.DirectionConeVar = MathHelper.ToRadians(cone); emitter.Data.NumParticlesToEmitThisFrame = 0; emitter.Data.ParticleLifeSpan = Life; radius.GetKey(0, out time, out emitter.Data.ParticleSize0); radius.GetKey(1, out emitter.Data.ParticleSizeKeys1, out emitter.Data.ParticleSize1); radius.GetKey(2, out emitter.Data.ParticleSizeKeys2, out emitter.Data.ParticleSize2); radius.GetKey(3, out time, out emitter.Data.ParticleSize3); emitter.Data.ParticleSize0 *= m_effect.UserRadiusMultiplier; emitter.Data.ParticleSize1 *= m_effect.UserRadiusMultiplier; emitter.Data.ParticleSize2 *= m_effect.UserRadiusMultiplier; emitter.Data.ParticleSize3 *= m_effect.UserRadiusMultiplier; EmitterSize.GetInterpolatedValue <Vector3>(m_effect.GetElapsedTime(), out emitter.Data.EmitterSize); EmitterSizeMin.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out emitter.Data.EmitterSizeMin); emitter.Data.RotationVelocity = RotationVelocity; emitter.Data.RotationVelocityVar = RotationVelocityVar; emitter.Data.Acceleration = Acceleration; emitter.Data.Gravity = m_effect.Gravity * Gravity; emitter.Data.StreakMultiplier = StreakMultiplier; GPUEmitterFlags flags = 0; flags |= Streaks ? GPUEmitterFlags.Streaks : 0; flags |= Collide ? GPUEmitterFlags.Collide : 0; flags |= SleepState ? GPUEmitterFlags.SleepState : 0; flags |= Light ? GPUEmitterFlags.Light : 0; flags |= VolumetricLight ? GPUEmitterFlags.VolumetricLight : 0; flags |= m_effect.IsSimulationPaused ? GPUEmitterFlags.FreezeSimulate : 0; emitter.Data.Flags = flags; emitter.Data.SoftParticleDistanceScale = SoftParticleDistanceScale; emitter.Data.AnimationFrameTime = AnimationFrameTime; emitter.Data.OITWeightFactor = OITWeightFactor; emitter.Data.Scale = m_effect.GetEmitterScale(); emitter.AtlasTexture = (Material.GetValue <MyTransparentMaterial>()).Texture; emitter.AtlasDimension = new Vector2I((int)ArraySize.GetValue <Vector3>().X, (int)ArraySize.GetValue <Vector3>().Y); emitter.AtlasFrameOffset = ArrayOffset; emitter.AtlasFrameModulo = ArrayModulo; emitter.WorldPosition = mat.Translation; }