// Start is called before the first frame update
    public void Generate()
    {
        // Construct mesh
        meshFilter = this.GetComponent <MeshFilter>();

        Mesh curtainMesh = new Mesh();

        curtainMesh.vertices  = this.vertices;
        curtainMesh.triangles = this.indices;
        curtainMesh.uv        = this.uvs;
        meshFilter.mesh       = curtainMesh;

        MeshRenderer render = this.GetComponent <MeshRenderer>();

        Material mat = new Material(Shader.Find("EPlane/unlitSampler2D"));

        mat.SetTexture("_MainTex", _MainTex);
        render.material = mat;

        // Spawn UI
        GameObject EPUI            = GameObject.Find("EPUI");
        GameObject uiSpawnerPrefab = Resources.Load <GameObject>("Prefabs/Components/visualVertexSpawner");

        uiSpawner = GameObject.Instantiate <GameObject>(uiSpawnerPrefab);
        uiSpawner.GetComponent <RectTransform>().SetParent(EPUI.GetComponent <RectTransform>());
        UIVertexSpawner uiSpawnerComp = uiSpawner.GetComponent <UIVertexSpawner>();

        uiSpawnerComp.meshEntity = this.gameObject;
        uiSpawnerComp.SpawnVertices(this.WorldToScreenPoints(meshFilter.mesh.vertices));
    }
    public void OnPointerUp(PointerEventData eventData)
    {
        float minPosX = Mathf.Min(eventData.pressPosition.x, eventData.position.x);
        float maxPosX = Mathf.Max(eventData.pressPosition.x, eventData.position.x);

        float minPosY = Math.Min(eventData.pressPosition.y, eventData.position.y);
        float maxPosY = Mathf.Max(eventData.pressPosition.y, eventData.position.y);

        UIVertex[] uiVertices = this.FilterByRectangle(GameObject.FindObjectsOfType <UIVertex>(), new Vector3(minPosX, minPosY, 0), new Vector3(maxPosX, maxPosY, 0));

        foreach (var vertex in uiVertices)
        {
            UIVertexSpawner uiSpawner = vertex.transform.parent.gameObject.GetComponent <UIVertexSpawner>();
            uiSpawner.AddDirtyVertex(vertex.VertexIndex, vertex);
        }
    }
    public void OnClicked(GameObject vertex)
    {
        UIVertexSpawner spawnerComp = uiSpawner.GetComponent <UIVertexSpawner>();
        UIVertex        uiVertex    = vertex.GetComponent <UIVertex>();

        spawnerComp.rulerVertexIndex = uiVertex.VertexIndex;

        RectTransform rTrans = vertex.GetComponent <RectTransform>();

        startPosition = Input.mousePosition;

        if (!spawnerComp.dirtyVertices.ContainsKey(spawnerComp.rulerVertexIndex))
        {
            spawnerComp.EmptyDirtyVertices();
            spawnerComp.AddDirtyVertex(uiVertex.VertexIndex, uiVertex);
        }
        EPCamera.SendMessage("OnUpdateRulerPosition", rTrans.position);
    }
    public void OnDrag(PointerEventData eventData)
    {
        UIVertex uiVertex = eventData.pointerDrag.GetComponent <UIVertex>();

        Vector3 position    = this.ScreenPositionToLocalPosition(Input.mousePosition);
        Vector3 nowPosition = Input.mousePosition;

        UIVertexSpawner spawnerComp = uiSpawner.GetComponent <UIVertexSpawner>();

        // 移动所有选中的顶点
        if (spawnerComp.IsDirtyVerticesContainsKey(uiVertex.VertexIndex))
        {
            spawnerComp.MoveDirtyVertices(nowPosition - startPosition);
            this.SetVertex(spawnerComp.dirtyVertices);
        }

        startPosition = nowPosition;
    }
    public void SetVertex(Dictionary <int, UIVertex> DirtyVertices)
    {
        List <Vector3> tempVertices = new List <Vector3>();

        meshFilter.mesh.GetVertices(tempVertices);
        foreach (var vertex in DirtyVertices)
        {
            tempVertices[vertex.Value.VertexIndex] = this.ScreenPositionToLocalPosition(vertex.Value.GetComponent <RectTransform>().position);
        }
        meshFilter.mesh.SetVertices(tempVertices);

        UIVertexSpawner spawnerComp = uiSpawner.GetComponent <UIVertexSpawner>();
        Vector3         position    = spawnerComp.RulerPosition();

        if (position.z != -1)
        {
            EPCamera.SendMessage("OnUpdateRulerPosition", position);
        }
    }