/// <summary>
        /// Create the vertices of hose mesh.
        /// </summary>
        /// <param name="curve"></param>
        /// <param name="segments"></param>
        /// <param name="differ"></param>
        /// <param name="isSeal">Is seal at both ends of hose?</param>
        /// <returns>Vertices array.</returns>
        protected Vector3[] CreateVertices(IMonoCurve curve, int segments, float differ, bool isSeal = false)
        {
            var vertices = new List <Vector3>();

            for (int i = 0; i < segments - 1; i++)
            {
                var len     = differ * i;
                var node    = curve.LocalEvaluate(len);
                var tangent = (curve.LocalEvaluate(len + differ) - node);
                vertices.AddRange(MeshBuildUtility.BuildPolygonVertices(polygon, radius, node, Quaternion.LookRotation(tangent)));
            }
            var lastNode    = curve.LocalEvaluate(curve.Length);
            var lastTangent = (lastNode - curve.LocalEvaluate(curve.Length - differ));

            vertices.AddRange(MeshBuildUtility.BuildPolygonVertices(polygon, radius, lastNode, Quaternion.LookRotation(lastTangent)));

            if (isSeal)
            {
                var polygonVertices = polygon + 1;
                vertices.Add(curve.LocalEvaluate(0));
                vertices.AddRange(vertices.GetRange(0, polygonVertices));

                var lastPolygonStart = polygonVertices * (segments - 1);
                vertices.Add(lastNode);
                vertices.AddRange(vertices.GetRange(lastPolygonStart, polygonVertices));
            }
            return(vertices.ToArray());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Get segment count of mono curve.
        /// </summary>
        /// <param name="curve"></param>
        /// <param name="segment"></param>
        /// <param name="differ">Differentiation.</param>
        /// <returns>Detail count of mono curve.</returns>
        public static int GetSegmentCount(IMonoCurve curve, float segment, out float differ)
        {
            //AwayFromZero means that 12.5 -> 13
            var count = (int)Math.Round(curve.Length / segment, MidpointRounding.AwayFromZero);

            count  = Mathf.Max(count, 1);
            differ = curve.Length / count;
            return(count);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Rebuild collider base curve.
 /// </summary>
 /// <param name="curve"></param>
 public override void Rebuild(IMonoCurve curve)
 {
     if (curve == null || curve.Length == 0)
     {
         Segments = 0;
         ClearCollider();
         return;
     }
     RebuildCollider(curve);
 }
Ejemplo n.º 4
0
        /// <summary>
        /// Rebuild renderer base curve.
        /// </summary>
        /// <param name="curve"></param>
        public override void Rebuild(IMonoCurve curve)
        {
            if (curve == null || curve.Length == 0)
            {
                Segments = 0;
                lineRenderer.SetVertexCount(0);
                return;
            }

            Segments = MonoCurveUtility.GetSegmentCount(curve, segment, out float differ) + 1;
            lineRenderer.SetVertexCount(Segments);
            for (int i = 0; i < Segments; i++)
            {
                lineRenderer.SetPosition(i, curve.LocalEvaluate(i * differ));
            }
        }
        /// <summary>
        /// Set capsule colliders.
        /// </summary>
        /// <param name="curve"></param>
        /// <param name="segments"></param>
        /// <param name="differ"></param>
        protected virtual void SetCapsules(IMonoCurve curve, int segments, float differ)
        {
            for (int i = 0; i < segments; i++)
            {
                var node = colliderGroup.GetChild(i);
                node.position = curve.Evaluate((i + 0.5f) * differ);
                var tangent = (curve.Evaluate((i + 1) * differ) - curve.Evaluate(i * differ));
                node.LookAt(node.position + tangent);

                var capsule = node.GetComponent <CapsuleCollider>();
                capsule.enabled   = enabled;
                capsule.center    = Vector3.zero;
                capsule.direction = 2;
                capsule.height    = differ + radius * 2;
                capsule.radius    = radius;
                capsule.isTrigger = isTrigger;
                capsule.material  = material;
            }
        }
 /// <summary>
 /// Rebuild collider for mono curve.
 /// </summary>
 protected override void RebuildCollider(IMonoCurve curve)
 {
     Segments = MonoCurveUtility.GetSegmentCount(curve, segment, out float differ);
     RequireCapsules(Segments);
     SetCapsules(curve, Segments, differ);
 }
Ejemplo n.º 7
0
 /// <summary>
 /// Rebuild renderer base mono curve.
 /// </summary>
 /// <param name="curve"></param>
 public abstract void Rebuild(IMonoCurve curve);
Ejemplo n.º 8
0
 /// <summary>
 /// [MESSAGE] On mono curve rebuild.
 /// </summary>
 /// <param name="curve"></param>
 private void OnMonoCurveRebuild(IMonoCurve curve)
 {
     Rebuild(curve);
 }
 /// <summary>
 /// Rebuild renderer base curve.
 /// </summary>
 /// <param name="curve"></param>
 public override void Rebuild(IMonoCurve curve)
 {
     this.curve = curve;
     base.Rebuild();
 }
Ejemplo n.º 10
0
 /// <summary>
 /// Rebuild collider for mono curve.
 /// </summary>
 protected abstract void RebuildCollider(IMonoCurve curve);