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); } }
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); }
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); } } } } }
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); } } } } }