示例#1
0
    public static LakePolygon CreatePolygon(Material material, List <Vector3> positions = null)
    {
        GameObject   gameobject   = new GameObject("Lake Polygon");
        LakePolygon  polygon      = gameobject.AddComponent <LakePolygon>();
        MeshRenderer meshRenderer = gameobject.AddComponent <MeshRenderer>();

        meshRenderer.receiveShadows    = false;
        meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;

        if (material != null)
        {
            meshRenderer.sharedMaterial = material;
        }

        if (positions != null)
        {
            for (int i = 0; i < positions.Count; i++)
            {
                polygon.AddPoint(positions[i]);
            }
        }

        return(polygon);
    }
示例#2
0
    protected virtual void OnSceneGUI()
    {
        if (lakePolygon == null)
        {
            lakePolygon = (LakePolygon)target;
        }

        Color baseColor = Handles.color;
        int   controlId = GUIUtility.GetControlID(FocusType.Passive);



        if (lakePolygon != null)
        {
            if (lakePolygon.lockHeight)
            {
                for (int i = 1; i < lakePolygon.points.Count; i++)
                {
                    Vector3 vec = lakePolygon.points[i];
                    vec.y = lakePolygon.points[0].y;
                    lakePolygon.points[i] = vec;
                }
            }
        }
        {
            Vector3[] points = new Vector3[lakePolygon.splinePoints.Count];


            for (int i = 0; i < lakePolygon.splinePoints.Count; i++)
            {
                points[i] = lakePolygon.splinePoints[i] + lakePolygon.transform.position;
            }


            Handles.color = Color.white;
            Handles.DrawPolyLine(points);

            if (Event.current.commandName == "UndoRedoPerformed")
            {
                lakePolygon.GeneratePolygon();
                return;
            }

            if (selectedPosition >= 0 && selectedPosition < lakePolygon.points.Count)
            {
                Handles.color = Color.red;
                Handles.SphereHandleCap(0, (Vector3)lakePolygon.points[selectedPosition] + lakePolygon.transform.position, Quaternion.identity, 1, EventType.Repaint);
            }


            int controlPointToDelete = -1;

            for (int j = 0; j < lakePolygon.points.Count; j++)
            {
                EditorGUI.BeginChangeCheck();

                Vector3 handlePos = (Vector3)lakePolygon.points[j] + lakePolygon.transform.position;

                GUIStyle style = new GUIStyle();
                style.normal.textColor = Color.red;

                Vector3 screenPoint = Camera.current.WorldToScreenPoint(handlePos);

                if (screenPoint.z > 0)
                {
                    Handles.Label(handlePos + Vector3.up * HandleUtility.GetHandleSize(handlePos), "Point: " + j.ToString(), style);
                }

                if (Event.current.control && Event.current.shift)
                {
                    int id = GUIUtility.GetControlID(FocusType.Passive);



                    if (HandleUtility.nearestControl == id)
                    {
                        Handles.color = Color.white;
                        if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
                        {
                            controlPointToDelete = j;
                        }
                    }
                    else
                    {
                        Handles.color = Handles.xAxisColor;
                    }

                    float size = 0.6f;
                    size = HandleUtility.GetHandleSize(handlePos) * size;
                    if (Event.current.type == EventType.Repaint)
                    {
                        Handles.SphereHandleCap(id, (Vector3)lakePolygon.points[j] + lakePolygon.transform.position, Quaternion.identity, size, EventType.Repaint);
                    }
                    else if (Event.current.type == EventType.Layout)
                    {
                        Handles.SphereHandleCap(id, (Vector3)lakePolygon.points[j] + lakePolygon.transform.position, Quaternion.identity, size, EventType.Layout);
                    }
                }
                else if (Tools.current == Tool.Move)
                {
                    float size = 0.6f;
                    size = HandleUtility.GetHandleSize(handlePos) * size;

                    Handles.color = Handles.xAxisColor;
                    Vector3 pos = Handles.Slider((Vector3)lakePolygon.points[j] + lakePolygon.transform.position, Vector3.right, size, Handles.ArrowHandleCap, 0.01f) - lakePolygon.transform.position;
                    if (!lakePolygon.lockHeight)
                    {
                        Handles.color = Handles.yAxisColor;

                        pos = Handles.Slider((Vector3)pos + lakePolygon.transform.position, Vector3.up, size, Handles.ArrowHandleCap, 0.01f) - lakePolygon.transform.position;
                    }
                    Handles.color = Handles.zAxisColor;
                    pos           = Handles.Slider((Vector3)pos + lakePolygon.transform.position, Vector3.forward, size, Handles.ArrowHandleCap, 0.01f) - lakePolygon.transform.position;

                    Vector3 halfPos = (Vector3.right + Vector3.forward) * size * 0.3f;
                    Handles.color = Handles.yAxisColor;
                    pos           = Handles.Slider2D((Vector3)pos + lakePolygon.transform.position + halfPos, Vector3.up, Vector3.right, Vector3.forward, size * 0.3f, Handles.RectangleHandleCap, 0.01f) - lakePolygon.transform.position - halfPos;
                    halfPos       = (Vector3.right + Vector3.up) * size * 0.3f;

                    if (!lakePolygon.lockHeight)
                    {
                        Handles.color = Handles.zAxisColor;
                        pos           = Handles.Slider2D((Vector3)pos + lakePolygon.transform.position + halfPos, Vector3.forward, Vector3.right, Vector3.up, size * 0.3f, Handles.RectangleHandleCap, 0.01f) - lakePolygon.transform.position - halfPos;
                        halfPos       = (Vector3.up + Vector3.forward) * size * 0.3f;
                        Handles.color = Handles.xAxisColor;
                        pos           = Handles.Slider2D((Vector3)pos + lakePolygon.transform.position + halfPos, Vector3.right, Vector3.up, Vector3.forward, size * 0.3f, Handles.RectangleHandleCap, 0.01f) - lakePolygon.transform.position - halfPos;
                    }

                    lakePolygon.points[j] = pos;
                }


                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(lakePolygon, "Change Position");
                    lakePolygon.GeneratePolygon();
#if VEGETATION_STUDIO
                    RegenerateVegetationMask();
#endif
#if VEGETATION_STUDIO_PRO
                    RegenerateBiomMask();
#endif
                }
            }

            if (controlPointToDelete >= 0)
            {
                Undo.RecordObject(lakePolygon, "Remove point");
                Undo.RecordObject(lakePolygon.transform, "Remove point");


                lakePolygon.RemovePoint(controlPointToDelete);

                lakePolygon.GeneratePolygon();

                GUIUtility.hotControl = controlId;
                Event.current.Use();
                HandleUtility.Repaint();
                controlPointToDelete = -1;
            }

            if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && Event.current.control)
            {
                Ray        ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
                RaycastHit hit;

                if (Physics.Raycast(ray, out hit))
                {
                    Undo.RecordObject(lakePolygon, "Add point");
                    Undo.RecordObject(lakePolygon.transform, "Add point");

                    Vector3 position = hit.point - lakePolygon.transform.position;
                    lakePolygon.AddPoint(position);

                    lakePolygon.GeneratePolygon();

#if VEGETATION_STUDIO
                    RegenerateVegetationMask();
#endif
#if VEGETATION_STUDIO_PRO
                    RegenerateBiomMask();
#endif

                    GUIUtility.hotControl = controlId;
                    Event.current.Use();
                    HandleUtility.Repaint();
                }
            }

            if (!Event.current.control && Event.current.shift)
            {
                Ray        ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
                RaycastHit hit;

                if (Physics.Raycast(ray, out hit))
                {
                    int   idMin       = -1;
                    float distanceMin = float.MaxValue;

                    for (int j = 0; j < lakePolygon.points.Count; j++)
                    {
                        Vector3 handlePos = (Vector3)lakePolygon.points[j] + lakePolygon.transform.position;

                        float pointDist = Vector3.Distance(hit.point, handlePos);
                        if (pointDist < distanceMin)
                        {
                            distanceMin = pointDist;
                            idMin       = j;
                        }
                    }

                    Vector3 posOne = (Vector3)lakePolygon.points[idMin] + lakePolygon.transform.position;
                    Vector3 posTwo;



                    Vector3 posPrev = (Vector3)lakePolygon.points[lakePolygon.ClampListPos(idMin - 1)] + lakePolygon.transform.position;
                    Vector3 posNext = (Vector3)lakePolygon.points[lakePolygon.ClampListPos(idMin + 1)] + lakePolygon.transform.position;

                    if (Vector3.Distance(hit.point, posPrev) > Vector3.Distance(hit.point, posNext))
                    {
                        posTwo = posNext;
                    }
                    else
                    {
                        posTwo = posPrev;
                        idMin  = lakePolygon.ClampListPos(idMin - 1);
                    }



                    Handles.color = Handles.xAxisColor;
                    Handles.DrawLine(hit.point, posOne);
                    Handles.DrawLine(hit.point, posTwo);

                    if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
                    {
                        Undo.RecordObject(lakePolygon, "Add point");
                        Undo.RecordObject(lakePolygon.transform, "Add point");

                        Vector4 position = hit.point - lakePolygon.transform.position;
                        lakePolygon.AddPointAfter(idMin);
                        lakePolygon.ChangePointPosition(idMin + 1, position);

                        lakePolygon.GeneratePolygon();

                        GUIUtility.hotControl = controlId;
                        Event.current.Use();
                        HandleUtility.Repaint();
                    }
                }
            }


            if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && Event.current.control)
            {
                GUIUtility.hotControl = 0;
            }
            if (Event.current.type == EventType.MouseUp && Event.current.button == 0 && Event.current.shift)
            {
                GUIUtility.hotControl = 0;
            }
        }
    }
示例#3
0
        /// <summary>
        /// Create a lake and re-parent the mask so that the lake becomes the child of the container and the mask the child of the lake.
        ///
        /// Note: the lake uses a bezier curve on the points, so the lake most likely won't be 100% in line with the mask.
        /// </summary>
        /// <param name="maskGameObject"></param>
        /// <param name="gameObjectName"></param>
        /// <param name="nodes"></param>
        public static LakePolygon CreateLakePolygon(LakeSettings lakeSettings, BiomeMaskArea mask, GameObject maskGameObject, string gameObjectName, List <Vector3> nodes)
        {
            GameObject maskParentGameObject = maskGameObject.transform.parent.gameObject;
            Vector3    maskPosition         = maskGameObject.transform.position;

            // lake
            LakePolygon lakePolygon = LakePolygon.CreatePolygon(AssetDatabase.GetBuiltinExtraResource <Material>("Default-Diffuse.mat"));

            // apply profile
            lakePolygon.currentProfile = lakeSettings.lakeProfile;

            // apply gameobject data
            lakePolygon.transform.localPosition = Vector3.zero;
            lakePolygon.name = "Lake " + gameObjectName;

            // add biome nodes
            if (lakeSettings.ramInternalLakeCreation)
            {
                // apply settings
                lakePolygon.angleSimulation            = lakeSettings.angleSimulation;
                lakePolygon.closeDistanceSimulation    = lakeSettings.closeDistanceSimulation;
                lakePolygon.checkDistanceSimulation    = lakeSettings.checkDistanceSimulation;
                lakePolygon.removeFirstPointSimulation = lakeSettings.removeFirstPointSimulation;

                // add point
                lakePolygon.AddPoint(maskPosition);

                // start simulation
                lakePolygon.Simulation();
            }
            // use mask shape
            else
            {
                foreach (Vector3 node in nodes)
                {
                    lakePolygon.AddPoint(maskParentGameObject.transform.InverseTransformPoint(node));
                }
            }


            // generate the lake
            lakePolygon.GeneratePolygon();

            // re-parent the mask to the lake and the lake to the parent
            GameObjectUtility.SetParentAndAlign(lakePolygon.gameObject, maskParentGameObject);
            GameObjectUtility.SetParentAndAlign(maskGameObject, lakePolygon.gameObject);

            // adjust the lake position
            lakePolygon.transform.position = maskPosition;

            // reset the mask position, it's now a child of the lake
            if (lakeSettings.ramInternalLakeCreation)
            {
                maskGameObject.transform.position = Vector3.zero;

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

                foreach (Vector3 node in lakePolygon.points)
                {
                    newPoints.Add(lakePolygon.transform.TransformPoint(node));
                }

                // set the lake's polygon as new mask nodes
                SetMaskNodes(mask, newPoints);

                // put move handle into the center of the polygon
                BiomeMaskUtils.CenterMainHandle(mask);
            }

            // re-apply the material so that the water becomes immediately visible
            MeshRenderer meshRenderer = lakePolygon.GetComponent <MeshRenderer>();

            meshRenderer.sharedMaterial = lakePolygon.currentProfile.lakeMaterial;

            /* carving is disabled for now
             * if ( extension.lakeSettings.carveTerrain)
             * {
             *  Debug.Log("Start carve");
             *  lakePolygon.terrainSmoothMultiplier = 2f;
             *  lakePolygon.distSmooth = 10f;
             *  lakePolygon.TerrainCarve();
             * }
             */

            // EditorUtility.SetDirty(lakePolygon);

            return(lakePolygon);
        }