blob: d2ba1ae2dcda70ba9b3038fe20a62edee4ef8143 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
using UnityEngine;
using System.Collections;
using XUtliPoolLib;
[ExecuteInEditMode]
public class ControlParticle : MonoBehaviour, IControlParticle
{
public int renderQueue = 3500;
public bool runOnlyOnce = false;
public bool autoFindWidget = false;
public UIWidget widget;
public int renderQueueOffset = 0;
[System.NonSerialized]
UIPanel panel;
[System.NonSerialized]
Material matCache;
[System.NonSerialized]
private Renderer renderCache;
void Awake()
{
renderCache = GetComponent<Renderer>();
if (Application.isPlaying && renderCache != null)
{
matCache = GetComponent<Renderer>().material;
if (matCache != null)
{
matCache.renderQueue = 3500;//ui defalut
}
}
}
void Start()
{
RefreshRenderQueue(false);
}
public void SetWidget(GameObject go)
{
if (go != null)
{
UIWidget tWidget = go.GetComponent<UIWidget>();
if (tWidget != null)
{
widget = tWidget;
}
}
}
public void RefreshRenderQueue(bool resetWidget)
{
if (autoFindWidget|| resetWidget)
widget = null;
if (autoFindWidget && widget == null)
{
Transform _parent = transform;
while (_parent != null)
{
UIWidget _widget = _parent.GetComponent<UIWidget>();
if (_widget != null)
{
widget = _widget;
break;
}
_parent = _parent.parent;
}
}
}
[ContextMenu("test")]
void Test()
{
print("widget:" + (widget == null));
if (widget != null)
{
print(widget.name+" panel: "+(widget.panel==null));
if(widget.panel!=null)
{
print("usemerge:" + widget.panel.useMerge+" dc count:"+widget.panel.drawCalls.Count);
}
}
}
void InnerUpdate(Material mat)
{
if (mat != null)
{
if (widget != null && widget.drawCall != null)
{
renderQueue = widget.drawCall.renderQueue+renderQueueOffset;
}
else if (widget != null && widget.panel != null && widget.panel.useMerge && widget.panel.drawCalls.Count > 0)
{
renderQueue = widget.panel.drawCalls[0].renderQueue+renderQueueOffset;
}
if (mat.renderQueue != renderQueue)
{
mat.renderQueue = renderQueue + renderQueueOffset;
renderQueue = mat.renderQueue;
}
UIPanel newPanel = widget != null ? widget.panel : null;
if (newPanel != null && panel != newPanel)
{
panel = newPanel;
if (panel.root != null && panel.clipping != UIDrawCall.Clipping.None)
{
Vector4 clipRange = panel.finalClipRegion;
Vector3 panelPos = panel.root.transform.InverseTransformPoint(panel.transform.position);
clipRange.x += panelPos.x;
clipRange.y += panelPos.y;
float left = (clipRange.x - clipRange.z * 0.5f) / 568;
float right = (clipRange.x + clipRange.z * 0.5f) / 568;
float top = (clipRange.y + clipRange.w * 0.5f) / 320;
float down = (clipRange.y - clipRange.w * 0.5f) / 320;
mat.SetVector("_ClipRange0", new Vector4(left, down, right, top));
}
else
{
mat.SetVector("_ClipRange0", new Vector4(-1, -1, 1, 1));
}
}
}
}
void Update()
{
if (renderCache != null)
{
if (Application.isPlaying)
{
InnerUpdate(matCache);
}
else
{
InnerUpdate(renderCache.sharedMaterial);
}
}
if (runOnlyOnce && Application.isPlaying)
{
this.enabled = false;
}
}
//public void SetHierarchy(GameObject go)
//{
//}
//public void SetWidget(GameObject go)
//{
// if(go != null)
// {
// UIWidget tWidget = go.GetComponent<UIWidget>();
// if (tWidget != null)
// {
// widget = tWidget;
// }
// }
//}
}
|