Esempio n. 1
0
        public static TerrainBrush CreateTreeBrush(Random random, int woodIndex, int leavesIndex, int height, int branchesCount, Func <int, float> leavesProbabilityByHeight, Func <int, float> branchesLengthByHeight)
        {
            TerrainBrush terrainBrush = new TerrainBrush();

            terrainBrush.AddRay(0, -1, 0, 0, height, 0, 1, 1, 1, woodIndex);
            for (int i = 0; i < branchesCount; i++)
            {
                int     x       = 0;
                int     num     = random.Int(0, height);
                int     z       = 0;
                float   s       = branchesLengthByHeight(num);
                Vector3 vector  = Vector3.Normalize(new Vector3(random.Float(-1f, 1f), random.Float(0f, 0.33f), random.Float(-1f, 1f))) * s;
                int     x2      = (int)MathUtils.Round(vector.X);
                int     y       = num + (int)MathUtils.Round(vector.Y);
                int     z2      = (int)MathUtils.Round(vector.Z);
                int     cutFace = 0;
                if (MathUtils.Abs(vector.X) == MathUtils.Max(MathUtils.Abs(vector.X), MathUtils.Abs(vector.Y), MathUtils.Abs(vector.Z)))
                {
                    cutFace = 1;
                }
                else if (MathUtils.Abs(vector.Y) == MathUtils.Max(MathUtils.Abs(vector.X), MathUtils.Abs(vector.Y), MathUtils.Abs(vector.Z)))
                {
                    cutFace = 4;
                }
                terrainBrush.AddRay(x, num, z, x2, y, z2, 1, 1, 1, (Func <int?, int?>)((int?v) => v.HasValue ? null : new int?(Terrain.MakeBlockValue(woodIndex, 0, WoodBlock.SetCutFace(0, cutFace)))));
            }
            for (int j = 0; j < 3; j++)
            {
                terrainBrush.CalculateBounds(out Point3 min, out Point3 max);
                for (int k = min.X - 1; k <= max.X + 1; k++)
                {
                    for (int l = min.Z - 1; l <= max.Z + 1; l++)
                    {
                        for (int m = 1; m <= max.Y + 1; m++)
                        {
                            float num2 = leavesProbabilityByHeight(m);
                            if (random.Float(0f, 1f) < num2 && !terrainBrush.GetValue(k, m, l).HasValue&& (terrainBrush.CountNonDiagonalNeighbors(k, m, l, leavesIndex) != 0 || terrainBrush.CountNonDiagonalNeighbors(k, m, l, (Func <int?, int>)((int?v) => (v.HasValue && Terrain.ExtractContents(v.Value) == woodIndex) ? 1 : 0)) != 0))
                            {
                                terrainBrush.AddCell(k, m, l, 0);
                            }
                        }
                    }
                }
                terrainBrush.Replace(0, leavesIndex);
            }
            terrainBrush.AddCell(0, height, 0, leavesIndex);
            terrainBrush.Compile();
            return(terrainBrush);
        }
Esempio n. 2
0
        public static TerrainBrush CreateMimosaBrush(Random random, float size)
        {
            TerrainBrush terrainBrush = new TerrainBrush();
            int          value        = m_treeTrunksByType[4];
            int          value2       = m_treeLeavesByType[4];

            terrainBrush.AddRay(0, -1, 0, 0, 0, 0, 1, 1, 1, value);
            List <Point3> list = new List <Point3>();
            float         num  = random.Float(0f, (float)Math.PI * 2f);

            for (int i = 0; i < 3; i++)
            {
                float   radians = num + (float)i * MathUtils.DegToRad(120f);
                Vector3 v       = Vector3.Transform(Vector3.Normalize(new Vector3(1f, random.Float(1f, 1.5f), 0f)), Matrix.CreateRotationY(radians));
                int     num2    = random.Int((int)(0.7f * size), (int)size);
                Point3  p       = new Point3(0, 0, 0);
                Point3  item    = new Point3(Vector3.Round(new Vector3(p) + v * num2));
                terrainBrush.AddRay(p.X, p.Y, p.Z, item.X, item.Y, item.Z, 1, 1, 1, value);
                list.Add(item);
            }
            foreach (Point3 item2 in list)
            {
                float num3 = random.Float(0.3f * size, 0.45f * size);
                int   num4 = (int)MathUtils.Ceiling(num3);
                for (int j = item2.X - num4; j <= item2.X + num4; j++)
                {
                    for (int k = item2.Y - num4; k <= item2.Y + num4; k++)
                    {
                        for (int l = item2.Z - num4; l <= item2.Z + num4; l++)
                        {
                            int   num5 = MathUtils.Abs(j - item2.X) + MathUtils.Abs(k - item2.Y) + MathUtils.Abs(l - item2.Z);
                            float num6 = ((new Vector3(j, k, l) - new Vector3(item2)) * new Vector3(1f, 1.7f, 1f)).Length();
                            if (num6 <= num3 && (num3 - num6 > 1f || num5 <= 2 || random.Bool(0.7f)) && !terrainBrush.GetValue(j, k, l).HasValue)
                            {
                                terrainBrush.AddCell(j, k, l, value2);
                            }
                        }
                    }
                }
            }
            terrainBrush.Compile();
            return(terrainBrush);
        }