public static void TriangulateHorizontalMegaQuad(MeshGenerator mesh, Vector3 workingZero, int materialIndex, int colorIndex, bool flat = false)
    {
        vertexA = workingZero + Metrics.CornerFromIndex[0];
        vertexB = workingZero + Metrics.CornerFromIndex[1];
        vertexC = workingZero + Metrics.CornerFromIndex[2];
        vertexD = workingZero + Metrics.CornerFromIndex[3];

        uvA = new Vector2(1, 1);
        uvB = new Vector2(1, 0);
        uvC = new Vector2(0, 0);
        uvD = new Vector2(0, 1);

        if (flat == true)
        {
            mesh.AddTriangleUnperturbed(Metrics.PerturbFlat(vertexA), Metrics.PerturbFlat(vertexB), Metrics.PerturbFlat(vertexC));
            mesh.AddTriangleUnperturbed(Metrics.PerturbFlat(vertexC), Metrics.PerturbFlat(vertexD), Metrics.PerturbFlat(vertexA));
        }
        else
        {
            mesh.AddTriangle(vertexA, vertexB, vertexC);
            mesh.AddTriangle(vertexC, vertexD, vertexA);
        }


        mesh.AddTriangleUV(uvA, uvB, uvC);
        mesh.AddTriangleUV(uvC, uvD, uvA);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }
    public static void TriangulateBarMegaQuad(MeshGenerator mesh, Vector3 workingZero, float height, float offset, int cornerIndexA, int cornerIndexB)
    {
        offset -= 0.1f;
        float scale = 0.25f;

        vertexA = (workingZero + (Metrics.CornerFromIndex[cornerIndexA] * scale)) + (Vector3.up * offset);
        vertexB = (workingZero + (Metrics.CornerFromIndex[cornerIndexB] * scale)) + (Vector3.up * offset);
        vertexC = new Vector3(vertexA.x, height, vertexA.z) + (Vector3.up * offset);
        vertexD = new Vector3(vertexB.x, height, vertexB.z) + (Vector3.up * offset);

        uvA = new Vector2(0.5f + (scale / 2f), height);
        uvB = new Vector2(0.5f - (scale / 2f), height);
        uvC = new Vector2(0.5f + (scale / 2f), 0.5f - (scale / 2f));
        uvD = new Vector2(0.5f - (scale / 2f), 0.5f - (scale / 2f));

        mesh.AddTriangle(vertexC, vertexB, vertexA);
        mesh.AddTriangle(vertexD, vertexB, vertexC);

        mesh.AddTriangleUV(uvC, uvB, uvA);
        mesh.AddTriangleUV(uvD, uvB, uvC);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[(int)MatI.Boards]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[(int)MatI.Boards]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[(int)ColI.Black]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[(int)ColI.Black]);
    }
    public static void TriangulateGrateMegaQuad(MeshGenerator mesh, Vector3 workingZero, int materialIndex, int colorIndex, int cornerIndexA, int cornerIndexB)
    {
        float horizontalScale = 0.5f;
        float verticalScale   = 0.5f;
        float height          = Metrics.trimHeight * verticalScale;
        float offset          = -height;

        #region TriangulateHorizontalMegaQuad

        vertexA = (workingZero + Metrics.CornerFromIndex[cornerIndexA]);
        vertexB = (workingZero + (Metrics.CornerFromIndex[cornerIndexA] * horizontalScale));
        vertexC = (workingZero + (Metrics.CornerFromIndex[cornerIndexB] * horizontalScale));
        vertexD = (workingZero + Metrics.CornerFromIndex[cornerIndexB]);

        uvA = new Vector2(1, 1);
        uvB = new Vector2(0.75f, 0.25f);
        uvC = new Vector2(0.25f, 0.25f);
        uvD = new Vector2(0, 1);

        mesh.AddTriangle(vertexA, vertexB, vertexC);
        mesh.AddTriangle(vertexC, vertexD, vertexA);

        mesh.AddTriangleUV(uvA, uvB, uvC);
        mesh.AddTriangleUV(uvC, uvD, uvA);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);

        #endregion

        #region TriangulateReverseVerticalMegaQuad

        vertexA = (workingZero + (Metrics.CornerFromIndex[cornerIndexA] * horizontalScale)) + (Vector3.up * offset);
        vertexB = (workingZero + (Metrics.CornerFromIndex[cornerIndexB] * horizontalScale)) + (Vector3.up * offset);
        vertexC = new Vector3(vertexA.x, height, vertexA.z) + (Vector3.up * offset);
        vertexD = new Vector3(vertexB.x, height, vertexB.z) + (Vector3.up * offset);

        uvA = new Vector2(1, height - offset);
        uvB = new Vector2(verticalScale, height - offset);
        uvC = new Vector2(1, verticalScale);
        uvD = new Vector2(verticalScale, verticalScale);

        mesh.AddTriangle(vertexC, vertexB, vertexD);
        mesh.AddTriangle(vertexA, vertexB, vertexC);

        mesh.AddTriangleUV(uvC, uvB, uvD);
        mesh.AddTriangleUV(uvA, uvB, uvC);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);

        #endregion
    }
Exemplo n.º 4
0
    public static GameObject CreateCompass(float Radius = 5f, float Thickness = 0.5f, float ArrowSize = 2f, int NCirclePoints = 40)
    {
        GameObject   go = new GameObject("Compass");
        MeshFilter   mf = go.AddComponent <MeshFilter>();
        MeshRenderer mr = go.AddComponent <MeshRenderer>();

        List <Vector3> outerCirclePoints =
            Enumerable.Range(0, NCirclePoints + 1)
            .Select(i => new Vector3(Mathf.Sin(2 * Mathf.PI * i / NCirclePoints), 0f, Mathf.Cos(2 * Mathf.PI * i / NCirclePoints)))
            .Select(v => (.5f * Thickness + Radius) * v)
            .ToList();

        List <Vector3> innerCirclePoints =
            Enumerable.Range(0, NCirclePoints + 1)
            .Select(i => new Vector3(Mathf.Sin(2 * Mathf.PI * i / NCirclePoints), 0f, Mathf.Cos(2 * Mathf.PI * i / NCirclePoints)))
            .Select(v => (-0.5f * Thickness + Radius) * v)
            .ToList();

        MeshGenerator mg = new MeshGenerator();

        for (int i = 0; i < NCirclePoints; i++)
        {
            mg.AddRectangle(outerCirclePoints[i + 1], outerCirclePoints[i], innerCirclePoints[i], innerCirclePoints[i + 1]);
            mg.AddRectangle(outerCirclePoints[i], outerCirclePoints[i + 1], innerCirclePoints[i + 1], innerCirclePoints[i]);
        }

        float[] Sizes = new float[] { 3f / 2, 1f / 3, 1f / 2, 1f / 3, 1f / 2, 1f / 3, 1f / 2, 1f / 3 };

        for (int i = 0; i < Sizes.Length; i++)
        {
            float angle     = 2 * Mathf.PI * i / Sizes.Length;
            float something = Mathf.PI * 2 / 40;

            Vector3 center = Radius * new Vector3(Mathf.Sin(angle), 0f, Mathf.Cos(angle));
            Vector3 tip    = ((Radius + Sizes[i] * ArrowSize) / Radius) * center;

            Vector3 left  = Radius * new Vector3(Mathf.Sin(angle + something), 0f, Mathf.Cos(angle + something));
            Vector3 right = Radius * new Vector3(Mathf.Sin(angle - something), 0f, Mathf.Cos(angle - something));

            mg.AddTriangle(left, tip, right);
            mg.AddTriangle(left, right, tip);
        }



        mf.mesh = mg.GetMesh();

        return(go);
    }
    public static void TriangulateHorizontalQuad(MeshGenerator mesh, Vector3 workingZero, int colorIndex)
    {
        vertexA = workingZero + Metrics.CornerFromIndex[0];
        vertexB = workingZero + Metrics.CornerFromIndex[1];
        vertexC = workingZero + Metrics.CornerFromIndex[2];
        vertexD = workingZero + Metrics.CornerFromIndex[3];

        uvA = new Vector2(1, 1);
        uvB = new Vector2(1, 0);
        uvC = new Vector2(0, 0);
        uvD = new Vector2(0, 1);

        mesh.AddTriangle(vertexA, vertexB, vertexC);
        mesh.AddTriangle(vertexC, vertexD, vertexA);

        mesh.AddTriangleUV(uvA, uvB, uvC);
        mesh.AddTriangleUV(uvC, uvD, uvA);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }
    public static void TriangulateReverseVerticalMegaQuad(MeshGenerator mesh, Vector3 workingZero, float height, float offset, int materialIndex, int colorIndex, int cornerIndexA, int cornerIndexB)
    {
        vertexA = (workingZero + Metrics.CornerFromIndex[cornerIndexA]) + (Vector3.up * offset);
        vertexB = (workingZero + Metrics.CornerFromIndex[cornerIndexB]) + (Vector3.up * offset);
        vertexC = new Vector3(vertexA.x, height, vertexA.z) + (Vector3.up * offset);
        vertexD = new Vector3(vertexB.x, height, vertexB.z) + (Vector3.up * offset);

        uvA = new Vector2(1, height - offset);
        uvB = new Vector2(0, height - offset);
        uvC = new Vector2(1, 0);
        uvD = new Vector2(0, 0);

        mesh.AddTriangle(vertexC, vertexB, vertexD);
        mesh.AddTriangle(vertexA, vertexB, vertexC);

        mesh.AddTriangleUV(uvC, uvB, uvD);
        mesh.AddTriangleUV(uvA, uvB, uvC);

        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);
        mesh.AddTriangleTextureProperties(Metrics.megaSurface.properties[materialIndex]);

        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
    }
    public static void TriangulateGrassPoints(MeshGenerator mesh, Vector3 workingZero, int colorIndex)
    {
        if (mesh.isPointCloud == true)
        {
            Vector3 vertex = workingZero;
            mesh.AddPoint(vertex, Metrics.megaSurface.colors[colorIndex]);

            for (int i = 0; i < 8; i++)
            {
                vertex = workingZero + (Metrics.CornerFromDirection[i] * 0.6667f);
                mesh.AddPoint(vertex, Metrics.megaSurface.colors[colorIndex]);
            }
        }
        else
        {
            vertexA = workingZero + (Metrics.CornerFromIndex[0] * 0.5f);
            vertexB = workingZero + (Metrics.CornerFromIndex[1] * 0.5f);
            vertexC = workingZero + (Metrics.CornerFromIndex[2] * 0.5f);

            mesh.AddTriangle(vertexA, vertexB, vertexC);
            mesh.AddTriangleColor(Metrics.megaSurface.colors[colorIndex]);
        }
    }
Exemplo n.º 8
0
    public static Mesh GeneratePrysmMesh(Settings settings, Vector3 shift)
    {
        var   mesh       = new MeshGenerator("Prysm");
        int   segments   = settings.edgeCount;
        float startAngle = settings.startAngle / 180f * Mathf.PI;

        Vector3[] sideNormals  = new Vector3[segments + 1];
        Vector3[] topPoints    = new Vector3[segments + 1];
        Vector3[] bottomPoints = new Vector3[segments + 1];
        for (int i = 0; i < topPoints.Length; i++)
        {
            float angleInRad = 2f * Mathf.PI / (float)segments * (float)i + startAngle;
            float angleOfNormalInRad;
            if (settings.smoothNormals)
            {
                angleOfNormalInRad = 2f * Mathf.PI / (float)segments * (float)(i) + startAngle;
            }
            else
            {
                angleOfNormalInRad = 2f * Mathf.PI / (float)segments * (float)(i + 0.5f) + startAngle;
            }
            topPoints[i]    = new Vector3(Mathf.Sin(angleInRad), 0, Mathf.Cos(angleInRad)) * settings.radius + shift;
            bottomPoints[i] = topPoints[i] + new Vector3(0, -settings.depth);
            sideNormals[i]  = new Vector3(Mathf.Sin(angleOfNormalInRad), 0, Mathf.Cos(angleOfNormalInRad));
        }
        Vector3 topCenter    = shift;
        Vector3 bottomCenter = shift + new Vector3(0, -settings.depth);

        for (int i = 0; i < segments; i++)
        {
            mesh.AddTriangle(topCenter, topPoints[i], topPoints[i + 1]);
        }
        if (settings.depth != 0)
        {
            for (int i = 0; i < segments; i++)
            {
                if (settings.smoothNormals)
                {
                    mesh.AddQuad(
                        topPoints[i + 1],
                        topPoints[i],
                        bottomPoints[i],
                        bottomPoints[i + 1],
                        sideNormals[i + 1],
                        sideNormals[i],
                        sideNormals[i],
                        sideNormals[i + 1]
                        );
                }
                else
                {
                    mesh.AddQuad(
                        topPoints[i + 1],
                        topPoints[i],
                        bottomPoints[i],
                        bottomPoints[i + 1],
                        sideNormals[i]
                        );
                }
            }
        }
        for (int i = 0; i < segments; i++)
        {
            mesh.AddTriangle(bottomCenter, bottomPoints [i + 1], bottomPoints [i]);
        }
        return(mesh.Generate());
    }