private void PickupVoxels(UltimateTerrain uTerrain) { var values = new double[size * size * size]; for (var x = 0; x < size; ++x) { var px = x * step + position.x - radius; for (var y = 0; y < size; ++y) { var py = y * step + position.y - radius; for (var z = 0; z < size; ++z) { var pz = z * step + position.z - radius; values[x + y * size + z * size * size] = uTerrain.GetVoxelAt(px, py, pz).Value; } } } var averagedValues = new double[size * size * size]; for (var x = 0; x < size; ++x) { for (var y = 0; y < size; ++y) { for (var z = 0; z < size; ++z) { if (x >= 1 && x < size - 1 && y >= 1 && y < size - 1 && z >= 1 && z < size - 1) { var average = 0.0; for (var kx = -1; kx <= 1; ++kx) { for (var ky = -1; ky <= 1; ++ky) { for (var kz = -1; kz <= 1; ++kz) { average += GetVoxelValue(values, x + kx, y + ky, z + kz); } } } average /= 27.0; averagedValues[x + y * size + z * size * size] = average; } else { averagedValues[x + y * size + z * size * size] = GetVoxelValue(values, x, y, z); } } } } voxelValues = averagedValues; }
private void EnsureStartEndPointsAreAboveTheGround(double step, double maxSlope) { while (start.y > -200 && start.y < 200) { start.y -= step * maxSlope; var voxel = terrain.GetVoxelAt(start); if (voxel.IsInside) { start.y += step * maxSlope; break; } } while (end.y > -200 && end.y < 200) { end.y -= step * maxSlope; var voxel = terrain.GetVoxelAt(end); if (voxel.IsInside) { end.y += step * maxSlope; break; } } }
private void PickupVoxels(UltimateTerrain uTerrain) { var values = new double[size * size * size]; for (var x = 0; x < size; ++x) { var px = x * step + position.x - radius; for (var y = 0; y < size; ++y) { var py = y * step + position.y - radius; for (var z = 0; z < size; ++z) { var pz = z * step + position.z - radius; values[x + y * size + z * size * size] = uTerrain.GetVoxelAt(px, py, pz).Value; } } } var averagedValues = new double[size * size * size]; for (var x = 0; x < size; ++x) { for (var y = 0; y < size; ++y) { for (var z = 0; z < size; ++z) { if (x >= 1 && x < size - 1 && y >= 1 && y < size - 1 && z >= 1 && z < size - 1) { var average = 7.0 * GetVoxelValue(values, x, y, z); average -= GetVoxelValue(values, x + 1, y, z); average -= GetVoxelValue(values, x - 1, y, z); average -= GetVoxelValue(values, x, y + 1, z); average -= GetVoxelValue(values, x, y - 1, z); average -= GetVoxelValue(values, x, y, z + 1); average -= GetVoxelValue(values, x, y, z - 1); averagedValues[x + y * size + z * size * size] = average; } else { averagedValues[x + y * size + z * size * size] = GetVoxelValue(values, x, y, z); } } } } voxelValues = averagedValues; }
// Update is called once per frame private void Update() { if (PreventPlayerMovesUntilLoaded) { PreventPlayerMoves(); } if (Input.GetKeyDown(KeyCode.L)) { Cursor.lockState = Cursor.lockState == CursorLockMode.Locked ? Cursor.lockState = CursorLockMode.None : Cursor.lockState = CursorLockMode.Locked; } if (!Terrain.IsLoaded || string.IsNullOrEmpty(operationName)) { return; } var intersection = GetIntersectionWithTerrain(dig); if (intersection.HasValue) { var wpos = intersection.Value.point + intersection.Value.normal * 0.01f; if (followGrid) { wpos = GetFollowGrid(wpos); } if (!Input.GetKey(KeyCode.LeftAlt) && Input.GetMouseButtonDown(0)) { clicking = true; } else if (!isNonStopEditing || Input.GetMouseButtonUp(0)) { clicking = false; } switch (operationName) { case AxisAlignedCubeName: UpdateForAxisAlignedCube(wpos); break; case SphereName: UpdateForSphere(wpos); break; case AdditiveSphereName: UpdateForAdditiveSphere(wpos); break; case PaintName: UpdateForPaint(wpos); break; case ParallelepipedName: DisableContinuousEditing(); UpdateForParallelepiped(wpos); break; case CylinderName: DisableContinuousEditing(); UpdateForCylinder(wpos); break; case CapsuleName: DisableContinuousEditing(); UpdateForCapsule(wpos); break; case SmoothName: DisableContinuousEditing(); UpdateForSmooth(wpos); break; case SharpenName: DisableContinuousEditing(); UpdateForSharpen(wpos); break; } if (Input.GetMouseButtonDown(1)) { var voxelWorldPos = Terrain.Converter.UnityToVoxelPosition(wpos); var targetVoxel = Terrain.GetVoxelAt(voxelWorldPos); targetVoxelText.text = targetVoxel.ToString(); pathTester.Start = pathTester.End; pathTester.End = voxelWorldPos; pathTester.ClearCubes(); } if (Input.GetKeyUp(KeyCode.P)) { // Find path asynchronously to avoid affecting the frame rate. // See the code of PathTester.cs for an example of using async path-finder StartCoroutine(pathTester.DebugPathCoroutine(pathfinderStep, pathfinderMaxSlope, pathfinderGroundOnly)); } } if (KeepPlayerAboveGround) { KeepPlayerAbove(); } }