private void LegacyAddEdge()
    {
        // split the path into segments based on the split angle
        List <List <int>               > segments = new List <List <int>               >();
        List <Ferr2DT_TerrainDirection>  dirs     = new List <Ferr2DT_TerrainDirection>();
        List <int> order = new List <int>();

        segments = GetSegments(Path.GetVertsRaw(), out dirs);
        if (dirs.Count < segments.Count)
        {
            dirs.Add(directionOverrides[directionOverrides.Count - 1]);
        }
        for (int i = 0; i < segments.Count; i++)
        {
            order.Add(i);
        }

        order.Sort(
            new Ferr.LambdaComparer <int>(
                (x, y) => {
            Ferr2DT_TerrainDirection dirx = dirs[x] == Ferr2DT_TerrainDirection.None ? Ferr2D_Path.GetDirection(Path.pathVerts, segments[x], 0, fill == Ferr2DT_FillMode.InvertedClosed) : dirs[x];
            Ferr2DT_TerrainDirection diry = dirs[y] == Ferr2DT_TerrainDirection.None ? Ferr2D_Path.GetDirection(Path.pathVerts, segments[y], 0, fill == Ferr2DT_FillMode.InvertedClosed) : dirs[y];
            return(TerrainMaterial.GetDescriptor(diry).zOffset.CompareTo(TerrainMaterial.GetDescriptor(dirx).zOffset));
        }
                ));

        // process the segments into meshes
        for (int i = 0; i < order.Count; i++)
        {
            List <int> currSeg = segments[order[i]];
            List <int> prevSeg = order[i] - 1 < 0 ?  segments[segments.Count - 1] : segments[order[i] - 1];
            List <int> nextSeg = segments[(order[i] + 1) % segments.Count];

            int curr = currSeg[0];
            int prev = prevSeg[prevSeg.Count - 2];
            int next = currSeg[1];

            Vector2 p1        = Path.pathVerts[prev] - Path.pathVerts[curr];
            Vector2 p2        = Path.pathVerts[next] - Path.pathVerts[curr];
            bool    leftInner = Mathf.Atan2(p1.x * p2.y - p1.y * p2.x, Vector2.Dot(p1, p2)) < 0;

            curr = currSeg[currSeg.Count - 1];
            prev = currSeg[currSeg.Count - 2];
            next = nextSeg[1];

            p1 = Path.pathVerts[prev] - Path.pathVerts[curr];
            p2 = Path.pathVerts[next] - Path.pathVerts[curr];
            bool rightInner = Mathf.Atan2(p1.x * p2.y - p1.y * p2.x, Vector2.Dot(p1, p2)) < 0;

            LegacyAddSegment(Ferr2D_Path.IndicesToList <Vector2>(Path.pathVerts, segments[order[i]]), leftInner, rightInner, Ferr2D_Path.IndicesToList <float>(vertScales, segments[order[i]]), Ferr2D_Path.IndicesToList <CutOverrides>(cutOverrides, segments[order[i]]), order.Count <= 1 && Path.closed, smoothPath, dirs[order[i]]);
        }
    }
    private List <Vector2> GetSegmentsCombined(float aSplitDist)
    {
        Ferr2D_Path path = Path;
        List <Ferr2DT_TerrainDirection> dirs = new List <Ferr2DT_TerrainDirection>();
        List <Vector2> result = new List <Vector2>();
        List <List <int>               > list = GetSegments(path.GetVertsRaw(), out dirs);

        for (int i = 0; i < list.Count; i++)
        {
            if (smoothPath && list[i].Count > 2)
            {
                result.AddRange(Ferr2D_Path.SmoothSegment(Ferr2D_Path.IndicesToList <Vector2>(path.pathVerts, list[i]), aSplitDist, false));
            }
            else
            {
                result.AddRange(Ferr2D_Path.IndicesToList <Vector2>(path.pathVerts, list[i]));
            }
        }
        return(result);
    }
Beispiel #3
0
    private void DoCutOverrideModeHandles(Ferr2D_Path path, Ferr2DT_PathTerrain terrain, Matrix4x4 mat, Transform camTransform)
    {
        List <List <int>               > segments = new List <List <int>               >();
        List <Ferr2DT_TerrainDirection>  dirs     = new List <Ferr2DT_TerrainDirection>();
        List <Vector2> rawVerts = path.GetVertsRaw();

        // cut the terrain into segments, we need segment info to draw these points
        segments = terrain.GetSegments(rawVerts, out dirs);

        for (int s = 0; s < segments.Count; s++)
        {
            List <int>     currSeg   = segments[s];
            List <Vector2> currVerts = Ferr2D_Path.IndicesToList(rawVerts, currSeg);
            List <Ferr2DT_PathTerrain.CutOverrides> overrides = Ferr2D_Path.IndicesToList(terrain.cutOverrides, currSeg);

            // find information about this segment
            Ferr2DT_TerrainDirection   currDir = dirs[s];
            Ferr2DT_SegmentDescription desc    = default(Ferr2DT_SegmentDescription);

            if (currDir != Ferr2DT_TerrainDirection.None)
            {
                desc = terrain.TerrainMaterial.GetDescriptor(currDir);
            }
            else
            {
                desc = terrain.GetDescription(currSeg);
            }

            // if there's no body segment choices, don't bother with the rest of this
            if (desc.body.Length < 2)
            {
                continue;
            }

            Vector2 capLeftSlideDir  = (currVerts[1] - currVerts[0]);
            Vector2 capRightSlideDir = (currVerts[currVerts.Count - 2] - currVerts[currVerts.Count - 1]);
            capLeftSlideDir.Normalize();
            capRightSlideDir.Normalize();
            currVerts[0] -= capLeftSlideDir * desc.capOffset;
            currVerts[currVerts.Count - 1] -= capRightSlideDir * desc.capOffset;

            float distance = Ferr2D_Path.GetSegmentLength(currVerts);

            // how many texture cuts are there on the segment
            float bodyWidth   = desc.body[0].width * (terrain.TerrainMaterial.edgeMaterial.mainTexture.width / terrain.pixelsPerUnit);
            int   textureCuts = Mathf.Max(1, Mathf.FloorToInt(distance / bodyWidth + 0.5f));

            // data is attached to the points still, check if we've switched to a new point
            int activePt       = -1;
            int activeLocalCut = -1;
            for (int c = 0; c < textureCuts; c++)
            {
                float pctGlobal = c / (float)textureCuts;

                int   ptLocal  = 0;
                float pctLocal = 0;
                Ferr2D_Path.PathGlobalPercentToLocal(currVerts, pctGlobal, out ptLocal, out pctLocal, distance, false);

                if (ptLocal != activePt)
                {
                    // if they size down, we need to shorten the data too
                    if (activePt != -1)
                    {
                        CapListSize <int>(ref overrides[activePt].data, activeLocalCut + 3);
                    }
                    activePt       = ptLocal;
                    activeLocalCut = 0;

                    if (overrides[activePt].data == null)
                    {
                        overrides[activePt].data = new List <int>();
                    }
                }

                while (activeLocalCut >= overrides[activePt].data.Count)
                {
                    overrides[activePt].data.Add(0);
                }

                CapFunction cap            = CapDotAuto;
                int         activeOverride = overrides[activePt].data[activeLocalCut];
                if (activeOverride != 0)
                {
                    if (activeOverride == 1)
                    {
                        cap = CapDot1;
                    }
                    else if (activeOverride == 2)
                    {
                        cap = CapDot2;
                    }
                    else if (activeOverride == 3)
                    {
                        cap = CapDot3;
                    }
                    else if (activeOverride == 4)
                    {
                        cap = CapDot4;
                    }
                    else if (activeOverride == 5)
                    {
                        cap = CapDot5;
                    }
                    else if (activeOverride >= 6)
                    {
                        cap = CapDotN;
                    }
                }
                if (Event.current.alt)
                {
                    cap = CapDotReset;
                }

                int   ptShow  = 0;
                float pctShow = 0;
                Ferr2D_Path.PathGlobalPercentToLocal(currVerts, pctGlobal + (1f / textureCuts) * 0.5f, out ptShow, out pctShow, distance, false);

                Vector2 pt  = Ferr2D_Path.LinearGetPt(currVerts, ptShow, pctShow, false);
                Vector3 pos = mat.MultiplyPoint3x4(pt);
                float   sc  = HandleScale(pos) * 0.5f;
                if (Handles.Button(pos, camTransform.rotation, sc, sc, cap))
                {
                    Undo.RecordObject(terrain, "Lock Texture Segment");

                    overrides[activePt].data[activeLocalCut] = Event.current.alt ? 0 : (activeOverride + 1) % (desc.body.Length + 1);
                    EditorUtility.SetDirty(terrain);
                    GUI.changed = true;
                }

                activeLocalCut += 1;
            }
            if (activePt != -1)
            {
                CapListSize <int>(ref overrides[activePt].data, activeLocalCut + 3);
            }
        }
    }