Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
0
    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;
            }
        }
    }
Exemplo n.º 3
0
    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;
    }
Exemplo n.º 4
0
    // 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();
        }
    }