private void DrawMeshTypeInspector(MeshCreator meshCreator)
    {
        meshCreator.meshType = (MeshCreator.MeshType)EditorGUILayout.EnumPopup("Type", meshCreator.meshType);
        GUILayoutOption[] emptyLayout = null;

        switch (meshCreator.meshType)
        {
        case MeshCreator.MeshType.Triangle:
            meshCreator.triangleVertex1 = EditorGUILayout.Vector2Field("First vertex", meshCreator.triangleVertex1);
            meshCreator.triangleVertex2 = EditorGUILayout.Vector2Field("Second vertex", meshCreator.triangleVertex2);
            meshCreator.triangleVertex3 = EditorGUILayout.Vector2Field("Third vertex", meshCreator.triangleVertex3);
            break;

        case MeshCreator.MeshType.Rectangle:
            meshCreator.boxSize = EditorGUILayout.Vector2Field("Size", meshCreator.boxSize);
            break;

        case MeshCreator.MeshType.Circle:
            meshCreator.circleRadius            = EditorGUILayout.Slider("Radius", meshCreator.circleRadius, 0.0001f, 16, null);
            meshCreator.circleSides             = EditorGUILayout.IntSlider("Sides", meshCreator.circleSides, 3, 128);
            meshCreator.circleUseCircleCollider = EditorGUILayout.Toggle("Use CircleCollider", meshCreator.circleUseCircleCollider);
            break;

        case MeshCreator.MeshType.Quadrangle:
            meshCreator.quadrangleVertex1 = EditorGUILayout.Vector3Field("First vertex", meshCreator.quadrangleVertex1);
            meshCreator.quadrangleVertex2 = EditorGUILayout.Vector3Field("Second vertex", meshCreator.quadrangleVertex2);
            meshCreator.quadrangleVertex3 = EditorGUILayout.Vector3Field("Third vertex", meshCreator.quadrangleVertex3);
            meshCreator.quadrangleVertex4 = EditorGUILayout.Vector3Field("Fourth vertex", meshCreator.quadrangleVertex4);
            break;

        case MeshCreator.MeshType.Ellipse:
            meshCreator.ellipseHorizontalRadius = EditorGUILayout.Slider("Horizontal Radius", meshCreator.ellipseHorizontalRadius, 0.0001f, 16, null);
            meshCreator.ellipseVerticalRadius   = EditorGUILayout.Slider("Vertical Radius", meshCreator.ellipseVerticalRadius, 0.0001f, 16, null);
            meshCreator.ellipseSides            = EditorGUILayout.IntSlider("Sides", meshCreator.ellipseSides, 3, 128);
            break;

        case MeshCreator.MeshType.PointedCircle:
            meshCreator.pointedCircleRadius = EditorGUILayout.Slider("Radius", meshCreator.pointedCircleRadius, 0.0001f, 16, null);
            meshCreator.pointedCircleSides  = EditorGUILayout.IntSlider("Sides", meshCreator.pointedCircleSides, 3, 128);
            meshCreator.pointedCircleShift  = EditorGUILayout.Vector2Field("Shift", meshCreator.pointedCircleShift);
            break;

        case MeshCreator.MeshType.Cake:
            meshCreator.cakeRadius      = EditorGUILayout.Slider("Radius", meshCreator.cakeRadius, 0.0001f, 16, null);
            meshCreator.cakeSides       = EditorGUILayout.IntSlider("Sides", meshCreator.cakeSides, 3, 128);
            meshCreator.cakeSidesToFill = EditorGUILayout.IntSlider("Sides to fill", meshCreator.cakeSidesToFill, 1, meshCreator.cakeSides);
            break;

        case MeshCreator.MeshType.Convex:
            convexPointList.Draw();
            break;

        case MeshCreator.MeshType.Star:
            meshCreator.starRadiusA = EditorGUILayout.Slider("Radius A", meshCreator.starRadiusA, 0.0001f, 16, null);
            meshCreator.starRadiusB = EditorGUILayout.Slider("Radius B", meshCreator.starRadiusB, 0.0001f, 16, null);
            meshCreator.starSides   = EditorGUILayout.IntSlider("Sides", meshCreator.starSides, 3, 128);
            break;

        case MeshCreator.MeshType.Gear:
            meshCreator.gearInnerRadius = EditorGUILayout.Slider("Inner radius", meshCreator.gearInnerRadius, 0.0001f, 16, null);
            meshCreator.gearRootRadius  = EditorGUILayout.Slider("Root radius", meshCreator.gearRootRadius, meshCreator.gearInnerRadius, meshCreator.gearOuterRadius, null);
            meshCreator.gearOuterRadius = EditorGUILayout.Slider("Outer radius", meshCreator.gearOuterRadius, meshCreator.gearRootRadius, 16, null);
            meshCreator.gearSides       = EditorGUILayout.IntSlider("Sides", meshCreator.gearSides, 3, 128);
            break;

        case MeshCreator.MeshType.Line:
            meshCreator.lineWidth             = EditorGUILayout.Slider("Line width", meshCreator.lineWidth, 0.0001f, 1f, null);
            meshCreator.lineUseDoubleCollider = EditorGUILayout.Toggle("Use double collider", meshCreator.lineUseDoubleCollider, emptyLayout);
            linePointsList.Draw();
            break;

        case MeshCreator.MeshType.TriangulatedMesh:
            triangulatedPointList.Draw();
            break;

        case MeshCreator.MeshType.SplineShape:
            splineShapePointList.Draw();
            var points = CatmullRomSpline.GetPoints(meshCreator.splinePoints.ToArray(), meshCreator.splineResolution);
            DrawSplineInspector(meshCreator, points, true);
            break;

        case MeshCreator.MeshType.SplineCurve:
            splineCurvePointList.Draw();
            meshCreator.splineCurveWidth             = EditorGUILayout.Slider("Width", meshCreator.splineCurveWidth, 0.0001f, 5f);
            meshCreator.splineCurveUseDoubleCollider = EditorGUILayout.Toggle("Use double collider",
                                                                              meshCreator.splineCurveUseDoubleCollider);
            DrawSplineInspector(meshCreator, CatmullRomSpline.GetPoints(meshCreator.splineCurvePoints, meshCreator.splineResolution, false), false);
            break;

        case MeshCreator.MeshType.SplineConvexShape:
            convexSplinePointList.Draw();
            List <Vector2> splineConvexPoints = ConvexHull.QuickHull(meshCreator.convexSplinePoints);
            splineConvexPoints = CatmullRomSpline.GetPoints(splineConvexPoints, meshCreator.splineResolution, true);
            DrawSplineInspector(meshCreator, splineConvexPoints, true);
            break;

        default:
            throw new System.ArgumentOutOfRangeException();
        }

        SceneView.RepaintAll();
    }
Beispiel #2
0
    void OnDrawGizmos()
    {
        Gizmos.color = Color.white;

        //cache position
        Vector2 p2 = transform.position;

        Vector2 lastPos;
        float   angleDelta;
        float   angleShift;

        switch (meshType)
        {
        case MeshType.Triangle:
            Gizmos.DrawLine(p2 + triangleVertex1, p2 + triangleVertex2);
            Gizmos.DrawLine(p2 + triangleVertex2, p2 + triangleVertex3);
            Gizmos.DrawLine(p2 + triangleVertex3, p2 + triangleVertex1);
            break;

        case MeshType.Rectangle:
            Gizmos.DrawLine(p2 + new Vector2(-boxSize.x / 2, -boxSize.y / 2), p2 + new Vector2(boxSize.x / 2, -boxSize.y / 2));
            Gizmos.DrawLine(p2 + new Vector2(boxSize.x / 2, -boxSize.y / 2), p2 + new Vector2(boxSize.x / 2, boxSize.y / 2));
            Gizmos.DrawLine(p2 + new Vector2(boxSize.x / 2, boxSize.y / 2), p2 + new Vector2(-boxSize.x / 2, boxSize.y / 2));
            Gizmos.DrawLine(p2 + new Vector2(-boxSize.x / 2, boxSize.y / 2), p2 + new Vector2(-boxSize.x / 2, -boxSize.y / 2));
            break;

        case MeshType.Circle:
            lastPos    = Vector2.right * circleRadius;
            angleDelta = 360 * Mathf.Deg2Rad / circleSides;
            for (int i = 1; i < circleSides + 1; i++)
            {
                var vertPos = new Vector2(Mathf.Cos(i * angleDelta), Mathf.Sin(i * angleDelta)) * circleRadius;
                Gizmos.DrawLine(p2 + lastPos, p2 + vertPos);
                lastPos = vertPos;
            }
            break;

        case MeshType.Quadrangle:
            Gizmos.DrawLine(p2 + quadrangleVertex1, p2 + quadrangleVertex2);
            Gizmos.DrawLine(p2 + quadrangleVertex2, p2 + quadrangleVertex3);
            Gizmos.DrawLine(p2 + quadrangleVertex3, p2 + quadrangleVertex4);
            Gizmos.DrawLine(p2 + quadrangleVertex4, p2 + quadrangleVertex1);
            break;

        case MeshType.Ellipse:
            lastPos    = Vector2.right * ellipseHorizontalRadius;
            angleDelta = 360 * Mathf.Deg2Rad / ellipseSides;
            for (int i = 1; i < ellipseSides + 1; i++)
            {
                var vertPos = new Vector2(Mathf.Cos(i * angleDelta) * ellipseHorizontalRadius, Mathf.Sin(i * angleDelta) * ellipseVerticalRadius);
                Gizmos.DrawLine(p2 + lastPos, p2 + vertPos);
                lastPos = vertPos;
            }
            break;

        case MeshType.PointedCircle:
            lastPos    = Vector2.right * pointedCircleRadius;
            angleDelta = 360 * Mathf.Deg2Rad / pointedCircleSides;
            for (int i = 1; i < pointedCircleSides + 1; i++)
            {
                var vertPos = new Vector2(Mathf.Cos(i * angleDelta), Mathf.Sin(i * angleDelta)) * pointedCircleRadius;
                Gizmos.DrawLine(p2 + lastPos, p2 + vertPos);
                lastPos = vertPos;
            }

            float angle = Mathf.Atan2(pointedCircleShift.y, pointedCircleShift.x);

            Vector2 a = new Vector2(Mathf.Cos(angle + Mathf.Deg2Rad * 90), Mathf.Sin(angle + Mathf.Deg2Rad * 90)) * pointedCircleRadius;
            Vector2 b = new Vector2(Mathf.Cos(angle - Mathf.Deg2Rad * 90), Mathf.Sin(angle - Mathf.Deg2Rad * 90)) * pointedCircleRadius;

            Gizmos.DrawLine(p2 + a, p2 + pointedCircleShift);
            Gizmos.DrawLine(p2 + pointedCircleShift, p2 + b);
            Gizmos.DrawLine(p2 + b, p2 + a);
            break;

        case MeshType.Cake:
            lastPos    = Vector2.right * cakeRadius;
            angleDelta = 360 * Mathf.Deg2Rad / cakeSides;
            for (int i = 1; i < cakeSidesToFill + 1; i++)
            {
                var vertPos = new Vector2(Mathf.Cos(i * angleDelta), Mathf.Sin(i * angleDelta)) * cakeRadius;
                Gizmos.DrawLine(p2 + lastPos, p2 + vertPos);
                lastPos = vertPos;
            }
            if (cakeSidesToFill != cakeSides)
            {
                Gizmos.DrawLine(p2, p2 + lastPos);
                Gizmos.DrawLine(p2, p2 + Vector2.right * cakeRadius);
            }

            break;

        case MeshType.Convex:
            if (convexPoints != null && convexPoints.Count < 2)
            {
                return;
            }
            var convexOutline = ConvexHull.QuickHull(convexPoints);
            for (int i = 0; i < convexOutline.Count; i++)
            {
                Gizmos.DrawLine(p2 + convexOutline[i], p2 + convexOutline[(i + 1) % convexOutline.Count]);
            }
            break;

        case MeshType.Star:
            angleDelta = 360 / (float)starSides / 2 * Mathf.Deg2Rad;
            angleShift = -360f / (starSides * 4) * Mathf.Deg2Rad;
            lastPos    = new Vector3(Mathf.Cos(angleShift), Mathf.Sin(angleShift)) * starRadiusA;
            for (int i = 1; i < starSides * 2 + 1; i++)
            {
                var vertPos = new Vector2(Mathf.Cos(i * angleDelta + angleShift),
                                          Mathf.Sin(i * angleDelta + angleShift));
                vertPos *= (i % 2 == 0 ? starRadiusA : starRadiusB);
                Gizmos.DrawLine(p2 + lastPos, p2 + vertPos);
                lastPos = vertPos;
            }
            break;

        case MeshType.Gear:
            angleDelta = 360 * Mathf.Deg2Rad / gearSides / 2;
            angleShift = angleDelta * 0.5f;
            float   outerAngleShift = angleDelta * 0.2f;
            Vector2 lastInnerPos    = new Vector2(Mathf.Cos(angleShift), Mathf.Sin(angleShift)) * gearInnerRadius;
            Vector2 lastRootPos     = new Vector2(Mathf.Cos(angleShift), Mathf.Sin(angleShift)) * gearRootRadius;
            Vector2 lastOuterPos    = new Vector2(Mathf.Cos(angleShift + outerAngleShift), Mathf.Sin(angleShift + outerAngleShift)) * gearOuterRadius;
            for (int i = 1; i < gearSides * 2 + 1; i++)
            {
                var vertPos = new Vector2(Mathf.Cos(i * angleDelta + angleShift), Mathf.Sin(i * angleDelta + angleShift)) * gearInnerRadius;
                Gizmos.DrawLine(p2 + lastInnerPos, p2 + vertPos);
                lastInnerPos = vertPos;

                vertPos = new Vector3(Mathf.Cos(i * angleDelta + angleShift), Mathf.Sin(i * angleDelta + angleShift)) * gearRootRadius;
                Gizmos.DrawLine(p2 + lastRootPos, p2 + vertPos);
                lastRootPos = vertPos;

                int sign = (i % 2) * 2 - 1;
                vertPos = new Vector3(Mathf.Cos(i * angleDelta + angleShift - outerAngleShift * sign), Mathf.Sin(i * angleDelta + angleShift - outerAngleShift * sign)) * gearOuterRadius;
                Gizmos.DrawLine(p2 + lastRootPos, p2 + vertPos);
                if (i % 2 == 1)
                {
                    Gizmos.DrawLine(p2 + lastOuterPos, p2 + vertPos);
                }
                lastOuterPos = vertPos;
            }
            break;

        case MeshType.Line:
            for (int i = 0; i < linePoints.Count - 1; i++)
            {
                Gizmos.DrawLine(p2 + linePoints[i], p2 + linePoints[i + 1]);
            }

            if (linePoints.Count < 2 || lineWidth <= 0.0001f)
            {
                return;
            }

            Vector2[] points = GetLinePoints();
            for (int i = 0; i < points.Length - 1; i++)
            {
                Gizmos.DrawLine(p2 + points[i], p2 + points[i + 1]);
            }
            break;

        case MeshType.TriangulatedMesh:
            for (int i = 0; i < triangulatedPoints.Count; i++)
            {
                Gizmos.DrawLine(p2 + triangulatedPoints[i],
                                p2 + triangulatedPoints[(i + 1) % triangulatedPoints.Count]);
            }
            break;

        case MeshType.SplineShape:
            List <Vector2> shapePoints = CatmullRomSpline.GetPoints(splinePoints.ToArray(), splineResolution);
            shapePoints = SimplifySplinePoints(shapePoints, true);
            for (int i = 0; i < shapePoints.Count; i++)
            {
                Gizmos.DrawLine(p2 + shapePoints[i], p2 + shapePoints[(i + 1) % shapePoints.Count]);
            }
            break;

        case MeshType.SplineCurve:
            List <Vector2> curvePoints = CatmullRomSpline.GetPoints(splineCurvePoints, splineResolution, false);
            curvePoints = SimplifySplinePoints(curvePoints, false);
            int len = curvePoints.Count;
            if (len <= 1)
            {
                return;
            }

            for (int i = 0; i < len - 1; i++)
            {
                Gizmos.DrawLine(p2 + curvePoints[i], p2 + curvePoints[i + 1]);
            }

            List <Vector2> leftCurvePoints  = new List <Vector2>();
            List <Vector2> rightCurvePoints = new List <Vector2>();
            // first vertex
            {
                Vector2 dir = (curvePoints[1] - curvePoints[0]).normalized;
                dir = new Vector2(-dir.y, dir.x) * splineCurveWidth;
                Gizmos.DrawLine(p2 + curvePoints[0] - dir, p2 + curvePoints[0] + dir);
                leftCurvePoints.Add(p2 + curvePoints[0] - dir);
                rightCurvePoints.Add(p2 + curvePoints[0] + dir);
            }
            // second to last - 1 vertices
            for (int i = 1; i < len - 1; i++)
            {
                float   leftAngle   = Mathf.Atan2(curvePoints[i].y - curvePoints[i - 1].y, curvePoints[i].x - curvePoints[i - 1].x) * Mathf.Rad2Deg + 90;
                float   rightAngle  = Mathf.Atan2(curvePoints[i + 1].y - curvePoints[i].y, curvePoints[i + 1].x - curvePoints[i].x) * Mathf.Rad2Deg + 90;
                float   middleAngle = leftAngle + Mathf.DeltaAngle(leftAngle, rightAngle) * 0.5f;
                Vector2 dir         = new Vector2(Mathf.Cos(middleAngle * Mathf.Deg2Rad), Mathf.Sin(middleAngle * Mathf.Deg2Rad)) * splineCurveWidth;
                //Gizmos.DrawLine(p2 + curvePoints[i] - dir, p2 + curvePoints[i] + dir);
                leftCurvePoints.Add(p2 + curvePoints[i] - dir);
                rightCurvePoints.Add(p2 + curvePoints[i] + dir);
            }
            // last vertex
            {
                Vector2 dir = (curvePoints[len - 2] - curvePoints[len - 1]).normalized;
                dir = new Vector2(-dir.y, dir.x) * splineCurveWidth;
                Gizmos.DrawLine(p2 + curvePoints[len - 1] - dir, p2 + curvePoints[len - 1] + dir);
                leftCurvePoints.Add(p2 + curvePoints[len - 1] + dir);
                rightCurvePoints.Add(p2 + curvePoints[len - 1] - dir);
            }

            for (int i = 0; i < leftCurvePoints.Count - 1; i++)
            {
                Gizmos.DrawLine(leftCurvePoints[i], leftCurvePoints[i + 1]);
            }
            for (int i = 0; i < rightCurvePoints.Count - 1; i++)
            {
                Gizmos.DrawLine(rightCurvePoints[i], rightCurvePoints[i + 1]);
            }
            break;

        case MeshType.SplineConvexShape:
            List <Vector2> splineConvexPoints = ConvexHull.QuickHull(convexSplinePoints);
            splineConvexPoints = CatmullRomSpline.GetPoints(splineConvexPoints, splineResolution);
            splineConvexPoints = SimplifySplinePoints(splineConvexPoints, true);
            for (int i = 0; i < splineConvexPoints.Count; i++)
            {
                Gizmos.DrawLine(p2 + splineConvexPoints[i], p2 + splineConvexPoints[(i + 1) % splineConvexPoints.Count]);
            }
            break;

        default:
            throw new System.ArgumentOutOfRangeException();
        }
    }