83 lines
2.5 KiB
C#
83 lines
2.5 KiB
C#
|
using UnityEngine;
|
|||
|
|
|||
|
namespace AwesomeTechnologies.VegetationSystem.Wind
|
|||
|
{
|
|||
|
// ReSharper disable once UnusedMember.Global
|
|||
|
public class VSWindController : IWindController
|
|||
|
{
|
|||
|
public string WindControlerID { get; }
|
|||
|
private WindControllerSettings _windControllerSettings;
|
|||
|
|
|||
|
public Texture2D WindWaveTexture;
|
|||
|
public float WindWaveSize;
|
|||
|
public float WindSpeed;
|
|||
|
|
|||
|
private readonly int _awDir;
|
|||
|
private readonly int _awWavesTex;
|
|||
|
|
|||
|
public WindControllerSettings Settings
|
|||
|
{
|
|||
|
get { return _windControllerSettings; }
|
|||
|
set
|
|||
|
{
|
|||
|
_windControllerSettings = value;
|
|||
|
RefreshSettings();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public VSWindController()
|
|||
|
{
|
|||
|
WindControlerID = "VSWindController";
|
|||
|
_awDir = Shader.PropertyToID("_AW_DIR");
|
|||
|
_awWavesTex = Shader.PropertyToID("_AW_WavesTex");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public WindControllerSettings CreateDefaultSettings()
|
|||
|
{
|
|||
|
Settings = new WindControllerSettings
|
|||
|
{
|
|||
|
WindControlerID = WindControlerID,
|
|||
|
Heading = "Vegetation Studio Grass Wind Settings"
|
|||
|
};
|
|||
|
|
|||
|
Settings.AddTextureProperty("AW_WavesTex", "Wind Waves", "", Resources.Load("PerlinSeamless") as Texture2D);
|
|||
|
Settings.AddFloatProperty("WindWaveSize", "Wind Wave Size", "", 10, 0, 30);
|
|||
|
Settings.AddFloatProperty("WindSpeed", "Wind Speed", "", 1f, 0, 3);
|
|||
|
RefreshSettings();
|
|||
|
return Settings;
|
|||
|
}
|
|||
|
|
|||
|
public void RefreshSettings()
|
|||
|
{
|
|||
|
WindSpeed = Settings.GetFloatPropertyValue("WindSpeed");
|
|||
|
WindWaveSize = Settings.GetFloatPropertyValue("WindWaveSize");
|
|||
|
WindWaveTexture = Settings.GetTexturePropertyValue("AW_WavesTex");
|
|||
|
}
|
|||
|
|
|||
|
public void UpdateWind(WindZone windZone, float windSpeedFactor)
|
|||
|
{
|
|||
|
Vector3 dir = Vector3.forward;
|
|||
|
Vector4 dir4;
|
|||
|
|
|||
|
if (windZone)
|
|||
|
{
|
|||
|
dir = windZone.transform.forward;
|
|||
|
dir4 = new Vector4(dir.x, Mathf.Abs(windZone.windMain) * WindSpeed * windSpeedFactor, dir.z, WindWaveSize);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
dir4 = new Vector4(dir.x, 1 * WindSpeed * windSpeedFactor, dir.z, WindWaveSize);
|
|||
|
}
|
|||
|
Shader.SetGlobalVector(_awDir, dir4);
|
|||
|
|
|||
|
if (WindWaveTexture)
|
|||
|
{
|
|||
|
Shader.SetGlobalTexture(_awWavesTex, WindWaveTexture);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|