92 lines
1.9 KiB
C#
92 lines
1.9 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
[AddComponentMenu("MegaShapes/Helix")]
|
|
public class MegaShapeHelix : MegaShape
|
|
{
|
|
public float radius1 = 1f;
|
|
|
|
public float radius2 = 0.75f;
|
|
|
|
public float height;
|
|
|
|
public float turns = 1f;
|
|
|
|
public float bias;
|
|
|
|
public float adjust = 0.4f;
|
|
|
|
public bool clockwise = true;
|
|
|
|
public int PointsPerTurn = 8;
|
|
|
|
private const float CIRCLE_VECTOR_LENGTH = 0.5517862f;
|
|
|
|
public override void MakeShape()
|
|
{
|
|
Matrix4x4 matrix = GetMatrix();
|
|
PointsPerTurn = Mathf.Clamp(PointsPerTurn, 3, 100);
|
|
MegaSpline megaSpline = NewSpline();
|
|
float num = 0f;
|
|
float num2 = turns * (float)Math.PI * 2f;
|
|
if (num > num2)
|
|
{
|
|
num2 += (float)Math.PI * 2f;
|
|
}
|
|
float num3 = (float)Math.PI * 2f * turns;
|
|
if (clockwise)
|
|
{
|
|
num3 *= -1f;
|
|
}
|
|
int num4 = (int)(turns * (float)PointsPerTurn);
|
|
if (num4 == 0)
|
|
{
|
|
num4 = 1;
|
|
}
|
|
float num5 = num4;
|
|
float num6 = num2 - num;
|
|
float num7 = MegaShape.veccalc(num6 / num5);
|
|
float num8 = radius2 - radius1;
|
|
float p = 1f;
|
|
if (bias > 0f)
|
|
{
|
|
p = bias * 9f + 1f;
|
|
}
|
|
else if (bias < 0f)
|
|
{
|
|
p = (0f - bias) * 9f + 1f;
|
|
}
|
|
for (int i = 0; i <= num4; i++)
|
|
{
|
|
float num9 = (float)i / num5;
|
|
float num10 = radius1 + num8 * num9;
|
|
float num11 = num9;
|
|
if (bias > 0f)
|
|
{
|
|
num11 = 1f - Mathf.Pow(1f - num9, p);
|
|
}
|
|
else if (bias < 0f)
|
|
{
|
|
num11 = Mathf.Pow(num9, p);
|
|
}
|
|
float f = num3 * num9;
|
|
float num12 = Mathf.Sin(f);
|
|
float num13 = Mathf.Cos(f);
|
|
float num14 = num7 * num10;
|
|
Vector3 vector = new Vector3(num13 * num10, num12 * num10, height * num11);
|
|
Vector3 vector2 = new Vector3(num12 * num14, (0f - num13) * num14, 0f);
|
|
Vector3 vector3 = vector + vector2;
|
|
Vector3 vector4 = vector - vector2;
|
|
if (!clockwise)
|
|
{
|
|
megaSpline.AddKnot(vector, vector3, vector4, matrix);
|
|
}
|
|
else
|
|
{
|
|
megaSpline.AddKnot(vector, vector4, vector3, matrix);
|
|
}
|
|
}
|
|
CalcLength();
|
|
}
|
|
}
|