Пример #1
0
        /// <summary>
        /// Applies animations to all models and invalidates the viewport.
        /// Also updates animation controls if not playing.
        /// </summary>
        public virtual void UpdateModel(float frame)
        {
            if (_updating)
            {
                return;
            }

            if (EditingAll)
            {
                foreach (IModel n in _targetModels)
                {
                    UpdateModel(n, frame);
                }
            }
            else if (TargetModel != null)
            {
                UpdateModel(TargetModel, frame);
            }

            if (!_playing)
            {
                UpdatePropDisplay();
            }

            ModelPanel.Invalidate();
        }
Пример #2
0
        public void SelectedPolygonChanged(object sender, EventArgs e)
        {
            _targetModel._polyIndex = _targetModel._objList.IndexOf(leftPanel.SelectedPolygon);

            if (syncTexObjToolStripMenuItem.Checked)
            {
                leftPanel.UpdateTextures();
            }

            if (TargetAnimType == AnimType.VIS)
            {
                if (leftPanel.TargetObject != null && vis0Editor.listBox1.Items.Count != 0)
                {
                    int x = 0;
                    foreach (object i in vis0Editor.listBox1.Items)
                    {
                        if (i.ToString() == leftPanel.TargetObject.VisibilityBone)
                        {
                            vis0Editor.listBox1.SelectedIndex = x;
                            break;
                        }
                        else
                        {
                            x++;
                        }
                    }
                    if (x == vis0Editor.listBox1.Items.Count)
                    {
                        vis0Editor.listBox1.SelectedIndex = -1;
                    }
                }
            }

            ModelPanel.Invalidate();
        }
Пример #3
0
        public void UpdateModel()
        {
            if (_updating || models == null)
            {
                return;
            }

            if (!_editingAll)
            {
                if (TargetModel != null)
                {
                    UpdateModel(TargetModel);
                }
            }
            else
            {
                foreach (MDL0Node n in _targetModels)
                {
                    UpdateModel(n);
                }
            }

            if (!_playing)
            {
                UpdatePropDisplay();
            }

            ModelPanel.Invalidate();
        }
Пример #4
0
        private void cboToolSelect_SelectedIndexChanged(object sender, EventArgs e)
        {
            _updating = true;
            switch (ControlType)
            {
            case TransformType.None:
                rotationToolStripMenuItem.Checked        =
                    translationToolStripMenuItem.Checked =
                        scaleToolStripMenuItem.Checked   = false;
                break;

            case TransformType.Scale:
                rotationToolStripMenuItem.Checked        =
                    translationToolStripMenuItem.Checked = false;
                scaleToolStripMenuItem.Checked           = true;
                break;

            case TransformType.Rotation:
                translationToolStripMenuItem.Checked =
                    scaleToolStripMenuItem.Checked   = false;
                rotationToolStripMenuItem.Checked    = true;
                break;

            case TransformType.Translation:
                rotationToolStripMenuItem.Checked    =
                    scaleToolStripMenuItem.Checked   = false;
                translationToolStripMenuItem.Checked = true;
                break;
            }
            _updating = false;

            _snapCirc = _snapX = _snapY = _snapZ = false;
            ModelPanel.Invalidate();
        }
Пример #5
0
        private bool HotkeySelectAllVertices()
        {
            if (!ModelPanel.Focused)
            {
                return(false);
            }

            ClearSelectedVertices();
            if (EditingAll)
            {
                if (_targetModels != null)
                {
                    foreach (IModel mdl in _targetModels)
                    {
                        SelectAllVertices(mdl);
                    }
                }
            }
            else if (TargetModel != null)
            {
                SelectAllVertices(TargetModel);
            }

            OnSelectedVerticesChanged();

            weightEditor.TargetVertices = _selectedVertices;
            vertexEditor.TargetVertices = _selectedVertices;

            ModelPanel.Invalidate();

            return(true);
        }
Пример #6
0
        private void SetFrame(int index)
        {
            //if (_animFrame == index)
            //    return;

            _animFrame = _targetModel == null ? 0 : index;


            btnNextFrame.Enabled = _animFrame < _maxFrame;
            btnPrevFrame.Enabled = _animFrame > 0;

            numFrameIndex.Value = _animFrame;

            pnlAnim.CurrentFrame = _animFrame;

            modelPanel1.Invalidate();
        }
Пример #7
0
 private bool HotkeyRenderDepthPressed()
 {
     if (ModelPanel.Focused && !_renderDepth)
     {
         _renderDepth = true;
         ModelPanel.Invalidate();
         return(true);
     }
     return(false);
 }
Пример #8
0
 private bool HotkeyRenderDepthReleased()
 {
     if (ModelPanel.Focused && _renderDepth)
     {
         _renderDepth = false;
         ModelPanel.Invalidate();
         return(true);
     }
     return(false);
 }
Пример #9
0
        private void hideAllOtherModelsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (MDL0Node node in _targetModels)
            {
                if (node != TargetModel)
                {
                    ModelPanel.RemoveTarget(node);
                }
            }

            ModelPanel.Invalidate();
        }
        private void hideFromSceneToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ModelPanel.RemoveTarget(TargetModel);

            if (_targetModels != null && _targetModels.Count != 0)
            {
                _resetCamera = false;
                TargetModel  = _targetModels[0];
            }

            ModelPanel.Invalidate();
        }
Пример #11
0
        private void TworldToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
        {
            if (_updating)
            {
                return;
            }

            _updating = true;
            TparentLocalToolStripMenuItem.Checked = !TworldToolStripMenuItem.Checked;
            _updating = false;

            ModelPanel.Invalidate();
        }
        private void deleteAllOtherModelsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (IModel node in _targetModels)
            {
                if (node != TargetModel)
                {
                    _targetModels.Remove(node);
                    ModelPanel.RemoveTarget(node);
                }
            }

            ModelPanel.Invalidate();
        }
Пример #13
0
        public void SelectedPolygonChanged()
        {
            //We can't return here if the selected polygon is set to null.
            //If the target model is changed or the selected object is cleared,
            //things relying on the selected object must be updated to reflect that.
            //if (leftPanel.SelectedPolygon == null) return;

            //This sets the selected object index internally in the model.
            //This determines the target object for focus editing vertices, normals, etc in the viewer
            //If the selected object is set to null, the poly index will be set to -1 by IndexOf.
            //This means vertices, normals etc will be drawn for all objects, if enabled.
            _targetModel.SelectedObjectIndex = _targetModel.Objects.IndexOf(leftPanel.SelectedObject);

            //If this setting is enabled, we need to show the user what textures only this object uses.
            //If the polygon is set to null, all of the model's texture references will be shown.
            if (SyncTexturesToObjectList)
            {
                leftPanel.UpdateTextures();
            }

            //Update the VIS editor to show the entries for the selected object
            if (TargetAnimType == NW4RAnimType.VIS &&
                leftPanel.SelectedObject != null &&
                vis0Editor.listBox1.Items.Count != 0 &&
                leftPanel.SelectedObject is MDL0ObjectNode)
            {
                MDL0ObjectNode o = (MDL0ObjectNode)leftPanel.SelectedObject;

                int x = 0;
                foreach (object i in vis0Editor.listBox1.Items)
                {
                    if (o._drawCalls.Count > 0 && i.ToString() == o._drawCalls[0].VisibilityBone)
                    {
                        vis0Editor.listBox1.SelectedIndex = x;
                        break;
                    }
                    else
                    {
                        x++;
                    }
                }

                if (x == vis0Editor.listBox1.Items.Count)
                {
                    vis0Editor.listBox1.SelectedIndex = -1;
                }
            }

            ModelPanel.Invalidate();
        }
Пример #14
0
 private void centerToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
 {
     if (_updating)
     {
         return;
     }
     if (centerToolStripMenuItem1.Checked)
     {
         _updating = true;
         stretchToolStripMenuItem1.Checked = resizeToolStripMenuItem1.Checked = false;
         ModelPanel._bgType = GLPanel.BackgroundType.Center;
         _updating          = false;
         ModelPanel.Invalidate();
     }
 }
Пример #15
0
        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _resetCamera = false;

            ModelPanel.RemoveTarget(TargetModel);
            _targetModels.Remove(TargetModel);
            models.Items.Remove(TargetModel);

            if (_targetModels != null && _targetModels.Count != 0)
            {
                TargetModel = _targetModels[0];
            }

            ModelPanel.Invalidate();
        }
Пример #16
0
        protected virtual void modelPanel1_MouseDown(object sender, MouseEventArgs e)
        {
            _createdNewBone = false;

            ModelPanel         panel    = sender as ModelPanel;
            ModelPanelViewport viewport = panel.CurrentViewport;

            if (panel._draggingViewports)
            {
                return;
            }

            if (e.Button == Forms.MouseButtons.Left)
            {
                if (DoNotHighlightOnMouseMove)
                {
                    HighlightStuff(e, panel);

                    //Reset the cursor (HighlightStuff sets the cursor)
                    panel.Cursor = Cursors.Default;
                }

                //Reset snap flags
                _boneSelection.ResetSnaps();
                _vertexSelection.ResetSnaps();

                MouseDownTargetBone(e, panel);

                if (!MouseDownTargetVertex(e, panel))
                {
                    if (CurrentFrame == 0 &&
                        TargetAnimType == NW4RAnimType.CHR &&
                        CHR0Editor.chkMoveBoneOnly.Checked &&
                        TargetModel != null &&
                        TargetModel is MDL0Node)
                    {
                        MDL0Node m = TargetModel as MDL0Node;
                        m._dontUpdateMesh = true;
                    }
                }

                //Ensure a redraw so the snapping indicators are correct
                panel.Invalidate();
            }
        }
        private void topToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            ModelPanelViewport curViewport = modelPanel.CurrentViewport;
            ModelPanelViewport newViewport = ModelPanelViewport.DefaultPerspective;

            newViewport.BackgroundColor = curViewport.BackgroundColor;
            ModelPanel.AddViewport(newViewport);

            float xMin     = curViewport.Percentages._x;
            float yMin     = curViewport.Percentages._y;
            float xMax     = curViewport.Percentages._z;
            float yMax     = curViewport.Percentages._w;
            float averageY = (yMin + yMax) / 2.0f;

            curViewport.SetPercentages(xMin, averageY, xMax, yMax);
            newViewport.SetPercentages(xMin, yMin, xMax, averageY);

            ModelPanel.Invalidate();
        }
Пример #18
0
 private void scaleToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
 {
     if (_updating)
     {
         return;
     }
     if (scaleToolStripMenuItem.Checked)
     {
         _updating = true;
         rotationToolStripMenuItem.Checked = translationToolStripMenuItem.Checked = false;
         _editType = TransformType.Scale;
         _snapCirc = _snapX = _snapY = _snapZ = false;
         _updating = false;
         ModelPanel.Invalidate();
     }
     else if (translationToolStripMenuItem.Checked == rotationToolStripMenuItem.Checked == scaleToolStripMenuItem.Checked)
     {
         _editType = TransformType.None;
     }
 }
Пример #19
0
        public void HighlightStuff(MouseEventArgs e, ModelPanel panel)
        {
            panel.Capture();

            _hiX = _hiY = _hiZ = _hiCirc = _hiSphere = false;

            float depth          = panel.GetDepth(e.X, e.Y);
            ModelPanelViewport v = panel.HighlightedViewport;

            foreach (var targetFunc in _mouseMoveTargetType)
            {
                targetFunc(panel, e, depth, v);
            }

#if DEBUG
            if (_renderDepth)
            {
                v.ScreenText["Depth: " + depth.ToString()] = new Vector3(5.0f, v.Height - 20.0f, 0.5f);
                panel.Invalidate();
            }
#endif
        }
Пример #20
0
        public void HighlightStuff(MouseEventArgs e, ModelPanel panel)
        {
            panel.Capture();

            _boneSelection.ResetHighlights();
            _vertexSelection.ResetHighlights();

            float depth          = panel.GetDepth(e.X, e.Y);
            ModelPanelViewport v = panel.HighlightedViewport;

            foreach (MouseMoveTargetType targetFunc in _mouseMoveTargetType)
            {
                targetFunc(panel, e, depth, v);
            }

#if DEBUG
            if (_renderDepth)
            {
                v.ScreenText["Depth: " + depth.ToString()] = new Vector3(5.0f, v.Height - 20.0f, 0.5f);
                panel.Invalidate();
            }
#endif
        }
Пример #21
0
        private void btnUndo_Click(object sender, EventArgs e)
        {
            if (CanUndo)
            {
                ModelPanel.BeginUpdate();

                if (!_undoing)
                {
                    _saveIndex--;
                }
                _undoing = true;

                Apply(_undoSaves[_saveIndex]);

                //Decrement index after applying save
                _saveIndex--;

                UpdateUndoButtons();

                ModelPanel.EndUpdate();
                ModelPanel.Invalidate();
            }
        }
Пример #22
0
        private void btnRedo_Click(object sender, EventArgs e)
        {
            if (CanRedo)
            {
                ModelPanel.BeginUpdate();

                if (_undoing)
                {
                    _saveIndex++;
                }
                _undoing = false;

                Apply(_redoSaves[_saveIndex]);

                //Increment index after applying save
                _saveIndex++;

                UpdateUndoButtons();

                ModelPanel.EndUpdate();
                ModelPanel.Invalidate();
            }
        }
Пример #23
0
        private void chkShaders_CheckedChanged(object sender, EventArgs e)
        {
            if (ModelPanel._ctx != null)
            {
                if (ModelPanel._ctx._version < 2 && chkShaders.Checked)
                {
                    MessageBox.Show("You need at least OpenGL 2.0 to view shaders.", "GLSL not supported",
                                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                    chkShaders.Checked = false;
                    return;
                }
                else
                {
                    if (ModelPanel._ctx._shadersEnabled && !chkShaders.Checked)
                    {
                        GL.UseProgram(0); GL.ActiveTexture(TextureUnit.Texture0);
                    }
                    ModelPanel._ctx._shadersEnabled = chkShaders.Checked;
                }
            }
            ModelPanel.Invalidate();
        }
Пример #24
0
        private void cboToolSelect_SelectedIndexChanged(object sender, EventArgs e)
        {
            _updating = true;
            switch (ControlType)
            {
            case TransformType.Scale:
                rotationToolStripMenuItem.Checked    = false;
                translationToolStripMenuItem.Checked = false;
                scaleToolStripMenuItem.Checked       = true;
                break;

            case TransformType.Rotation:
                translationToolStripMenuItem.Checked = false;
                scaleToolStripMenuItem.Checked       = false;
                rotationToolStripMenuItem.Checked    = true;
                break;

            case TransformType.Translation:
                rotationToolStripMenuItem.Checked    = false;
                scaleToolStripMenuItem.Checked       = false;
                translationToolStripMenuItem.Checked = true;
                break;

            default:     //TransformType.None
                rotationToolStripMenuItem.Checked    = false;
                translationToolStripMenuItem.Checked = false;
                scaleToolStripMenuItem.Checked       = false;
                break;
            }

            _updating = false;

            _boneSelection.ResetAll();
            _vertexSelection.ResetAll();
            ModelPanel.Invalidate();
        }
Пример #25
0
 private void Invalidate_Event(object sender, EventArgs e)
 {
     ModelPanel.Invalidate();
 }
Пример #26
0
        protected override bool ProcessKeyPreview(ref Message m)
        {
            if (m.Msg == 0x100)
            {
                bool focused = ModelPanel.ContainsFocus;

                Keys key = (Keys)m.WParam;
                if (key == Keys.PageUp)
                {
                    if (Ctrl)
                    {
                        pnlPlayback.btnLast_Click(this, null);
                    }
                    else
                    {
                        pnlPlayback.btnNextFrame_Click(this, null);
                    }
                    return(true);
                }
                else if (key == Keys.PageDown)
                {
                    if (Ctrl)
                    {
                        pnlPlayback.btnFirst_Click(this, null);
                    }
                    else
                    {
                        pnlPlayback.btnPrevFrame_Click(this, null);
                    }
                    return(true);
                }
                else if (key == Keys.U)
                {
                    if (Ctrl)
                    {
                        ModelPanel.ResetCamera();
                        return(true);
                    }
                }
                else if (key == Keys.A)
                {
                    if (Ctrl)
                    {
                        ResetVertexColors();
                        if (_targetModels != null)
                        {
                            foreach (MDL0Node mdl in _targetModels)
                            {
                                if (mdl._objList != null)
                                {
                                    if (mdl._polyIndex != -1 && mdl._polyIndex >= 0 && mdl._polyIndex < mdl._objList.Count)
                                    {
                                        foreach (Vertex3 v in ((MDL0ObjectNode)mdl._objList[mdl._polyIndex])._manager._vertices)
                                        {
                                            _selectedVertices.Add(v);
                                            v._selected       = true;
                                            v._highlightColor = Color.Orange;
                                        }
                                    }
                                    else
                                    {
                                        foreach (MDL0ObjectNode o in mdl._objList)
                                        {
                                            foreach (Vertex3 v in o._manager._vertices)
                                            {
                                                _selectedVertices.Add(v);
                                                v._selected       = true;
                                                v._highlightColor = Color.Orange;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        weightEditor.TargetVertices = _selectedVertices;
                        vertexEditor.TargetVertices = _selectedVertices;
                        ModelPanel.Invalidate();
                    }
                    else if (focused)
                    {
                        btnLeftToggle_Click(null, null);
                        return(true);
                    }
                }
                else if (key == Keys.D)
                {
                    if (focused)
                    {
                        if (Control.ModifierKeys == (Keys.Control | Keys.Alt))
                        {
                            if (leftPanel.Visible || rightPanel.Visible || animEditors.Visible || controlPanel.Visible)
                            {
                                showBottom.Checked = showRight.Checked = showLeft.Checked = showTop.Checked = false;
                            }
                            else
                            {
                                showBottom.Checked = showRight.Checked = showLeft.Checked = showTop.Checked = true;
                            }
                        }
                        else
                        {
                            btnRightToggle_Click(null, null);
                        }
                        return(true);
                    }
                }
                else if (key == Keys.W)
                {
                    if (focused)
                    {
                        btnTopToggle_Click(null, null);
                        return(true);
                    }
                }
                else if (key == Keys.S)
                {
                    btnBottomToggle_Click(null, null);
                    return(true);
                }
                else if (key == Keys.E)
                {
                    if (focused)
                    {
                        scaleToolStripMenuItem.PerformClick();
                        return(true);
                    }
                }
                else if (key == Keys.R)
                {
                    if (focused)
                    {
                        rotationToolStripMenuItem.PerformClick();
                        return(true);
                    }
                }
                else if (key == Keys.G)
                {
                    if (focused)
                    {
                        ModelPanel.RefreshReferences();
                        return(true);
                    }
                }
                else if (key == Keys.T)
                {
                    if (focused)
                    {
                        translationToolStripMenuItem.PerformClick();
                        return(true);
                    }
                }
                else if (key == Keys.C)
                {
                    if (focused)
                    {
                        //Copy frame
                        if (Ctrl)
                        {
                            if ((ModifierKeys & Keys.Shift) == Keys.Shift)
                            {
                                //We're copying the whole frame
                                if (_currentControl is CHR0Editor)
                                {
                                    chr0Editor.btnCopyAll.PerformClick();
                                    return(true);
                                }
                            }
                            else
                            {
                                //We're copying the entry frame
                                if (_currentControl is CHR0Editor)
                                {
                                    chr0Editor.btnCopy.PerformClick();
                                    return(true);
                                }
                            }
                        }
                    }
                }
                else if (key == Keys.V)
                {
                    if (focused)
                    {
                        //Paste frame
                        if (Ctrl)
                        {
                            if (Shift)
                            {
                                if (Alt)
                                {
                                    //We're pasting only keyframes of the whole frame
                                    if (_currentControl is CHR0Editor)
                                    {
                                        chr0Editor._onlyKeys = true;
                                        chr0Editor.btnPasteAll.PerformClick();
                                        return(true);
                                    }
                                }
                                else
                                {
                                    //We're pasting the whole frame
                                    if (_currentControl is CHR0Editor)
                                    {
                                        chr0Editor._onlyKeys = false;
                                        chr0Editor.btnPasteAll.PerformClick();
                                        return(true);
                                    }
                                }
                            }
                            else
                            if (Alt)
                            {
                                //We're pasting only keyframes of the entry frame
                                if (_currentControl is CHR0Editor)
                                {
                                    chr0Editor._onlyKeys = true;
                                    chr0Editor.btnPaste.PerformClick();
                                    return(true);
                                }
                            }
                            else
                            {
                                //We're pasting the entry frame
                                if (_currentControl is CHR0Editor)
                                {
                                    chr0Editor._onlyKeys = false;
                                    chr0Editor.btnPaste.PerformClick();
                                    return(true);
                                }
                            }
                        }
                        else
                        {
                            chkVertices.PerformClick();
                            return(true);
                        }
                    }
                }
                else if (key == Keys.Back)
                {
                    if (focused)
                    {
                        if (Ctrl)
                        {
                            //Clear all keyframes from frame
                            if ((ModifierKeys & Keys.Shift) == Keys.Shift)
                            {
                                //We're removing the whole frame
                                if (_currentControl is CHR0Editor)
                                {
                                    chr0Editor.btnClearAll.PerformClick();
                                    return(true);
                                }
                            }
                            else
                            {
                                //We're removing the entry frame
                                if (_currentControl is CHR0Editor)
                                {
                                    chr0Editor.ClearEntry();
                                    return(true);
                                }
                            }
                        }
                        else if (ModifierKeys == Keys.Shift)
                        {
                            //Delete frame
                            if (_currentControl is CHR0Editor)
                            {
                                chr0Editor.btnDelete.PerformClick();
                                return(true);
                            }
                        }
                    }
                }
                else if (key == Keys.P)
                {
                    if (focused)
                    {
                        chkPolygons.PerformClick();
                        return(true);
                    }
                }
                else if (key == Keys.B)
                {
                    if (focused)
                    {
                        chkBones.PerformClick();
                        return(true);
                    }
                }
                else if (key == Keys.F)
                {
                    if (focused)
                    {
                        chkFloor.PerformClick();
                        return(true);
                    }
                }
                else if (key == Keys.I)
                {
                    if ((ModifierKeys & (Keys.Alt | Keys.Control)) == (Keys.Alt | Keys.Control))
                    {
                        btnExportToImgWithTransparency_Click(null, null);
                        return(true);
                    }
                    else if ((ModifierKeys & (Keys.Shift | Keys.Control)) == (Keys.Shift | Keys.Control))
                    {
                        btnExportToImgNoTransparency_Click(null, null);
                        return(true);
                    }
                }
                if (key == Keys.Z)
                {
                    if (Ctrl)
                    {
                        if (btnUndo.Enabled)
                        {
                            btnUndo_Click(null, null);
                        }

                        return(true);
                    }
                }
                else if (key == Keys.Y)
                {
                    if (Ctrl)
                    {
                        if (btnRedo.Enabled)
                        {
                            btnRedo_Click(null, null);
                        }

                        return(true);
                    }
                }
                else if (key == Keys.Escape)
                {
                    //Undo transformations, make sure to reset keyframes
                    if (_rotating)
                    {
                        _rotating = false;
                        chr0Editor.numRotX.Value = _oldAngles._x;
                        chr0Editor.numRotY.Value = _oldAngles._y;
                        chr0Editor.numRotZ.Value = _oldAngles._z;
                        chr0Editor.BoxChanged(chr0Editor.numRotX, null);
                        chr0Editor.BoxChanged(chr0Editor.numRotY, null);
                        chr0Editor.BoxChanged(chr0Editor.numRotZ, null);
                        ModelPanel._forceNoSelection = false;
                    }
                    if (_translating)
                    {
                        _translating = false;
                        chr0Editor.numTransX.Value = _oldPosition._x;
                        chr0Editor.numTransY.Value = _oldPosition._y;
                        chr0Editor.numTransZ.Value = _oldPosition._z;
                        chr0Editor.BoxChanged(chr0Editor.numTransX, null);
                        chr0Editor.BoxChanged(chr0Editor.numTransY, null);
                        chr0Editor.BoxChanged(chr0Editor.numTransZ, null);
                        ModelPanel._forceNoSelection = false;
                    }
                    if (_scaling)
                    {
                        _scaling = false;
                        chr0Editor.numScaleX.Value = _oldScale._x;
                        chr0Editor.numScaleY.Value = _oldScale._y;
                        chr0Editor.numScaleZ.Value = _oldScale._z;
                        chr0Editor.BoxChanged(chr0Editor.numScaleX, null);
                        chr0Editor.BoxChanged(chr0Editor.numScaleY, null);
                        chr0Editor.BoxChanged(chr0Editor.numScaleZ, null);
                        ModelPanel._forceNoSelection = false;
                    }
                }
                else if (key == Keys.Space)
                {
                    if (focused)
                    {
                        btnPlay_Click(null, null);
                        return(true);
                    }
                }
                //Weight editor has been disabled due to the necessity of re-encoding objects
                //after making influence changes. Each primitive must be regrouped if their influences have
                //changed, and this will get confusing with tristrips and other types of primitives.
                //else if (key == Keys.H)
                //{
                //    ToggleWeightEditor();
                //    return true;
                //}
                else if (key == Keys.J)
                {
                    if (focused)
                    {
                        ToggleVertexEditor();
                        return(true);
                    }
                }
            }
            return(base.ProcessKeyPreview(ref m));
        }
Пример #27
0
 private void sCN0CameraToolStripMenuItem1_CheckedChanged(object sender, EventArgs e)
 {
     SCN0CameraNode._linear = chkLinearCamera.Checked;
     ModelPanel.Invalidate();
 }
Пример #28
0
        private void GetVertex(ModelPanel panel, MouseEventArgs e, float depth, ModelPanelViewport v)
        {
            //Try targeting a vertex
            if (RenderVertices)
            {
                if (panel.CurrentViewport.Selecting)
                {
                    if (NotCtrlAlt)
                    {
                        ClearSelectedVertices();
                    }

                    bool selected = false;
                    if (TargetModel != null)
                    {
                        if (TargetModel.SelectedObjectIndex < 0)
                        {
                            foreach (IObject o in TargetModel.Objects)
                            {
                                if (o.IsRendering)
                                {
                                    SelectVertices(o, panel);
                                    selected = true;
                                }
                            }
                        }
                        else
                        {
                            IObject w = TargetModel.Objects[TargetModel.SelectedObjectIndex];
                            if (w.IsRendering)
                            {
                                SelectVertices(w, panel);
                                selected = true;
                            }
                            else
                            {
                                foreach (IObject h in TargetModel.Objects)
                                {
                                    if (h.IsRendering)
                                    {
                                        SelectVertices(h, panel);
                                        selected = true;
                                    }
                                }
                            }
                        }
                    }
                    else if (_targetModels != null)
                    {
                        foreach (IModel m in _targetModels)
                        {
                            if (m.SelectedObjectIndex < 0)
                            {
                                foreach (IObject o in m.Objects)
                                {
                                    if (o.IsRendering)
                                    {
                                        SelectVertices(o, panel);
                                        selected = true;
                                    }
                                }
                            }
                            else
                            {
                                IObject w = m.Objects[m.SelectedObjectIndex];
                                if (w.IsRendering)
                                {
                                    SelectVertices(w, panel);
                                    selected = true;
                                }
                                else
                                {
                                    foreach (IObject h in m.Objects)
                                    {
                                        if (h.IsRendering)
                                        {
                                            SelectVertices(h, panel);
                                            selected = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (selected)
                    {
                        OnSelectedVerticesChanged();
                    }
                }
                else
                {
                    if (depth < 1.0f && _targetModel != null)
                    {
                        Vector3 point  = v.UnProject(e.X, e.Y, depth);
                        Vertex3 vertex = CompareVertexDistance(point);
                        bool    update = false;
                        if (_hiVertex != null && !_hiVertex._selected)
                        {
                            update = true;
                            _hiVertex._highlightColor = Color.Transparent;
                            ModelPanel.CurrentViewport.AllowSelection = true;
                        }
                        if ((_hiVertex = vertex) != null)
                        {
                            update = true;
                            _hiVertex._highlightColor = Color.Orange;
                            panel.Cursor = Cursors.Cross;
                            ModelPanel.CurrentViewport.AllowSelection = false;
                        }
                        if (update)
                        {
                            panel.Invalidate();
                        }
                    }
                    else if (_hiVertex != null)
                    {
                        if (!_hiVertex._selected)
                        {
                            _hiVertex._highlightColor = Color.Transparent;
                            ModelPanel.CurrentViewport.AllowSelection = true;
                            panel.Invalidate();
                        }
                        _hiVertex = null;
                    }
                }
            }
        }
Пример #29
0
        private void GetBone(ModelPanel panel, MouseEventArgs e, float depth, ModelPanelViewport v)
        {
            if (!_boneSelection.IsMoving() && depth < 1.0f)
            {
                IBoneNode o = null;

                Vector3 point   = v.UnProject(e.X, e.Y, depth);
                bool    doScale = v._renderAttrib._scaleBones;

                //Find orb near chosen point
                if (EditingAll)
                {
                    foreach (IModel m in _targetModels)
                    {
                        foreach (IBoneNode b in m.RootBones)
                        {
                            if (CompareBoneDistanceRecursive(b, point, ref o, v, doScale))
                            {
                                break;
                            }
                        }
                    }
                }
                else if (_targetModel != null)
                {
                    foreach (IBoneNode b in _targetModel.RootBones)
                    {
                        if (CompareBoneDistanceRecursive(b, point, ref o, v, doScale))
                        {
                            break;
                        }
                    }
                }

                bool update = false;
                if (_hiBone != null && _hiBone != SelectedBone && (update = _hiBone.NodeColor != Color.Transparent))
                {
                    _hiBone.NodeColor = Color.Transparent;
                }

                if ((_hiBone = o) != null)
                {
                    _hiBone.NodeColor = Color.FromArgb(255, 128, 0);
                    panel.Cursor      = Cursors.Hand;
                    update            = true;
                }

                if (update)
                {
                    panel.Invalidate();
                }
            }
            else if (_hiBone != null)
            {
                if (_hiBone != SelectedBone)
                {
                    _hiBone.NodeColor = Color.Transparent;
                    panel.Invalidate();
                }
                _hiBone = null;
            }
        }
Пример #30
0
        private void MouseMoveTarget(
            ModelPanel panel,
            MouseEventArgs e,
            float depth,
            ModelPanelViewport v,
            Matrix transformMatrix,
            Matrix invTransformMatrix,
            SelectionParams selection)
        {
            if (ControlType == TransformType.None)
            {
                return;
            }

            CoordinateType coord = _coordinateTypes[(int)ControlType];

            //Get the location of the bone
            Vector3 center = transformMatrix.GetPoint();

            //Standard radius scaling snippet. This is used for orb scaling depending on camera distance.
            float radius = CamDistance(center, v);

            bool snapFound = false;

            if (ControlType == TransformType.Rotation)
            {
                //Get point projected onto our orb.
                Vector3 point = v.ProjectCameraSphere(new Vector2(e.X, e.Y), center, radius, false);

                //Get the distance of the mouse point from the bone
                float distance = point.TrueDistance(center);

                if (Math.Abs(distance - radius) < (radius * _selectOrbScale)) //Point lies within orb radius
                {
                    selection._hiSphere = true;

                    //Determine axis snapping
                    Vector3 angles = (invTransformMatrix * point).GetAngles() * Maths._rad2degf;
                    angles._x = (float)Math.Abs(angles._x);
                    angles._y = (float)Math.Abs(angles._y);
                    angles._z = (float)Math.Abs(angles._z);

                    if (Math.Abs(angles._y - 90.0f) <= _axisSnapRange)
                    {
                        selection._hiX = true;
                    }
                    else if (angles._x >= (180.0f - _axisSnapRange) || angles._x <= _axisSnapRange)
                    {
                        selection._hiY = true;
                    }
                    else if (angles._y >= (180.0f - _axisSnapRange) || angles._y <= _axisSnapRange)
                    {
                        selection._hiZ = true;
                    }
                }
                else if (Math.Abs(distance - (radius * _circOrbScale)) < (radius * _selectOrbScale)) //Point lies on circ line
                {
                    selection._hiCirc = true;
                }

                if (selection._hiX || selection._hiY || selection._hiZ || selection._hiCirc)
                {
                    snapFound = true;
                }
            }
            else if (ControlType == TransformType.Translation || ControlType == TransformType.Scale)
            {
                //No more need to use depth!!! Just some nice math

                if (_coordinateTypes[(int)ControlType] == CoordinateType.World)
                {
                    transformMatrix = Matrix.TranslationMatrix(center) * Matrix.ScaleMatrix(transformMatrix.GetScale());
                }

                Vector3[] planePoints = new Vector3[3]; //xy, yz, xz
                v.ProjectCameraPlanes(new Vector2(e.X, e.Y), transformMatrix,
                                      out planePoints[0], out planePoints[1], out planePoints[2]);

                List <Vector3> testDiffs = new List <Vector3>();
                foreach (Vector3 planePoint in planePoints)
                {
                    Vector3 d =
                        coord == CoordinateType.World ? (planePoint - center) / radius :
                        coord == CoordinateType.Local ? (invTransformMatrix * planePoint) / radius :
                        (panel.Camera._matrix * planePoint - panel.Camera._matrix * center) / radius;

                    if (d._x > -_axisSelectRange && d._x < (_axisLDist + 0.01f) &&
                        d._y > -_axisSelectRange && d._y < (_axisLDist + 0.01f) &&
                        d._z > -_axisSelectRange && d._z < (_axisLDist + 0.01f))
                    {
                        testDiffs.Add(d);
                    }
                }

                //Check if point lies on a specific axis
                foreach (Vector3 diff in testDiffs)
                {
                    float errorRange = _axisSelectRange;

                    if (diff._x > _axisHalfLDist &&
                        Math.Abs(diff._y) < errorRange &&
                        Math.Abs(diff._z) < errorRange)
                    {
                        selection._hiX = true;
                    }
                    if (diff._y > _axisHalfLDist &&
                        Math.Abs(diff._x) < errorRange &&
                        Math.Abs(diff._z) < errorRange)
                    {
                        selection._hiY = true;
                    }
                    if (diff._z > _axisHalfLDist &&
                        Math.Abs(diff._x) < errorRange &&
                        Math.Abs(diff._y) < errorRange)
                    {
                        selection._hiZ = true;
                    }

                    if (snapFound = selection._hiX || selection._hiY || selection._hiZ)
                    {
                        break;
                    }
                }

                if (!snapFound)
                {
                    foreach (Vector3 diff in testDiffs)
                    {
                        if (ControlType == TransformType.Translation)
                        {
                            if (diff._x < _axisHalfLDist &&
                                diff._y < _axisHalfLDist &&
                                diff._z < _axisHalfLDist)
                            {
                                //Point lies inside the double drag areas
                                if (diff._x > _axisSelectRange)
                                {
                                    selection._hiX = true;
                                }
                                if (diff._y > _axisSelectRange)
                                {
                                    selection._hiY = true;
                                }
                                if (diff._z > _axisSelectRange)
                                {
                                    selection._hiZ = true;
                                }

                                selection._hiCirc =
                                    !selection._hiX &&
                                    !selection._hiY &&
                                    !selection._hiZ;

                                snapFound = true;
                            }
                        }
                        else if (ControlType == TransformType.Scale)
                        {
                            //Determine if the point is in the double or triple drag triangles
                            float halfDist   = _scaleHalf2LDist;
                            float centerDist = _scaleHalf1LDist;
                            if (diff.IsInTriangle(new Vector3(), new Vector3(halfDist, 0, 0), new Vector3(0, halfDist, 0)))
                            {
                                if (diff.IsInTriangle(new Vector3(), new Vector3(centerDist, 0, 0), new Vector3(0, centerDist, 0)))
                                {
                                    selection._hiX = selection._hiY = selection._hiZ = true;
                                }
                                else
                                {
                                    selection._hiX = selection._hiY = true;
                                }
                            }
                            else if (diff.IsInTriangle(new Vector3(), new Vector3(halfDist, 0, 0), new Vector3(0, 0, halfDist)))
                            {
                                if (diff.IsInTriangle(new Vector3(), new Vector3(centerDist, 0, 0), new Vector3(0, 0, centerDist)))
                                {
                                    selection._hiX = selection._hiY = selection._hiZ = true;
                                }
                                else
                                {
                                    selection._hiX = selection._hiZ = true;
                                }
                            }
                            else if (diff.IsInTriangle(new Vector3(), new Vector3(0, halfDist, 0), new Vector3(0, 0, halfDist)))
                            {
                                if (diff.IsInTriangle(new Vector3(), new Vector3(0, centerDist, 0), new Vector3(0, 0, centerDist)))
                                {
                                    selection._hiX = selection._hiY = selection._hiZ = true;
                                }
                                else
                                {
                                    selection._hiY = selection._hiZ = true;
                                }
                            }

                            snapFound = selection._hiX || selection._hiY || selection._hiZ;
                        }

                        if (snapFound)
                        {
                            break;
                        }
                    }
                }
            }

            if (snapFound)
            {
                panel.Cursor = Cursors.Hand;
                panel.Invalidate();
            }
        }