mirror of
https://github.com/BlackMATov/unity-iso-tools.git
synced 2025-12-15 09:16:08 +07:00
new 'cacheRenderers' option for IsoObject
This commit is contained in:
@@ -7,31 +7,10 @@ using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace IsoTools {
|
||||
[SelectionBase]
|
||||
[ExecuteInEditMode, DisallowMultipleComponent]
|
||||
public class IsoObject : MonoBehaviour {
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// Mode
|
||||
//
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
public enum Mode {
|
||||
Mode2d,
|
||||
Mode3d
|
||||
}
|
||||
|
||||
[SerializeField]
|
||||
Mode _mode = Mode.Mode2d;
|
||||
|
||||
public Mode mode {
|
||||
get { return _mode; }
|
||||
set {
|
||||
_mode = value;
|
||||
FixTransform();
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// Size
|
||||
@@ -158,6 +137,52 @@ namespace IsoTools {
|
||||
get { return new Vector2(tilePositionX, tilePositionZ); }
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// Mode
|
||||
//
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
|
||||
public enum Mode {
|
||||
Mode2d,
|
||||
Mode3d
|
||||
}
|
||||
|
||||
[Space(10)]
|
||||
[SerializeField]
|
||||
Mode _mode = Mode.Mode2d;
|
||||
|
||||
public Mode mode {
|
||||
get { return _mode; }
|
||||
set {
|
||||
_mode = value;
|
||||
FixTransform();
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// Cache renderers
|
||||
//
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
[SerializeField]
|
||||
bool _cacheRenderers = false;
|
||||
|
||||
public bool cacheRenderers {
|
||||
get { return _cacheRenderers; }
|
||||
set {
|
||||
_cacheRenderers = value;
|
||||
if ( value ) {
|
||||
UpdateCachedRenderers();
|
||||
} else {
|
||||
ClearCachedRenderers();
|
||||
}
|
||||
FixTransform();
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
//
|
||||
// Internal
|
||||
@@ -165,15 +190,16 @@ namespace IsoTools {
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
public class InternalState {
|
||||
public bool Dirty = false;
|
||||
public bool Placed = false;
|
||||
public Rect ScreenRect = new Rect();
|
||||
public IsoUtils.MinMax MinMax3d = IsoUtils.MinMax.zero;
|
||||
public float Offset3d = 0.0f;
|
||||
public Vector2 MinSector = Vector2.zero;
|
||||
public Vector2 MaxSector = Vector2.zero;
|
||||
public IsoAssocList<IsoObject> SelfDepends = new IsoAssocList<IsoObject>(47);
|
||||
public IsoAssocList<IsoObject> TheirDepends = new IsoAssocList<IsoObject>(47);
|
||||
public bool Dirty = false;
|
||||
public bool Placed = false;
|
||||
public Rect ScreenRect = new Rect();
|
||||
public IsoUtils.MinMax MinMax3d = IsoUtils.MinMax.zero;
|
||||
public float Offset3d = 0.0f;
|
||||
public Vector2 MinSector = Vector2.zero;
|
||||
public Vector2 MaxSector = Vector2.zero;
|
||||
public List<Renderer> Renderers = new List<Renderer>();
|
||||
public IsoAssocList<IsoObject> SelfDepends = new IsoAssocList<IsoObject>(47);
|
||||
public IsoAssocList<IsoObject> TheirDepends = new IsoAssocList<IsoObject>(47);
|
||||
}
|
||||
|
||||
public InternalState Internal = new InternalState();
|
||||
@@ -185,10 +211,13 @@ namespace IsoTools {
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
#if UNITY_EDITOR
|
||||
Vector3 _lastSize = Vector3.zero;
|
||||
Vector3 _lastPosition = Vector3.zero;
|
||||
Vector2 _lastTransPos = Vector2.zero;
|
||||
Vector3 _lastSize = Vector3.zero;
|
||||
Vector3 _lastPosition = Vector3.zero;
|
||||
Vector2 _lastTransPos = Vector2.zero;
|
||||
Mode _lastMode = Mode.Mode2d;
|
||||
bool _lastCacheRenderers = false;
|
||||
|
||||
[Space(10)]
|
||||
[SerializeField] bool _isAlignment = true;
|
||||
[SerializeField] bool _isShowBounds = false;
|
||||
|
||||
@@ -243,6 +272,14 @@ namespace IsoTools {
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateCachedRenderers() {
|
||||
GetComponentsInChildren<Renderer>(Internal.Renderers);
|
||||
}
|
||||
|
||||
public void ClearCachedRenderers() {
|
||||
Internal.Renderers.Clear();
|
||||
}
|
||||
|
||||
void FixScreenRect() {
|
||||
if ( isoWorld ) {
|
||||
var l = isoWorld.IsoToScreen(position + IsoUtils.Vec3FromY(size.y)).x;
|
||||
@@ -255,9 +292,11 @@ namespace IsoTools {
|
||||
|
||||
void FixLastProperties() {
|
||||
#if UNITY_EDITOR
|
||||
_lastSize = size;
|
||||
_lastPosition = position;
|
||||
_lastTransPos = transform.position;
|
||||
_lastSize = size;
|
||||
_lastPosition = position;
|
||||
_lastTransPos = transform.position;
|
||||
_lastMode = mode;
|
||||
_lastCacheRenderers = cacheRenderers;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -296,13 +335,17 @@ namespace IsoTools {
|
||||
|
||||
#if UNITY_EDITOR
|
||||
void Reset() {
|
||||
size = Vector3.one;
|
||||
position = Vector3.zero;
|
||||
size = Vector3.one;
|
||||
position = Vector3.zero;
|
||||
mode = Mode.Mode2d;
|
||||
cacheRenderers = false;
|
||||
}
|
||||
|
||||
void OnValidate() {
|
||||
size = _size;
|
||||
position = _position;
|
||||
size = _size;
|
||||
position = _position;
|
||||
mode = _mode;
|
||||
cacheRenderers = _cacheRenderers;
|
||||
}
|
||||
|
||||
void OnDrawGizmos() {
|
||||
@@ -321,6 +364,12 @@ namespace IsoTools {
|
||||
if ( !IsoUtils.Vec2Approximately(_lastTransPos, transform.position) ) {
|
||||
FixIsoPosition();
|
||||
}
|
||||
if ( _lastCacheRenderers != _cacheRenderers ) {
|
||||
cacheRenderers = _cacheRenderers;
|
||||
}
|
||||
if ( _lastMode != _mode ) {
|
||||
mode = _mode;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -294,9 +294,15 @@ namespace IsoTools {
|
||||
|
||||
public void AddIsoObject(IsoObject iso_object) {
|
||||
_objects.Add(iso_object);
|
||||
if ( iso_object.cacheRenderers ) {
|
||||
iso_object.UpdateCachedRenderers();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveIsoObject(IsoObject iso_object) {
|
||||
if ( iso_object.cacheRenderers ) {
|
||||
iso_object.ClearCachedRenderers();
|
||||
}
|
||||
ClearIsoObjectDepends(iso_object);
|
||||
_objects.Remove(iso_object);
|
||||
_visibles.Remove(iso_object);
|
||||
@@ -350,12 +356,21 @@ namespace IsoTools {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Renderer> GetIsoObjectRenderers(IsoObject iso_object) {
|
||||
if ( iso_object.cacheRenderers ) {
|
||||
return iso_object.Internal.Renderers;
|
||||
} else {
|
||||
iso_object.GetComponentsInChildren<Renderer>(_tmpRenderers);
|
||||
return _tmpRenderers;
|
||||
}
|
||||
}
|
||||
|
||||
IsoUtils.MinMax IsoObjectMinMax3D(IsoObject iso_object) {
|
||||
iso_object.GetComponentsInChildren<Renderer>(_tmpRenderers);
|
||||
bool inited = false;
|
||||
var result = IsoUtils.MinMax.zero;
|
||||
for ( int i = 0, e = _tmpRenderers.Count; i < e; ++i ) {
|
||||
var bounds = _tmpRenderers[i].bounds;
|
||||
bool inited = false;
|
||||
var result = IsoUtils.MinMax.zero;
|
||||
var renderers = GetIsoObjectRenderers(iso_object);
|
||||
for ( int i = 0, e = renderers.Count; i < e; ++i ) {
|
||||
var bounds = renderers[i].bounds;
|
||||
var extents = bounds.extents;
|
||||
if ( extents.x > 0.0f || extents.y > 0.0f || extents.z > 0.0f ) {
|
||||
var center = bounds.center.z;
|
||||
@@ -378,9 +393,9 @@ namespace IsoTools {
|
||||
}
|
||||
|
||||
bool IsIsoObjectVisible(IsoObject iso_object) {
|
||||
iso_object.GetComponentsInChildren<Renderer>(_tmpRenderers);
|
||||
for ( int i = 0, e = _tmpRenderers.Count; i < e; ++i ) {
|
||||
if ( _tmpRenderers[i].isVisible ) {
|
||||
var renderers = GetIsoObjectRenderers(iso_object);
|
||||
for ( int i = 0, e = renderers.Count; i < e; ++i ) {
|
||||
if ( renderers[i].isVisible ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -544,6 +559,11 @@ namespace IsoTools {
|
||||
Profiler.EndSample();
|
||||
_dirty = false;
|
||||
}
|
||||
PostStepSortActions();
|
||||
}
|
||||
|
||||
void PostStepSortActions() {
|
||||
_tmpRenderers.Clear();
|
||||
}
|
||||
|
||||
void UpdateVisibles() {
|
||||
|
||||
Reference in New Issue
Block a user