Тип роста меша через Scale динамический класс

Если быть точным данный класс реализует увеличение\уменьшение 3д модели это можно использовать к примеру для роста растений а динамический класс нам даёт возможность перерождать объекты в другие и тд.

Отредактировал под версию 3.4.1(Работает) Автор кода: Incin

PowerUpEffect.cs

Код:
using System;
using System.ComponentModel;
using Engine.Renderer;
using Engine.EntitySystem;
using Engine.MapSystem;
using Engine.MathEx;

namespace ProjectEntities
{
    public class PowerUpEffectType : DynamicType
    {

        public enum PowerEffect
        {
            Pulse,
            Grow,
            Shrink,
        }
        public enum ScaleOnlyAxis
        {
            X = 1,
            Y = 2,
            Z = 4,
            XY = 3,
            XZ = 5,
            YZ = 6,
            All = 7
        }

        [FieldSerialize]
        public ScaleOnlyAxis axis = ScaleOnlyAxis.All;

        [DefaultValue(ScaleOnlyAxis.All)]
        public ScaleOnlyAxis Scale_Axis
        {
            get { return axis; }
            set { axis = value; }
        }

        [FieldSerialize]
        public PowerEffect effect = PowerEffect.Pulse;

        [DefaultValue(PowerEffect.Pulse)]
        public PowerEffect EffectType
        {
            get { return effect; }
            set { effect = value; }
        }

        [FieldSerialize]
        Vec2 scalerange = new Vec2(.1f, 1.4f);

        [Description("Диапазон масштабирования объекта сетки, может быть от 0,1 до максимума с плавающей точкой: устанавливает размер")]
        [DefaultValue(typeof(Vec2), "1 1.4")]
        public Vec2 ScaleRange
        {
            get { return scalerange; }
            set { scalerange = value; }
        }

        [FieldSerialize]
        float scaletimer = .33f;
        [Description("Время, необходимое для смены кадров рендера")]
        [DefaultValue(typeof(float), ".33")]
        public float ScaleTimer
        {
            get { return scaletimer; }
            set { scaletimer = value; }
        }

        [FieldSerialize]
        float scaleIncrement= .1f;
        [Description("Расстояние шкалы на секунду")]
        [DefaultValue(typeof(float), ".1")]
        public float ScaleIncrement
        {
            get { return scaleIncrement; }
            set { scaleIncrement= value; }
        }

        [FieldSerialize]
        bool renderineditor = false;
        [Description("Визуализация в редакторе")]
        [DefaultValue(false)]
        public bool RenderInEditor
        {
            get { return renderineditor; }
            set { renderineditor = value; }
        }

    }

    public class PowerUpEffect : Dynamic
    {

        PowerUpEffectType _type = null; public new PowerUpEffectType Type { get { return _type; } }

        static MapObjectAttachedMesh attachedobject = null;

        protected override void OnPostCreate(bool loaded)
        {
            base.OnPostCreate(loaded);

            OnTick();

            //To find the first attached mesh
            foreach (MapObjectAttachedObject attachedObject in AttachedObjects)
            {
                MapObjectAttachedMesh attachedMesh = attachedObject as MapObjectAttachedMesh;
                if (attachedMesh != null)
                {
                    attachedobject = attachedMesh;

                    break;
                }
            }
        }

         float scaletimerXX = 0f;
         bool inoutdirection = true;


        private Vec3 TickScale(Vec3 scaling, bool inOutDirection)
        {
            var multiplier = inOutDirection ? 1f : -1f;
            multiplier *= RendererWorld.Instance.FrameRenderTimeStep;
            //X
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.X) == PowerUpEffectType.ScaleOnlyAxis.X)
            {
                scaling.X += Type.ScaleIncrement * multiplier;
            }
            //Y
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.Y) == PowerUpEffectType.ScaleOnlyAxis.Y)
            {
                scaling.Y += Type.ScaleIncrement * multiplier;
            }
            //Z
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.Z) == PowerUpEffectType.ScaleOnlyAxis.Z)
            {
                scaling.Z += Type.ScaleIncrement * multiplier;
            }
            return scaling;
        }

        private bool CheckAddtoScale(Vec3 scaling)
        {
            bool OnIsBiggerThanMaxScale = false;
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.X) == PowerUpEffectType.ScaleOnlyAxis.X)
            {
                if (scaling.X >= Type.ScaleRange.Y)
                    OnIsBiggerThanMaxScale = true;
            }
            //Y
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.Y) == PowerUpEffectType.ScaleOnlyAxis.Y)
            {
                if (scaling.Y >= Type.ScaleRange.Y)
                    OnIsBiggerThanMaxScale = true;
            }
            //Z
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.Z) == PowerUpEffectType.ScaleOnlyAxis.Z)
            {
                if (scaling.Z >= Type.ScaleRange.Y)
                    OnIsBiggerThanMaxScale = true;
            }
            return OnIsBiggerThanMaxScale;
        }

        private bool CheckSubtractfromScale(Vec3 scaling)
        {
            bool OnIsSmallerThanMinScale = false;
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.X) == PowerUpEffectType.ScaleOnlyAxis.X)
            {
                if (scaling.X <= Type.ScaleRange.X)
                    OnIsSmallerThanMinScale = true;
            }
            //Y
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.Y) == PowerUpEffectType.ScaleOnlyAxis.Y)
            {
                if (scaling.Y <= Type.ScaleRange.X)
                    OnIsSmallerThanMinScale = true;
            }
            //Z
            if ((Type.Scale_Axis & PowerUpEffectType.ScaleOnlyAxis.Z) == PowerUpEffectType.ScaleOnlyAxis.Z)
            {
                if (scaling.Z <= Type.ScaleRange.X)
                    OnIsSmallerThanMinScale = true;
            }
            return OnIsSmallerThanMinScale;
        }

        protected override void OnRenderFrame()
        {
            base.OnRenderFrame();
            if (attachedobject == null)
                return;
            if (EntitySystemWorld.Instance.IsEditor() && !Type.RenderInEditor)
                return;

            Vec3 scaling = attachedobject.ScaleOffset;


            scaletimerXX += RendererWorld.Instance.FrameRenderTimeStep;

            if (scaletimerXX < this.Type.ScaleTimer)
                return;

            if (Type.EffectType == PowerUpEffectType.PowerEffect.Pulse)
            {
                scaletimerXX = 0f; //RESET TIMER EVENT
                if (inoutdirection)
                {
                    scaling = TickScale(scaling, inoutdirection);
                    if (CheckAddtoScale(scaling))
                        inoutdirection = false;
                }
                else if (!inoutdirection)
                {
                    scaling = TickScale(scaling, inoutdirection);
                    if (CheckSubtractfromScale(scaling))
                        inoutdirection = true;
                }
            }
            else if (Type.EffectType == PowerUpEffectType.PowerEffect.Grow)
            {
                scaletimerXX = 0f; //RESET TIMER EVENT
                if (CheckAddtoScale(scaling))
                {
                    scaling.X = Type.ScaleRange.X;
                    scaling.Y = Type.ScaleRange.X;
                    scaling.Z = Type.ScaleRange.X;
                }
                else
                {
                    scaling = TickScale(scaling, true);
                }

            }
            else if (Type.EffectType == PowerUpEffectType.PowerEffect.Shrink)
            {
                scaletimerXX = 0f; //RESET TIMER EVENT
                if (CheckSubtractfromScale(scaling))
                {
                    scaling.X = Type.ScaleRange.Y;
                    scaling.Y = Type.ScaleRange.Y;
                    scaling.Z = Type.ScaleRange.Y;
                }
                else
                {
                    scaling = TickScale(scaling, false);
                }

            }
                attachedobject.ScaleOffset = scaling;

        }
    }
}