mirror of
https://github.com/BlackMATov/unity-iso-tools.git
synced 2025-12-15 01:12:05 +07:00
all to assoc list
This commit is contained in:
@@ -25,6 +25,18 @@ namespace IsoTools.Internal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Dictionary<T, int> RawDict {
|
||||||
|
get {
|
||||||
|
return _dict;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count {
|
||||||
|
get {
|
||||||
|
return _list.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Add(T item) {
|
public void Add(T item) {
|
||||||
if ( !_dict.ContainsKey(item) ) {
|
if ( !_dict.ContainsKey(item) ) {
|
||||||
_dict.Add(item, _list.Count);
|
_dict.Add(item, _list.Count);
|
||||||
|
|||||||
@@ -10,15 +10,15 @@ namespace IsoTools {
|
|||||||
[ExecuteInEditMode, DisallowMultipleComponent]
|
[ExecuteInEditMode, DisallowMultipleComponent]
|
||||||
public class IsoWorld : MonoBehaviour {
|
public class IsoWorld : MonoBehaviour {
|
||||||
|
|
||||||
bool _dirty = false;
|
bool _dirty = false;
|
||||||
HashSet<IsoObject> _objects = new HashSet<IsoObject>();
|
IsoAssocList<IsoObject> _objects = new IsoAssocList<IsoObject>();
|
||||||
HashSet<IsoObject> _visibles = new HashSet<IsoObject>();
|
IsoAssocList<IsoObject> _visibles = new IsoAssocList<IsoObject>();
|
||||||
HashSet<IsoObject> _oldVisibles = new HashSet<IsoObject>();
|
IsoAssocList<IsoObject> _oldVisibles = new IsoAssocList<IsoObject>();
|
||||||
|
|
||||||
bool _dirtyMat = true;
|
bool _dirtyMat = true;
|
||||||
Matrix4x4 _isoMatrix = Matrix4x4.identity;
|
Matrix4x4 _isoMatrix = Matrix4x4.identity;
|
||||||
Matrix4x4 _isoRMatrix = Matrix4x4.identity;
|
Matrix4x4 _isoRMatrix = Matrix4x4.identity;
|
||||||
List<Renderer> _tmpRenderers = new List<Renderer>();
|
List<Renderer> _tmpRenderers = new List<Renderer>();
|
||||||
|
|
||||||
class Sector {
|
class Sector {
|
||||||
public IsoList<IsoObject> objects = new IsoList<IsoObject>();
|
public IsoList<IsoObject> objects = new IsoList<IsoObject>();
|
||||||
@@ -291,7 +291,7 @@ namespace IsoTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void MarkDirty(IsoObject iso_object) {
|
public void MarkDirty(IsoObject iso_object) {
|
||||||
if ( !iso_object.Internal.Dirty && _visibles.Contains(iso_object) ) {
|
if ( !iso_object.Internal.Dirty && _visibles.RawDict.ContainsKey(iso_object) ) {
|
||||||
iso_object.Internal.Dirty = true;
|
iso_object.Internal.Dirty = true;
|
||||||
MarkDirty();
|
MarkDirty();
|
||||||
}
|
}
|
||||||
@@ -329,9 +329,8 @@ namespace IsoTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FixAllTransforms() {
|
void FixAllTransforms() {
|
||||||
var objects_iter = _objects.GetEnumerator();
|
for ( int i = 0, e = _objects.RawList.Count; i < e; ++i ) {
|
||||||
while ( objects_iter.MoveNext() ) {
|
_objects.RawList[i].FixTransform();
|
||||||
objects_iter.Current.FixTransform();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,10 +419,6 @@ namespace IsoTools {
|
|||||||
a.Internal.ScreenRect.Overlaps(b.Internal.ScreenRect) &&
|
a.Internal.ScreenRect.Overlaps(b.Internal.ScreenRect) &&
|
||||||
IsIsoObjectDepends(a.position, a.size, b.position, b.size);
|
IsIsoObjectDepends(a.position, a.size, b.position, b.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SectorIndex(Vector2 num_pos) {
|
|
||||||
return Mathf.FloorToInt(num_pos.x + _sectorsNumPosCount.x * num_pos.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
Sector FindSector(Vector2 num_pos) {
|
Sector FindSector(Vector2 num_pos) {
|
||||||
if ( num_pos.x < 0 || num_pos.y < 0 ) {
|
if ( num_pos.x < 0 || num_pos.y < 0 ) {
|
||||||
@@ -432,7 +427,8 @@ namespace IsoTools {
|
|||||||
if ( num_pos.x >= _sectorsNumPosCount.x || num_pos.y >= _sectorsNumPosCount.y ) {
|
if ( num_pos.x >= _sectorsNumPosCount.x || num_pos.y >= _sectorsNumPosCount.y ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return _sectors[SectorIndex(num_pos)];
|
var sector_index = Mathf.FloorToInt(num_pos.x + _sectorsNumPosCount.x * num_pos.y);
|
||||||
|
return _sectors[sector_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
void LookUpSectorDepends(Vector2 num_pos, IsoObject obj_a) {
|
void LookUpSectorDepends(Vector2 num_pos, IsoObject obj_a) {
|
||||||
@@ -463,9 +459,9 @@ namespace IsoTools {
|
|||||||
|
|
||||||
void SetupSectorSize() {
|
void SetupSectorSize() {
|
||||||
_sectorsSize = 0.0f;
|
_sectorsSize = 0.0f;
|
||||||
var visibles_iter = _visibles.GetEnumerator();
|
for ( int i = 0, e = _visibles.RawList.Count; i < e; ++i ) {
|
||||||
while ( visibles_iter.MoveNext() ) {
|
var iso_internal = _visibles.RawList[i].Internal;
|
||||||
_sectorsSize += IsoUtils.Vec2MaxF(visibles_iter.Current.Internal.ScreenRect.size);
|
_sectorsSize += IsoUtils.Vec2MaxF(iso_internal.ScreenRect.size);
|
||||||
}
|
}
|
||||||
var min_sector_size = IsoToScreen(IsoUtils.vec3OneX).x - IsoToScreen(Vector3.zero).x;
|
var min_sector_size = IsoToScreen(IsoUtils.vec3OneX).x - IsoToScreen(Vector3.zero).x;
|
||||||
_sectorsSize = Mathf.Round(Mathf.Max(min_sector_size, _sectorsSize / _visibles.Count));
|
_sectorsSize = Mathf.Round(Mathf.Max(min_sector_size, _sectorsSize / _visibles.Count));
|
||||||
@@ -474,9 +470,8 @@ namespace IsoTools {
|
|||||||
void SetupObjectsSectors() {
|
void SetupObjectsSectors() {
|
||||||
_sectorsMinNumPos = IsoUtils.Vec2From(float.MaxValue);
|
_sectorsMinNumPos = IsoUtils.Vec2From(float.MaxValue);
|
||||||
_sectorsMaxNumPos = IsoUtils.Vec2From(float.MinValue);
|
_sectorsMaxNumPos = IsoUtils.Vec2From(float.MinValue);
|
||||||
var visibles_iter = _visibles.GetEnumerator();
|
for ( int i = 0, e = _visibles.RawList.Count; i < e; ++i ) {
|
||||||
while ( visibles_iter.MoveNext() ) {
|
var iso_internal = _visibles.RawList[i].Internal;
|
||||||
var iso_internal = visibles_iter.Current.Internal;
|
|
||||||
iso_internal.MinSector = IsoUtils.Vec3DivFloor(iso_internal.ScreenRect.min, _sectorsSize);
|
iso_internal.MinSector = IsoUtils.Vec3DivFloor(iso_internal.ScreenRect.min, _sectorsSize);
|
||||||
iso_internal.MaxSector = IsoUtils.Vec3DivCeil (iso_internal.ScreenRect.max, _sectorsSize);
|
iso_internal.MaxSector = IsoUtils.Vec3DivCeil (iso_internal.ScreenRect.max, _sectorsSize);
|
||||||
_sectorsMinNumPos = IsoUtils.Vec3Min(_sectorsMinNumPos, iso_internal.MinSector);
|
_sectorsMinNumPos = IsoUtils.Vec3Min(_sectorsMinNumPos, iso_internal.MinSector);
|
||||||
@@ -500,9 +495,8 @@ namespace IsoTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TuneSectors() {
|
void TuneSectors() {
|
||||||
var visibles_iter = _visibles.GetEnumerator();
|
for ( int i = 0, e = _visibles.RawList.Count; i < e; ++i ) {
|
||||||
while ( visibles_iter.MoveNext() ) {
|
var iso_object = _visibles.RawList[i];
|
||||||
var iso_object = visibles_iter.Current;
|
|
||||||
iso_object.Internal.MinSector -= _sectorsMinNumPos;
|
iso_object.Internal.MinSector -= _sectorsMinNumPos;
|
||||||
iso_object.Internal.MaxSector -= _sectorsMinNumPos;
|
iso_object.Internal.MaxSector -= _sectorsMinNumPos;
|
||||||
var min = iso_object.Internal.MinSector;
|
var min = iso_object.Internal.MinSector;
|
||||||
@@ -552,9 +546,8 @@ namespace IsoTools {
|
|||||||
|
|
||||||
void CalculateNewVisibles() {
|
void CalculateNewVisibles() {
|
||||||
_oldVisibles.Clear();
|
_oldVisibles.Clear();
|
||||||
var objects_iter = _objects.GetEnumerator();
|
for ( int i = 0, e = _objects.RawList.Count; i < e; ++i ) {
|
||||||
while ( objects_iter.MoveNext() ) {
|
var iso_object = _objects.RawList[i];
|
||||||
var iso_object = objects_iter.Current;
|
|
||||||
if ( IsIsoObjectVisible(iso_object) ) {
|
if ( IsIsoObjectVisible(iso_object) ) {
|
||||||
iso_object.Internal.Placed = false;
|
iso_object.Internal.Placed = false;
|
||||||
_oldVisibles.Add(iso_object);
|
_oldVisibles.Add(iso_object);
|
||||||
@@ -566,10 +559,9 @@ namespace IsoTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ResolveVisibles() {
|
void ResolveVisibles() {
|
||||||
var visibles_iter = _visibles.GetEnumerator();
|
for ( int i = 0, e = _visibles.RawList.Count; i < e; ++i ) {
|
||||||
while ( visibles_iter.MoveNext() ) {
|
var iso_object = _visibles.RawList[i];
|
||||||
var iso_object = visibles_iter.Current;
|
if ( iso_object.Internal.Dirty || !_oldVisibles.RawDict.ContainsKey(iso_object) ) {
|
||||||
if ( iso_object.Internal.Dirty || !_oldVisibles.Contains(iso_object) ) {
|
|
||||||
MarkDirty();
|
MarkDirty();
|
||||||
SetupIsoObjectDepends(iso_object);
|
SetupIsoObjectDepends(iso_object);
|
||||||
iso_object.Internal.Dirty = false;
|
iso_object.Internal.Dirty = false;
|
||||||
@@ -578,11 +570,9 @@ namespace IsoTools {
|
|||||||
MarkDirty();
|
MarkDirty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for ( int i = 0, e = _oldVisibles.RawList.Count; i < e; ++i ) {
|
||||||
var old_visibles_iter = _oldVisibles.GetEnumerator();
|
var iso_object = _oldVisibles.RawList[i];
|
||||||
while ( old_visibles_iter.MoveNext() ) {
|
if ( !_visibles.RawDict.ContainsKey(iso_object) ) {
|
||||||
var iso_object = old_visibles_iter.Current;
|
|
||||||
if ( !_visibles.Contains(iso_object) ) {
|
|
||||||
MarkDirty();
|
MarkDirty();
|
||||||
ClearIsoObjectDepends(iso_object);
|
ClearIsoObjectDepends(iso_object);
|
||||||
}
|
}
|
||||||
@@ -615,9 +605,8 @@ namespace IsoTools {
|
|||||||
|
|
||||||
void PlaceAllVisibles() {
|
void PlaceAllVisibles() {
|
||||||
var depth = startDepth;
|
var depth = startDepth;
|
||||||
var visibles_iter = _visibles.GetEnumerator();
|
for ( int i = 0, e = _visibles.RawList.Count; i < e; ++i ) {
|
||||||
while ( visibles_iter.MoveNext() ) {
|
depth = RecursivePlaceIsoObject(_visibles.RawList[i], depth);
|
||||||
depth = RecursivePlaceIsoObject(visibles_iter.Current, depth);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -662,9 +651,16 @@ namespace IsoTools {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OnEnable() {
|
void OnEnable() {
|
||||||
_objects = new HashSet<IsoObject>(FindObjectsOfType<IsoObject>());
|
var all_iso_objects = FindObjectsOfType<IsoObject>();
|
||||||
_objects.RemoveWhere(iso_object => !iso_object.enabled);
|
_objects = new IsoAssocList<IsoObject>(all_iso_objects.Length);
|
||||||
|
for ( int i = 0, e = all_iso_objects.Length; i < e; ++i ) {
|
||||||
|
var iso_object = all_iso_objects[i];
|
||||||
|
if ( iso_object.enabled ) {
|
||||||
|
_objects.Add(iso_object);
|
||||||
|
}
|
||||||
|
}
|
||||||
_visibles.Clear();
|
_visibles.Clear();
|
||||||
|
_oldVisibles.Clear();
|
||||||
_sectors.Clear();
|
_sectors.Clear();
|
||||||
MarkDirty();
|
MarkDirty();
|
||||||
}
|
}
|
||||||
@@ -672,6 +668,7 @@ namespace IsoTools {
|
|||||||
void OnDisable() {
|
void OnDisable() {
|
||||||
_objects.Clear();
|
_objects.Clear();
|
||||||
_visibles.Clear();
|
_visibles.Clear();
|
||||||
|
_oldVisibles.Clear();
|
||||||
_sectors.Clear();
|
_sectors.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user