75 lines
2.5 KiB
C#
75 lines
2.5 KiB
C#
|
using UnityEngine;
|
|||
|
|
|||
|
|
|||
|
namespace AwesomeTechnologies.VegetationSystem.Wind
|
|||
|
{
|
|||
|
// ReSharper disable once UnusedMember.Global
|
|||
|
public class CTIWindController : IWindController
|
|||
|
{
|
|||
|
public string WindControlerID { get; }
|
|||
|
private WindControllerSettings _windControllerSettings;
|
|||
|
public float WindSpeed;
|
|||
|
|
|||
|
private readonly int _terrainLODWind = Shader.PropertyToID("_TerrainLODWind");
|
|||
|
|
|||
|
public WindControllerSettings Settings
|
|||
|
{
|
|||
|
get { return _windControllerSettings; }
|
|||
|
set
|
|||
|
{
|
|||
|
_windControllerSettings = value;
|
|||
|
RefreshSettings();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public CTIWindController()
|
|||
|
{
|
|||
|
WindControlerID = "CTIWindController";
|
|||
|
}
|
|||
|
|
|||
|
public WindControllerSettings CreateDefaultSettings()
|
|||
|
{
|
|||
|
Settings = new WindControllerSettings
|
|||
|
{
|
|||
|
WindControlerID = WindControlerID,
|
|||
|
Heading = "CTI Wind Settings"
|
|||
|
};
|
|||
|
Settings.AddFloatProperty("WindSpeed", "Wind Speed", "", 1f, 0, 3);
|
|||
|
RefreshSettings();
|
|||
|
return Settings;
|
|||
|
}
|
|||
|
|
|||
|
public void RefreshSettings()
|
|||
|
{
|
|||
|
WindSpeed = Settings.GetFloatPropertyValue("WindSpeed");
|
|||
|
}
|
|||
|
|
|||
|
public void UpdateWind(WindZone windZone, float windSpeedFactor)
|
|||
|
{
|
|||
|
Vector3 windDirection;
|
|||
|
float windStrength;
|
|||
|
float windTurbulence;
|
|||
|
|
|||
|
if (windZone)
|
|||
|
{
|
|||
|
windDirection = windZone.transform.forward;
|
|||
|
windStrength = windZone.windMain * windSpeedFactor * WindSpeed;
|
|||
|
windStrength += windZone.windPulseMagnitude * (1.0f + Mathf.Sin(Time.time * windZone.windPulseFrequency) + 1.0f + Mathf.Sin(Time.time * windZone.windPulseFrequency * 3.0f)) * 0.5f;
|
|||
|
windTurbulence = windZone.windTurbulence * windZone.windMain * windSpeedFactor * WindSpeed;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
windDirection =Vector3.forward;
|
|||
|
windStrength = 1 * windSpeedFactor * WindSpeed;
|
|||
|
windStrength += 1 * (1.0f + Mathf.Sin(Time.time) + 1.0f + Mathf.Sin(Time.time * 3.0f)) * 0.5f;
|
|||
|
windTurbulence = windSpeedFactor * WindSpeed;
|
|||
|
}
|
|||
|
|
|||
|
windDirection.x *= windStrength;
|
|||
|
windDirection.y *= windStrength;
|
|||
|
windDirection.z *= windStrength;
|
|||
|
Shader.SetGlobalVector(_terrainLODWind, new Vector4(windDirection.x, windDirection.y, windDirection.z, windTurbulence));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|