public virtual void Update(DwarfTime gameTime, Timer.TimerMode mode = Timer.TimerMode.Game) { if (IsPlaying && CurrentAnimation != null) { LastFrame = CurrentFrame; float dt = mode == Timer.TimerMode.Game ? (float)gameTime.ElapsedGameTime.TotalSeconds : (float)gameTime.ElapsedRealTime.TotalSeconds; FrameTimer += dt; float time = CurrentAnimation.FrameHZ; if (CurrentAnimation.Speeds.Count > 0) { time = CurrentAnimation.Speeds[Math.Min(CurrentFrame, CurrentAnimation.Speeds.Count - 1)]; } if (FrameTimer * CurrentAnimation.SpeedMultiplier >= 1.0f / time) { NextFrame(); FrameTimer = 0.0f; } } // Todo: Track enough state to only do this as needed. if (CurrentAnimation != null) { if (Primitive == null) { Primitive = new BillboardPrimitive(); } CurrentAnimation.UpdatePrimitive(Primitive, CurrentFrame); } }
public ParticleEmitter(GraphicsDevice Device, ComponentManager manager, string name, Matrix localTransform, EmitterData emitterData) : base(manager, name, localTransform, Vector3.Zero, Vector3.Zero, false) { Particles = new List <Particle>(); if (emitterData == null) { return; } Data = emitterData; maxParticles = Data.MaxParticles; Sprites = new List <FixedInstanceArray>(); for (var t = 0; t < Data.Animation.GetFrameCount(); ++t) { var primitive = new BillboardPrimitive(); Data.Animation.UpdatePrimitive(primitive, t); Sprites.Add(new FixedInstanceArray(Name, primitive, Data.Animation.SpriteSheet.GetTexture(), Data.MaxParticles, Data.BlendMode)); } AnimPlayer.Play(Data.Animation); TriggerTimer = new Timer(Data.EmissionFrequency, Data.ReleaseOnce); SetFlag(Flag.ShouldSerialize, false); }
public virtual void UpdatePrimitive(BillboardPrimitive Primitive, int CurrentFrame) { if (CurrentFrame >= Frames.Count) { return; } var rect = GetFrameRect(CurrentFrame); Primitive.SetFrame(SpriteSheet, rect, rect.Width / 32.0f, rect.Height / 32.0f, Color.White, Tint, Flipped); }
public virtual void UpdatePrimitive(BillboardPrimitive Primitive, int CurrentFrame) { if (CurrentFrame >= Frames.Count) { return; } var rect = GetFrameRect(CurrentFrame); // Don't scale here - sprite will be scaled by the world matrix. Primitive.SetFrame(SpriteSheet, rect, 1.0f, 1.0f, /*rect.Width / 32.0f, rect.Height / 32.0f,*/ Color.White, Tint, Flipped); }
public override void UpdatePrimitive(BillboardPrimitive Primitive, int CurrentFrame) { SpriteSheet = new SpriteSheet(Composite.GetTarget(CurrentOffset)); if (CurrentFrame >= CompositeFrames.Count) { return; } PushFrames(); CurrentOffset = Composite.PushFrame(CompositeFrames[CurrentFrame]); var rect = Composite.GetFrameRect(CurrentOffset); Primitive.SetFrame(SpriteSheet, rect, rect.Width / 32.0f, rect.Height / 32.0f, Color.White, Color.White, Flipped); }
public void UpdatePrimitive() { if (HasValidFrame && CurrentFrame >= 0 && CurrentFrame < CompositeFrames.Count) { Primitive = Composite.CreatePrimitive(GameState.Game.GraphicsDevice, CurrentOffset); Composite.ApplyBillboard(Primitive, CurrentOffset); Primitives.Clear(); foreach (Composite.Frame frame in CompositeFrames) { Primitives.Add(Primitive); } } }
private void OnAnimationChanged() { if (InstancingPossible && !CurrentAnimation.CanUseInstancing) { if (Primitive == null) { Primitive = new BillboardPrimitive(); } if (CurrentAnimation != null) { CurrentAnimation.UpdatePrimitive(Primitive, CurrentFrame); } InstancingPossible = false; } }
public virtual void Update(DwarfTime gameTime, bool WillUseInstancingIfPossible, Timer.TimerMode mode = Timer.TimerMode.Game) { InstancingPossible = false; if (CurrentAnimation == null) { return; } if (IsPlaying) { LastFrame = CurrentFrame; float dt = mode == Timer.TimerMode.Game ? (float)gameTime.ElapsedGameTime.TotalSeconds : (float)gameTime.ElapsedRealTime.TotalSeconds; FrameTimer += dt; float hz = CurrentAnimation.FrameHZ > 0 ? CurrentAnimation.FrameHZ : 1; float time = 1.0f / hz; if (CurrentAnimation.Speeds.Count > 0) { time = CurrentAnimation.Speeds[Math.Min(CurrentFrame, CurrentAnimation.Speeds.Count - 1)]; } time /= CurrentAnimation.SpeedMultiplier; if (FrameTimer >= time) { NextFrame(); FrameTimer = 0; } } if (!WillUseInstancingIfPossible || !CurrentAnimation.CanUseInstancing) { // Todo: Only update when actually needed. if (Primitive == null) { Primitive = new BillboardPrimitive(); } CurrentAnimation.UpdatePrimitive(Primitive, CurrentFrame); } else { InstancingPossible = true; } }
public ParticleEmitter(ComponentManager manager, string name, Matrix localTransform, EmitterData emitterData) { Particles = new List <Particle>(); if (emitterData == null) { return; } Data = emitterData; maxParticles = Data.MaxParticles; Sprites = new List <FixedInstanceArray>(); for (var t = 0; t < Data.Animation.GetFrameCount(); ++t) { var primitive = new BillboardPrimitive(); Data.Animation.UpdatePrimitive(primitive, t); Sprites.Add(new FixedInstanceArray(name, primitive, Data.Animation.SpriteSheet.AssetName, Data.MaxParticles, Data.BlendMode)); } AnimPlayer.Play(Data.Animation); TriggerTimer = new Timer(Data.EmissionFrequency, Data.ReleaseOnce); }
public void ApplyBillboard(BillboardPrimitive primitive, Point offset) { primitive.UVs = new BillboardPrimitive.BoardTextureCoords(Target.Width, Target.Height, FrameSize.X, FrameSize.Y, offset, false); primitive.UpdateVertexUvs(); }