/*
http://www.cgsoso.com/forum-211-1.html
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
CGSOSO 主打游戏开发,影视设计等CG资源素材。
插件如若商用,请务必官网购买!
daily assets update for try.
U should buy the asset from home store if u use it in your project!
*/
using UnityEngine;
public class LTGUI
{
public enum Element_Type
{
Texture,
Label
}
public static int RECT_LEVELS = 5;
public static int RECTS_PER_LEVEL = 10;
public static int BUTTONS_MAX = 24;
private static LTRect[] levels;
private static int[] levelDepths;
private static Rect[] buttons;
private static int[] buttonLevels;
private static int[] buttonLastFrame;
private static LTRect r;
private static Color color = Color.white;
private static bool isGUIEnabled = false;
private static int global_counter = 0;
public static void init()
{
if (levels == null)
{
levels = new LTRect[RECT_LEVELS * RECTS_PER_LEVEL];
levelDepths = new int[RECT_LEVELS];
}
}
public static void initRectCheck()
{
if (buttons == null)
{
buttons = new Rect[BUTTONS_MAX];
buttonLevels = new int[BUTTONS_MAX];
buttonLastFrame = new int[BUTTONS_MAX];
for (int i = 0; i < buttonLevels.Length; i++)
{
buttonLevels[i] = -1;
}
}
}
public static void reset()
{
if (isGUIEnabled)
{
isGUIEnabled = false;
for (int i = 0; i < levels.Length; i++)
{
levels[i] = null;
}
for (int j = 0; j < levelDepths.Length; j++)
{
levelDepths[j] = 0;
}
}
}
public static void update(int updateLevel)
{
if (!isGUIEnabled)
{
return;
}
init();
if (levelDepths[updateLevel] <= 0)
{
return;
}
color = GUI.color;
int num = updateLevel * RECTS_PER_LEVEL;
int num2 = num + levelDepths[updateLevel];
for (int i = num; i < num2; i++)
{
r = levels[i];
if (r == null)
{
continue;
}
if (r.useColor)
{
GUI.color = r.color;
}
if (r.type == Element_Type.Label)
{
if (r.style != null)
{
GUI.skin.label = r.style;
}
if (r.useSimpleScale)
{
GUI.Label(new Rect((r.rect.x + r.margin.x + r.relativeRect.x) * r.relativeRect.width, (r.rect.y + r.margin.y + r.relativeRect.y) * r.relativeRect.height, r.rect.width * r.relativeRect.width, r.rect.height * r.relativeRect.height), r.labelStr);
}
else
{
GUI.Label(new Rect(r.rect.x + r.margin.x, r.rect.y + r.margin.y, r.rect.width, r.rect.height), r.labelStr);
}
}
else if (r.type == Element_Type.Texture && r.texture != null)
{
Vector2 vector = (!r.useSimpleScale) ? new Vector2(r.rect.width, r.rect.height) : new Vector2(0f, r.rect.height * r.relativeRect.height);
if (r.sizeByHeight)
{
vector.x = (float)r.texture.width / (float)r.texture.height * vector.y;
}
if (r.useSimpleScale)
{
GUI.DrawTexture(new Rect((r.rect.x + r.margin.x + r.relativeRect.x) * r.relativeRect.width, (r.rect.y + r.margin.y + r.relativeRect.y) * r.relativeRect.height, vector.x, vector.y), r.texture);
}
else
{
GUI.DrawTexture(new Rect(r.rect.x + r.margin.x, r.rect.y + r.margin.y, vector.x, vector.y), r.texture);
}
}
}
GUI.color = color;
}
public static bool checkOnScreen(Rect rect)
{
bool flag = rect.x + rect.width < 0f;
bool flag2 = rect.x > (float)Screen.width;
bool flag3 = rect.y > (float)Screen.height;
bool flag4 = rect.y + rect.height < 0f;
return !flag && !flag2 && !flag3 && !flag4;
}
public static void destroy(int id)
{
int num = id & 0xFFFF;
int num2 = id >> 16;
if (id >= 0 && levels[num] != null && levels[num].hasInitiliazed && levels[num].counter == num2)
{
levels[num] = null;
}
}
public static void destroyAll(int depth)
{
int num = depth * RECTS_PER_LEVEL + RECTS_PER_LEVEL;
int num2 = depth * RECTS_PER_LEVEL;
while (levels != null && num2 < num)
{
levels[num2] = null;
num2++;
}
}
public static LTRect label(Rect rect, string label, int depth)
{
return LTGUI.label(new LTRect(rect), label, depth);
}
public static LTRect label(LTRect rect, string label, int depth)
{
rect.type = Element_Type.Label;
rect.labelStr = label;
return element(rect, depth);
}
public static LTRect texture(Rect rect, Texture texture, int depth)
{
return LTGUI.texture(new LTRect(rect), texture, depth);
}
public static LTRect texture(LTRect rect, Texture texture, int depth)
{
rect.type = Element_Type.Texture;
rect.texture = texture;
return element(rect, depth);
}
public static LTRect element(LTRect rect, int depth)
{
isGUIEnabled = true;
init();
int num = depth * RECTS_PER_LEVEL + RECTS_PER_LEVEL;
int num2 = 0;
if (rect != null)
{
destroy(rect.id);
}
if (rect.type == Element_Type.Label && rect.style != null)
{
Color textColor = rect.style.normal.textColor;
if (textColor.a <= 0f)
{
UnityEngine.Debug.LogWarning("Your GUI normal color has an alpha of zero, and will not be rendered.");
}
}
if (rect.relativeRect.width == float.PositiveInfinity)
{
rect.relativeRect = new Rect(0f, 0f, Screen.width, Screen.height);
}
for (int i = depth * RECTS_PER_LEVEL; i < num; i++)
{
r = levels[i];
if (r == null)
{
r = rect;
r.rotateEnabled = true;
r.alphaEnabled = true;
r.setId(i, global_counter);
levels[i] = r;
if (num2 >= levelDepths[depth])
{
levelDepths[depth] = num2 + 1;
}
global_counter++;
return r;
}
num2++;
}
UnityEngine.Debug.LogError("You ran out of GUI Element spaces");
return null;
}
public static bool hasNoOverlap(Rect rect, int depth)
{
initRectCheck();
bool result = true;
bool flag = false;
for (int i = 0; i < buttonLevels.Length; i++)
{
if (buttonLevels[i] >= 0)
{
if (buttonLastFrame[i] + 1 < Time.frameCount)
{
buttonLevels[i] = -1;
}
else if (buttonLevels[i] > depth && pressedWithinRect(buttons[i]))
{
result = false;
}
}
if (!flag && buttonLevels[i] < 0)
{
flag = true;
buttonLevels[i] = depth;
buttons[i] = rect;
buttonLastFrame[i] = Time.frameCount;
}
}
return result;
}
public static bool pressedWithinRect(Rect rect)
{
Vector2 vector = firstTouch();
if (vector.x < 0f)
{
return false;
}
float num = (float)Screen.height - vector.y;
return vector.x > rect.x && vector.x < rect.x + rect.width && num > rect.y && num < rect.y + rect.height;
}
public static bool checkWithinRect(Vector2 vec2, Rect rect)
{
vec2.y = (float)Screen.height - vec2.y;
return vec2.x > rect.x && vec2.x < rect.x + rect.width && vec2.y > rect.y && vec2.y < rect.y + rect.height;
}
public static Vector2 firstTouch()
{
if (UnityEngine.Input.touchCount > 0)
{
return Input.touches[0].position;
}
if (Input.GetMouseButton(0))
{
return UnityEngine.Input.mousePosition;
}
return new Vector2(float.NegativeInfinity, float.NegativeInfinity);
}
}