예제 #1
0
    public override void OnInspectorGUI()
    {
        AreaGrassObject _target = AreaGrassObject.Instance;

        GUILayout.Label("Working mode", EditorStyles.boldLabel);
        int _state = GUILayout.Toolbar(_target.state, _target.stateStrings, GUILayout.Height(30));

        if ((_target.state == 0) && (_state == 1))
        {
            // build mesh
            if (!BuildMesh())
            {
                EditorUtility.DisplayDialog("Error...", "Can't build mesh   ", "Proceed", "");
                return;
            }
        }
        else if ((_target.state == 1) && (_state == 0))
        {
            _target.state = _state;
            EditorUtility.SetDirty(_target);
            return;
        }
        _target.state = _state;

        if (_state == 0)
        {
            if (_target.active_idx >= 0)
            {
                _target.control_points[_target.active_idx] = EditorGUILayout.Vector3Field("Position", _target.control_points[_target.active_idx]);
                EditorUtility.SetDirty(_target);
            }
        }
    }
예제 #2
0
    public void OnSceneGUI()
    {
        AreaGrassObject _target = AreaGrassObject.Instance;

        Event current = Event.current;
        int   i;

        switch (current.type)
        {
        case EventType.keyDown:
            if (current.keyCode == KeyCode.Delete)
            {
                if (_target.active_idx >= 0)
                {
                    Undo.RecordObject(_target, "delete pos");
                    _target.control_points.RemoveAt(_target.active_idx);
                    _target.active_idx = -1;
                    current.Use();
                }
            }

            break;

        case EventType.keyUp:
            //					current.Use();
            break;

        case EventType.mouseDown:
            //Debug.Log(current +"     "+controlID);
            float dist;
            float min_dist;

            _target.active_idx = -1;
            // pressing control points
            min_dist = 12f;
            for (i = 0; i < _target.control_points.Count; i++)
            {
                dist = Vector2.Distance(current.mousePosition, HandleUtility.WorldToGUIPoint(_target.control_points[i]));
                if (dist < min_dist)
                {
                    min_dist           = dist;
                    _target.active_idx = i;
                }
            }

            if (current.control && _target.active_idx == -1)
            {
                //Vector3 insert_pos = new Vector3(0, 0, 0);

                Undo.RecordObject(_target, "add pos");
                _target.control_points.Add(GetWorldPointFromMouse());

                current.Use();
            }
            //current.Use();
            break;

        //				case EventType.mouseMove:
        //				break;
        case EventType.mouseDrag:
            //current.Use();
            break;

        case EventType.mouseUp:
            //current.Use();
            break;

        case EventType.layout:
            // HandleUtility.AddDefaultControl(controlID);
            break;
        }

        // Node Numbers
        for (i = 0; i < _target.control_points.Count; i++)
        {
            Handles.Label(_target.control_points[i], "  " + i);
        }

        // control_points
        for (i = 0; i < _target.control_points.Count; i++)
        {
            Vector3 vec =
                Handles.FreeMoveHandle((_target.control_points[i]),
                                       Quaternion.identity, HandleUtility.GetHandleSize((_target.control_points[i])) * 0.08f, Vector3.one,
                                       Handles.RectangleCap);

            Undo.RecordObject(_target, "modify pos");
            //vec.y = 0;
            _target.control_points[i] = vec;


            Handles.DrawLine(_target.control_points[i], _target.control_points[(i + 1) % _target.control_points.Count]);
        }

        Handles.color = Color.gray;
    }
예제 #3
0
    bool BuildRealMesh()
    {
        GameObject      grass        = Resources.Load("Q_shiyancao") as GameObject;
        GameObject      grassParent  = GameObject.Find("Grass") as GameObject;
        AreaGrassObject _target      = AreaGrassObject.Instance;
        Vector3         heightOffset = new Vector3(0, _target.height, 0);

        Vector2 xMinMax, zMinMax;

        Vector3[] keyPoints = new Vector3[4];
        getPointsAB(_target.control_points, out xMinMax, out zMinMax, keyPoints);

        List <Vector3> intersectPs = new List <Vector3>();

        //x
        for (float i = xMinMax.x; i < xMinMax.y; i += _target.step)
        {
            intersectPs = getIntersectPoints(true, i, _target.control_points);
            if (intersectPs.Count <= 1)
            {
                continue;
            }
            for (int j = 0; j < intersectPs.Count - 1; j += 2)
            {
                float dis = Vector3.Distance(intersectPs[j], intersectPs[j + 1]);
                if (dis == 0)
                {
                    continue;
                }

                Vector3 dir = intersectPs[j + 1] - intersectPs[j];
                dir /= dis;

                for (float k = 0; k < dis; k += _target.step)
                {
                    Vector3    pos = intersectPs[j] + dir * k;
                    GameObject go  = Instantiate(grass, pos, Quaternion.identity) as GameObject;
                    go.transform.parent = grassParent.transform;
                }
            }
        }
        ////z
        //for (float i = zMinMax.x; i < zMinMax.y; i += _target.step)
        //{
        //    intersectPs = getIntersectPoints(false, i, _target.control_points);
        //    if (intersectPs.Count <= 1)
        //        continue;
        //    for (int j = 0; j < intersectPs.Count - 1; j += 2)
        //    {
        //        float dis = Vector3.Distance(intersectPs[j], intersectPs[j + 1]);
        //        if (dis == 0)
        //            continue;
        //        vertexs.Add(intersectPs[j]); uvs.Add(new Vector2(0, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 0 + index / 4)); uv3s.Add(new Vector2(0, 0));
        //        vertexs.Add(intersectPs[j] + heightOffset); uvs.Add(new Vector2(0, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 1 + index / 4)); uv3s.Add(new Vector2(0, 1));
        //        vertexs.Add(intersectPs[j + 1]); uvs.Add(new Vector2(dis / _target.height / 4, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 0 + index / 4)); uv3s.Add(new Vector2(0, 0));
        //        vertexs.Add(intersectPs[j + 1] + heightOffset); uvs.Add(new Vector2(dis / _target.height / 4, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 1 + index / 4)); uv3s.Add(new Vector2(0, 1));

        //        triangles.Add(index);
        //        triangles.Add(index + 1);
        //        triangles.Add(index + 2);

        //        triangles.Add(index + 2);
        //        triangles.Add(index + 1);
        //        triangles.Add(index + 3);

        //        index += 4;
        //    }
        //}

        return(true);
    }
예제 #4
0
    bool BuildMesh()
    {
        Mesh           grassMesh = new Mesh();
        List <Vector3> vertexs   = new List <Vector3>();
        List <Vector2> uvs       = new List <Vector2>();
        List <Vector2> uv2s      = new List <Vector2>();
        List <Vector2> uv3s      = new List <Vector2>();
        List <Vector3> normals   = new List <Vector3>();
        List <int>     triangles = new List <int>();

        int index = 0;

        AreaGrassObject _target      = AreaGrassObject.Instance;
        Vector3         heightOffset = new Vector3(0, _target.height, 0);

        Vector2 xMinMax, zMinMax;

        Vector3[] keyPoints = new Vector3[4];
        getPointsAB(_target.control_points, out xMinMax, out zMinMax, keyPoints);

        ProcessPoints(_target.control_points, keyPoints);

        List <Vector3> intersectPs = new List <Vector3>();

        //边界
        for (int i = 0; i < _target.control_points.Count; i++)
        {
            Vector3 p1 = _target.control_points[i];
            Vector3 p2 = _target.control_points[(i + 1) % _target.control_points.Count];

            Vector3 dir    = p2 - p1;
            Vector3 offset = new Vector3(-dir.z, 0, dir.x);
            offset = offset.normalized * AreaGrassObject.Instance.step;

            float dis = Vector3.Distance(p1, p2);

            vertexs.Add(p1 + offset); uvs.Add(new Vector2(0, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 0 + index / 4)); uv3s.Add(new Vector2(1, 0.5f));
            vertexs.Add(p1 + heightOffset); uvs.Add(new Vector2(0, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 1 + index / 4)); uv3s.Add(new Vector2(1, 1));
            vertexs.Add(p2 + offset); uvs.Add(new Vector2(dis / _target.height / 4, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 0 + index / 4)); uv3s.Add(new Vector2(1, 0.5f));
            vertexs.Add(p2 + heightOffset); uvs.Add(new Vector2(dis / _target.height / 4, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 1 + index / 4)); uv3s.Add(new Vector2(1, 1));

            triangles.Add(index);
            triangles.Add(index + 1);
            triangles.Add(index + 2);

            triangles.Add(index + 2);
            triangles.Add(index + 1);
            triangles.Add(index + 3);
            index += 4;
        }

        //x
        for (float i = xMinMax.x; i < xMinMax.y; i += _target.step)
        {
            intersectPs = getIntersectPoints(true, i, _target.control_points);
            if (intersectPs.Count <= 1)
            {
                continue;
            }
            for (int j = 0; j < intersectPs.Count - 1; j += 2)
            {
                float dis = Vector3.Distance(intersectPs[j], intersectPs[j + 1]);
                if (dis == 0)
                {
                    continue;
                }
                vertexs.Add(intersectPs[j]); uvs.Add(new Vector2(0, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 0 + index / 4)); uv3s.Add(new Vector2(1, 0));
                vertexs.Add(intersectPs[j] + heightOffset); uvs.Add(new Vector2(0, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 1 + index / 4)); uv3s.Add(new Vector2(1, 1));
                vertexs.Add(intersectPs[j + 1]); uvs.Add(new Vector2(dis / _target.height / 4, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 0 + index / 4)); uv3s.Add(new Vector2(1, 0));
                vertexs.Add(intersectPs[j + 1] + heightOffset); uvs.Add(new Vector2(dis / _target.height / 4, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 1 + index / 4)); uv3s.Add(new Vector2(1, 1));

                triangles.Add(index);
                triangles.Add(index + 1);
                triangles.Add(index + 2);

                triangles.Add(index + 2);
                triangles.Add(index + 1);
                triangles.Add(index + 3);

                index += 4;
            }
        }
        //z
        for (float i = zMinMax.x; i < zMinMax.y; i += _target.step)
        {
            intersectPs = getIntersectPoints(false, i, _target.control_points);
            if (intersectPs.Count <= 1)
            {
                continue;
            }
            for (int j = 0; j < intersectPs.Count - 1; j += 2)
            {
                float dis = Vector3.Distance(intersectPs[j], intersectPs[j + 1]);
                if (dis == 0)
                {
                    continue;
                }
                vertexs.Add(intersectPs[j]); uvs.Add(new Vector2(0, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 0 + index / 4)); uv3s.Add(new Vector2(0, 0));
                vertexs.Add(intersectPs[j] + heightOffset); uvs.Add(new Vector2(0, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(0, 1 + index / 4)); uv3s.Add(new Vector2(0, 1));
                vertexs.Add(intersectPs[j + 1]); uvs.Add(new Vector2(dis / _target.height / 4, 0)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 0 + index / 4)); uv3s.Add(new Vector2(0, 0));
                vertexs.Add(intersectPs[j + 1] + heightOffset); uvs.Add(new Vector2(dis / _target.height / 4, 1)); normals.Add(new Vector3(0, 1, 0)); uv2s.Add(new Vector2(dis / _target.height / 4, 1 + index / 4)); uv3s.Add(new Vector2(0, 1));

                triangles.Add(index);
                triangles.Add(index + 1);
                triangles.Add(index + 2);

                triangles.Add(index + 2);
                triangles.Add(index + 1);
                triangles.Add(index + 3);

                index += 4;
            }
        }

        ProcessUV2(ref uv2s);

        grassMesh.SetVertices(vertexs);
        grassMesh.SetNormals(normals);
        //grassMesh.SetUVs(0, uvs);
        grassMesh.SetUVs(1, uv2s);
        grassMesh.SetUVs(0, uv3s);
        grassMesh.SetTriangles(triangles, 0);

        GameObject mobj = new GameObject("AreaGrass");


        MeshRenderer mr = mobj.AddComponent <MeshRenderer>();

        mr.sharedMaterial    = Resources.Load("meshgrass") as Material;
        mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
        mr.sharedMaterial.SetFloat("_StepOffset", AreaGrassObject.Instance.step + 0.03f);
        MeshFilter mf = mobj.AddComponent <MeshFilter>();

        mf.sharedMesh = grassMesh;

        return(true);
    }