示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#6
0
        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);
                }
            }
        }
示例#7
0
 private void OnAnimationChanged()
 {
     if (InstancingPossible && !CurrentAnimation.CanUseInstancing)
     {
         if (Primitive == null)
         {
             Primitive = new BillboardPrimitive();
         }
         if (CurrentAnimation != null)
         {
             CurrentAnimation.UpdatePrimitive(Primitive, CurrentFrame);
         }
         InstancingPossible = false;
     }
 }
示例#8
0
        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;
            }
        }
示例#9
0
        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);
        }
示例#10
0
 public void ApplyBillboard(BillboardPrimitive primitive, Point offset)
 {
     primitive.UVs = new BillboardPrimitive.BoardTextureCoords(Target.Width, Target.Height, FrameSize.X, FrameSize.Y, offset, false);
     primitive.UpdateVertexUvs();
 }
示例#11
0
        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);
                }
            }
        }
示例#12
0
 public void ApplyBillboard(BillboardPrimitive primitive, Point offset)
 {
     primitive.UVs = new BillboardPrimitive.BoardTextureCoords(Target.Width, Target.Height, FrameSize.X, FrameSize.Y, offset, false);
     primitive.UpdateVertexUvs();
 }