/// <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(); }
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(); }
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(); }
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(); }
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); }
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(); }
private bool HotkeyRenderDepthPressed() { if (ModelPanel.Focused && !_renderDepth) { _renderDepth = true; ModelPanel.Invalidate(); return(true); } return(false); }
private bool HotkeyRenderDepthReleased() { if (ModelPanel.Focused && _renderDepth) { _renderDepth = false; ModelPanel.Invalidate(); return(true); } return(false); }
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(); }
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(); }
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(); }
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(); } }
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(); }
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(); }
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; } }
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 }
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 }
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(); } }
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(); } }
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(); }
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(); }
private void Invalidate_Event(object sender, EventArgs e) { ModelPanel.Invalidate(); }
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)); }
private void sCN0CameraToolStripMenuItem1_CheckedChanged(object sender, EventArgs e) { SCN0CameraNode._linear = chkLinearCamera.Checked; ModelPanel.Invalidate(); }
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; } } } }
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; } }
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(); } }