示例#1
0
    public void AttemptToApplySymmetry(ref GeneratedVoxelModel voxelModel, SymmetryConfig3D configuration,
                                       ref SymmetryOutcome3D symmetryOutcome)
    {
        symmetryOutcome = Determine3DSymmetryDirectionsToApply(configuration);

        foreach (var direction in symmetryOutcome.symmetryDirections)
        {
            ApplySymmetry(ref voxelModel.modelData, direction, symmetryOutcome);
        }
    }
示例#2
0
    SymmetryOutcome3D Determine3DSymmetryDirectionsToApply(SymmetryConfig3D configuration)
    {
        var outcome = new SymmetryOutcome3D();

        foreach (SymmetryDirection3D direction in Enum.GetValues(typeof(SymmetryDirection3D)))
        {
            if (Random.value < configuration.ChanceOf(direction))
            {
                if (outcome.symmetryDirections.Count == 0 ||
                    configuration.allowMultipleSymmetryTypes && outcome.symmetryDirections.Count > 0)
                {
                    outcome.symmetryDirections.Add(direction);
                }
            }
        }

        return(outcome);
    }
示例#3
0
    void ApplySymmetry(ref Texture3D texture, SymmetryDirection3D direction, SymmetryOutcome3D symmetryOutcome)
    {
        var halfX       = texture.width / 2;
        var halfY       = texture.height / 2;
        var halfZ       = texture.depth / 2;
        var lowDominant = true;// symmetryOutcome.lowerIsDominant;

        for (var x = 0; x < texture.width; x++)
        {
            for (var z = 0; z < texture.depth; z++)
            {
                for (var y = 0; y < texture.height; y++)
                {
                    var setSymmetrical = false;
                    switch (direction)
                    {
                    case SymmetryDirection3D.EastTopToWestBottom:
                        if (CompareTo(x, texture.height - y - 1, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.SouthBottomToNorthTop:
                        if (CompareTo(z, x, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.WestBottomToEastTop:
                        if (CompareTo(x, y, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.SouthTopToNorthBottom:
                        if (CompareTo(z, texture.width - x - 1, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.SouthEastCenterToNorthWestCenter:
                        if (CompareTo(z, texture.height - y - 1, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.SouthWestCenterToNorthEastCenter:
                        if (CompareTo(z, y, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.SouthCenterToNorthCenterVertical:
                        if (CompareTo(y, halfY - 1, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.SouthCenterToNorthCenterHorizontal:
                        if (CompareTo(x, halfX - 1, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;

                    case SymmetryDirection3D.CenterUpToCenterDown:
                        if (CompareTo(z, halfZ - 1, lowDominant))
                        {
                            setSymmetrical = true;
                        }
                        break;
                    }

                    if (setSymmetrical)
                    {
                        SetSymmetricalVoxel(texture, direction, y, x, z, halfX, halfY, halfZ);
                    }
                }
            }
        }
    }
示例#4
0
    void ApplySymmetry(ref Texture3D texture, SymmetryDirection3D direction, SymmetryOutcome3D symmetryOutcome)
    {
        var halfwayPoint = texture.width / 2;
        var lowDominant  = symmetryOutcome.lowerIsDominant;

        for (var x = 0; x < texture.height; x++)
        {
            for (var z = 0; z < texture.depth; z++)
            {
                for (var y = 0; y < texture.width; y++)
                {
                    switch (direction)
                    {
                    //case SymmetryDirection.Horizontal:
                    //    referenceValue = symmetryOutcome.quarterHorizontalSymmetryResult ? columnIndex : rowIndex;
                    //    if ((symmetryOutcome.lowerIsDominant && referenceValue >= halfwayPoint - 1) ||
                    //        (!symmetryOutcome.lowerIsDominant && referenceValue <= halfwayPoint + 1))
                    //        SetSymmetricalVoxel(texture, direction, columnIndex, rowIndex, depthIndex, halfwayPoint);
                    //    break;
                    //case SymmetryDirection.Vertical:
                    //    referenceValue = symmetryOutcome.quarterVerticalSymmetryResult ? rowIndex : columnIndex;
                    //    if ((symmetryOutcome.lowerIsDominant && referenceValue >= halfwayPoint - 1) ||
                    //        (!symmetryOutcome.lowerIsDominant && referenceValue <= halfwayPoint + 1))
                    //        SetSymmetricalVoxel(texture, direction, columnIndex, rowIndex, depthIndex, halfwayPoint);
                    //    break;
                    //case SymmetryDirection.ForwardDiagonal:
                    //    if (symmetryOutcome.quarterForwardDiagonalSymmetryResult) {
                    //        if (symmetryOutcome.lowerIsDominant && columnIndex > rowIndex ||
                    //            !symmetryOutcome.lowerIsDominant && columnIndex < rowIndex)
                    //            texture.SetPixel(columnIndex, rowIndex, depthIndex,
                    //                texture.GetPixel(
                    //                    texture.width - rowIndex,
                    //                    texture.width - columnIndex,
                    //                    texture.depth - depthIndex));
                    //    } else {
                    //        if (symmetryOutcome.lowerIsDominant && rowIndex < texture.width - columnIndex ||
                    //            !symmetryOutcome.lowerIsDominant && rowIndex > texture.width - columnIndex)
                    //            texture.SetPixel(columnIndex, rowIndex, depthIndex,
                    //                texture.GetPixel(
                    //                    texture.width - rowIndex,
                    //                    texture.width - columnIndex,
                    //                    texture.depth - depthIndex));
                    //    }
                    //
                    //    break;
                    //case SymmetryDirection.BackwardDiagonal:
                    //    if (symmetryOutcome.quarterBackwardDiagonalSymmetryResult) {
                    //        if (symmetryOutcome.lowerIsDominant && rowIndex < texture.width - columnIndex ||
                    //            !symmetryOutcome.lowerIsDominant && rowIndex > texture.width - columnIndex)
                    //            texture.SetPixel(columnIndex, rowIndex, depthIndex,
                    //                texture.GetPixel(rowIndex, columnIndex, depthIndex));
                    //    } else if (symmetryOutcome.lowerIsDominant && columnIndex > rowIndex ||
                    //               !symmetryOutcome.lowerIsDominant && columnIndex < rowIndex)
                    //        texture.SetPixel(columnIndex, rowIndex, depthIndex,
                    //            texture.GetPixel(rowIndex, columnIndex, depthIndex));
//
                    //    break;
                    case SymmetryDirection3D.TopLeftToBottomRight:
                        if (x < y)  //(lowDominant && x < y || !lowDominant && x > y)
                        {
                            SetSymmetricalVoxel(texture, direction, y, x, z, halfwayPoint);
                        }
                        break;

                    case SymmetryDirection3D.FrontBottomToTopBack:
                        break;

                    case SymmetryDirection3D.BottomLeftToTopRight:
                        if (lowDominant && x > y || !lowDominant && x < y)
                        {
                            SetSymmetricalVoxel(texture, direction, y, x, z, halfwayPoint);
                        }
                        break;

                    case SymmetryDirection3D.FrontTopToBottomBack:
                        break;

                    case SymmetryDirection3D.FrontRightToBackLeft:
                        break;

                    case SymmetryDirection3D.FrontLeftToBackRight:
                        break;

                    case SymmetryDirection3D.FrontCenterToBackCenterVertical:
                        if (lowDominant && y > halfwayPoint || !lowDominant && y < halfwayPoint)
                        {
                            SetSymmetricalVoxel(texture, direction, y, x, z, halfwayPoint);
                        }
                        break;

                    case SymmetryDirection3D.FrontCenterToBackCenterHorizontal:
                        if (lowDominant && x > halfwayPoint || !lowDominant && x < halfwayPoint)
                        {
                            SetSymmetricalVoxel(texture, direction, y, x, z, halfwayPoint);
                        }
                        break;

                    case SymmetryDirection3D.MiddleTopToMiddleBottomVertical:
                        if (lowDominant && z > halfwayPoint || !lowDominant && z < halfwayPoint)
                        {
                            SetSymmetricalVoxel(texture, direction, y, x, z, halfwayPoint);
                        }
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(direction), direction, null);
                    }
                }
            }
        }
    }