summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleo2006-03-05 23:44:30 +0000
committerleo2006-03-05 23:44:30 +0000
commit5313b0d1b2cf4a803d25faa80b6d7b697f046634 (patch)
tree0bcee3bb32c9819e05deacabcdd19f12b99cdb50
parenta393e0e4f9b7e492e78388565b7c39928564ca0b (diff)
Rewrote the 3D mouse rotation code, removed the 3D mouse option.
git-svn-id: http://svn.leocad.org/trunk@515 c7d43263-9d01-0410-8a33-9dba5d9f93d6
-rw-r--r--common/defines.h2
-rw-r--r--common/project.cpp154
-rw-r--r--win/Prefpage.cpp6
-rw-r--r--win/Prefpage.h1
-rw-r--r--win/System.cpp5
5 files changed, 54 insertions, 114 deletions
diff --git a/common/defines.h b/common/defines.h
index 84a8e56..f871c6f 100644
--- a/common/defines.h
+++ b/common/defines.h
@@ -164,7 +164,7 @@ int stricmp(const char* str1, const char* str2);
#define LC_DRAW_MOVEAXIS 0x0800 // Move on fixed axis
//#define LC_DRAW_PREVIEW 0x1000 // Show piece position
#define LC_DRAW_CM_UNITS 0x2000 // Use centimeters
-#define LC_DRAW_3DMOUSE 0x4000 // Mouse moves in all directions
+//#define LC_DRAW_3DMOUSE 0x4000 // Mouse moves in all directions
// #define RENDER_FAST 0x001
// #define RENDER_BACKGROUND 0x002
diff --git a/common/project.cpp b/common/project.cpp
index 303b863..035726a 100644
--- a/common/project.cpp
+++ b/common/project.cpp
@@ -6204,12 +6204,6 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam)
case 3:
m_nSnap &= ~LC_DRAW_LOCK_XYZ;
break;
- case 4:
- m_nSnap &= ~LC_DRAW_3DMOUSE;
- break;
- case 5:
- m_nSnap |= LC_DRAW_3DMOUSE;
- break;
}
SystemUpdateSnap(m_nSnap);
} break;
@@ -8515,12 +8509,11 @@ void Project::OnMouseMove(int x, int y, bool bControl, bool bShift)
if ((x == m_nDownX) && (y == m_nDownY))
break;
+ Camera* Camera = m_pViewCameras[m_nActiveViewport];
bool Redraw;
- if ((m_OverlayActive && (m_OverlayMode != LC_OVERLAY_XYZ)) || ((m_nSnap & LC_DRAW_3DMOUSE) == 0))
+ if ((m_OverlayActive && (m_OverlayMode != LC_OVERLAY_XYZ)) || (!Camera->IsSide()))
{
- Camera* Camera = m_pViewCameras[m_nActiveViewport];
-
Vector3 ScreenX = Cross3(Camera->GetTargetPosition() - Camera->GetEyePosition(), Camera->GetUpVector());
Vector3 ScreenY = Camera->GetUpVector();
ScreenX.Normalize();
@@ -8584,6 +8577,7 @@ void Project::OnMouseMove(int x, int y, bool bControl, bool bShift)
Axis2 = Mul(Dir2, RotMat);
}
}
+
// Find out what direction the mouse is going to move stuff.
Vector3 MoveX, MoveY;
@@ -8657,21 +8651,33 @@ void Project::OnMouseMove(int x, int y, bool bControl, bool bShift)
else
{
// 3D movement.
- Camera* Camera = m_pViewCameras[m_nActiveViewport];
-
Vector3 ScreenZ = (Camera->GetTargetPosition() - Camera->GetEyePosition()).Normalize();
Vector3 ScreenX = Cross3(ScreenZ, Camera->GetUpVector());
Vector3 ScreenY = Camera->GetUpVector();
- Vector3 MoveX, MoveY;
+ Vector3 TotalMove;
- MoveX = ScreenX * (float)(x - m_nDownX) * 0.25f / (float)(21 - m_nMouse);
- MoveY = ScreenY * (float)(y - m_nDownY) * 0.25f / (float)(21 - m_nMouse);
+ if (m_nTracking == LC_TRACK_LEFT)
+ {
+ Vector3 MoveX, MoveY;
+
+ MoveX = ScreenX * (float)(x - m_nDownX) * 0.25f / (float)(21 - m_nMouse);
+ MoveY = ScreenY * (float)(y - m_nDownY) * 0.25f / (float)(21 - m_nMouse);
+
+ TotalMove = MoveX + MoveY + m_MouseSnapLeftover;
+ }
+ else
+ {
+ Vector3 MoveZ;
+
+ MoveZ = ScreenZ * (float)(y - m_nDownY) * 0.25f / (float)(21 - m_nMouse);
+
+ TotalMove = MoveZ + m_MouseSnapLeftover;
+ }
m_nDownX = x;
m_nDownY = y;
- Vector3 TotalMove = MoveX + MoveY + m_MouseSnapLeftover;
Redraw = MoveSelectedObjects(TotalMove, m_MouseSnapLeftover);
}
@@ -8682,19 +8688,27 @@ void Project::OnMouseMove(int x, int y, bool bControl, bool bShift)
case LC_ACTION_ROTATE:
{
+ Camera* Camera = m_pViewCameras[m_nActiveViewport];
bool Redraw;
- if (m_OverlayActive && (m_OverlayMode != LC_OVERLAY_XYZ))
+ if ((m_OverlayActive && (m_OverlayMode != LC_OVERLAY_XYZ)) || (!Camera->IsSide()))
{
- Camera* Camera = m_pViewCameras[m_nActiveViewport];
-
Vector3 ScreenX = Cross3(Camera->GetTargetPosition() - Camera->GetEyePosition(), Camera->GetUpVector());
Vector3 ScreenY = Camera->GetUpVector();
ScreenX.Normalize();
Vector3 Dir1, Dir2;
bool SingleDir = true;
- switch (m_OverlayMode)
+ int OverlayMode;
+
+ if (m_OverlayActive && (m_OverlayMode != LC_OVERLAY_XYZ))
+ OverlayMode = m_OverlayMode;
+ else if (m_nTracking == LC_TRACK_LEFT)
+ OverlayMode = LC_OVERLAY_XY;
+ else
+ OverlayMode = LC_OVERLAY_Z;
+
+ switch (OverlayMode)
{
case LC_OVERLAY_X:
Dir1 = Vector3(1, 0, 0);
@@ -8794,104 +8808,42 @@ void Project::OnMouseMove(int x, int y, bool bControl, bool bShift)
}
else
{
- // TODO: old mouse rotation code needs to be fixed/removed.
- Camera *camera = m_pViewCameras[m_nActiveViewport];
-
- if (camera->IsSide ())
- {
- Matrix mat;
- float delta[3];
-
- mat.CreateLookat (camera->GetEyePos (), camera->GetTargetPos (), camera->GetUpVec ());
- mat.SetTranslation (0, 0, 0);
- mat.Invert ();
-
- if (m_nTracking == LC_TRACK_LEFT)
- {
- delta[0] = (float)(x - m_nDownX);
- delta[1] = (float)(y - m_nDownY);
- delta[2] = 0;
- }
- else
- {
- delta[0] = 0;
- delta[1] = 0;
- delta[2] = (float)(y - m_nDownY);
- }
-
- mat.TransformPoints (delta, 1);
+ // 3D movement.
+ Vector3 ScreenZ = (Camera->GetTargetPosition() - Camera->GetEyePosition()).Normalize();
+ Vector3 ScreenX = Cross3(ScreenZ, Camera->GetUpVector());
+ Vector3 ScreenY = Camera->GetUpVector();
- float mouse = 36.0f/(21-m_nMouse);
- ldiv_t result;
+ Vector3 Delta;
- for (int i = 0; i < 3; i++)
- if (m_nSnap & LC_DRAW_SNAP_A)
- {
- delta[i] = delta[i] * mouse + m_fTrack[i];
- result = ldiv ((long)delta[i], m_nAngleSnap);
- delta[i] = (float)(result.quot * m_nAngleSnap);
- m_fTrack[i] = (float)(result.rem);
- }
- else
- {
- delta[i] = delta[i] * mouse + m_fTrack[i];
- result = ldiv ((long)delta[i], 1);
- delta[i] = (float)(result.quot);
- m_fTrack[i] = (float)(result.rem);
- }
+ if (m_nTracking == LC_TRACK_LEFT)
+ {
+ Vector3 MoveX, MoveY;
- Vector3 tmp;
- Redraw = RotateSelectedObjects(Vector3(delta[0], delta[1], delta[2]), tmp);
+ MoveX = ScreenX * (float)(x - m_nDownX) * 36.0f / (float)(21 - m_nMouse);
+ MoveY = ScreenY * (float)(y - m_nDownY) * 36.0f / (float)(21 - m_nMouse);
- m_nDownX = x;
- m_nDownY = y;
+ Delta = MoveX + MoveY + m_MouseSnapLeftover;
}
else
{
+ Vector3 MoveZ;
- // TODO: rewrite
+ MoveZ = ScreenZ * (float)(y - m_nDownY) * 36.0f / (float)(21 - m_nMouse);
- float mouse = 360.0f/(21-m_nMouse);
- float delta[3] = {
- (ptx - m_fTrack[0])*mouse,
- (pty - m_fTrack[1])*mouse,
- (ptz - m_fTrack[2])*mouse };
- float d[3] = { delta[0], delta[1], delta[2] };
-
- ldiv_t result;
- for (int i = 0; i < 3; i++)
- if (m_nSnap & LC_DRAW_SNAP_A)
- {
- result = ldiv ((long)delta[i], m_nAngleSnap);
- delta[i] = (float)(result.quot * m_nAngleSnap);
- }
- else
- {
- result = ldiv ((long)delta[i], 1);
- delta[i] = (float)result.quot;
- }
+ Delta = MoveZ + m_MouseSnapLeftover;
+ }
- m_fTrack[0] = ptx + (delta[0]-d[0])/mouse;
- m_fTrack[1] = pty + (delta[1]-d[1])/mouse;
- m_fTrack[2] = ptz + (delta[2]-d[2])/mouse;
+ m_nDownX = x;
+ m_nDownY = y;
- Vector3 tmp;
- if ((m_nSnap & LC_DRAW_3DMOUSE) || (m_OverlayActive && (m_OverlayMode != LC_OVERLAY_XYZ)))
- Redraw = RotateSelectedObjects(Vector3(delta[0], delta[1], delta[2]), tmp);
- else
- {
- if (m_nTracking == LC_TRACK_LEFT)
- Redraw = RotateSelectedObjects(Vector3(delta[0], delta[1], 0), tmp);
- else
- Redraw = RotateSelectedObjects(Vector3(0, 0, delta[2]), tmp);
- }
- }
+ Redraw = RotateSelectedObjects(Delta, m_MouseSnapLeftover);
+ m_MouseTotalDelta += Delta;
}
SystemUpdateFocus(NULL);
if (Redraw)
UpdateAllViews();
- } break;
+ } break;
case LC_ACTION_ZOOM:
{
diff --git a/win/Prefpage.cpp b/win/Prefpage.cpp
index f0ff261..72f37fa 100644
--- a/win/Prefpage.cpp
+++ b/win/Prefpage.cpp
@@ -253,7 +253,6 @@ CPreferencesDrawing::CPreferencesDrawing() : CPropertyPage(CPreferencesDrawing::
m_bSnapX = FALSE;
m_bSnapY = FALSE;
m_bSnapZ = FALSE;
- m_b3DMouse = FALSE;
//}}AFX_DATA_INIT
}
@@ -280,7 +279,6 @@ void CPreferencesDrawing::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_AIDDLG_SNAPX, m_bSnapX);
DDX_Check(pDX, IDC_AIDDLG_SNAPY, m_bSnapY);
DDX_Check(pDX, IDC_AIDDLG_SNAPZ, m_bSnapZ);
- DDX_Check(pDX, IDC_AIDDLG_3DMOUSE, m_b3DMouse);
//}}AFX_DATA_MAP
}
@@ -298,7 +296,6 @@ void CPreferencesDrawing::SetOptions(unsigned long dwSnap, unsigned short nAngle
m_bAxis = (dwSnap & LC_DRAW_AXIS) != 0;
m_bCentimeters = (dwSnap & LC_DRAW_CM_UNITS) != 0;
-// m_bCollision = (dwSnap & LC_DRAW_COLLISION) != 0;
m_bFixed = (dwSnap & LC_DRAW_MOVEAXIS) != 0;
m_bGrid = (dwSnap & LC_DRAW_GRID) != 0;
m_bLockX = (dwSnap & LC_DRAW_LOCK_X) != 0;
@@ -309,7 +306,6 @@ void CPreferencesDrawing::SetOptions(unsigned long dwSnap, unsigned short nAngle
m_bSnapX = (dwSnap & LC_DRAW_SNAP_X) != 0;
m_bSnapY = (dwSnap & LC_DRAW_SNAP_Y) != 0;
m_bSnapZ = (dwSnap & LC_DRAW_SNAP_Z) != 0;
- m_b3DMouse = (dwSnap & LC_DRAW_3DMOUSE) != 0;
}
void CPreferencesDrawing::GetOptions(unsigned long* dwSnap, unsigned short* nAngle, unsigned short* nGrid)
@@ -320,7 +316,6 @@ void CPreferencesDrawing::GetOptions(unsigned long* dwSnap, unsigned short* nAng
*dwSnap = 0;
if (m_bAxis) *dwSnap |= LC_DRAW_AXIS;
if (m_bCentimeters) *dwSnap |= LC_DRAW_CM_UNITS;
-// if (m_bCollision) *dwSnap |= LC_DRAW_COLLISION;
if (m_bFixed) *dwSnap |= LC_DRAW_MOVEAXIS;
if (m_bGrid) *dwSnap |= LC_DRAW_GRID;
if (m_bLockX) *dwSnap |= LC_DRAW_LOCK_X;
@@ -331,7 +326,6 @@ void CPreferencesDrawing::GetOptions(unsigned long* dwSnap, unsigned short* nAng
if (m_bSnapX) *dwSnap |= LC_DRAW_SNAP_X;
if (m_bSnapY) *dwSnap |= LC_DRAW_SNAP_Y;
if (m_bSnapZ) *dwSnap |= LC_DRAW_SNAP_Z;
- if (m_b3DMouse) *dwSnap |= LC_DRAW_3DMOUSE;
}
/////////////////////////////////////////////////////////////////////////////
diff --git a/win/Prefpage.h b/win/Prefpage.h
index bf3a6b5..effda4a 100644
--- a/win/Prefpage.h
+++ b/win/Prefpage.h
@@ -140,7 +140,6 @@ public:
BOOL m_bSnapX;
BOOL m_bSnapY;
BOOL m_bSnapZ;
- BOOL m_b3DMouse;
//}}AFX_DATA
diff --git a/win/System.cpp b/win/System.cpp
index 252295a..cd56d3c 100644
--- a/win/System.cpp
+++ b/win/System.cpp
@@ -579,11 +579,6 @@ void SystemUpdateSnap(const unsigned long nSnap)
SetMenuItemBitmaps(pMenu->m_hMenu, ID_LOCK_2BUTTONS, MF_BYCOMMAND, NULL, hbmMenuDot);
SetMenuItemBitmaps(pMenu->m_hMenu, ID_LOCK_3DMOVEMENT, MF_BYCOMMAND, NULL, hbmMenuDot);
- pMenu->CheckMenuItem(ID_LOCK_2BUTTONS, MF_BYCOMMAND |
- ((nSnap & LC_DRAW_3DMOUSE) == 0 ? MF_CHECKED : MF_UNCHECKED));
- pMenu->CheckMenuItem(ID_LOCK_3DMOVEMENT, MF_BYCOMMAND |
- (nSnap & LC_DRAW_3DMOUSE ? MF_CHECKED : MF_UNCHECKED));
-
// TODO: change Snap None & All (or maybe not ?)
}