Exemplo n.º 1
0
    public static Mesh createSurfaceMesh(PlanetData planet)
    {
        Stopwatch sw = new Stopwatch();

        sw.Start();

        int size = planet.triangles.Length;

        int[]     triangles = new int[size * 3];
        Color32[] colors    = new Color32[size * 3];
        Vector3[] points    = new Vector3[size * 3];

        for (int i = 0; i < size; i++)
        {
            points[3 * i]     = planet.points[planet.triangles[i].v1].point * (planet.points[planet.triangles[i].v1].height + 1) * planet.scale;
            points[3 * i + 1] = planet.points[planet.triangles[i].v2].point * (planet.points[planet.triangles[i].v2].height + 1) * planet.scale;
            points[3 * i + 2] = planet.points[planet.triangles[i].v3].point * (planet.points[planet.triangles[i].v3].height + 1) * planet.scale;

            var   biomeID = PlanetEx.biomeIndexOfTriangle(planet, i);
            Color biomeColor;
            if (biomeID < 0)
            {
                biomeColor = new Color(255, 255, 255);
            }
            else
            {
                biomeColor = planet.biomes[biomeID].color;
            }
            colors[3 * i]     = biomeColor;
            colors[3 * i + 1] = biomeColor;
            colors[3 * i + 2] = biomeColor;
        }

        for (int i = 0; i < size * 3; i++)
        {
            triangles[i] = i;
        }

        Mesh m = new Mesh();

        m.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
        m.vertices    = points;
        m.colors32    = colors;
        m.triangles   = triangles;
        m.RecalculateNormals();
        m.RecalculateTangents();
        m.RecalculateBounds();

        sw.Stop();
        UnityEngine.Debug.Log("Elapsed renderer " + sw.Elapsed);

        return(m);
    }
Exemplo n.º 2
0
    static void makeStructures(PlanetData planet, IRandomGenerator gen)
    {
        planet.structuresPrefabs = new List <GameObject>();
        planet.structures        = new List <StructureInfo>();

        int[] structStartIndex = new int[planet.biomes.Length];
        for (int i = 0; i < planet.biomes.Length; i++)
        {
            structStartIndex[i] = planet.structuresPrefabs.Count;

            foreach (var s in planet.biomes[i].structures)
            {
                planet.structuresPrefabs.Add(s.prefab);
            }
        }

        var dAngle = new UniformFloatDistribution(0, 360.0f);

        for (int i = 0; i < planet.triangles.Length; i++)
        {
            int biomeId = PlanetEx.biomeIndexOfTriangle(planet, i);
            if (biomeId < 0)
            {
                continue;
            }

            if (planet.biomes[biomeId].structureDensity <= 0 || planet.biomes[biomeId].structures.Count == 0)
            {
                continue;
            }

            var t = planet.triangles[i];

            float area = MathEx.triangleArea(planet.points[t.v1].point, planet.points[t.v2].point, planet.points[t.v3].point) * planet.biomes[biomeId].structureDensity;

            float v = area - (int)area;
            if (new BernoulliDistribution(v).Next(gen))
            {
                area = (int)area + 1;
            }
            else
            {
                area = (int)area;
            }

            var p1 = planet.points[t.v1].point * (planet.points[t.v1].height + 1) * planet.scale;
            var p2 = planet.points[t.v2].point * (planet.points[t.v2].height + 1) * planet.scale;
            var p3 = planet.points[t.v3].point * (planet.points[t.v3].height + 1) * planet.scale;

            var d = new Uniform3DTriangleDistribution(p1, p2, p3);

            List <float> weights = new List <float>();
            for (int j = 0; j < planet.biomes[biomeId].structures.Count; j++)
            {
                weights.Add(planet.biomes[biomeId].structures[j].weight);
            }
            var dStructs = new DiscreteDistribution(weights);

            for (int j = 0; j < area; j++)
            {
                var pos = d.Next(gen);
                planet.structures.Add(new StructureInfo(dStructs.Next(gen) + structStartIndex[biomeId], i, pos, dAngle.Next(gen)));
            }
        }
    }
Exemplo n.º 3
0
    public static Mesh CreateWaterMesh(PlanetData planet)
    {
        Stopwatch sw = new Stopwatch();

        sw.Start();

        int oceanIndex = -1;

        for (int i = 0; i < planet.biomes.Length; i++)
        {
            if (planet.biomes[i].isOceanBiome)
            {
                oceanIndex = i;
                break;
            }
        }
        if (oceanIndex < 0)
        {
            return(null);
        }

        int size = 0;

        for (int i = 0; i < planet.triangles.Length; i++)
        {
            int b1 = planet.points[planet.triangles[i].v1].biomeID;
            int b2 = planet.points[planet.triangles[i].v2].biomeID;
            int b3 = planet.points[planet.triangles[i].v3].biomeID;
            if (b1 == oceanIndex || b2 == oceanIndex || b3 == oceanIndex)
            {
                size++;
            }
        }

        int[]     triangles = new int[size * 3];
        Color32[] colors    = new Color32[size * 3];
        Vector3[] points    = new Vector3[size * 3];

        int index = 0;

        for (int i = 0; i < planet.triangles.Length; i++)
        {
            int b1 = planet.points[planet.triangles[i].v1].biomeID;
            int b2 = planet.points[planet.triangles[i].v2].biomeID;
            int b3 = planet.points[planet.triangles[i].v3].biomeID;
            if (b1 != oceanIndex && b2 != oceanIndex && b3 != oceanIndex)
            {
                continue;
            }

            points[3 * index]     = planet.points[planet.triangles[i].v1].point * planet.scale;
            points[3 * index + 1] = planet.points[planet.triangles[i].v2].point * planet.scale;
            points[3 * index + 2] = planet.points[planet.triangles[i].v3].point * planet.scale;

            var   biomeID    = PlanetEx.biomeIndexOfTriangle(planet, i);
            Color biomeColor = planet.biomes[oceanIndex].color;
            colors[3 * index]     = biomeColor;
            colors[3 * index + 1] = biomeColor;
            colors[3 * index + 2] = biomeColor;

            index++;
        }

        for (int i = 0; i < size * 3; i++)
        {
            triangles[i] = i;
        }

        Mesh m = new Mesh();

        m.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
        m.vertices    = points;
        m.colors32    = colors;
        m.triangles   = triangles;
        m.RecalculateNormals();
        m.RecalculateTangents();
        m.RecalculateBounds();

        sw.Stop();
        UnityEngine.Debug.Log("Elapsed water renderer " + sw.Elapsed);

        return(m);
    }