Tanoda
BoundsDivider.cs
Go to the documentation of this file.
1using UnityEngine;
2
4{
5 public static class BoundsDivider
6 {
7 public static void Divide(Bounds bounds, float edgeLength, out Vector3[] positions, out int xDivisionCount,
8 out int yDivisionCount,
9 out int zDivisionCount)
10 {
11 Vector3 min, max;
12 GetMinMax(bounds, out min, out max);
13 var center = (min + max) / 2f;
14
15 if (edgeLength == 1.0f)
16 {
17 positions = new Vector3[1];
18 positions[0] = center;
19 xDivisionCount = 1;
20 yDivisionCount = 1;
21 zDivisionCount = 1;
22 return;
23 }
24
25 xDivisionCount = 1;
26 var minX = center.x;
27 while (minX > min.x)
28 {
29 minX -= edgeLength;
30 xDivisionCount++;
31 }
32
33 var maxX = center.x;
34 while (maxX < max.x)
35 {
36 maxX += edgeLength;
37 xDivisionCount++;
38 }
39
40 yDivisionCount = 1;
41 var minY = center.y;
42 while (minY > min.y)
43 {
44 minY -= edgeLength;
45 yDivisionCount++;
46 }
47
48 var maxY = center.y;
49 while (maxY < max.y)
50 {
51 maxY += edgeLength;
52 yDivisionCount++;
53 }
54
55 zDivisionCount = 1;
56 var minZ = center.z;
57 while (minZ > min.z)
58 {
59 minZ -= edgeLength;
60 zDivisionCount++;
61 }
62
63 var maxZ = center.z;
64 while (maxZ < max.z)
65 {
66 maxZ += edgeLength;
67 zDivisionCount++;
68 }
69
70 positions = new Vector3[xDivisionCount * yDivisionCount * zDivisionCount];
71 var index = 0;
72 for (var x = minX; x <= maxX; x += edgeLength)
73 for (var y = minY; y <= maxY; y += edgeLength)
74 for (var z = minZ; z <= maxZ; z += edgeLength)
75 {
76 positions[index] = new Vector3(x, y, z);
77 index++;
78 }
79 }
80
81 static void GetMinMax(Bounds bounds, out Vector3 min, out Vector3 max)
82 {
83 var tmpMin = bounds.min;
84 var tmpMax = bounds.max;
85 var minZ = Mathf.Min(tmpMin.z, tmpMax.z);
86 var maxZ = Mathf.Max(tmpMin.z, tmpMax.z);
87 tmpMin.z = minZ;
88 tmpMax.z = maxZ;
89 min = tmpMin;
90 max = tmpMax;
91 }
92 }
93}