diff --git a/Assets/IsoTools/Scripts/Internal/IsoSortingSolver.cs b/Assets/IsoTools/Scripts/Internal/IsoSortingSolver.cs index a86f511..11e91d9 100644 --- a/Assets/IsoTools/Scripts/Internal/IsoSortingSolver.cs +++ b/Assets/IsoTools/Scripts/Internal/IsoSortingSolver.cs @@ -35,7 +35,7 @@ namespace IsoTools.Internal { return false; } - public void OnDrawGizmos() { + public void OnDrawGizmos(IsoWorld iso_world) { } // --------------------------------------------------------------------- diff --git a/Assets/IsoTools/Scripts/Internal/IsoWarningSolver.cs b/Assets/IsoTools/Scripts/Internal/IsoWarningSolver.cs new file mode 100644 index 0000000..98158e6 --- /dev/null +++ b/Assets/IsoTools/Scripts/Internal/IsoWarningSolver.cs @@ -0,0 +1,131 @@ +using UnityEngine; +using System.Collections.Generic; + +#if UNITY_EDITOR +using UnityEditor; +#endif + +#if UNITY_5_5_OR_NEWER +using UnityEngine.Profiling; +#endif + +namespace IsoTools.Internal { + public class IsoWarningSolver { + IsoWarningSolverImpl _impl = + #if UNITY_EDITOR + new IsoWarningSolverEditorImpl(); + #else + new IsoWarningSolverImpl(); + #endif + + public void OnAddIsoObject(IsoObject iso_object) { + _impl.OnAddIsoObject(iso_object); + } + + public void OnRemoveIsoObject(IsoObject iso_object) { + _impl.OnRemoveIsoObject(iso_object); + } + + public bool OnMarkDirtyIsoObject(IsoObject iso_object) { + return _impl.OnMarkDirtyIsoObject(iso_object); + } + + public void OnDrawGizmos(IsoWorld iso_world) { + _impl.OnDrawGizmos(iso_world); + } + + public void StepSortingAction(IsoWorld iso_world) { + _impl.StepSortingAction(iso_world); + } + + public void Clear() { + _impl.Clear(); + } + } + + class IsoWarningSolverImpl { + public virtual void OnAddIsoObject(IsoObject iso_object) {} + public virtual void OnRemoveIsoObject(IsoObject iso_object) {} + public virtual bool OnMarkDirtyIsoObject(IsoObject iso_object) { return false; } + public virtual void OnDrawGizmos(IsoWorld iso_world) {} + public virtual void StepSortingAction(IsoWorld iso_world) {} + public virtual void Clear() {} + } + + class IsoWarningSolverEditorImpl : IsoWarningSolverImpl { + const int IsoObjectsPerFrame = 100; + + uint _objCounter = 0; + IsoAssocList _isoObjects = new IsoAssocList(47); + + // --------------------------------------------------------------------- + // + // Overrides + // + // --------------------------------------------------------------------- + + public override void OnAddIsoObject(IsoObject iso_object) { + _isoObjects.Add(iso_object); + } + + public override void OnRemoveIsoObject(IsoObject iso_object) { + _isoObjects.Remove(iso_object); + } + + public override void StepSortingAction(IsoWorld iso_world) { + Profiler.BeginSample("IsoWarningSolver.ProcessTransforms"); + ProcessTransforms(); + Profiler.EndSample(); + } + + // --------------------------------------------------------------------- + // + // Private + // + // --------------------------------------------------------------------- + + void ProcessTransforms() { + var check_count = Application.isPlaying + ? Mathf.Min(IsoObjectsPerFrame, _isoObjects.Count) + : _isoObjects.Count; + for ( var i = 0; i < check_count; ++i ) { + var obj_index = (_objCounter++) % _isoObjects.Count; + var iso_object = _isoObjects[(int)obj_index]; + CheckScaledTransform(iso_object); + CheckRotatedTransform(iso_object); + CheckChangedTransform(iso_object); + } + } + + void CheckScaledTransform(IsoObject iso_object) { + if ( iso_object.transform.lossyScale != Vector3.one ) { + Debug.LogWarning( + "Don't change 'transform.scale' for IsoObject and its parents!", + iso_object); + } + } + + void CheckRotatedTransform(IsoObject iso_object) { + if ( iso_object.transform.rotation != Quaternion.identity ) { + Debug.LogWarning( + "Don't change 'transform.rotation' for IsoObject and its parents!", + iso_object); + } + } + + void CheckChangedTransform(IsoObject iso_object) { + var iso_world = iso_object.isoWorld; + if ( iso_world ) { + var needed_position = iso_world.IsoToScreen(iso_object.position); + var current_position = iso_object.transform.position; + if ( !IsoUtils.Vec2Approximately(needed_position, current_position) ) { + Debug.LogWarning( + "Don't change 'IsoObject.transform.position' manually!\n" + + "Use 'IsoObject.position' instead.", + iso_object); + iso_object.FixTransform(); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/IsoTools/Scripts/Internal/IsoWarningSolver.cs.meta b/Assets/IsoTools/Scripts/Internal/IsoWarningSolver.cs.meta new file mode 100644 index 0000000..ac0a52c --- /dev/null +++ b/Assets/IsoTools/Scripts/Internal/IsoWarningSolver.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 389c69714ba074780af3cc5b345780ca +timeCreated: 1483092700 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/IsoTools/Scripts/IsoWorld.cs b/Assets/IsoTools/Scripts/IsoWorld.cs index c7c15fa..652ad61 100644 --- a/Assets/IsoTools/Scripts/IsoWorld.cs +++ b/Assets/IsoTools/Scripts/IsoWorld.cs @@ -9,6 +9,7 @@ namespace IsoTools { Matrix4x4 _isoRMatrix = Matrix4x4.identity; IsoScreenSolver _screenSolver = new IsoScreenSolver(); IsoSortingSolver _sortingSolver = new IsoSortingSolver(); + IsoWarningSolver _warningSolver = new IsoWarningSolver(); // --------------------------------------------------------------------- // @@ -333,6 +334,9 @@ namespace IsoTools { if ( _sortingSolver.OnMarkDirtyIsoObject(iso_object) ) { Internal_SetDirtyInEditorMode(); } + if ( _warningSolver.OnMarkDirtyIsoObject(iso_object) ) { + Internal_SetDirtyInEditorMode(); + } } // --------------------------------------------------------------------- @@ -369,6 +373,7 @@ namespace IsoTools { if ( _sortingSolver.StepSortingAction(this, _screenSolver) ) { Internal_SetDirtyInEditorMode(); } + _warningSolver.StepSortingAction(this); } // --------------------------------------------------------------------- @@ -394,18 +399,21 @@ namespace IsoTools { base.OnDisable(); _screenSolver.Clear(); _sortingSolver.Clear(); + _warningSolver.Clear(); } protected override void OnAddIsoObjectToWorld(IsoObject iso_object) { base.OnAddIsoObjectToWorld(iso_object); _screenSolver.OnAddIsoObject(iso_object); _sortingSolver.OnAddIsoObject(iso_object); + _warningSolver.OnAddIsoObject(iso_object); } protected override void OnRemoveIsoObjectFromWorld(IsoObject iso_object) { base.OnRemoveIsoObjectFromWorld(iso_object); _screenSolver.OnRemoveIsoObject(iso_object); _sortingSolver.OnRemoveIsoObject(iso_object); + _warningSolver.OnRemoveIsoObject(iso_object); } #if UNITY_EDITOR @@ -436,7 +444,8 @@ namespace IsoTools { void OnDrawGizmos() { _screenSolver.OnDrawGizmos(this); - _sortingSolver.OnDrawGizmos(); + _sortingSolver.OnDrawGizmos(this); + _warningSolver.OnDrawGizmos(this); } #endif }