public static void WorldPositionToArrayIndex(this Isosurface3D iso, ref Vector3Int refIndex, Vector3 position, Transform mesh, float maxDistance) { float closestDistance = Mathf.Infinity; Vector3Int closestIndex = new Vector3Int(); for (int x = 0; x < iso.Size.x; x++) { for (int y = 0; y < iso.Size.y; y++) { for (int z = 0; z < iso.Size.z; z++) { Vector3 worldPosition = Vectorx.Multiply(new Vector3(x, y, z), mesh.localScale) + mesh.position; float distance = Vector3.Distance(worldPosition, position); if (distance < closestDistance) { closestDistance = distance; closestIndex = new Vector3Int(x, y, z); } } } } if (closestDistance < maxDistance) { refIndex = closestIndex; } }
public static void SetCube(this Isosurface3D iso, Vector3Int center, Vector3Int size, float value) { float[,,] data = iso.Data; for (int x = center.x - size.x; x < center.x + size.x; x++) { for (int y = center.y - size.y; y < center.y + size.y; y++) { for (int z = center.z - size.z; z < center.z + size.z; z++) { if (x < data.GetLength(0) && x > 0) { if (y < data.GetLength(1) && y > 0) { if (z < data.GetLength(2) && z > 0) { data[x, y, z] = value; } } } } } } iso.Data = data; }
public static void SetAll(this Isosurface3D iso, float value) { float[,,] data = iso.Data; for (int x = 0; x < iso.Size.x; x++) { for (int y = 0; y < iso.Size.y; y++) { for (int z = 0; z < iso.Size.z; z++) { data[x, y, z] = value; } } } iso.Data = data; }
public static void EraseAll(this Isosurface3D iso) { SetAll(iso, -1f); }
public static void FillAll(this Isosurface3D iso) { SetAll(iso, 1f); }
public static void EraseCube(this Isosurface3D iso, Vector3Int center, Vector3Int size) { SetCube(iso, center, size, -1f); }