Тип роста меша через 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;
}
}
}