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); } } }
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; }
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); }
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); }