using UnityEngine;
using System.Collections;
public class PickMe : MonoBehaviour
{
enum Mode { SELECT, OPER };
Mode operMode;
Rect drawRect = new Rect();
bool drawSelectRect = false;
GameObject objDummy;
ArrayList arya = new ArrayList();
GameObject[] objChoosen;
Shader[] matChoosen;
Transform[] objParent;
public Material lineMat;
public GameObject lineShader;
void Start()
{
/* lineMat=new Material( "Shader \"Lines/Colored Blended\" {" +
"SubShader { Pass { " +
" Blend SrcAlpha OneMinusSrcAlpha " +
" ZWrite Off Cull Off Fog { Mode Off } " +
" BindChannels {" +
" Bind \"vertex\", vertex Bind \"color\", color }" +
"} } }" );*/
objDummy = new GameObject("Dummy");
operMode = Mode.SELECT;
// lineMat.SetColor("_Color",new Color(1f,1f,1f,0.2f));
}
void OnGUI()
{
GUI.Label(new Rect(0, 0, 400, 20), "Left Click drag to Choose Object,Right Click to Cancel Choose");
GUI.Label(new Rect(0, 30, 100, 90), "Alpha1 move Alpha2 Rotate Alpha3 Scale");
GUI.Label(new Rect(0, 80, 300, 90), "Mouse mid and alt button to move and rotate the camera ");
}
void Update()
{
if (Input.GetMouseButtonDown(0) && operMode == Mode.SELECT)
{
drawRect.x = Input.mousePosition.x;
drawRect.y = Input.mousePosition.y;
drawSelectRect = true;
}
if (Input.GetMouseButtonDown(1))
{
operMode = Mode.SELECT;
GizmoRender gzr = objDummy.GetComponent<GizmoRender>();
Destroy(gzr);
for (int i = 0; i < objChoosen.Length; i++)
{
if (objChoosen[i] != null)
{
if (objChoosen[i].GetComponent<Renderer>() != null)
objChoosen[i].GetComponent<Renderer>().material.shader = matChoosen[i];
objChoosen[i].transform.parent = objParent[i];
BoundRender gzrs = objChoosen[i].GetComponent<BoundRender>();
Destroy(gzrs);
}
}
objDummy.transform.DetachChildren();
objDummy.transform.position = Vector3.zero;
objDummy.transform.localEulerAngles = Vector3.zero;
objDummy.transform.localScale = new Vector3(1, 1, 1);
arya.Clear();
}
if (Input.GetMouseButtonUp(0) && operMode == Mode.SELECT)
{
FixRect(ref drawRect);
drawSelectRect = false;
GameObject[] objs = GameObject.FindGameObjectsWithTag("Choose");
objs = AddChildObject(objs);
objChoosen = new GameObject[objs.Length];
matChoosen = new Shader[objs.Length];
objParent = new Transform[objs.Length];
int k = 0;
for (int i = 0; i < objs.Length; i++)
{
Mesh sharedMesh = null;
Bounds bonds = new Bounds();
if (objs[i].GetComponent<MeshFilter>() == null || objs[i].GetComponent<MeshRenderer>() == null)
{
if (objs[i].GetComponent<SkinnedMeshRenderer>() == null)
{
continue;
}
else
{
sharedMesh = objs[i].GetComponent<SkinnedMeshRenderer>().sharedMesh;
bonds = objs[i].GetComponent<SkinnedMeshRenderer>().GetComponent<Renderer>().bounds;
}
}
else
{
MeshFilter meshfilter = objs[i].GetComponent<MeshFilter>();
MeshRenderer meshRender = objs[i].GetComponent<MeshRenderer>();
sharedMesh = meshfilter.sharedMesh;
bonds = meshRender.GetComponent<Renderer>().bounds;
}
Vector3[] vertices;
vertices = sharedMesh.vertices;
Vector3 vec3 = Vector3.zero;
Vector2 vec2 = Vector2.zero;
for (int j = 0; j < vertices.Length; j++)
{
vec3 = GetComponent<Camera>().WorldToScreenPoint(objs[i].transform.TransformPoint(vertices[j]));
vec2.x = vec3.x;
vec2.y = vec3.y;
if (drawRect.Contains(vec2))
{
if (objs[i].GetComponent<BoundRender>() == null)
{
objs[i].AddComponent<BoundRender>();
objDummy.transform.position += bonds.center;
operMode = Mode.OPER;
objChoosen[k] = objs[i];
matChoosen[k] = objs[i].GetComponent<Renderer>().material.shader;
objChoosen[k].GetComponent<Renderer>().material.shader = Shader.Find("Transparent/Diffuse");
k++;
}
break;
}
}
}
if (k != 0)
{
objDummy.transform.position /= k;
for (int j = 0; j < k; j++)
{
if (objChoosen[j].GetComponent<MeshCollider>() != null)
objChoosen[j].GetComponent<MeshCollider>().enabled = false;
objParent[j] = objChoosen[j].transform.parent;
objChoosen[j].transform.parent = objDummy.transform;
}
if (objDummy.GetComponent<GizmoRender>() == null)
{
objDummy.AddComponent<GizmoRender>();
objDummy.GetComponent<GizmoRender>().eAxis = true;
}
}
}
if (drawSelectRect && operMode == Mode.SELECT)
{
drawRect.height = Input.mousePosition.y - drawRect.y;
drawRect.width = Input.mousePosition.x - drawRect.x;
}
if (Input.GetKeyDown(KeyCode.Alpha1))
{
if (objDummy.GetComponent<GizmoRender>())
{
objDummy.GetComponent<GizmoRender>().eAxis = true;
objDummy.GetComponent<GizmoRender>().eRotate = false;
objDummy.GetComponent<GizmoRender>().eScal = false;
}
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
if (objDummy.GetComponent<GizmoRender>())
{
objDummy.GetComponent<GizmoRender>().eAxis = false;
objDummy.GetComponent<GizmoRender>().eRotate = true;
objDummy.GetComponent<GizmoRender>().eScal = false;
}
}
if (Input.GetKeyDown(KeyCode.Alpha3))
{
if (objDummy.GetComponent<GizmoRender>())
{
objDummy.GetComponent<GizmoRender>().eAxis = false;
objDummy.GetComponent<GizmoRender>().eRotate = false;
objDummy.GetComponent<GizmoRender>().eScal = true;
}
}
}
void FixRect(ref Rect rect)
{
if (rect.width < 0)
{
rect.x += rect.width;
rect.width = -rect.width;
}
if (rect.height < 0)
{
rect.y += rect.height;
rect.height = -rect.height;
}
}
GameObject[] AddChildObject(GameObject[] objs)
{
for (int i = 0; i < objs.Length; i++)
{
arya.Add(objs[i]);
CountChildren(objs[i].transform);
}
GameObject[] objret = new GameObject[arya.Count];
for (int j = 0; j < arya.Count; j++)
objret[j] = (GameObject)arya[j];
return objret;
}
void CountChildren(Transform c)
{
foreach (Transform a in c)
{
if (a.gameObject.CompareTag("Choose"))
{
break;
}
else
{
arya.Add(a.gameObject);
}
CountChildren(a);
}
}
void OnRenderObject()
{
if (drawSelectRect)
{
lineMat.SetPass(0);
GL.Color(new Color(1f, 1f, 1f, 0.2f));
GL.PushMatrix();
GL.LoadOrtho();
GL.Begin(GL.QUADS);
if (drawRect.width * drawRect.height < 0)
{
GL.Vertex3(drawRect.x / Screen.width, drawRect.y / Screen.height, 0);
GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, drawRect.y / Screen.height, 0);
GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
GL.Vertex3(drawRect.x / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
}
else
{
GL.Vertex3(drawRect.x / Screen.width, drawRect.y / Screen.height, 0);
GL.Vertex3(drawRect.x / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, (drawRect.y + drawRect.height) / Screen.height, 0);
GL.Vertex3((drawRect.x + drawRect.width) / Screen.width, drawRect.y / Screen.height, 0);
}
GL.End();
GL.PopMatrix();
}
}
}