You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

200 lines
7.4 KiB

using System;
using UnityEngine;
namespace BansheeGz.BGSpline.Components
{
/// <summary>
/// Visualize curve in Play mode with standard LineRenderer Component.
/// This component updates LineRenderer vertex count & positions only
/// </summary>
[HelpURL("http://www.bansheegz.com/BGCurve/Cc/BGCcVisualizationLineRenderer")]
[RequireComponent(typeof(LineRenderer))]
[DisallowMultipleComponent]
[
CcDescriptor(
Description = "Visualize curve with standard LineRenderer Unity component.",
Name = "Cc Line Renderer",
Image = "Assets/BansheeGz/BGCurve/Icons/Components/BGCcVisualizationLineRenderer123.png")
]
[AddComponentMenu("BansheeGz/BGCurve/Components/BGCcLineRenderer")]
public class BGCcVisualizationLineRenderer : BGCcSplitterPolyline
{
//===============================================================================================
// Events
//===============================================================================================
/// <summary>ui updated</summary>
public event EventHandler ChangedVisualization;
//===============================================================================================
// Fields (Persistent)
//===============================================================================================
[SerializeField] [Tooltip("Update LineRenderer at Start method.")] private bool updateAtStart;
/// <summary>If LineRenderer should be updated then Start is called </summary>
public bool UpdateAtStart
{
get { return updateAtStart; }
set { updateAtStart = value; }
}
//===============================================================================================
// Editor stuff
//===============================================================================================
public override string Error
{
get { return ChoseMessage(base.Error, () => (LineRenderer == null) ? "LineRenderer is null" : null); }
}
public override string Warning
{
get
{
var warning = base.Warning;
var lineRenderer = LineRenderer;
if (lineRenderer == null) return warning;
if (!lineRenderer.useWorldSpace)
warning += "\r\nLineRenderer uses local space (LineRenderer.useWorldSpace=false)! " +
"This is not optimal, especially if you plan to update a curve at runtime. Try to set LineRenderer.useWorldSpace to true";
return warning.Length == 0 ? null : warning;
}
}
public override string Info
{
get { return lineRenderer != null ? "LineRenderer uses " + PointsCount + " points" : "LineRenderer is null"; }
}
public override bool SupportHandles
{
get { return false; }
}
//===============================================================================================
// Fields (Not persistent)
//===============================================================================================
//linerenderer cached
private LineRenderer lineRenderer;
/// <summary>Get Unity's LineRenderer component </summary>
public LineRenderer LineRenderer
{
get
{
//do not replace with ??
if (lineRenderer == null) lineRenderer = GetComponent<LineRenderer>();
return lineRenderer;
}
}
//===============================================================================================
// Unity Callbacks
//===============================================================================================
// Use this for initialization
public override void Start()
{
base.Start();
if (updateAtStart) UpdateUI();
else Math.EnsureMathIsCreated();
}
//===============================================================================================
// Public functions
//===============================================================================================
//see parent for comments
public override void AddedInEditor()
{
UpdateUI();
}
/// <summary>Update underlying Unity's LineRenderer component </summary>
public void UpdateUI()
{
try
{
//have no idea how to cope with UndoRedo
if (Math == null) return;
}
catch (MissingReferenceException)
{
return;
}
var math = Math.Math;
if (math == null) return;
LineRenderer lineRenderer;
try
{
//have no idea how to cope with UndoRedo
lineRenderer = LineRenderer;
}
catch (MissingReferenceException)
{
return;
}
if (lineRenderer == null) return;
var curve = Curve;
if (curve == null) return;
if (math.SectionsCount == 0)
{
//not enough points
#if UNITY_5_5 || UNITY_5_6
lineRenderer.positionCount = 0;
#else
lineRenderer.SetVertexCount(0);
#endif
if (positions != null && positions.Count > 0 && ChangedVisualization != null) ChangedVisualization(this, null);
positions.Clear();
}
else
{
//============== ok
useLocal = !lineRenderer.useWorldSpace;
var newPositions = Positions;
//update LineRenderer
var count = newPositions.Count;
if (count > 0)
{
#if UNITY_5_5 || UNITY_5_6
lineRenderer.positionCount = count;
#else
lineRenderer.SetVertexCount(count);
#endif
//the only way to get rid of GC is to use slow one-by-one setter unfortunately
for (var i = 0; i < count; i++) lineRenderer.SetPosition(i, newPositions[i]);
}
else
{
#if UNITY_5_5 || UNITY_5_6
lineRenderer.positionCount = 0;
#else
lineRenderer.SetVertexCount(0);
#endif
}
if (ChangedVisualization != null) ChangedVisualization(this, null);
}
}
//===============================================================================================
// Private functions
//===============================================================================================
//math/curve is changed
protected override void UpdateRequested(object sender, EventArgs e)
{
base.UpdateRequested(sender, e);
UpdateUI();
}
}
}