diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index 56db010..1082ab8 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -51,6 +51,7 @@ + diff --git a/Assets/IsoTools/Examples/Prefabs/Tests/Model_1x1x1.prefab b/Assets/IsoTools/Examples/Prefabs/Tests/Model_1x1x1.prefab index 6257c46..91d9f71 100644 --- a/Assets/IsoTools/Examples/Prefabs/Tests/Model_1x1x1.prefab +++ b/Assets/IsoTools/Examples/Prefabs/Tests/Model_1x1x1.prefab @@ -1662,7 +1662,6 @@ MonoBehaviour: _position: {x: -3, y: 1, z: 0} _mode: 1 _cacheRenderers: 1 - _isAlignment: 1 _isShowBounds: 0 --- !u!137 &13705018 SkinnedMeshRenderer: diff --git a/Assets/IsoTools/Scripts/IsoWorld.cs b/Assets/IsoTools/Scripts/IsoWorld.cs index 53242ba..ee53af8 100644 --- a/Assets/IsoTools/Scripts/IsoWorld.cs +++ b/Assets/IsoTools/Scripts/IsoWorld.cs @@ -13,6 +13,7 @@ namespace IsoTools { static IsoWorld _instance = null; bool _dirty = false; + Vector2 _minXY = Vector2.zero; IsoAssocList _objects = new IsoAssocList(); IsoAssocList _visibles = new IsoAssocList(); IsoAssocList _oldVisibles = new IsoAssocList(); @@ -188,11 +189,14 @@ namespace IsoTools { // public Ray RayFromIsoCameraToIsoPoint(Vector3 iso_pnt) { - var max_dist = tileSize * _objects.Count; var screen_pnt = IsoToScreen(iso_pnt); - var screen_down_pnt = new Vector2(screen_pnt.x, screen_pnt.y - max_dist); - var iso_down_pnt = ScreenToIso(screen_down_pnt); - iso_down_pnt.z = max_dist / tileHeight; + + var min_screen_pnt = IsoToScreen(_minXY - Vector2.one); + var max_screen_dist = screen_pnt.y - min_screen_pnt.y; + + var screen_down_pnt = new Vector2(screen_pnt.x, screen_pnt.y - max_screen_dist); + var iso_down_pnt = ScreenToIso(screen_down_pnt, iso_pnt.z); + iso_down_pnt.z += max_screen_dist / tileHeight; return new Ray(iso_down_pnt, iso_pnt - iso_down_pnt); } @@ -620,7 +624,8 @@ namespace IsoTools { var iso_internal = _visibles[i].Internal; _sectorsSize += IsoUtils.Vec2MaxF(iso_internal.ScreenRect.size); } - var min_sector_size = IsoToScreen(IsoUtils.vec3OneX).x - IsoToScreen(Vector3.zero).x; + var min_sector_size_xy = IsoToScreen(IsoUtils.vec3OneXY) - IsoToScreen(Vector3.zero); + var min_sector_size = Mathf.Max(min_sector_size_xy.x, min_sector_size_xy.y); _sectorsSize = _visibles.Count > 0 ? Mathf.Round(Mathf.Max(min_sector_size, _sectorsSize / _visibles.Count)) : min_sector_size; @@ -638,10 +643,10 @@ namespace IsoTools { var min_y = iso_internal.ScreenRect.yMin / _sectorsSize; var max_x = iso_internal.ScreenRect.xMax / _sectorsSize; var max_y = iso_internal.ScreenRect.yMax / _sectorsSize; - iso_internal.MinSector.x = (int)(min_x >= 0.0F ? min_x : min_x - 1.0F); - iso_internal.MinSector.y = (int)(min_y >= 0.0F ? min_y : min_y - 1.0F); - iso_internal.MaxSector.x = (int)(max_x >= 0.0F ? max_x + 1.0F : max_x); - iso_internal.MaxSector.y = (int)(max_y >= 0.0F ? max_y + 1.0F : max_y); + iso_internal.MinSector.x = (int)(min_x >= 0.0f ? min_x : min_x - 1.0f); + iso_internal.MinSector.y = (int)(min_y >= 0.0f ? min_y : min_y - 1.0f); + iso_internal.MaxSector.x = (int)(max_x >= 0.0f ? max_x + 1.0f : max_x); + iso_internal.MaxSector.y = (int)(max_y >= 0.0f ? max_y + 1.0f : max_y); if ( _sectorsMinNumPos.x > iso_internal.MinSector.x ) { _sectorsMinNumPos.x = iso_internal.MinSector.x; } @@ -733,18 +738,24 @@ namespace IsoTools { void CalculateNewVisibles() { _oldVisibles.Clear(); - for ( int i = 0, e = _objects.Count; i < e; ++i ) { - var iso_object = _objects[i]; - if ( !IsoUtils.Vec2Approximately( - iso_object.Internal.LastTrans, - iso_object.Internal.Transform.position) ) - { - iso_object.FixIsoPosition(); - } - if ( IsIsoObjectVisible(iso_object) ) { - iso_object.Internal.Placed = false; - _oldVisibles.Add(iso_object); + if ( _objects.Count > 0 ) { + _minXY = new Vector2(float.MaxValue, float.MaxValue); + for ( int i = 0, e = _objects.Count; i < e; ++i ) { + var iso_object = _objects[i]; + _minXY = IsoUtils.Vec2Min(_minXY, iso_object.position); + if ( !IsoUtils.Vec2Approximately( + iso_object.Internal.LastTrans, + iso_object.Internal.Transform.position) ) + { + iso_object.FixIsoPosition(); + } + if ( IsIsoObjectVisible(iso_object) ) { + iso_object.Internal.Placed = false; + _oldVisibles.Add(iso_object); + } } + } else { + _minXY = Vector2.zero; } var old_visibles = _visibles; _visibles = _oldVisibles;