24 for (
int i = 0; i < 16; i++) {
43 int height4 = array[i];
52 delegate(
int y,
int _) {
54 if (y < 0.2f * height4) {
57 else if (y >= 0.2f * height4
64 if (y < height4 * 0.3f
65 || y > height4 * 0.9f) {
68 float num6 = y < height4 * 0.7f ? 0.5f * height4 : 0.35f * height4;
69 return random.
Float(0.33f, 1f) * num6;
75 for (
int j = 0; j < 16; j++) {
94 int height3 = array2[j];
103 delegate(
int y,
int _) {
105 if (y < height3 / 2 - 1) {
108 else if (y > height3 / 2
114 y => y < height3 * 0.35f || y > height3 * 0.75f ? 0f : random.
Float(0f, 0.33f * height3)
119 for (
int k = 0; k < 16; k++) {
138 int height2 = array3[k];
139 int branchesCount3 = height2 * 3;
147 delegate(
int y,
int _) {
159 || y > height2 * 0.8f) {
168 for (
int l = 0; l < 16; l++) {
189 int height = array4[l];
190 int branchesCount4 = height * 3;
191 float startHeight = (0.3f + l % 4 * 0.05f) * height;
199 delegate(
int y,
int _) {
202 if (y < startHeight) {
216 return y < startHeight
217 ? !(y < startHeight - 4f) ? 0.1f * height : 0f
224 for (
int m = 0; m < 16; m++) {
228 for (
int n = 0; n < 16; n++) {
248 int height5 = array5[n];
249 int branchesCount5 = height5 * 3;
257 delegate(
int y,
int round) {
258 int num8 = height5 < 14 ? 1 : 2;
287 if (!(random.
Float(0f, 1f) < humidity / 60f)) {
292 float num = random.
Float(0f, 1f);
296 else if (num < 0.07f) {
299 else if (num < 0.09f) {
302 else if (num < 0.17f) {
305 else if (num < 0.19f) {
311 if (random.
Float(0f, 1f) < 0.025f) {
312 if (random.
Float(0f, 1f) < 0.2f) {
320 && random.
Float(0f, 1f) < 0.01f) {
321 if (random.
Float(0f, 1f) < 0.05f) {
412 return (v - a) / (b - a);
418 return 1f - (v - c) / (d - c);
429 Func<int, int, float> leavesProbability,
430 Func<int, float> branchesLength) {
444 for (
int i = 0; i < branchesCount; i++) {
446 int num = random.
Int(0, height);
448 float s = branchesLength(num);
450 int x2 = (int)MathF.
Round(vector.
X);
451 int y = num + (int)MathF.
Round(vector.
Y);
452 int z2 = (int)MathF.
Round(vector.
Z);
454 if (MathF.Abs(vector.
X) ==
MathUtils.
Max(MathF.Abs(vector.
X), MathF.Abs(vector.
Y), MathF.Abs(vector.
Z))) {
457 else if (MathF.Abs(vector.
Y) ==
MathUtils.
Max(MathF.Abs(vector.
X), MathF.Abs(vector.
Y), MathF.Abs(vector.
Z))) {
473 for (
int j = 0; j < leavesRounds; j++) {
475 for (
int k = min.X - 1; k <= max.X + 1; k++) {
476 for (
int l = min.Z - 1; l <= max.Z + 1; l++) {
477 for (
int m = 1; m <= max.Y + 1; m++) {
478 float num2 = leavesProbability(m, j);
479 if (random.
Float(0f, 1f) < num2
480 && !terrainBrush.
GetValue(k, m, l).HasValue
489 terrainBrush.
AddCell(k, m, l, 0);
494 terrainBrush.
Replace(0, leavesIndex);
496 terrainBrush.
AddCell(0, height, 0, leavesIndex);
517 List<Point3> list =
new();
518 float num = random.
Float(0f, (
float)Math.PI * 2f);
519 for (
int i = 0; i < 3; i++) {
522 int num2 = random.
Int((
int)(0.7f * size), (
int)size);
539 foreach (
Point3 item2
in list) {
540 float num3 = random.Float(0.3f * size, 0.45f * size);
541 int num4 = (int)MathF.Ceiling(num3);
542 for (
int j = item2.
X - num4; j <= item2.
X + num4; j++) {
543 for (
int k = item2.
Y - num4; k <= item2.
Y + num4; k++) {
544 for (
int l = item2.
Z - num4; l <= item2.
Z + num4; l++) {
545 int num5 = Math.Abs(j - item2.
X) + Math.Abs(k - item2.
Y) + Math.Abs(l - item2.
Z);
548 && (num3 - num6 > 1f || num5 <= 2 || random.Bool(0.7f))
549 && !terrainBrush.GetValue(j, k, l).HasValue) {
550 terrainBrush.AddCell(j, k, l, value2);
556 terrainBrush.Compile();
static float Saturate(float x)
static int Max(int x1, int x2)
static float DegToRad(float degrees)
static float Lerp(float x1, float x2, float f)
static float LinearStep(float zero, float one, float f)
static int SetSize(int data, int size)
static int SetIsWild(int data, bool isWild)
static int SetSeason(int data, Season season)
static IList< int > GetEnumValues(Type type)
static int GenerateRandomPlantValue(Random random, int groundValue, int temperature, int humidity, int y)
static List< TerrainBrush >[] m_treeBrushesByType
static float RangeProbability(float v, float a, float b, float c, float d)
static int[] m_treeLeavesByType
static ReadOnlyList< TerrainBrush > GetTreeBrushes(TreeType treeType)
static float CalculateTreeDensity(TreeType treeType, int temperature, int humidity, int y)
static TerrainBrush CreateTreeBrush(Random random, int woodIndex, int leavesIndex, int height, int branchesCount, int leavesRounds, Func< int, int, float > leavesProbability, Func< int, float > branchesLength)
static int[] m_treeTrunksByType
static ? TreeType GenerateRandomTreeType(Random random, int temperature, int humidity, int y, float densityMultiplier=1f)
static float CalculateTreeProbability(TreeType treeType, int temperature, int humidity, int y)
static TerrainBrush CreateMimosaBrush(Random random, float size)
static int GetTreeTrunkValue(TreeType treeType)
static int GetTreeLeavesValue(TreeType treeType)
static int SetIsWild(int data, bool isWild)
static int SetSize(int data, int size)
static Func< int, int, bool > IsPlaceFrozen
static int SetIsSmall(int data, bool isSmall)
void CalculateBounds(out Point3 min, out Point3 max)
void Replace(int oldValue, int newValue)
int CountNonDiagonalNeighbors(int x, int y, int z, Counter counter)
void AddCell(int x, int y, int z, Brush brush)
void AddRay(int x1, int y1, int z1, int x2, int y2, int z2, int sizeX, int sizeY, int sizeZ, Brush brush)
static int ExtractContents(int value)
static int MakeBlockValue(int contents)
static int SetCutFace(int data, int cutFace)
static Matrix CreateRotationY(float radians)
static Vector3 Round(Vector3 v)
static Vector3 Transform(Vector3 v, Matrix m)
static Vector3 Normalize(Vector3 v)