private void GLSurface_GLPaint(object sender, EventArgs e)
        {
            try
            {
                long time = DateTimeOffset.Now.ToUnixTimeMilliseconds();

                float ox = GLSurface.ClientSize.Width % 2 == 0 ? 0 : 0.5f / GLSurface.Zoom;
                float oy = GLSurface.ClientSize.Height % 2 == 0 ? 0 : 0.5f / GLSurface.Zoom;

                GLSurface.Render(-ox - OffsetX, -oy - OffsetY);

                float tx = (int)Math.Round(-OffsetX + MouseManager.CurrentLocation.X - GLSurface.FieldW / 2 + 0.5) + OffsetX + (float)GLSurface.FieldW / 2 - 0.5f;
                float ty = (int)Math.Round(-OffsetY + MouseManager.CurrentLocation.Y - GLSurface.FieldH / 2 + 0.5) + OffsetY + (float)GLSurface.FieldH / 2 - 0.5f;
                gl.Color4ub(255, 0, 0, 255);
                gl.Begin(GL.LINE_LOOP);
                gl.Vertex2f(tx - 0.5f, ty - 0.5f);
                gl.Vertex2f(tx + 0.5f, ty - 0.5f);
                gl.Vertex2f(tx + 0.5f, ty + 0.5f);
                gl.Vertex2f(tx - 0.5f, ty + 0.5f);
                gl.End();
            }
            catch (Exception ex)
            {
                GLFrameTimer.Stop();
                MessageBox.Show(this, ex.ToString(), "Error: Can not render frame.",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Beispiel #2
0
 private void Window_Loaded(object sender, RoutedEventArgs e)
 {
     renderingSurface             = new ProGLSurface();
     imageHost.Child              = renderingSurface;
     timer                        = new Stopwatch();
     CompositionTarget.Rendering += RenderGLSurface;
 }
        private void GLSurface_GLMouseDown(object sender, GLMouseEventArgs e)
        {
            try
            {
                MouseManager.BeginDrag(e.Location);

                if (e.Button.HasFlag(MouseButtons.Left))
                {
                    int tx = (int)Math.Round(-OffsetX + e.X + GLSurface.FieldW / 2 - 0.5);
                    int ty = (int)Math.Round(-OffsetY + e.Y + GLSurface.FieldH / 2 - 0.5);

                    if (GLSurface.GetTile(tx, ty) == null)
                    {
                        GLSurface.PlaceTile(TileComboBox.SelectedIndex <= 0 ? TileName : (string)TileComboBox.SelectedItem, tx, ty);
                        MouseState = MouseStatus.Placing;
                    }
                    else
                    {
                        GLSurface.PlaceTile(null, tx, ty);
                        MouseState = MouseStatus.Removing;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString(), "Error: Can not handle MouseDown event.",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void UnlinkSpriteMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                GLSurface.MakeCurrent();
                int sind = PartsListBox.SelectedIndex;
                if (sind < 0 || sind >= LoadedResource.Sprites.Count)
                {
                    return;
                }
                var sprites = LoadedResource.Sprites[sind];
                int index   = VariantsListBox.SelectedIndex;
                if (index < 0 || index >= LoadedResource.Sprites[sind].Count)
                {
                    return;
                }

                sprites[index].Dispose();
                sprites.RemoveAt(index);
                VariantsListBox.Items.RemoveAt(index);
                BackupChanges();
                MakeUnsaved();
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString(), "Error: Can not unlink sprite.",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void LinkSpriteMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                int sind = PartsListBox.SelectedIndex;
                if (sind < 0 || sind >= LoadedResource.Sprites.Count)
                {
                    return;
                }
                var sprites = LoadedResource.Sprites[sind];

                GLSurface.MakeCurrent();
                var subform = new ExplorerForm(Directory.GetCurrentDirectory(), true, ResourceType.Sprite);
                if (subform.ShowDialog(this) == DialogResult.OK)
                {
                    foreach (var link in subform.SelectedResources)
                    {
                        sprites.Add(new Subresource <SpriteResource>(link, true));
                        VariantsListBox.Items.Add(link);
                    }
                    BackupChanges();
                    MakeUnsaved();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString(), "Error: Can not .",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void GLSurface_GLMouseMove(object sender, GLMouseEventArgs e)
        {
            try
            {
                MouseManager.UpdateLocation(e.Location);

                if (e.Button.HasFlag(MouseButtons.Left))
                {
                    int tx = (int)Math.Round(-OffsetX + e.X + GLSurface.FieldW / 2 - 0.5);
                    int ty = (int)Math.Round(-OffsetY + e.Y + GLSurface.FieldH / 2 - 0.5);
                    if (MouseState == MouseStatus.Placing)
                    {
                        GLSurface.PlaceTile(TileComboBox.SelectedIndex <= 0 ?
                                            TileName : (string)TileComboBox.SelectedItem, tx, ty);
                    }
                    else
                    {
                        GLSurface.PlaceTile(null, tx, ty);
                    }
                }
                if (e.Button.HasFlag(MouseButtons.Right))
                {
                    OffsetX += MouseManager.CurrentDelta.X;
                    OffsetY += MouseManager.CurrentDelta.Y;
                    RepairOffset();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString(), "Error: Can not handle MouseMove event.",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public OutfitControl(string path)
        {
            InitializeComponent();

            RagdollNodeNumeric.FixMouseWheel();

            MenuTabs = new ToolStripMenuItem[] {
                new ToolStripMenuItem("Link ragdoll", null, LinkRagdollMenuItem_Click, Keys.Control | Keys.I),
                new ToolStripMenuItem("Link sprite", null, LinkSpriteMenuItem_Click, Keys.Control | Keys.Shift | Keys.I),
                new ToolStripMenuItem("Create node", null, CreateNodeMenuItem_Click, Keys.Control | Keys.A),
                new ToolStripMenuItem("Remove node", null, RemoveNodeMenuItem_Click, Keys.Control | Keys.D),
                new ToolStripMenuItem("Move node up", null, MoveNodeUpMenuItem_Click, Keys.Control | Keys.Up),
                new ToolStripMenuItem("Move node down", null, MoveNodeDownMenuItem_Click, Keys.Control | Keys.Down),
                new ToolStripMenuItem("Toggle grid", null, ToggleGridMenuItem_Click, Keys.Control | Keys.G),
                new ToolStripMenuItem("Toggle transparency", null, ToggleTransparencyMenuItem_Click, Keys.Control | Keys.H),
                new ToolStripMenuItem("Pixel perfect", null, PixelPerfectMenuItem_Click, Keys.Control | Keys.P),
                new ToolStripMenuItem("Background color", null, BackColorMenuItem_Click, Keys.Control | Keys.L),
                new ToolStripMenuItem("Reset position", null, ResetPositionMenuItem_Click, Keys.Control | Keys.R),
            };
            for (int i = 3; i <= 5; i++)
            {
                MenuTabs[i].Enabled = false;
            }

            GLSurface.MakeCurrent();
            LoadedResource          = new OutfitResource(path);
            RagdollLinkTextBox.Text = LoadedResource.Ragdoll.Link;
            Story = new StoryItem <StoryState>(new StoryState(LoadedResource));
            Story.ValueChanged += Story_ValueChanged;
            LoadedResource.Ragdoll.Reload();
            RagdollLinkTextBox.Subresource = LoadedResource.Ragdoll;
            LoadedResource.Ragdoll.Resource?.Clothe(LoadedResource);

            ResourcePath = path;
            ResourceName = Path.GetFileName(path);

            GetTab("Toggle grid").Checked         = LoadedResource.GridEnabled;
            GetTab("Toggle transparency").Checked = LoadedResource.Transparency;
            GetTab("Pixel perfect").Checked       = LoadedResource.PixelPerfect;

            NodesListBox.BeginUpdate();
            while (NodesListBox.Items.Count < LoadedResource.Count)
            {
                NodesListBox.Items.Add("Node: " + NodesListBox.Items.Count);
            }
            while (NodesListBox.Items.Count > LoadedResource.Count)
            {
                NodesListBox.Items.RemoveAt(NodesListBox.Items.Count - 1);
            }
            NodesListBox.EndUpdate();

            GLSurface.BackColor = Color.FromArgb(LoadedResource.BackColor);

            ClotheTypeComboBox.Items.AddRange(Enum.GetNames(typeof(OutfitResource.Node.Clothe)));

            UpdateRedactor();

            GLFrameTimer.Start();
        }
 private void GLFrameTimer_Tick(object sender, EventArgs e)
 {
     try
     {
         GLSurface.Refresh();
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.ToString(), "Error: Can not handle Tick event.",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
 private void GLSurface_DragOver(object sender, DragEventArgs e)
 {
     try
     {
         var pos = GLSurface.AdjustMouse(GLSurface.PointToClient(new Point(e.X, e.Y)));
         MouseManager.UpdateLocation(pos);
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.ToString(), "Error: Can not drag tile.",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
        private void GLSurface_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                if (!e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    return;
                }
                var paths = e.Data.GetData(DataFormats.FileDrop) as string[];
                if (paths.Length != 1 || Resource.GetType(paths[0]) != ResourceType.Tile)
                {
                    return;
                }
                var path = ExtraPath.MakeDirectoryRelated(Directory.GetCurrentDirectory(), paths[0]);

                bool insert = !GLSurface.TileLoaded(path);

                if (GLSurface.LoadTile(path, path))
                {
                    if (insert)
                    {
                        TileComboBox.Items.Add(path);
                    }
                    var pos = GLSurface.AdjustMouse(GLSurface.PointToClient(new Point(e.X, e.Y)));
                    MouseManager.UpdateLocation(pos);

                    int tx = (int)Math.Round(-OffsetX + pos.X + GLSurface.FieldW / 2 - 0.5);
                    int ty = (int)Math.Round(-OffsetY + pos.Y + GLSurface.FieldH / 2 - 0.5);

                    if (GLSurface.GetTile(tx, ty) == null)
                    {
                        GLSurface.PlaceTile(path, tx, ty);
                    }
                    else
                    {
                        GLSurface.PlaceTile(null, tx, ty);
                    }

                    TileComboBox.SelectedItem = path;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString(), "Error: Can not place tile.",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        public SpriteControl(string path)
        {
            InitializeComponent();

            FramesNumeric.FixMouseWheel();
            DelayNumeric.FixMouseWheel();
            ImgboxWNumeric.FixMouseWheel();
            ImgboxHNumeric.FixMouseWheel();
            AxisXNumeric.FixMouseWheel();
            AxisYNumeric.FixMouseWheel();
            AngleNumeric.FixMouseWheel();

            MenuTabs = new ToolStripMenuItem[] {
                new ToolStripMenuItem("Link texture", null, LinkTextureMenuItem_Click, Keys.Control | Keys.I),
                new ToolStripMenuItem("Adjust size", null, AdjustSizeMenuItem_Click, Keys.Control | Keys.A),
                new ToolStripMenuItem("Pixel perfect", null, PixelPerfectMenuItem_Click, Keys.Control | Keys.P),
                new ToolStripMenuItem("Background color", null, BackColorMenuItem_Click, Keys.Control | Keys.L),
                new ToolStripMenuItem("Reset position", null, ResetPositionMenuItem_Click, Keys.Control | Keys.R),
            };

            GLSurface.MakeCurrent();
            LoadedResource      = new SpriteResource(path);
            Story               = new StoryItem <State>(new State(LoadedResource));
            Story.ValueChanged += Story_ValueChanged;

            MenuTabs[4].Checked = LoadedResource.PixelPerfect;

            ResourcePath = path;
            ResourceName = Path.GetFileName(path);

            LoadedResource.Texture.SynchronizingObject = this;
            LoadedResource.Texture.Reloaded           += Texture_Reloaded;

            FramesNumeric.Value     = LoadedResource.FramesCount;
            DelayNumeric.Value      = (decimal)LoadedResource.FrameDelay;
            ImgboxWNumeric.Value    = (decimal)LoadedResource.ImgboxW;
            ImgboxHNumeric.Value    = (decimal)LoadedResource.ImgboxH;
            AxisXNumeric.Value      = (decimal)LoadedResource.AxisX;
            AxisYNumeric.Value      = (decimal)LoadedResource.AxisY;
            AngleNumeric.Value      = (decimal)LoadedResource.Angle;
            VFramesCheckBox.Checked = LoadedResource.VerticalFrames;
            LinkTextBox.Text        = LoadedResource.Texture.Link;

            GLSurface.BackColor = Color.FromArgb(LoadedResource.BackColor);

            GLFrameTimer.Start();
        }
 private void LinkSpriteMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         GLSurface.MakeCurrent();
         var subform = new ExplorerForm(Directory.GetCurrentDirectory(), false, ResourceType.Ragdoll);
         if (subform.ShowDialog(this) == DialogResult.OK && subform.SelectedResources.Count == 1)
         {
             SpriteLinkTextBox.Text = subform.SelectedResources[0];
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.ToString(), "Error: Can not link ragdoll.",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
        public ToolControl(string path)
        {
            InitializeComponent();

            FirePointXNumeric.FixMouseWheel();
            FirePointYNumeric.FixMouseWheel();
            FireVectorXNumeric.FixMouseWheel();
            FireVectorYNumeric.FixMouseWheel();

            MenuTabs = new ToolStripMenuItem[] {
                new ToolStripMenuItem("Link sprite", null, LinkSpriteMenuItem_Click, Keys.Control | Keys.I),
                new ToolStripMenuItem("Unlink sprite", null, UnlinkSpriteMenuItem_Click, Keys.Control | Keys.U),
                new ToolStripMenuItem("Create part", null, CreatePartMenuItem_Click, Keys.Control | Keys.A),
                new ToolStripMenuItem("Remove part", null, RemovePartMenuItem_Click, Keys.Control | Keys.D),
                new ToolStripMenuItem("Adjust fire vector", null, AdjustFireVectorMenuItem_Click, Keys.Control | Keys.F),
                new ToolStripMenuItem("Toggle transparency", null, ToggleTransparencyMenuItem_Click, Keys.Control | Keys.H),
                new ToolStripMenuItem("Pixel perfect", null, PixelPerfectMenuItem_Click, Keys.Control | Keys.P),
                new ToolStripMenuItem("Background color", null, BackColorMenuItem_Click, Keys.Control | Keys.L),
                new ToolStripMenuItem("Reset position", null, ResetPositionMenuItem_Click, Keys.Control | Keys.R),
            };

            GLSurface.MakeCurrent();

            LoadedResource      = new ToolResource(path);
            Story               = new StoryItem <State>(new State(LoadedResource));
            Story.ValueChanged += Story_ValueChanged;
            ResourcePath        = path;
            ResourceName        = Path.GetFileName(path);

            ActionTextBox.TextChanged       += (object sender, EventArgs e) => SyncTextBoxValue(sender, LoadedResource.ActionName, v => LoadedResource.ActionName = v);
            FirePointXNumeric.ValueChanged  += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FirePointX, v => LoadedResource.FirePointX = v);
            FirePointYNumeric.ValueChanged  += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FirePointY, v => LoadedResource.FirePointY = v);
            FireVectorXNumeric.ValueChanged += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FireVectorX, v => LoadedResource.FireVectorX = v);
            FireVectorYNumeric.ValueChanged += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FireVectorY, v => LoadedResource.FireVectorY = v);
            AttachedCheckBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxValue(sender, LoadedResource.AngleAttached, v => LoadedResource.AngleAttached = v);

            PartsListBox.SelectedIndexChanged += (object sender, EventArgs e) => RestoreChanges(false);
            PartsListBox.ItemCheck            += (object sender, ItemCheckEventArgs e) => SyncCheckedValue(sender, e, LoadedResource.SpriteLockedOnCycle);

            GetTab("Pixel perfect").Checked       = LoadedResource.PixelPerfect;
            GetTab("Toggle transparency").Checked = LoadedResource.Transparency;
            RestoreChanges();

            GLFrameTimer.Start();
        }
 private void CreateNodeMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         GLSurface.MakeCurrent();
         var index = NodesListBox.SelectedIndex + 1;
         LoadedResource.Ragdoll.Resource?.Unclothe(LoadedResource);
         LoadedResource.Nodes.Insert(index, new OutfitResource.Node());
         LoadedResource.Ragdoll.Resource?.Clothe(LoadedResource);
         Story.Item = new StoryState(LoadedResource);
         NodesListBox.SelectedIndex = index;
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.ToString(), "Error: Can not create frame.",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
        private void Story_ValueChanged(object sender, EventArgs e)
        {
            GLSurface.MakeCurrent();
            LoadedResource.Ragdoll.Resource?.Unclothe(LoadedResource);
            Story.Item.ToResource(LoadedResource);
            LoadedResource.Ragdoll.Resource?.Clothe(LoadedResource);

            while (NodesListBox.Items.Count < LoadedResource.Count)
            {
                NodesListBox.Items.Add("Node: " + NodesListBox.Items.Count);
            }
            while (NodesListBox.Items.Count > LoadedResource.Count)
            {
                NodesListBox.Items.RemoveAt(NodesListBox.Items.Count - 1);
            }

            UpdateInterface();
            MakeUnsaved();
        }
Beispiel #16
0
        public OpenGLView(GraphicsMode mode) : base()
        {
            var surface = new GLSurface(
                mode,
                OpenGLBackEnd.DesiredMajorVersion,
                OpenGLBackEnd.DesiredMinorVersion,
                GraphicsContextFlags.ForwardCompatible);

            surface.GLInitalized += (sender, e) => OpenGLContextReady = true;

            // The Draw event of this control's GLSurface child will clear the
            // OpenGL viewport with its clear color. That event might be raised
            // in situations like a window resize, and may very well supersede
            // the call to Refresh by the GraphicsClock.Elapsed handler of this
            // class's base. Calling Refresh manually here prevents flickering.
            surface.Draw += (sender, e) => Refresh();

            Content = surface;

            LoadComplete += (sender, e) => ControlReady = true;
        }
 private void RemoveNodeMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         GLSurface.MakeCurrent();
         var index = NodesListBox.SelectedIndex;
         if (index >= 0 && index < LoadedResource.Count)
         {
             LoadedResource.Ragdoll.Resource?.Unclothe(LoadedResource);
             LoadedResource.Nodes[index].Dispose();
             LoadedResource.Nodes.RemoveAt(index);
             LoadedResource.Ragdoll.Resource?.Clothe(LoadedResource);
             Story.Item = new StoryState(LoadedResource);
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.ToString(), "Error: Can not remove frame.",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
 private void CreatePartMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         GLSurface.MakeCurrent();
         int index = PartsListBox.SelectedIndex + 1;
         if (index < 0 || index > LoadedResource.Count)
         {
             return;
         }
         LoadedResource.Sprites.Insert(index, new List <Subresource <SpriteResource> >());
         LoadedResource.SelectedSprites.Insert(index, -1);
         LoadedResource.SpriteLockedOnCycle.Insert(index, false);
         PartsListBox.Items.Add("Part: " + PartsListBox.Items.Count);
         BackupChanges();
         MakeUnsaved();
     }
     catch (Exception ex)
     {
         MessageBox.Show(this, ex.ToString(), "Error: Can not create part.",
                         MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
Beispiel #19
0
        public MainForm()
        {
            Title      = "My Eto Form";
            ClientSize = new Size(400, 350);
            var gl = new GLSurface();


            Content = new StackLayout
            {
                Padding = 10,
                Items   =
                {
                    "Hello World!",
                    gl
                    // add more controls here
                }
            };

            // create a few commands that can be used for the menu and toolbar
            var clickMe = new Command {
                MenuText = "Click Me!", ToolBarText = "Click Me!"
            };

            clickMe.Executed += (sender, e) => MessageBox.Show(this, "I was clicked!");

            var quitCommand = new Command {
                MenuText = "Quit", Shortcut = Application.Instance.CommonModifier | Keys.Q
            };

            quitCommand.Executed += (sender, e) => Application.Instance.Quit();

            var aboutCommand = new Command {
                MenuText = "About..."
            };

            aboutCommand.Executed += (sender, e) => new AboutDialog().ShowDialog(this);

            // create menu
            Menu = new MenuBar
            {
                Items =
                {
                    // File submenu
                    new ButtonMenuItem {
                        Text = "&File", Items ={ clickMe          }
                    },
                    // new ButtonMenuItem { Text = "&Edit", Items = { /* commands/items */ } },
                    // new ButtonMenuItem { Text = "&View", Items = { /* commands/items */ } },
                },
                ApplicationItems =
                {
                    // application (OS X) or file menu (others)
                    new ButtonMenuItem {
                        Text = "&Preferences..."
                    },
                },
                QuitItem  = quitCommand,
                AboutItem = aboutCommand
            };

            // create toolbar
            ToolBar = new ToolBar {
                Items = { clickMe }
            };
        }
        private void RestoreChanges(bool data_changed = true)
        {
            GLSurface.MakeCurrent();

            var item = Story.Item;

            var pindex = PartsListBox.SelectedIndex;
            var vindex = VariantsListBox.SelectedIndex;

            if (data_changed)
            {
                LoadedResource.ActionName  = item.ActionName;
                LoadedResource.FirePointX  = item.FirePointX;
                LoadedResource.FirePointY  = item.FirePointY;
                LoadedResource.FireVectorX = item.FireVectorX;
                LoadedResource.FireVectorY = item.FireVectorY;

                ActionTextBox.Text       = item.ActionName;
                FirePointXNumeric.Value  = (decimal)item.FirePointX;
                FirePointYNumeric.Value  = (decimal)item.FirePointY;
                FireVectorXNumeric.Value = (decimal)item.FireVectorX;
                FireVectorYNumeric.Value = (decimal)item.FireVectorY;
                AttachedCheckBox.Checked = item.AngleAttached;

                if (LoadedResource.Count != item.Count)
                {
                    MakeUnsaved();

                    while (LoadedResource.Count < item.Count)
                    {
                        LoadedResource.Sprites.Add(new List <Subresource <SpriteResource> >());
                    }
                    while (LoadedResource.Count > item.Count)
                    {
                        foreach (var res in LoadedResource[LoadedResource.Count - 1])
                        {
                            res.Resource?.Dispose();
                        }
                        LoadedResource.Sprites.RemoveAt(LoadedResource.Count - 1);
                    }
                }
                for (int i = 0; i < LoadedResource.Count; i++)
                {
                    var icol = item[i];
                    var col  = LoadedResource[i];
                    if (col.Count != icol.Length)
                    {
                        MakeUnsaved();
                        while (col.Count < item.Count)
                        {
                            col.Add(new Subresource <SpriteResource>());
                        }
                        while (col.Count > item.Count)
                        {
                            col[col.Count - 1].Resource?.Dispose();
                            col.RemoveAt(col.Count - 1);
                        }
                    }

                    for (int j = 0; j < col.Count; j++)
                    {
                        if (col[j].Link != icol[j])
                        {
                            MakeUnsaved();
                            col[j].Link = icol[j];
                        }
                    }
                }
                if (LoadedResource.SpriteLockedOnCycle.Count != item.LockedCount)
                {
                    while (LoadedResource.SpriteLockedOnCycle.Count < item.LockedCount)
                    {
                        LoadedResource.SpriteLockedOnCycle.Add(false);
                    }
                    while (LoadedResource.SpriteLockedOnCycle.Count > item.LockedCount)
                    {
                        LoadedResource.SpriteLockedOnCycle.RemoveAt(LoadedResource.SpriteLockedOnCycle.Count - 1);
                    }
                }
                for (int i = 0; i < LoadedResource.SpriteLockedOnCycle.Count; i++)
                {
                    LoadedResource.SpriteLockedOnCycle[i] = item.IsLocked(i);
                }

                if (item.Count != PartsListBox.Items.Count)
                {
                    PartsListBox.BeginUpdate();
                    while (PartsListBox.Items.Count < item.Count)
                    {
                        PartsListBox.Items.Add("Part: " + PartsListBox.Items.Count);
                    }
                    while (PartsListBox.Items.Count > item.Count)
                    {
                        PartsListBox.Items.RemoveAt(PartsListBox.Items.Count - 1);
                    }
                    PartsListBox.EndUpdate();

                    PartsListBox.SelectedIndex = Math.Min(pindex, PartsListBox.Items.Count - 1);
                }
                for (int i = 0; i < LoadedResource.SpriteLockedOnCycle.Count; i++)
                {
                    PartsListBox.SetItemChecked(i, LoadedResource.SpriteLockedOnCycle[i]);
                }

                GLSurface.BackColor                   = Color.FromArgb(item.BackColor);
                LoadedResource.PointBoundsX           = item.PointBoundsX;
                LoadedResource.PointBoundsY           = item.PointBoundsY;
                GetTab("Pixel perfect").Checked       = item.PixelPerfect;
                GetTab("Toggle transparency").Checked = item.Transparency;
            }

            if (pindex >= 0 && pindex < item.Count)
            {
                VariantsListBox.Enabled = true;
                var col = item[pindex];
                VariantsListBox.BeginUpdate();
                for (int i = 0; i < col.Length; i++)
                {
                    if (i < VariantsListBox.Items.Count)
                    {
                        VariantsListBox.Items[i] = col[i];
                    }
                    else
                    {
                        VariantsListBox.Items.Add(col[i]);
                    }
                }
                while (VariantsListBox.Items.Count > col.Length)
                {
                    VariantsListBox.Items.RemoveAt(VariantsListBox.Items.Count - 1);
                }
                VariantsListBox.EndUpdate();
            }
            else
            {
                VariantsListBox.Items.Clear();
                VariantsListBox.Enabled = false;
            }
        }
 private void GLFrameTimer_Tick(object sender, EventArgs e)
 {
     GLSurface.Refresh();
 }
 public void Activate()
 {
     GLSurface.MakeCurrent();
 }
        public TileControl(string path)
        {
            InitializeComponent();
            SolidityNumeric.FixMouseWheel();
            LayerNumeric.FixMouseWheel();
            SizeNumeric.FixMouseWheel();
            FramesCountNumeric.FixMouseWheel();
            FrameDelayNumeric.FixMouseWheel();
            OffsetXNumeric.FixMouseWheel();
            OffsetYNumeric.FixMouseWheel();

            TileComboBox.SelectedIndex = 0;

            MenuTabs = new ToolStripMenuItem[] {
                new ToolStripMenuItem("Link texture", null, LinkTextureMenuItem_Click, Keys.Control | Keys.I),
                new ToolStripMenuItem("Link event", null, LinkEventMenuItem_Click, Keys.Control | Keys.Shift | Keys.I),
                new ToolStripMenuItem("Toggle grid", null, ToggleGridMenuItem_Click, Keys.Control | Keys.G),
                new ToolStripMenuItem("Background color", null, BackColorMenuItem_Click, Keys.Control | Keys.L),
                new ToolStripMenuItem("Reset position", null, ResetPositionMenuItem_Click, Keys.Control | Keys.R),
            };

            GLSurface.MakeCurrent();
            LoadedResource = new TileResource(path);

            SolidityNumeric.ValueChanged += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.Solidity, v => LoadedResource.Solidity = v);
            LayerNumeric.ValueChanged    += (object sender, EventArgs e) =>
            {
                SyncNumericValue(sender, LoadedResource.Layer, v => LoadedResource.Layer = v);
                GLSurface.ResortTiles();
            };
            SizeNumeric.ValueChanged        += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.PartSize, v => LoadedResource.PartSize = v);
            FramesCountNumeric.ValueChanged += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FramesCount, v => LoadedResource.FramesCount = v);
            FrameDelayNumeric.ValueChanged  += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.FrameDelay, v => LoadedResource.FrameDelay = v);
            OffsetXNumeric.ValueChanged     += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.OffsetX, v => LoadedResource.OffsetX = v);
            OffsetYNumeric.ValueChanged     += (object sender, EventArgs e) => SyncNumericValue(sender, LoadedResource.OffsetY, v => LoadedResource.OffsetY = v);

            TReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.T);
            TLReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.TL);
            LReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.L);
            LDReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.LD);
            DReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.D);
            DRReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.DR);
            RReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.R);
            RUReactionBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.RT);
            MReactionBox.CheckedChanged  += (object sender, EventArgs e) => SyncCheckBoxReaction(sender, LoadedResource.Reactions, v => LoadedResource.Reactions = v, TileResource.Reaction.M);

            TAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.T);
            LAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.L);
            DAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.D);
            RAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.R);
            FAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.F);
            BAnchorBox.CheckedChanged += (object sender, EventArgs e) => SyncCheckBoxAnchor(sender, LoadedResource.Anchors, v => LoadedResource.Anchors = v, TileResource.Anchor.B);

            PropertiesListBox.ItemCheck += (object sender, ItemCheckEventArgs e) => SyncFlags(sender, e, LoadedResource.Properties, v => LoadedResource.Properties = v);

            Story = new StoryItem <State>(new State(LoadedResource));
            Story.ValueChanged            += Story_ValueChanged;
            TextureLinkTextBox.Subresource = LoadedResource.Texture;

            ResourcePath = path;
            ResourceName = Path.GetFileName(path);

            ShapeComboBox.Items.AddRange(Enum.GetNames(typeof(TileResource.Shape)));
            EventsComboBox.SelectedIndex = 0;

            ShapeComboBox.SelectedIndex = (int)LoadedResource.Form;

            for (int i = 0; i < PropertiesListBox.Items.Count; i++)
            {
                PropertiesListBox.SetItemChecked(i, LoadedResource[i]);
            }
            PropertiesListBox.SelectedIndexChanged += (object sender, EventArgs e) => PropertiesListBox.SelectedIndex = -1;

            SolidityNumeric.Value    = (decimal)LoadedResource.Solidity;
            LayerNumeric.Value       = (decimal)LoadedResource.Layer;
            SizeNumeric.Value        = (decimal)LoadedResource.PartSize;
            FramesCountNumeric.Value = (decimal)LoadedResource.FramesCount;
            FrameDelayNumeric.Value  = (decimal)LoadedResource.FrameDelay;
            OffsetXNumeric.Value     = (decimal)LoadedResource.OffsetX;
            OffsetYNumeric.Value     = (decimal)LoadedResource.OffsetY;

            TReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.T);
            TLReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.TL);
            LReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.L);
            LDReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.LD);
            DReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.D);
            DRReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.DR);
            RReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.R);
            RUReactionBox.Checked = LoadedResource.Reactions.HasFlag(TileResource.Reaction.RT);
            MReactionBox.Checked  = LoadedResource.Reactions.HasFlag(TileResource.Reaction.M);

            TAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.T);
            LAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.L);
            DAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.D);
            RAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.R);
            FAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.F);
            BAnchorBox.Checked = LoadedResource.Anchors.HasFlag(TileResource.Anchor.B);
            GLFrameTimer.Start();

            int ox = (int)(GLSurface.FieldW / 2);
            int oy = (int)(GLSurface.FieldH / 2);

            GLSurface.LoadTile(LoadedResource, TileName);
            GLSurface.PlaceTile(TileName, ox + 0, oy + 0);
            GLSurface.PlaceTile(TileName, ox - 1, oy + 0);
            GLSurface.PlaceTile(TileName, ox + 1, oy + 0);
            GLSurface.PlaceTile(TileName, ox + 0, oy - 1);
            GLSurface.PlaceTile(TileName, ox + 0, oy + 1);
            GLSurface.BackColor           = Color.FromArgb(LoadedResource.BackColor);
            GLSurface.GridEnabled         = LoadedResource.GridEnabled;
            GetTab("Toggle grid").Checked = LoadedResource.GridEnabled;
        }