コード例 #1
0
ファイル: ResourceClip.cs プロジェクト: jhoran1046/olakedms
 public void Cut(CUserEntity user, int resourceId)
 {
     _currentUser = user;
     _clipMode    = ClipMode.CUTMODE;
     _resources.Clear();
     AddResource(resourceId);
 }
コード例 #2
0
ファイル: CutFile.cs プロジェクト: MusouCrow/ExtractorSharp
        public void Do(params object[] args)
        {
            Array               = args[0] as Album[];
            Mode                = (ClipMode)args[1];
            Clipboarder         = Clipboarder.Default;
            Clipboarder.Default = Clipboarder.CreateClipboarder(Array, null, Mode);
            var builder = new LSBuilder();
            var dir     = $"{Program.Config["RootPath"]}/temp/clipbord_img";

            if (Directory.Exists(dir))
            {
                //删除文件夹内容
                Directory.Delete(dir, true);
            }
            Directory.CreateDirectory(dir);
            var path_arr = new string[Array.Length];

            for (var i = 0; i < Array.Length; i++)
            {
                path_arr[i] = $"{dir}/{Array[i].Name}";
                Tools.SaveFile(path_arr[i], Array[i]);
                var json_path = path_arr[i].RemoveSuffix(".ogg");
                json_path = json_path.RemoveSuffix(".img");
                json_path = $"{json_path}.json";
                var root = new LSObject {
                    { "path", Array[i].Path }
                };
                builder.Write(root, json_path);
            }
            var collection = new StringCollection();

            collection.AddRange(path_arr);
            Clipboard.SetFileDropList(collection);
        }
コード例 #3
0
ファイル: CutImage.cs プロジェクト: DK2222/ExtractorSharp
        public void Do(params object[] args)
        {
            Album               = args[0] as Album;
            Indexes             = args[1] as int[];
            Mode                = (ClipMode)args[2];
            Clipboarder         = Clipboarder.Default;
            Clipboarder.Default = Clipboarder.CreateClipboarder(Album, Indexes, Mode);

            var arr = new string[Indexes.Length];
            var dir = $"{Program.Config["RootPath"]}/temp/clipbord_image";

            if (Directory.Exists(dir))
            {
                Directory.Delete(dir, true);
            }
            Directory.CreateDirectory(dir);
            var builder = new LSBuilder();

            for (var i = 0; i < Indexes.Length; i++)
            {
                var entity = Album[Indexes[i]];
                var path   = $"{dir}/{entity.Index}";
                builder.WriteObject(entity, path + ".json");
                arr[i] = path + ".png";
                entity.Picture.Save(arr[i]);
            }
            var collection = new StringCollection();

            collection.AddRange(arr);
            Clipboard.SetFileDropList(collection);
        }
コード例 #4
0
        private void SetValue(ClipMode mode, T item)
        {
            var @new = new ClipboardValueContainer(item, mode);
            var old  = Interlocked.Exchange(ref this.container, @new);

            this.ContentChanged.BeginFire(this, new ChangingEventArgs <T>(old != null ? old.Value : default(T), item));
        }
コード例 #5
0
 public static Clipboarder CreateClipboarder(Album[] array, int[] indexes, ClipMode mode)
 {
     return(new Clipboarder {
         Albums = array,
         Indexes = indexes,
         Mode = mode
     });
 }
コード例 #6
0
 public static Clipboarder CreateClipboarder(Album album, int[] indexes, ClipMode mode)
 {
     return(new Clipboarder {
         Album = album,
         Indexes = indexes,
         Mode = mode
     });
 }
コード例 #7
0
ファイル: EditorClip.cs プロジェクト: ylmbtm/seqence
 public EditorClip(EditorTrack tr, IClip c)
 {
     this.track = tr;
     this.clip  = c;
     rect       = Rect.zero;
     dragMode   = DragMode.None;
     e          = Event.current;
     clipMode   = ClipMode.None;
 }
コード例 #8
0
ファイル: ResourceClip.cs プロジェクト: jhoran1046/olakedms
 public void Cut(CUserEntity user, List <int> resources)
 {
     _currentUser = user;
     _clipMode    = ClipMode.CUTMODE;
     _resources.Clear();
     foreach (int res in resources)
     {
         AddResource(res);
     }
 }
コード例 #9
0
 public void Init(EditorTrack tr, IClip c)
 {
     this.track = tr;
     this.clip  = c;
     rect       = Rect.zero;
     dragMode   = DragMode.None;
     e          = Event.current;
     clipMode   = ClipMode.None;
     select     = false;
     Regist(EventT.Select, OnSelect);
 }
コード例 #10
0
ファイル: EditorClip.cs プロジェクト: ylmbtm/seqence
        public void OnGUI()
        {
            rect   = track.RenderRect;
            rect.x = TimelineWindow.inst.TimeToPixel(clip.start);
            float y        = TimelineWindow.inst.TimeToPixel(clip.end);
            var   timeRect = TimelineWindow.inst.timeAreaRect;

            rect.x      = Mathf.Max(rect.x, timeRect.x);
            y           = Mathf.Min(y, timeRect.xMax);
            rect.width  = y - rect.x;
            rect.height = rect.height - 2;
            if (rect.width < 0)
            {
                rect.width = 0;
            }
            EditorGUI.DrawRect(rect, Color.gray);
            EditorGUI.DrawOutline(rect, 1, Color.white);

            Rect left = rect;

            left.x     = rect.x - Mathf.Min(10, rect.width / 4);
            left.x     = Mathf.Max(left.x, timeRect.x);
            left.width = Mathf.Min(20, rect.width / 2);
            EditorGUIUtility.AddCursorRect(left, MouseCursor.SplitResizeLeftRight);
            Rect right = left;

            right.x = rect.x + rect.width - Mathf.Min(10, rect.width / 4);
            right.x = Mathf.Max(right.x, timeRect.x);
            EditorGUIUtility.AddCursorRect(right, MouseCursor.SplitResizeLeftRight);
            ProcessEvent(left, right);
            clipMode = track.CalcuteClipMode(clip, out var loop);
            if (loop > 1e-2)
            {
                DrawLoops(loop);
            }
            if ((clipMode & ClipMode.Left) > 0)
            {
                left.x      = rect.x + 2;
                left.width  = 10;
                left.y      = rect.y + rect.height / 3;
                left.height = rect.height / 2;
                GUI.Label(left, GUIContent.none, TimelineStyles.clipIn);
            }
            if ((clipMode & ClipMode.Right) > 0)
            {
                right.x      = rect.xMax - 8;
                right.width  = 8;
                right.y      = rect.y + rect.height / 3;
                right.height = rect.height / 2;
                GUI.Label(right, GUIContent.none, TimelineStyles.clipOut);
            }
            MixProcessor();
            EditorGUI.LabelField(rect, clip.Display, TimelineStyles.fontClip);
        }
コード例 #11
0
ファイル: EditorAnimTrack.cs プロジェクト: zxsean/seqence
        public override ClipMode CalcuteClipMode(IClip c, out float loopLen)
        {
            var      d    = c.data as AnimClipData;
            ClipMode mode = ClipMode.None;

            if (d.trim_start > 1e-2)
            {
                mode |= ClipMode.Left;
            }
            if (d.trim_end < -1e-2)
            {
                mode |= ClipMode.Right;
            }
            else if (d.trim_end > 1e-2)
            {
                mode |= ClipMode.Loop;
            }
            loopLen = d.trim_end;
            return(mode);
        }
コード例 #12
0
        public static void Reload()
        {
            LockAxisX = EditorPrefs.GetBool("LockAxisX", false);
            LockAxisY = EditorPrefs.GetBool("LockAxisY", false);
            LockAxisZ = EditorPrefs.GetBool("LockAxisZ", false);

            UniformGrid = EditorPrefs.GetBool("UniformGrid", true);
            EditMode    = GetEnum("EditMode", ToolEditMode.Generate);

            SnapVector          = GetVector3("MoveSnap", Vector3.one);
            DefaultMoveOffset   = GetVector3("DefaultMoveOffset", Vector3.zero);
            DefaultRotateOffset = GetVector3("DefaultRotateOffset", Vector3.zero);

            ShapeBuildMode     = GetEnum("ShapeBuildMode", ShapeMode.Box);
            DefaultTexGenFlags = GetEnum("DefaultTexGenFlags", defaultTextGenFlagsState);

            GridVisible = EditorPrefs.GetBool("ShowGrid", true);
            SnapMode    = (SnapMode)EditorPrefs.GetInt("SnapMode", (int)(EditorPrefs.GetBool("ForceSnapToGrid", true) ? SnapMode.GridSnapping : SnapMode.None));

            VisibleHelperSurfaces = GetEnum("HelperSurfaces", DefaultHelperSurfaceFlags);

            ClipMode          = GetEnum("ClipMode", ClipMode.RemovePositive);
            EnableRealtimeCSG = EditorPrefs.GetBool("EnableRealtimeCSG", true);

            DefaultMaterial = GetMaterial("DefaultMaterial", MaterialUtility.WallMaterial);


            SnapScale          = EditorPrefs.GetFloat("ScaleSnap", 0.1f);
            SnapRotation       = EditorPrefs.GetFloat("RotationSnap", 15.0f);
            DefaultShapeHeight = EditorPrefs.GetFloat("DefaultShapeHeight", 1.0f);
            CurveSides         = (uint)EditorPrefs.GetInt("CurveSides", 10);

            SelectionVertex  = EditorPrefs.GetBool("SelectionVertex", true);
            SelectionEdge    = EditorPrefs.GetBool("SelectionEdge", true);
            SelectionSurface = EditorPrefs.GetBool("SelectionSurface", true);

            HiddenSurfacesNotSelectable = EditorPrefs.GetBool("HiddenSurfacesNotSelectable", true);
//			HiddenSurfacesOrthoSelectable	= EditorPrefs.GetBool("HiddenSurfacesOrthoSelectable", true);
            ShowTooltips       = EditorPrefs.GetBool("ShowTooltips", true);
            AutoRigidbody      = EditorPrefs.GetBool("AutoRigidbody", (CSGModel.DefaultSettings & ModelSettingsFlags.AutoUpdateRigidBody) == ModelSettingsFlags.AutoUpdateRigidBody);
            DefaultPreserveUVs = EditorPrefs.GetBool("DefaultPreserveUVs", (CSGModel.DefaultSettings & ModelSettingsFlags.PreserveUVs) == ModelSettingsFlags.PreserveUVs);
            SnapNonCSGObjects  = EditorPrefs.GetBool("SnapNonCSGObjects", true);

            AutoCommitExtrusion = EditorPrefs.GetBool("AutoCommitExtrusion", false);

            MaxSphereSplits = Mathf.Max(3, EditorPrefs.GetInt("MaxSphereSplits", 9));

            CircleSides             = Mathf.Max(3, EditorPrefs.GetInt("CircleSides", 18));
            MaxCircleSides          = Mathf.Max(3, EditorPrefs.GetInt("MaxCircleSides", 144));
            CircleOffset            = EditorPrefs.GetFloat("CircleOffset", 0);
            CircleSmoothShading     = EditorPrefs.GetBool("CircleSmoothShading", true);
            CircleSingleSurfaceEnds = EditorPrefs.GetBool("CircleSingleSurfaceEnds", true);
            CircleDistanceToSide    = EditorPrefs.GetBool("CircleDistanceToSide", true);
            CircleRecenter          = EditorPrefs.GetBool("CircleRecenter", true);


            SphereSplits         = Mathf.Max(1, EditorPrefs.GetInt("SphereSplits", 1));
            SphereOffset         = EditorPrefs.GetFloat("SphereOffset", 0);
            SphereSmoothShading  = EditorPrefs.GetBool("SphereSmoothShading", true);
            SphereDistanceToSide = EditorPrefs.GetBool("SphereDistanceToSide", true);
            HemiSphereMode       = EditorPrefs.GetBool("HemiSphereMode", false);

            LinearStairsStepLength = EditorPrefs.GetFloat("LinearStairsStepLength", 0.30f);
            LinearStairsStepHeight = EditorPrefs.GetFloat("LinearStairsStepHeight", 0.20f);
            LinearStairsStepWidth  = EditorPrefs.GetFloat("LinearStairsStepWidth", 1.0f);
            LinearStairsTotalSteps = EditorPrefs.GetInt("LinearStairsTotalSteps", 4);

            LinearStairsLength       = EditorPrefs.GetFloat("LinearStairsLength", 16.0f);
            LinearStairsHeight       = EditorPrefs.GetFloat("LinearStairsHeight", 16.0f);
            LinearStairsLengthOffset = EditorPrefs.GetFloat("LinearStairsLengthOffset", 0.0f);
            LinearStairsHeightOffset = EditorPrefs.GetFloat("LinearStairsHeightOffset", 0.0f);

            DistanceUnit = GetEnum("DistanceUnit", DistanceUnit.Meters);

            ShowSceneInfo = EditorPrefs.GetBool("ShowSceneInfo", false);


            var sceneViews = SortedSceneViews();

            EnsureValidSceneviewNames(sceneViews);
            var arrayString = EditorPrefs.GetString("Wireframe", string.Empty);

            if (arrayString.Contains(','))
            {
                LegacyLoadWireframeSettings(sceneViews, arrayString);
            }
            else
            {
                LoadWireframeSettings(sceneViews, arrayString);
            }

            UpdateSnapSettings();
        }
コード例 #13
0
        public void OnGUI()
        {
            rect   = track.RenderRect;
            rect.x = SeqenceWindow.inst.TimeToPixel(clip.start);
            float y        = SeqenceWindow.inst.TimeToPixel(clip.end);
            var   timeRect = SeqenceWindow.inst.timeAreaRect;

            rect.x      = Mathf.Max(rect.x, timeRect.x);
            y           = Mathf.Min(y, timeRect.xMax);
            rect.width  = y - rect.x;
            rect.height = rect.height - 2;
            if (rect.width < 0)
            {
                rect.width = 0;
            }

            var color = EditorGUIUtility.isProSkin ? Color.gray : Color.white;

            if (select)
            {
                color = color - SeqenceStyle.addtiveClip;
            }
            if (EditorGUIUtility.isProSkin)
            {
                EditorGUI.DrawRect(rect, color);
                EditorGUI.DrawOutline(rect, 1, Color.white);
            }
            else
            {
                EditorGUI.DrawRect(rect, color);
                EditorGUI.DrawOutline(rect, 1, Color.gray);
            }

            Rect left = rect;

            left.x     = rect.x - Mathf.Min(10, rect.width / 4);
            left.x     = Mathf.Max(left.x, timeRect.x);
            left.width = Mathf.Min(20, rect.width / 2);
            EditorGUIUtility.AddCursorRect(left, MouseCursor.SplitResizeLeftRight);
            Rect right = left;

            right.x = rect.x + rect.width - Mathf.Min(10, rect.width / 4);
            right.x = Mathf.Max(right.x, timeRect.x);
            EditorGUIUtility.AddCursorRect(right, MouseCursor.SplitResizeLeftRight);
            ProcessEvent(left, right);
            clipMode = track.CalcuteClipMode(clip, out var loop);
            if (loop > 1e-2)
            {
                DrawLoops(loop);
            }
            if ((clipMode & ClipMode.Left) > 0)
            {
                left.x      = rect.x + 2;
                left.width  = 10;
                left.y      = rect.y + rect.height / 3;
                left.height = rect.height / 2;
                GUI.Label(left, GUIContent.none, SeqenceStyle.clipIn);
            }
            if ((clipMode & ClipMode.Right) > 0)
            {
                right.x      = rect.xMax - 8;
                right.width  = 8;
                right.y      = rect.y + rect.height / 3;
                right.height = rect.height / 2;
                GUI.Label(right, GUIContent.none, SeqenceStyle.clipOut);
            }
            MixProcessor();
        }
コード例 #14
0
ファイル: ResourceClip.cs プロジェクト: jhoran1046/olakedms
 public ResourceClip()
 {
     _clipMode    = ClipMode.NONE;
     _resources   = new List <int>();
     _currentUser = null;
 }
コード例 #15
0
 internal ClipboardValueContainer(T value, ClipMode mode)
 {
     this.Value = value;
     this.Mode  = mode;
 }
コード例 #16
0
        public static void Reload()
        {
            RealtimeCSG.CSGSettings.LockAxisX = EditorPrefs.GetBool("LockAxisX", false);
            RealtimeCSG.CSGSettings.LockAxisY = EditorPrefs.GetBool("LockAxisY", false);
            RealtimeCSG.CSGSettings.LockAxisZ = EditorPrefs.GetBool("LockAxisZ", false);

            RealtimeCSG.CSGSettings.UniformGrid = EditorPrefs.GetBool("UniformGrid", true);
            RealtimeCSG.CSGSettings.EditMode    = (ToolEditMode)EditorPrefs.GetInt("EditMode", (int)ToolEditMode.Generate);

            var moveSnapVector = new Vector3(EditorPrefs.GetFloat("MoveSnapX", 1.0f),
                                             EditorPrefs.GetFloat("MoveSnapY", 1.0f),
                                             EditorPrefs.GetFloat("MoveSnapZ", 1.0f));

            RealtimeCSG.CSGSettings.SnapVector = moveSnapVector;

            var moveOffsetVector = new Vector3(EditorPrefs.GetFloat("DefaultMoveOffsetX", 0.0f),
                                               EditorPrefs.GetFloat("DefaultMoveOffsetY", 0.0f),
                                               EditorPrefs.GetFloat("DefaultMoveOffsetZ", 0.0f));

            RealtimeCSG.CSGSettings.DefaultMoveOffset = moveOffsetVector;

            var rotateOffsetVector = new Vector3(EditorPrefs.GetFloat("DefaultRotateOffsetX", 0.0f),
                                                 EditorPrefs.GetFloat("DefaultRotateOffsetY", 0.0f),
                                                 EditorPrefs.GetFloat("DefaultRotateOffsetZ", 0.0f));

            RealtimeCSG.CSGSettings.DefaultRotateOffset = rotateOffsetVector;

            RealtimeCSG.CSGSettings.ShapeBuildMode = (ShapeMode)EditorPrefs.GetInt("ShapeBuildMode", (int)ShapeMode.Box);

            RealtimeCSG.CSGSettings.GridVisible = EditorPrefs.GetBool("ShowGrid", true);
            RealtimeCSG.CSGSettings.SnapToGrid  = EditorPrefs.GetBool("ForceSnapToGrid", true);

            var helperSurfaces = (HelperSurfaceFlags)EditorPrefs.GetInt("HelperSurfaces", (int)DefaultHelperSurfaceFlags);

            RealtimeCSG.CSGSettings.VisibleHelperSurfaces = helperSurfaces;

            RealtimeCSG.CSGSettings.ClipMode          = (ClipMode)EditorPrefs.GetInt("ClipMode", 0);
            RealtimeCSG.CSGSettings.EnableRealtimeCSG = EditorPrefs.GetBool("EnableRealtimeCSG", true);

            var defaultMaterialGUID = EditorPrefs.GetString("DefaultMaterial", null);

            if (defaultMaterialGUID != null)
            {
                var defaultMaterialAssetPath = AssetDatabase.GUIDToAssetPath(defaultMaterialGUID);
                var materialFromID           = AssetDatabase.LoadAssetAtPath <Material>(defaultMaterialAssetPath);
                if (materialFromID)
                {
                    DefaultMaterial = materialFromID;
                }
                else
                {
                    DefaultMaterial = MaterialUtility.WallMaterial;
                }
            }
            else
            {
                DefaultMaterial = MaterialUtility.WallMaterial;
            }


            RealtimeCSG.CSGSettings.SnapScale          = EditorPrefs.GetFloat("ScaleSnap", 0.1f);
            RealtimeCSG.CSGSettings.SnapRotation       = EditorPrefs.GetFloat("RotationSnap", 15.0f);
            RealtimeCSG.CSGSettings.DefaultShapeHeight = EditorPrefs.GetFloat("DefaultShapeHeight", 1.0f);
            RealtimeCSG.CSGSettings.CurveSides         = (uint)EditorPrefs.GetInt("CurveSides", 10);


            CircleSides             = Mathf.Max(3, EditorPrefs.GetInt("CircleSides", 18));
            CircleOffset            = EditorPrefs.GetFloat("CircleOffset", 0);
            CircleSmoothShading     = EditorPrefs.GetBool("CircleSmoothShading", true);
            CircleSingleSurfaceEnds = EditorPrefs.GetBool("CircleSingleSurfaceEnds", true);
            CircleDistanceToSide    = EditorPrefs.GetBool("CircleDistanceToSide", true);
            CircleRecenter          = EditorPrefs.GetBool("CircleRecenter", true);


            SphereSplits         = Mathf.Max(1, EditorPrefs.GetInt("SphereSplits", 1));
            SphereOffset         = EditorPrefs.GetFloat("SphereOffset", 0);
            SphereSmoothShading  = EditorPrefs.GetBool("SphereSmoothShading", true);
            SphereDistanceToSide = EditorPrefs.GetBool("SphereDistanceToSide", true);
            HemiSphereMode       = EditorPrefs.GetBool("HemiSphereMode", false);

            LinearStairsStepLength = EditorPrefs.GetFloat("LinearStairsStepLength", 0.30f);
            LinearStairsStepHeight = EditorPrefs.GetFloat("LinearStairsStepHeight", 0.20f);
            LinearStairsStepWidth  = EditorPrefs.GetFloat("LinearStairsStepWidth", 1.0f);
            LinearStairsTotalSteps = EditorPrefs.GetInt("LinearStairsTotalSteps", 4);

            LinearStairsLength       = EditorPrefs.GetFloat("LinearStairsLength", 16.0f);
            LinearStairsHeight       = EditorPrefs.GetFloat("LinearStairsHeight", 16.0f);
            LinearStairsLengthOffset = EditorPrefs.GetFloat("LinearStairsLengthOffset", 0.0f);
            LinearStairsHeightOffset = EditorPrefs.GetFloat("LinearStairsHeightOffset", 0.0f);

            var distanceUnit = (DistanceUnit)EditorPrefs.GetInt("DistanceUnit", (int)DistanceUnit.Meters);

            RealtimeCSG.CSGSettings.DistanceUnit = distanceUnit;

            var sceneViews = SortedSceneViews();

            EnsureValidSceneviewNames(sceneViews);
            var arrayString = EditorPrefs.GetString("Wireframe", string.Empty);

            if (arrayString.Contains(','))
            {
                LegacyLoadWireframeSettings(sceneViews, arrayString);
            }
            else
            {
                LoadWireframeSettings(sceneViews, arrayString);
            }

            UpdateSnapSettings();
        }
コード例 #17
0
    public static Solid Clip(Solid A, Solid B, ClipMode mode)
    {
        List <CFace> Ai, Ax, Ao, Bi, Bx, Bo;
        CSolid       Ac = ReduceSolid(A);
        CSolid       Bc = ReduceSolid(B);

        //Divvy(Ac, Bc, out Ai, out Ax, out Ao);
        //Divvy(Bc, Ac, out Bi, out Bx, out Bo);
        Ai = new List <CFace>();
        Ao = new List <CFace>();
        Bi = new List <CFace>();
        Bo = new List <CFace>();


        foreach (CFace a in Ac.faces)
        {
            Vector3[] p = PolyTransform(a.GetVerts(), a);
            List <List <Vector3> > cross = CrossSection(Bc, a);
            foreach (List <Vector3> ql in cross)
            {
                Vector3[]        q = ql.ToArray();
                List <Vector3[]> pi, po;
                Clip2D(p, q, out pi, out po);
                foreach (Vector3[] poly in pi)
                {
                    Ai.Add(Ac.MapFace(DePolyTransform(poly, a)));
                }
                foreach (Vector3[] poly in po)
                {
                    Ao.Add(Ac.MapFace(DePolyTransform(poly, a)));
                }
            }
            if (cross.Count == 0)
            {
                if (B.ContainsPoint(Ac.vertices[a.points[0]].position))
                {
                    Ai.Add(a);
                }
                else
                {
                    Ao.Add(a);
                }
            }
        }

        foreach (CFace b in Bc.faces)
        {
            Vector3[] p = PolyTransform(b.GetVerts(), b);
            List <List <Vector3> > cross = CrossSection(Ac, b);
            foreach (List <Vector3> ql in cross)
            {
                Vector3[]        q = ql.ToArray();
                List <Vector3[]> pi, po;
                Clip2D(p, q, out pi, out po);
                foreach (Vector3[] poly in pi)
                {
                    Bi.Add(Bc.MapFace(DePolyTransform(poly, b)));
                }
                foreach (Vector3[] poly in po)
                {
                    Bo.Add(Bc.MapFace(DePolyTransform(poly, b)));
                }
            }
            if (cross.Count == 0)
            {
                if (A.ContainsPoint(Bc.vertices[b.points[0]].position))
                {
                    Bi.Add(b);
                }
                else
                {
                    Bo.Add(b);
                }
            }
        }


        //Set up merged CSolid
        CSolid Cc;

        Cc.vertices = new List <CPoint>();
        Cc.faces    = new List <CFace>();
        int ACount = Ac.vertices.Count;

        Cc.vertices.AddRange(Ac.vertices);
        Cc.vertices.AddRange(Bc.vertices);

        //find points that are probably the same
        int[] map     = new int[Cc.vertices.Count];
        float epsilon = 0.005f;

        for (int i = 0; i < Cc.vertices.Count; ++i)
        {
            map[i] = -1;
        }
        for (int i = Cc.vertices.Count - 1; i >= 0; --i)
        {
            for (int j = 0; j <= i; ++j)
            {
                if (Vector3.Distance(Cc.vertices[i].position, Cc.vertices[j].position) < epsilon)
                {
                    if (Cc.vertices[i].id != -1)
                    {
                        Cc.vertices[j].SetId(Cc.vertices[i].id);
                    }
                    map[i] = j;
                    break;
                }
            }
        }

        //Add verts to merged CSolid
        if (mode == ClipMode.Subtract)
        {
            foreach (CFace f in Ao)
            {
                for (int i = 0; i < f.points.Length; ++i)
                {
                    f.points[i] = map[f.points[i]];
                }
            }
            Cc.faces.AddRange(Ao);
            foreach (CFace f in Bi)
            {
                for (int i = 0; i < f.points.Length; ++i)
                {
                    f.points[i] = map[f.points[i] + ACount];
                }
            }
            Cc.faces.AddRange(Bi);
        }
        else if (mode == ClipMode.Add)
        {
            //Merge A and B into C, using faces Ao, Bi, adding to point indices of Bi respectively (TODO)
        }
        else if (mode == ClipMode.Intersect)
        {
            //Merge A and B into C, using faces Ai, Bi, adding to point indices of Bi respectively (TODO)
        }

        //Find used vertices
        bool[] used = new bool[Cc.vertices.Count];
        foreach (CFace f in Cc.faces)
        {
            foreach (int i in f.points)
            {
                used[i] = true;
            }
        }

        //Map duplicate points, create new points, delete unused points
        Point[] points = new Point[Cc.vertices.Count];                                    //Sparse Array
        Dictionary <int, Edge>[] edgeTo = new Dictionary <int, Edge> [Cc.vertices.Count]; //Sparse grid
        for (int i = 0; i < Cc.vertices.Count; ++i)
        {
            if (used[i])
            {
                if (map[i] == i)
                {
                    points[i] = Cc.vertices[i].id == -1 ? new Point(Cc.vertices[i].position) : DCGBase.all[Cc.vertices[i].id] as Point;
                    Cc.vertices[i].SetId(points[i].elementID);
                    edgeTo[i] = new Dictionary <int, Edge>();
                }
            }
            else
            {
                if (Cc.vertices[i].id != -1)
                {
                    DCGBase.all[Cc.vertices[i].id].Remove();
                }
            }
        }

        //Nuke A and B
        foreach (Point p in A.getPoints())
        {
            for (int i = p.edges.Count - 1; i >= 0; --i)
            {
                p.edges[i].Remove();
            }
        }

        foreach (Point p in B.getPoints())
        {
            for (int i = p.edges.Count - 1; i >= 0; --i)
            {
                p.edges[i].Remove();
            }
        }

        //Create new edges/faces in DCG
        Face[] faces = new Face[Cc.faces.Count];
        for (int i = 0; i < Cc.faces.Count; ++i)
        {
            CFace  f     = Cc.faces[i];
            Edge[] edges = new Edge[f.points.Length];

            Debug.Log(f.points.Length);
            for (int j = 0; j < f.points.Length; ++j)
            {
                int  k   = (j + 1) % f.points.Length;
                int  pk  = f.points[k];
                int  pj  = f.points[j];
                bool kcj = edgeTo[pk].ContainsKey(pj);
                bool jck = edgeTo[pj].ContainsKey(pk);
                if (jck)
                {
                    edges[j] = edgeTo[pj][pk];
                    if (!kcj)
                    {
                        edgeTo[pk].Add(pj, edges[j]);
                    }
                }
                else if (kcj)
                {
                    edges[j] = edgeTo[pk][pj];
                    if (!jck)
                    {
                        edgeTo[pj].Add(pk, edges[j]);
                    }
                }
                else
                {
                    edges[j] = new Edge(points[pj], points[pk]);
                    //if (!jck)
                    edgeTo[pj].Add(pk, edges[j]);
                    //if (!kcj)
                    edgeTo[pk].Add(pj, edges[j]);
                }
                //Debug.DrawLine(edges[j].points[0].position, edges[j].points[1].position, new Color(Random.value, Random.value, Random.value), 1000, false);
            }
            //Debug.Log(edges.Length);
            faces[i] = new Face(new List <Edge>(edges));
        }

        //Create new solid from C
        return(new Solid(new List <Face>(faces)));
        //return new Solid();

        //TODO eventually, if we have time:
        //Relate generated Faces and Edges to existing Faces and Edges, in order to reduce new objects being created or to copy materials/etc.
    }
コード例 #18
0
 public static SKClipOperation ToSkOperation(this ClipMode mode)
 {
     return(mode == ClipMode.Include ? SKClipOperation.Intersect : SKClipOperation.Difference);
 }
コード例 #19
0
 public static T ClipMode <T>(this T mask, ClipMode clipMode) where T : GradientMask
 {
     mask.ClipMode = clipMode;
     return(mask);
 }