109 lines
3.1 KiB
C#
109 lines
3.1 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using AwesomeTechnologies.Utility;
|
|||
|
using AwesomeTechnologies.VegetationStudio;
|
|||
|
using AwesomeTechnologies.VegetationSystem;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace AwesomeTechnologies.Vegetation
|
|||
|
{
|
|||
|
[HelpURL("http://www.awesometech.no/index.php/vegetation-beacon")]
|
|||
|
[ExecuteInEditMode]
|
|||
|
[AwesomeTechnologiesScriptOrder(99)]
|
|||
|
public class VegetationBeacon : MonoBehaviour
|
|||
|
{
|
|||
|
public float Radius = 5f;
|
|||
|
public AnimationCurve FalloffCurve = new AnimationCurve();
|
|||
|
public List<VegetationTypeSettings> VegetationTypeList = new List<VegetationTypeSettings>();
|
|||
|
|
|||
|
private Vector3 _lastPosition;
|
|||
|
private Quaternion _lastRotation;
|
|||
|
private BeaconMaskArea _currentMaskArea;
|
|||
|
private bool _needInit;
|
|||
|
|
|||
|
public void UpdateVegetationMask()
|
|||
|
{
|
|||
|
if (!enabled || !gameObject.activeSelf) return;
|
|||
|
|
|||
|
BeaconMaskArea maskArea = new BeaconMaskArea
|
|||
|
{
|
|||
|
Radius = Radius,
|
|||
|
Position = transform.position
|
|||
|
};
|
|||
|
|
|||
|
maskArea.SetFalloutCurve(FalloffCurve.GenerateCurveArray(4096));
|
|||
|
maskArea.Init();
|
|||
|
AddVegetationTypes(maskArea);
|
|||
|
|
|||
|
if (_currentMaskArea != null)
|
|||
|
{
|
|||
|
VegetationStudioManager.RemoveVegetationMask(_currentMaskArea);
|
|||
|
_currentMaskArea = null;
|
|||
|
}
|
|||
|
|
|||
|
_currentMaskArea = maskArea;
|
|||
|
VegetationStudioManager.AddVegetationMask(maskArea);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// ReSharper disable once UnusedMember.Local
|
|||
|
void Start()
|
|||
|
{
|
|||
|
_lastPosition = transform.position;
|
|||
|
_lastRotation = transform.rotation;
|
|||
|
}
|
|||
|
|
|||
|
// ReSharper disable once UnusedMember.Local
|
|||
|
void OnEnable()
|
|||
|
{
|
|||
|
_needInit = true;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// ReSharper disable once UnusedMember.Local
|
|||
|
void Update()
|
|||
|
{
|
|||
|
if (_lastPosition != transform.position || _lastRotation != transform.rotation)
|
|||
|
{
|
|||
|
UpdateVegetationMask();
|
|||
|
_lastPosition = transform.position;
|
|||
|
_lastRotation = transform.rotation;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void AddVegetationTypes(BaseMaskArea maskArea)
|
|||
|
{
|
|||
|
for (int i = 0; i <= VegetationTypeList.Count - 1; i++)
|
|||
|
{
|
|||
|
maskArea.VegetationTypeList.Add(new VegetationTypeSettings(VegetationTypeList[i]));
|
|||
|
}
|
|||
|
}
|
|||
|
// ReSharper disable once UnusedMember.Local
|
|||
|
void Reset()
|
|||
|
{
|
|||
|
FalloffCurve.AddKey(0, 1);
|
|||
|
FalloffCurve.AddKey(1, 0);
|
|||
|
}
|
|||
|
|
|||
|
// ReSharper disable once UnusedMember.Local
|
|||
|
void OnDisable()
|
|||
|
{
|
|||
|
if (_currentMaskArea != null)
|
|||
|
{
|
|||
|
VegetationStudioManager.RemoveVegetationMask(_currentMaskArea);
|
|||
|
_currentMaskArea.Dispose();
|
|||
|
_currentMaskArea = null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void LateUpdate()
|
|||
|
{
|
|||
|
if (_needInit)
|
|||
|
{
|
|||
|
_needInit = false;
|
|||
|
UpdateVegetationMask();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|