From f0b7f3165c2b024557023bc31ee5956e14847a64 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sat, 31 Dec 2016 02:35:28 +0700 Subject: [PATCH] snapping distance to world settings --- .../Scripts/Internal/Editor/IsoEditorUtils.cs | 69 ++++++++++++------- Assets/IsoTools/Scripts/IsoWorld.cs | 47 ++++++++----- 2 files changed, 74 insertions(+), 42 deletions(-) diff --git a/Assets/IsoTools/Scripts/Internal/Editor/IsoEditorUtils.cs b/Assets/IsoTools/Scripts/Internal/Editor/IsoEditorUtils.cs index ed9c33a..d53237b 100644 --- a/Assets/IsoTools/Scripts/Internal/Editor/IsoEditorUtils.cs +++ b/Assets/IsoTools/Scripts/Internal/Editor/IsoEditorUtils.cs @@ -90,11 +90,16 @@ namespace IsoTools.Internal { var iso_orig_z = iso_object.positionZ; var result_p_z = iso_orig_z + delta; foreach ( var other in other_objects ) { - if ( IsoEditorUtils.IsSnapOverlaps(iso_object.positionX, iso_object.sizeX, other.positionX, other.sizeX) && - IsoEditorUtils.IsSnapOverlaps(iso_object.positionY, iso_object.sizeY, other.positionY, other.sizeY) ) - { - var new_snapping_z = !snapping_z && IsoEditorUtils.IsSnapOverlaps(result_p_z, iso_object.sizeZ, other.positionZ, other.sizeZ) - ? IsoEditorUtils.SnapProcess(ref result_p_z, iso_object.sizeZ, other.positionZ, other.sizeZ) + var x_snap_overlaps = IsoEditorUtils.IsSnapOverlaps( + iso_world.snappingDistance, iso_object.positionX, iso_object.sizeX, other.positionX, other.sizeX); + var y_snap_overlaps = IsoEditorUtils.IsSnapOverlaps( + iso_world.snappingDistance, iso_object.positionY, iso_object.sizeY, other.positionY, other.sizeY); + if ( x_snap_overlaps && y_snap_overlaps ){ + var new_snapping_z = !snapping_z && IsoEditorUtils.IsSnapOverlaps( + iso_world.snappingDistance, result_p_z, iso_object.sizeZ, other.positionZ, other.sizeZ) + ? IsoEditorUtils.SnapProcess( + iso_world.snappingDistance, + ref result_p_z, iso_object.sizeZ, other.positionZ, other.sizeZ) : false; if ( new_snapping_z ) { delta = result_p_z - iso_orig_z; @@ -113,7 +118,9 @@ namespace IsoTools.Internal { foreach ( var iso_object in iso_objects ) { var iso_orig_z = iso_object.positionZ; var result_p_z = iso_orig_z + delta; - var new_snapping_z = IsoEditorUtils.SnapProcess(ref result_p_z, iso_object.sizeZ, iso_object.tilePositionZ, 1.0f); + var new_snapping_z = IsoEditorUtils.SnapProcess( + iso_world.snappingDistance, + ref result_p_z, iso_object.sizeZ, iso_object.tilePositionZ, 1.0f); if ( new_snapping_z ) { delta = result_p_z - iso_orig_z; snapping_z = true; @@ -157,12 +164,20 @@ namespace IsoTools.Internal { var iso_orig_p = iso_object.position; var result_pos_iso = iso_orig_p + iso_delta; foreach ( var other in other_objects ) { - if ( IsoEditorUtils.IsSnapOverlaps(iso_object.positionZ, iso_object.sizeZ, other.positionZ, other.sizeZ) ) { - var new_snapping_x = !snapping_x && IsoEditorUtils.IsSnapOverlaps(result_pos_iso.y, iso_object.sizeY, other.positionY, other.sizeY) - ? IsoEditorUtils.SnapProcess(ref result_pos_iso.x, iso_object.sizeX, other.positionX, other.sizeX) + var z_snap_overlaps = IsoEditorUtils.IsSnapOverlaps( + iso_world.snappingDistance, iso_object.positionZ, iso_object.sizeZ, other.positionZ, other.sizeZ); + if ( z_snap_overlaps ) { + var new_snapping_x = !snapping_x && IsoEditorUtils.IsSnapOverlaps( + iso_world.snappingDistance, result_pos_iso.y, iso_object.sizeY, other.positionY, other.sizeY) + ? IsoEditorUtils.SnapProcess( + iso_world.snappingDistance, + ref result_pos_iso.x, iso_object.sizeX, other.positionX, other.sizeX) : false; - var new_snapping_y = !snapping_y && IsoEditorUtils.IsSnapOverlaps(result_pos_iso.x, iso_object.sizeX, other.positionX, other.sizeX) - ? IsoEditorUtils.SnapProcess(ref result_pos_iso.y, iso_object.sizeY, other.positionY, other.sizeY) + var new_snapping_y = !snapping_y && IsoEditorUtils.IsSnapOverlaps( + iso_world.snappingDistance, result_pos_iso.x, iso_object.sizeX, other.positionX, other.sizeX) + ? IsoEditorUtils.SnapProcess( + iso_world.snappingDistance, + ref result_pos_iso.y, iso_object.sizeY, other.positionY, other.sizeY) : false; if ( new_snapping_x || new_snapping_y ) { if ( new_snapping_x ) { @@ -191,8 +206,12 @@ namespace IsoTools.Internal { foreach ( var iso_object in iso_objects ) { var iso_orig_p = iso_object.position; var result_pos_iso = iso_orig_p + iso_delta; - var new_snapping_x = IsoEditorUtils.SnapProcess(ref result_pos_iso.x, iso_object.sizeX, iso_object.tilePositionX, 1.0f); - var new_snapping_y = IsoEditorUtils.SnapProcess(ref result_pos_iso.y, iso_object.sizeY, iso_object.tilePositionY, 1.0f); + var new_snapping_x = IsoEditorUtils.SnapProcess( + iso_world.snappingDistance, + ref result_pos_iso.x, iso_object.sizeX, iso_object.tilePositionX, 1.0f); + var new_snapping_y = IsoEditorUtils.SnapProcess( + iso_world.snappingDistance, + ref result_pos_iso.y, iso_object.sizeY, iso_object.tilePositionY, 1.0f); if ( new_snapping_x || new_snapping_y ) { if ( new_snapping_x ) { iso_delta.x = result_pos_iso.x - iso_orig_p.x; @@ -266,32 +285,32 @@ namespace IsoTools.Internal { // // --------------------------------------------------------------------- - const float SnapDistance = 0.2f; - - public static bool SnapProcess(ref float min_a, float size_a, float min_b, float size_b) { + public static bool SnapProcess( + float snap_dist, ref float min_a, float size_a, float min_b, float size_b) + { var max_a = min_a + size_a; var max_b = min_b + size_b; var result = false; - if ( IsSnapOverlaps(min_a, size_a, min_b, size_b) ) { + if ( IsSnapOverlaps(snap_dist, min_a, size_a, min_b, size_b) ) { // |min_a max_a|min_b max_b| - if ( Mathf.Abs(max_a - min_b) < SnapDistance ) { + if ( Mathf.Abs(max_a - min_b) < snap_dist ) { min_a = min_b - size_a; result = true; } // |min_b max_b|min_a max_a| - if ( Mathf.Abs(max_b - min_a) < SnapDistance ) { + if ( Mathf.Abs(max_b - min_a) < snap_dist ) { min_a = max_b; result = true; } // |min_a_____max_a| // |min_b__max_b| - if ( Mathf.Abs(min_a - min_b) < SnapDistance ) { + if ( Mathf.Abs(min_a - min_b) < snap_dist ) { min_a = min_b; result = true; } // |min_a_____max_a| // |min_b__max_b| - if ( Mathf.Abs(max_a - max_b) < SnapDistance ) { + if ( Mathf.Abs(max_a - max_b) < snap_dist ) { min_a = max_b - size_a; result = true; } @@ -299,10 +318,12 @@ namespace IsoTools.Internal { return result; } - public static bool IsSnapOverlaps(float min_a, float size_a, float min_b, float size_b) { + public static bool IsSnapOverlaps( + float snap_dist, float min_a, float size_a, float min_b, float size_b) + { return - min_a + size_a + SnapDistance >= min_b && - min_a - SnapDistance <= min_b + size_b; + min_a + size_a + snap_dist >= min_b && + min_a - snap_dist <= min_b + size_b; } public static bool IsSnapByCellsEnabled(IsoWorld iso_world) { diff --git a/Assets/IsoTools/Scripts/IsoWorld.cs b/Assets/IsoTools/Scripts/IsoWorld.cs index 652ad61..8e2f88d 100644 --- a/Assets/IsoTools/Scripts/IsoWorld.cs +++ b/Assets/IsoTools/Scripts/IsoWorld.cs @@ -17,29 +17,33 @@ namespace IsoTools { // // --------------------------------------------------------------------- - public static readonly float DefTileSize = 32.0f; - public static readonly float MinTileSize = Mathf.Epsilon; - public static readonly float MaxTileSize = float.MaxValue; + public const float DefTileSize = 32.0f; + public const float MinTileSize = float.Epsilon; + public const float MaxTileSize = float.MaxValue; - public static readonly float DefTileRatio = 0.5f; - public static readonly float MinTileRatio = 0.25f; - public static readonly float MaxTileRatio = 1.0f; + public const float DefTileRatio = 0.5f; + public const float MinTileRatio = 0.25f; + public const float MaxTileRatio = 1.0f; - public static readonly float DefTileAngle = 45.0f; - public static readonly float MinTileAngle = 0.0f; - public static readonly float MaxTileAngle = 90.0f; + public const float DefTileAngle = 45.0f; + public const float MinTileAngle = 0.0f; + public const float MaxTileAngle = 90.0f; - public static readonly float DefTileHeight = DefTileSize; - public static readonly float MinTileHeight = MinTileSize; - public static readonly float MaxTileHeight = MaxTileSize; + public const float DefTileHeight = DefTileSize; + public const float MinTileHeight = MinTileSize; + public const float MaxTileHeight = MaxTileSize; - public static readonly float DefStepDepth = 0.1f; - public static readonly float MinStepDepth = Mathf.Epsilon; - public static readonly float MaxStepDepth = float.MaxValue; + public const float DefStepDepth = 0.1f; + public const float MinStepDepth = float.Epsilon; + public const float MaxStepDepth = float.MaxValue; - public static readonly float DefStartDepth = 1.0f; - public static readonly float MinStartDepth = float.MinValue; - public static readonly float MaxStartDepth = float.MaxValue; + public const float DefStartDepth = 1.0f; + public const float MinStartDepth = float.MinValue; + public const float MaxStartDepth = float.MaxValue; + + public const float DefSnapDistance = 0.2f; + public const float MinSnapDistance = 0.0f; + public const float MaxSnapDistance = 0.5f; // --------------------------------------------------------------------- // @@ -309,6 +313,13 @@ namespace IsoTools { get { return _sortInSceneView; } set { _sortInSceneView = value; } } + [SerializeField] + [Range(MinSnapDistance, MaxSnapDistance)] + float _snappingDistance = DefSnapDistance; + public float snappingDistance { + get { return _snappingDistance; } + set { _snappingDistance = Mathf.Clamp(value, MinSnapDistance, MaxSnapDistance); } + } [Header("Development Only")] [SerializeField] bool _showDepends = false; public bool isShowDepends {