new 'cacheRenderers' option for IsoObject

This commit is contained in:
2016-04-17 17:12:29 +06:00
parent fccf22b3cd
commit c1d521e96a
29 changed files with 1175 additions and 475 deletions

View File

@@ -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
}

View File

@@ -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() {