Exemplo n.º 1
0
    public override void Embody()
    {
        float[] triangleAreas = new float[tris.count / 3];

        int[]   triData  = tris.GetIntData();
        float[] vertData = verts.GetFloatData();

        float totalArea = 0;

        int tri0;
        int tri1;
        int tri2;

        for (int i = 0; i < tris.count / 3; i++)
        {
            tri0 = i * 3;
            tri1 = tri0 + 1;
            tri2 = tri0 + 2;

            tri0 = triData[tri0];
            tri1 = triData[tri1];
            tri2 = triData[tri2];

            float area = 1;

            Vector3 p0 = extractToVector(tri0, 0, vertData, verts);
            Vector3 p1 = extractToVector(tri1, 0, vertData, verts);
            Vector3 p2 = extractToVector(tri2, 0, vertData, verts);

            if (noiseType == "even")
            {
                area = HELP.AreaOfTriangle(p0, p1, p2);
            }
            else if (noiseType == "fractal")
            {
                area = HELP.NoiseTriangleArea(noiseSize, p0, p1, p2);
                area = Mathf.Pow(area, 10);
            }

            triangleAreas[i] = area;
            totalArea       += area;
        }

        for (int i = 0; i < triangleAreas.Length; i++)
        {
            triangleAreas[i] /= totalArea;
        }

        float[] values = new float[count * structSize];

        int index = 0;


        Vector3 pos;
        //Vector3 uv;
        //Vector3 tan;
        //Vector3 nor;
        int baseTri;

        for (int i = 0; i < count; i++)
        {
            baseTri = 3 * HELP.getTri(Random.value, triangleAreas);

            tri0 = baseTri + 0;
            tri1 = baseTri + 1;
            tri2 = baseTri + 2;

            tri0 = triData[tri0];
            tri1 = triData[tri1];
            tri2 = triData[tri2];

            Vector3 v0 = extractToVector(tri0, 0, vertData, verts);
            Vector3 v1 = extractToVector(tri1, 0, vertData, verts);
            Vector3 v2 = extractToVector(tri2, 0, vertData, verts);

            pos = HELP.GetRandomPointInTriangle(i, v0, v1, v2);

            float a0 = HELP.AreaOfTriangle(pos, v1, v2);
            float a1 = HELP.AreaOfTriangle(pos, v0, v2);
            float a2 = HELP.AreaOfTriangle(pos, v0, v1);

            float aTotal = a0 + a1 + a2;

            float p0 = a0 / aTotal;
            float p1 = a1 / aTotal;
            float p2 = a2 / aTotal;


            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;


            values[index++] = (float)i / (float)count;

            values[index++] = tri0;
            values[index++] = tri1;
            values[index++] = tri2;

            values[index++] = p0;
            values[index++] = p1;
            values[index++] = p2;

            values[index++] = 1;
            values[index++] = 0;
            values[index++] = 0;
        }


        SetData(values);
    }
Exemplo n.º 2
0
    public override void Embody()
    {
        float[] triangleAreas = new float[tris.count / 3];

        int[]   triData  = tris.GetIntData();
        float[] vertData = verts.GetFloatData();

        float totalArea = 0;

        int tri0;
        int tri1;
        int tri2;

        for (int i = 0; i < tris.count / 3; i++)
        {
            tri0 = i * 3;
            tri1 = tri0 + 1;
            tri2 = tri0 + 2;

            tri0 = triData[tri0];
            tri1 = triData[tri1];
            tri2 = triData[tri2];

            float area = 1;

            Vector3 p0  = extractToVector(tri0, 0, vertData, verts);
            Vector3 p1  = extractToVector(tri1, 0, vertData, verts);
            Vector3 p2  = extractToVector(tri2, 0, vertData, verts);
            Vector2 uv0 = extractToVector2(tri0, 12, vertData, verts);
            Vector2 uv1 = extractToVector2(tri1, 12, vertData, verts);
            Vector2 uv2 = extractToVector2(tri2, 12, vertData, verts);



            if (noiseType == NoiseType.MiddleBand)
            {
                float Y = 1 - ((1 - uv0.y) + (1 - uv1.y) + (1 - uv2.y)) / 3;
                area  = Mathf.Clamp(Mathf.Min(Y * 2, (1 - Y)) * 4.5f, 0, 4); //((1-uv0.y) + (1-uv1.y) + (1-uv2.y) ) / 3;
                area *= area * area;                                         // * area * area*area;
            }
            else if (noiseType == NoiseType.CenterOut)
            {
            }
            else if (noiseType == NoiseType.Even)
            {
                float Y = 1 - ((1 - uv0.y) + (1 - uv1.y) + (1 - uv2.y)) / 3;
                area = Y;
            }
            else if (noiseType == NoiseType.OuterRing)
            {
                float Y = 1 - ((1 - uv0.y) + (1 - uv1.y) + (1 - uv2.y)) / 3;
                area = Y * Y;
            }



            triangleAreas[i] = area;
            totalArea       += area;
        }

        for (int i = 0; i < triangleAreas.Length; i++)
        {
            triangleAreas[i] /= totalArea;
        }

        float[] values = new float[count * structSize];

        int index = 0;


        Vector3 pos;
        //Vector3 uv;
        //Vector3 tan;
        //Vector3 nor;
        int baseTri;

        for (int i = 0; i < count; i++)
        {
            baseTri = 3 * HELP.getTri(Random.value, triangleAreas);

            if (specialInCenter && i == 0)
            {
                baseTri = 0;
            }

            tri0 = baseTri + 0;
            tri1 = baseTri + 1;
            tri2 = baseTri + 2;

            tri0 = triData[tri0];
            tri1 = triData[tri1];
            tri2 = triData[tri2];

            Vector3 v0 = extractToVector(tri0, 0, vertData, verts);
            Vector3 v1 = extractToVector(tri1, 0, vertData, verts);
            Vector3 v2 = extractToVector(tri2, 0, vertData, verts);

            pos = HELP.GetRandomPointInTriangle(i, v0, v1, v2);

            float a0 = HELP.AreaOfTriangle(pos, v1, v2);
            float a1 = HELP.AreaOfTriangle(pos, v0, v2);
            float a2 = HELP.AreaOfTriangle(pos, v0, v1);

            float aTotal = a0 + a1 + a2;

            float p0 = a0 / aTotal;
            float p1 = a1 / aTotal;
            float p2 = a2 / aTotal;


            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;
            values[index++] = 0;

            values[index++] = 0;
            values[index++] = 0;


            values[index++] = (float)i / (float)count;

            values[index++] = tri0;
            values[index++] = tri1;
            values[index++] = tri2;

            values[index++] = p0;
            values[index++] = p1;
            values[index++] = p2;

            values[index++] = 1;

            if (specialInCenter)
            {
                values[index++] = 1;
            }
            else
            {
                values[index++] = triangleAreas[baseTri / 3] * 1000;
            }
            values[index++] = 0;
        }


        SetData(values);
    }
Exemplo n.º 3
0
    public override void Embody()
    {
        print("EMBOZ");

        triVals        = tris.GetIntData();
        connections    = new int[count][][];
        numConnections = new int[count];
        int maxConnections = 0;

        for (int i = 0; i < connections.Length; i++)
        {
            connections[i] = new int[16][];
            for (int j = 0; j < connections[i].Length; j++)
            {
                connections[i][j] = new int[3];
            }
        }


        for (int i = 0; i < triVals.Length / 3; i++)
        {
            int t1 = triVals[i * 3 + 0];
            int t2 = triVals[i * 3 + 1];
            int t3 = triVals[i * 3 + 2];

            AddConnection(t1, t2, t3);
            AddConnection(t2, t3, t1);
            AddConnection(t3, t1, t2);
        }

        Vector3[] pos = verts.mesh.vertices;

        for (int i = 0; i < count; i++)
        {
            for (int j = 0; j < count; j++)
            {
                // means it is same vert
                if (pos[i].x == pos[j].x && pos[i].y == pos[j].y && pos[i].z == pos[j].z)
                {
                    for (int k = 0; k < 16; k++)
                    {
                        AddConnection(i, connections[j][k][0], connections[j][k][1]);
                    }
                }
            }
        }

        float[] values = new float[count * structSize];



        for (int i = 0; i < count; i++)
        {
            if (numConnections[i] > maxConnections)
            {
                maxConnections = numConnections[i];
            }

            for (int j = 0; j < numConnections[i]; j++)
            {
                values[i * structSize + 20 + j * 3 + 0] = connections[i][j][0];
                values[i * structSize + 20 + j * 3 + 1] = connections[i][j][1];
                values[i * structSize + 20 + j * 3 + 2] = connections[i][j][2];
            }
        }

//    print( "MAX CONNECTION : " + maxConnections );

        SetData(values);
    }