summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorleo2001-01-25 23:06:11 +0000
committerleo2001-01-25 23:06:11 +0000
commitfdaeae206f67ce36fcc58e72897a731489691768 (patch)
treebbc33ffb413ceca9a42fbf75e9695a695eedc939
parent789d7a2a8eabb75bdc7d13d34b07bc219252b084 (diff)
Multiple project views
git-svn-id: http://svn.leocad.org/trunk@227 c7d43263-9d01-0410-8a33-9dba5d9f93d6
-rw-r--r--common/basewnd.h19
-rw-r--r--common/glwindow.h6
-rw-r--r--common/project.cpp4
-rw-r--r--common/view.cpp3
-rw-r--r--win/Cadview.cpp88
-rw-r--r--win/Cadview.h7
-rw-r--r--win/Figdlg.cpp34
-rw-r--r--win/Figdlg.h6
-rw-r--r--win/LeoCAD.dsp88
-rw-r--r--win/LeoCAD.rc2
-rw-r--r--win/Leocad.clw22
-rw-r--r--win/Mainfrm.cpp80
-rw-r--r--win/Mainfrm.h4
-rw-r--r--win/basewnd.cpp56
-rw-r--r--win/glwindow.cpp190
-rw-r--r--win/resource.h3
16 files changed, 538 insertions, 74 deletions
diff --git a/common/basewnd.h b/common/basewnd.h
index a767f68..1380ad4 100644
--- a/common/basewnd.h
+++ b/common/basewnd.h
@@ -2,6 +2,20 @@
#define _BASEWND_H_
#include <string.h>
+
+// FIXME: move this to another place
+#ifdef WIN32
+#include "stdafx.h"
+typedef CWnd* BaseWndXID;
+typedef struct
+{
+ CWnd* wnd;
+ int index;
+ UINT command;
+} BaseMenuItem;
+
+#else
+
#include <gtk/gtk.h>
typedef GtkWidget* BaseWndXID;
typedef struct
@@ -9,6 +23,7 @@ typedef struct
GtkWidget* widget;
GtkAccelGroup* accel;
} BaseMenuItem;
+#endif
// =============================================================================
// Message Box constants
@@ -56,10 +71,14 @@ class BaseWnd
BaseWndXID GetXID () const
{ return m_pXID; }
+ void SetXID (BaseWndXID id)
+ { m_pXID = id; }
+#ifndef WIN32
// FIXME: remove
operator GtkWidget* () const
{ return m_pXID; }
+#endif
BaseMenuItem* GetMenuItem (int id) const
{ return &m_pMenuItems[id]; }
diff --git a/common/glwindow.h b/common/glwindow.h
index 837a9c2..3354884 100644
--- a/common/glwindow.h
+++ b/common/glwindow.h
@@ -7,12 +7,16 @@ class GLWindow
GLWindow (GLWindow *share);
virtual ~GLWindow ();
- void Create (void* data);
+ bool Create (void* data);
void DestroyContext ();
bool MakeCurrent ();
void SwapBuffers ();
void Redraw ();
+ int GetWidth () const
+ { return m_nWidth; }
+ int GetHeight () const
+ { return m_nHeight; }
virtual void OnDraw () { };
virtual void OnSize (int cx, int cy)
diff --git a/common/project.cpp b/common/project.cpp
index c2b54e6..92be49d 100644
--- a/common/project.cpp
+++ b/common/project.cpp
@@ -745,7 +745,7 @@ void Project::LoadDefaults(bool cameras)
strcpy(m_strBackground, Sys_ProfileLoadString ("Default", "BMP", ""));
m_pTerrain->LoadDefaults((m_nDetail & LC_DET_LINEAR) != 0);
- for (int i = 0; i < m_ViewList.GetSize (); i++)
+ for (i = 0; i < m_ViewList.GetSize (); i++)
{
m_ViewList[i]->MakeCurrent ();
RenderInitialize();
@@ -1192,7 +1192,7 @@ bool Project::FileLoad(File* file, bool bUndo, bool bMerge)
}
}
- for (int i = 0; i < m_ViewList.GetSize (); i++)
+ for (i = 0; i < m_ViewList.GetSize (); i++)
{
m_ViewList[i]->MakeCurrent ();
RenderInitialize();
diff --git a/common/view.cpp b/common/view.cpp
index abd8435..27e0595 100644
--- a/common/view.cpp
+++ b/common/view.cpp
@@ -2,8 +2,9 @@
// View the project contents
//
-#include "view.h"
+#include <stdlib.h>
#include "project.h"
+#include "view.h"
View::View (Project *pProject, GLWindow *share)
: GLWindow (share)
diff --git a/win/Cadview.cpp b/win/Cadview.cpp
index b162e8d..a2bcea2 100644
--- a/win/Cadview.cpp
+++ b/win/Cadview.cpp
@@ -12,7 +12,8 @@
#include "project.h"
#include "globals.h"
#include "system.h"
-#include "Camera.h"
+#include "camera.h"
+#include "view.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -20,6 +21,7 @@
static char THIS_FILE[] = __FILE__;
#endif
+BOOL GLWindowPreTranslateMessage (GLWindow *wnd, MSG *pMsg);
/////////////////////////////////////////////////////////////////////////////
// CCADView
@@ -64,10 +66,8 @@ END_MESSAGE_MAP()
CCADView::CCADView()
{
m_pPixels = NULL;
- m_pPalette = NULL;
- m_hglRC = NULL;
- m_pDC = NULL;
m_hCursor = NULL;
+ m_pView = NULL;
}
CCADView::~CCADView()
@@ -122,7 +122,16 @@ BOOL CCADView::PreCreateWindow(CREATESTRUCT& cs)
void CCADView::OnDraw(CDC* /*pDC*/)
{
- project->Render(false);
+ static int added = 0;
+
+ if (!added)
+ {
+ m_pView->OnInitialUpdate ();
+ added = 1;
+ }
+
+// m_pView->OnDraw ();
+// project->Render(false);
/*
CCADDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
@@ -241,7 +250,7 @@ void CCADView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
lpy*theApp.GetProfileInt("Default","Margin Bottom", 50)/100);
int w = rc.Width()/cols, h = rc.Height()/rows; // cell size
- float viewaspect = (float)m_szView.cx/(float)m_szView.cy;
+ float viewaspect = (float)m_pView->GetWidth ()/(float)m_pView->GetHeight ();
int pw = w, ph = h; // picture
int mx = 0, my = 0; // offset
@@ -544,7 +553,7 @@ void CCADView::PrintHeader(BOOL bFooter, HDC hDC, CRect rc, UINT page, BOOL bCat
void CCADView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
- pfnwglMakeCurrent(m_pDC->GetSafeHdc(), m_hglRC);
+// pfnwglMakeCurrent(m_pDC->GetSafeHdc(), m_hglRC);
}
void CCADView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewViewEx* pView)
@@ -583,7 +592,7 @@ void CCADView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPrev
pfnwglMakeCurrent(NULL, NULL);
-
+/*
if (OpenGLGetPixelFormat(m_pDC->GetSafeHdc()) == 0)
{
delete m_pDC;
@@ -616,7 +625,7 @@ void CCADView::OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPrev
::MessageBox(NULL, lpMsgBuf, "Error", MB_OK|MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}
-
+*/
InvalidateRect(NULL, FALSE);
}
@@ -755,7 +764,11 @@ int CCADView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
-
+
+ m_pView = new View (project, NULL);
+ m_pView->Create (m_hWnd);
+// m_pView->OnInitialUpdate ();
+/*
m_pDC = new CClientDC(this);
ASSERT(m_pDC != NULL);
@@ -801,6 +814,7 @@ int CCADView::OnCreate(LPCREATESTRUCT lpCreateStruct)
pfnwglMakeCurrent(m_pDC->m_hDC, m_hglRC);
GL_InitializeExtensions ();
+ */
SetTimer (IDT_LC_SAVETIMER, 5000, NULL);
return 0;
@@ -808,13 +822,16 @@ int CCADView::OnCreate(LPCREATESTRUCT lpCreateStruct)
void CCADView::OnPaletteChanged(CWnd* pFocusWnd)
{
+ /*
// See if the change was caused by us and ignore it if not.
if (pFocusWnd != this)
OnQueryNewPalette();
+ */
}
BOOL CCADView::OnQueryNewPalette()
{
+ /*
if (m_pPalette)
{
m_pDC->SelectPalette(m_pPalette, FALSE);
@@ -824,12 +841,15 @@ BOOL CCADView::OnQueryNewPalette()
InvalidateRect(NULL, TRUE);
}
}
-
+*/
return TRUE;
}
void CCADView::OnDestroy()
{
+ delete m_pView;
+ m_pView = NULL;
+ /*
pfnwglMakeCurrent(NULL, NULL);
if (m_hglRC)
@@ -845,7 +865,7 @@ void CCADView::OnDestroy()
if (m_pDC)
delete m_pDC;
-
+*/
KillTimer (IDT_LC_SAVETIMER);
CView::OnDestroy();
@@ -853,46 +873,46 @@ void CCADView::OnDestroy()
void CCADView::OnSize(UINT nType, int cx, int cy)
{
- m_szView.cx = cx;
- m_szView.cy = cy;
- project->SetViewSize(cx, cy);
+// m_szView.cx = cx;
+// m_szView.cy = cy;
+// project->SetViewSize(cx, cy);
CView::OnSize(nType, cx, cy);
}
void CCADView::OnMouseMove(UINT nFlags, CPoint point)
{
- project->OnMouseMove(point.x, m_szView.cy - point.y - 1,
- (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
+// project->OnMouseMove(point.x, m_szView.cy - point.y - 1,
+// (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
}
void CCADView::OnLButtonUp(UINT nFlags, CPoint point)
{
- project->OnLeftButtonUp(point.x, m_szView.cy - point.y - 1,
- (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
+// project->OnLeftButtonUp(point.x, m_szView.cy - point.y - 1,
+// (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
}
void CCADView::OnLButtonDown(UINT nFlags, CPoint point)
{
- project->OnLeftButtonDown(point.x, m_szView.cy - point.y - 1,
- (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
+// project->OnLeftButtonDown(point.x, m_szView.cy - point.y - 1,
+// (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
}
void CCADView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
- project->OnLeftButtonDoubleClick(point.x, m_szView.cy - point.y - 1,
- (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
+// project->OnLeftButtonDoubleClick(point.x, m_szView.cy - point.y - 1,
+// (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
}
void CCADView::OnRButtonDown(UINT nFlags, CPoint point)
{
- project->OnRightButtonDown(point.x, m_szView.cy - point.y - 1,
- (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
+// project->OnRightButtonDown(point.x, m_szView.cy - point.y - 1,
+// (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
}
void CCADView::OnRButtonUp(UINT nFlags, CPoint point)
{
- project->OnRightButtonUp(point.x, m_szView.cy - point.y - 1,
- (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
+// project->OnRightButtonUp(point.x, m_szView.cy - point.y - 1,
+// (nFlags & MK_CONTROL) != 0, (nFlags & MK_SHIFT) != 0);
}
void CCADView::OnDropDown (NMHDR* pNotifyStruct, LRESULT* pResult)
@@ -1119,3 +1139,17 @@ void CCADView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeac
}
*/
}
+
+LRESULT CCADView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
+{
+ if (m_pView)
+ {
+ MSG msg;
+ msg.message = message;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+ GLWindowPreTranslateMessage (m_pView, &msg);
+ }
+
+ return CView::WindowProc(message, wParam, lParam);
+}
diff --git a/win/Cadview.h b/win/Cadview.h
index 6fc8f60..caea3e7 100644
--- a/win/Cadview.h
+++ b/win/Cadview.h
@@ -5,6 +5,7 @@
#ifndef _CADVIEW_H_
#define _CADVIEW_H_
+class View;
class CCADDoc;
class CPreviewViewEx;
@@ -35,6 +36,7 @@ public:
virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);
virtual void OnEndPrintPreview(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewViewEx* pView);
+ virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
// Implementation
@@ -48,10 +50,7 @@ public:
// Generated message map functions
protected:
HCURSOR m_hCursor;
- CSize m_szView;
- HGLRC m_hglRC;
- CClientDC* m_pDC;
- CPalette* m_pPalette;
+ View* m_pView;
BOOL DoPrintPreview(UINT nIDResource, CView* pPrintView, CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState);
void* m_pPixels;
diff --git a/win/Figdlg.cpp b/win/Figdlg.cpp
index 9ab19e8..d40c1ca 100644
--- a/win/Figdlg.cpp
+++ b/win/Figdlg.cpp
@@ -4,7 +4,6 @@
#include "stdafx.h"
#include "LeoCAD.h"
#include "FigDlg.h"
-#include "MFWnd.h"
#include "minifig.h"
#ifdef _DEBUG
@@ -19,7 +18,7 @@ static char THIS_FILE[] = __FILE__;
CMinifigDlg::CMinifigDlg(void* param, CWnd* pParent /*=NULL*/)
: CDialog(CMinifigDlg::IDD, pParent)
{
- m_pParam = param;
+ m_pMinifig = (MinifigWizard*)param;
//{{AFX_DATA_INIT(CMinifigDlg)
//}}AFX_DATA_INIT
@@ -71,13 +70,12 @@ BOOL CMinifigDlg::OnInitDialog()
::GetWindowRect (::GetDlgItem(m_hWnd, IDC_PREVIEWSTATIC), &r);
ScreenToClient (&r);
- m_pMFWnd = new CMinifigWnd;
- m_pMFWnd->m_pFig = (MinifigWizard*)m_pParam;
- m_pMFWnd->Create (NULL, NULL, WS_BORDER | WS_CHILD | WS_VISIBLE, r, this, 501);
- m_pMFWnd->InitGL();
+ m_pMinifigWnd = new CWnd;
+ m_pMinifigWnd->Create (NULL, NULL, WS_BORDER | WS_CHILD | WS_VISIBLE, r, this, 501);
+ m_pMinifig->Create (m_pMinifigWnd);
for (int i = 0; i < LC_MFW_NUMITEMS; i++)
- ((CColorPicker*)GetDlgItem (IDC_MF_HATCOLOR+i))->SetColorIndex (m_pMFWnd->m_pFig->m_Colors[i]);
+ ((CColorPicker*)GetDlgItem (IDC_MF_HATCOLOR+i))->SetColorIndex (m_pMinifig->m_Colors[i]);
for (i = 0; i < LC_MFW_NUMITEMS; i++)
{
@@ -85,7 +83,7 @@ BOOL CMinifigDlg::OnInitDialog()
char **names;
int j, count;
- m_pMFWnd->m_pFig->GetDescriptions (i, &names, &count);
+ m_pMinifig->GetDescriptions (i, &names, &count);
for (j = 0; j < count; j++)
pCombo->AddString (names[j]);
@@ -93,7 +91,7 @@ BOOL CMinifigDlg::OnInitDialog()
}
char *names[LC_MFW_NUMITEMS];
- m_pMFWnd->m_pFig->GetSelections (names);
+ m_pMinifig->GetSelections (names);
for (i = 0; i < LC_MFW_NUMITEMS; i++)
{
@@ -110,16 +108,16 @@ BOOL CMinifigDlg::OnInitDialog()
BOOL CMinifigDlg::DestroyWindow()
{
- m_pMFWnd->DestroyWindow();
- delete m_pMFWnd;
+ m_pMinifigWnd->DestroyWindow();
+ delete m_pMinifigWnd;
return CDialog::DestroyWindow();
}
LONG CMinifigDlg::OnColorSelEndOK(UINT lParam, LONG wParam)
{
- m_pMFWnd->m_pFig->ChangeColor (wParam-IDC_MF_HATCOLOR, lParam);
- m_pMFWnd->PostMessage(WM_PAINT);
+ m_pMinifig->ChangeColor (wParam-IDC_MF_HATCOLOR, lParam);
+ m_pMinifig->Redraw ();
return TRUE;
}
@@ -128,21 +126,21 @@ void CMinifigDlg::OnPieceSelEndOK(UINT nID)
{
char tmp[65];
GetDlgItem(nID)->GetWindowText (tmp, 65);
- m_pMFWnd->m_pFig->ChangePiece (nID-IDC_MF_HAT, tmp);
- m_pMFWnd->PostMessage(WM_PAINT);
+ m_pMinifig->ChangePiece (nID-IDC_MF_HAT, tmp);
+ m_pMinifig->Redraw ();
}
void CMinifigDlg::OnChangeAngle(UINT nID)
{
char tmp[65];
GetDlgItem(nID)->GetWindowText (tmp, 65);
- if (m_pMFWnd)
+ if (m_pMinifigWnd)
{
int index[] = { LC_MFW_HAT, LC_MFW_HEAD, LC_MFW_NECK,
LC_MFW_LEFT_ARM, LC_MFW_RIGHT_ARM, LC_MFW_LEFT_HAND,
LC_MFW_RIGHT_HAND, LC_MFW_LEFT_TOOL, LC_MFW_RIGHT_TOOL,
LC_MFW_LEFT_LEG, LC_MFW_RIGHT_LEG, LC_MFW_LEFT_SHOE, LC_MFW_RIGHT_SHOE };
- m_pMFWnd->m_pFig->ChangeAngle (index[nID-IDC_MF_HATANGLE], (float)strtod (tmp, NULL));
- m_pMFWnd->PostMessage(WM_PAINT);
+ m_pMinifig->ChangeAngle (index[nID-IDC_MF_HATANGLE], (float)strtod (tmp, NULL));
+ m_pMinifig->Redraw ();
}
}
diff --git a/win/Figdlg.h b/win/Figdlg.h
index 221f2a7..974029a 100644
--- a/win/Figdlg.h
+++ b/win/Figdlg.h
@@ -12,7 +12,7 @@
/////////////////////////////////////////////////////////////////////////////
// CMinifigDlg dialog
-class CMinifigWnd;
+class MinifigWizard;
class CMinifigDlg : public CDialog
{
@@ -51,8 +51,8 @@ public:
// Implementation
protected:
- CMinifigWnd* m_pMFWnd;
- void* m_pParam;
+ CWnd* m_pMinifigWnd;
+ MinifigWizard* m_pMinifig;
afx_msg LONG OnColorSelEndOK(UINT lParam, LONG wParam);
void OnPieceSelEndOK(UINT nID);
diff --git a/win/LeoCAD.dsp b/win/LeoCAD.dsp
index e054340..e782bb9 100644
--- a/win/LeoCAD.dsp
+++ b/win/LeoCAD.dsp
@@ -96,6 +96,11 @@ SOURCE=.\Aboutdlg.cpp
# End Source File
# Begin Source File
+SOURCE=..\common\array.cpp
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
SOURCE=.\Arraydlg.cpp
# End Source File
# Begin Source File
@@ -104,6 +109,10 @@ SOURCE=.\Barcmdui.cpp
# End Source File
# Begin Source File
+SOURCE=.\basewnd.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Bmpmenu.cpp
# End Source File
# Begin Source File
@@ -148,6 +157,10 @@ SOURCE=.\Flatbar.cpp
# End Source File
# Begin Source File
+SOURCE=.\glwindow.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Groupdlg.cpp
# End Source File
# Begin Source File
@@ -216,10 +229,6 @@ SOURCE=.\Mainfrm.cpp
# End Source File
# Begin Source File
-SOURCE=.\Mfwnd.cpp
-# End Source File
-# Begin Source File
-
SOURCE=.\Moddlg.cpp
# End Source File
# Begin Source File
@@ -441,10 +450,6 @@ SOURCE=.\MainFrm.h
# End Source File
# Begin Source File
-SOURCE=.\Mfwnd.h
-# End Source File
-# Begin Source File
-
SOURCE=.\ModDlg.h
# End Source File
# Begin Source File
@@ -845,6 +850,10 @@ SOURCE=".\$(ProjDir)\hlp\AfxCore.rtf"
# End Source File
# Begin Source File
+SOURCE=".\$(ProjDir)\hlp\AfxCore.rtf"
+# End Source File
+# Begin Source File
+
SOURCE=.\hlp\AfxCore.rtf
# End Source File
# Begin Source File
@@ -857,6 +866,10 @@ SOURCE=".\$(ProjDir)\hlp\AfxPrint.rtf"
# End Source File
# Begin Source File
+SOURCE=".\$(ProjDir)\hlp\AfxPrint.rtf"
+# End Source File
+# Begin Source File
+
SOURCE=.\hlp\AfxPrint.rtf
# End Source File
# Begin Source File
@@ -965,6 +978,10 @@ SOURCE=..\common\array.h
# End Source File
# Begin Source File
+SOURCE=..\common\basewnd.h
+# End Source File
+# Begin Source File
+
SOURCE=..\Common\camera.cpp
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
@@ -1005,6 +1022,10 @@ SOURCE=..\Common\globals.h
# End Source File
# Begin Source File
+SOURCE=..\common\glwindow.h
+# End Source File
+# Begin Source File
+
SOURCE=..\Common\group.cpp
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
@@ -1065,6 +1086,23 @@ SOURCE=..\Common\light.h
# End Source File
# Begin Source File
+SOURCE=..\common\mainwnd.cpp
+
+!IF "$(CFG)" == "LeoCAD - Win32 Release"
+
+!ELSEIF "$(CFG)" == "LeoCAD - Win32 Debug"
+
+# SUBTRACT CPP /YX /Yc /Yu
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\mainwnd.h
+# End Source File
+# Begin Source File
+
SOURCE=..\Common\matrix.cpp
# SUBTRACT CPP /YX /Yc /Yu
# End Source File
@@ -1156,6 +1194,23 @@ SOURCE=..\Common\quant.h
# End Source File
# Begin Source File
+SOURCE=..\common\str.cpp
+
+!IF "$(CFG)" == "LeoCAD - Win32 Release"
+
+!ELSEIF "$(CFG)" == "LeoCAD - Win32 Debug"
+
+# SUBTRACT CPP /YX /Yc /Yu
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\str.h
+# End Source File
+# Begin Source File
+
SOURCE=..\common\system.h
# End Source File
# Begin Source File
@@ -1198,6 +1253,23 @@ SOURCE=..\Common\vector.cpp
SOURCE=..\Common\vector.h
# End Source File
+# Begin Source File
+
+SOURCE=..\common\view.cpp
+
+!IF "$(CFG)" == "LeoCAD - Win32 Release"
+
+!ELSEIF "$(CFG)" == "LeoCAD - Win32 Debug"
+
+# SUBTRACT CPP /YX /Yc /Yu
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\view.h
+# End Source File
# End Group
# End Target
# End Project
diff --git a/win/LeoCAD.rc b/win/LeoCAD.rc
index 0274da4..97295c0 100644
--- a/win/LeoCAD.rc
+++ b/win/LeoCAD.rc
@@ -342,6 +342,7 @@ BEGIN
END
MENUITEM SEPARATOR
MENUITEM "&Full Screen\tCtrl+F", ID_VIEW_FULLSCREEN
+ MENUITEM "New View", ID_VIEW_NEWVIEW
END
POPUP "&Help"
BEGIN
@@ -2017,6 +2018,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
ID_FILE_IMPORTPIECE "Import a piece from LDraw"
+ ID_VIEW_NEWVIEW "Creates a new view window"
END
#endif // English (U.S.) resources
diff --git a/win/Leocad.clw b/win/Leocad.clw
index 9c7d803..07d379e 100644
--- a/win/Leocad.clw
+++ b/win/Leocad.clw
@@ -2,7 +2,7 @@
[General Info]
Version=1
-LastClass=CPiecesList
+LastClass=CMainFrame
LastTemplate=CHeaderCtrl
NewFileInclude1=#include "stdafx.h"
NewFileInclude2=#include "leocad.h"
@@ -71,7 +71,7 @@ Resource8=IDR_ANIMATORBAR
Resource9=IDD_LIBRARY
Resource10=IDD_TERRAIN_OPTIONS
Resource11=IDD_PREFPRINT
-Resource12=IDR_MAINFRAME
+Resource12=IDD_ABOUTBOX
Resource13=IDD_EDIT_GROUPS
Resource14=IDD_PROPGENERAL
Resource15=IDD_PROPSUMMARY
@@ -97,7 +97,7 @@ Resource34=IDD_SAVEPICTUREDLG_TEMPLATE
Resource35=IDD_PIECEEDITOR
Class50=CGroupEditTree
Class51=CSortHeaderCtrl
-Resource36=IDD_ABOUTBOX
+Resource36=IDR_MAINFRAME
[CLS:CAboutDlg]
Type=0
@@ -224,6 +224,9 @@ Type=0
BaseClass=CFrameWnd
HeaderFile=Mainfrm.h
ImplementationFile=Mainfrm.cpp
+Filter=T
+VirtualFilter=fWC
+LastObject=ID_VIEW_NEWVIEW
[CLS:CMinifigWnd]
Type=0
@@ -1093,12 +1096,13 @@ Command73=ID_VIEW_STEP_LAST
Command74=ID_VIEW_STEP_CHOOSE
Command75=ID_VIEW_STEP_INSERT
Command76=ID_VIEW_FULLSCREEN
-Command77=ID_HELP_FINDER
-Command78=ID_HELP_LEOCADHOMEPAGE
-Command79=ID_HELP_SENDEMAIL
-Command80=ID_HELP_CHECKFORUPDATES
-Command81=ID_APP_ABOUT
-CommandCount=81
+Command77=ID_VIEW_NEWVIEW
+Command78=ID_HELP_FINDER
+Command79=ID_HELP_LEOCADHOMEPAGE
+Command80=ID_HELP_SENDEMAIL
+Command81=ID_HELP_CHECKFORUPDATES
+Command82=ID_APP_ABOUT
+CommandCount=82
[MNU:IDR_POPUPS]
Type=1
diff --git a/win/Mainfrm.cpp b/win/Mainfrm.cpp
index e49d8d2..d6819d1 100644
--- a/win/Mainfrm.cpp
+++ b/win/Mainfrm.cpp
@@ -8,6 +8,7 @@
#include "project.h"
#include "message.h"
#include "globals.h"
+#include "mainwnd.h"
#include "Print.h"
@@ -56,6 +57,7 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_GETMINMAXINFO()
ON_COMMAND(ID_FILE_PRINTPIECELIST, OnFilePrintPieceList)
ON_WM_ACTIVATEAPP()
+ ON_COMMAND(ID_VIEW_NEWVIEW, OnViewNewView)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_PIECEBAR_ZOOMPREVIEW, ID_PIECEBAR_SUBPARTS, OnPieceBar)
ON_UPDATE_COMMAND_UI_RANGE(ID_PIECEBAR_ZOOMPREVIEW, ID_PIECEBAR_SUBPARTS, OnUpdatePieceBar)
@@ -91,10 +93,12 @@ CMainFrame::CMainFrame()
{
m_pwndFullScrnBar = NULL;
m_bAutoMenuEnable = FALSE;
+ m_pMainWnd = new MainWnd ();
}
CMainFrame::~CMainFrame()
{
+ delete m_pMainWnd;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
@@ -201,6 +205,8 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
messenger->Listen (&mainframe_listener, this);
+ m_pMainWnd->SetXID (this);
+
return 0;
}
@@ -926,3 +932,77 @@ void CMainFrame::OnActivateApp(BOOL bActive, HTASK hTask)
project->HandleNotify(LC_ACTIVATE, bActive ? 1 : 0);
}
+
+#include "glwindow.h"
+#include "view.h"
+
+BOOL GLWindowPreTranslateMessage (GLWindow *wnd, MSG *pMsg);
+
+static LRESULT CALLBACK GLWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ static CMapPtrToPtr WindowMap;
+ GLWindow *wnd;
+
+ if (uMsg == WM_CREATE)
+ {
+ View *view = new View (project, NULL);
+ view->Create (hwnd);
+
+ WindowMap.SetAt (hwnd, view);
+ }
+
+ wnd = (GLWindow*)WindowMap[hwnd];
+
+ if (wnd)
+ {
+ MSG msg;
+ msg.hwnd = hwnd;
+ msg.message = uMsg;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+
+ GLWindowPreTranslateMessage (wnd, &msg);
+
+ if (uMsg == WM_DESTROY)
+ {
+ WindowMap.RemoveKey (hwnd);
+ delete wnd;
+ }
+ }
+
+ return DefWindowProc (hwnd, uMsg, wParam, lParam);
+}
+
+void CMainFrame::OnViewNewView()
+{
+ HINSTANCE hInst = AfxGetInstanceHandle();
+ WNDCLASS wndcls;
+ CWnd *pWnd;
+
+#define OPENGL_CLASSNAME _T("LeoCADOpenGLClass")
+#define FLOATING_CLASSNAME _T("LeoCADFloatingOpenGLClass")
+
+ // check if our class is registered
+ if(!(GetClassInfo (hInst, FLOATING_CLASSNAME, &wndcls)))
+ {
+ if (GetClassInfo (hInst, OPENGL_CLASSNAME, &wndcls))
+ {
+ // set our class name
+ wndcls.lpszClassName = FLOATING_CLASSNAME;
+ wndcls.lpfnWndProc = GLWindowProc;
+ wndcls.hIcon = LoadIcon (hInst, MAKEINTRESOURCE (IDR_MAINFRAME));
+
+ // register class
+ if (!AfxRegisterClass (&wndcls))
+ AfxThrowResourceException();
+ }
+ else
+ AfxThrowResourceException();
+ }
+
+ pWnd = new CWnd ();
+ pWnd->CreateEx (0, FLOATING_CLASSNAME, "LeoCAD",
+ WS_VISIBLE | WS_POPUPWINDOW | WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, 200, 100,
+ m_hWnd, (HMENU)0, NULL);
+}
diff --git a/win/Mainfrm.h b/win/Mainfrm.h
index fb5529a..06bf001 100644
--- a/win/Mainfrm.h
+++ b/win/Mainfrm.h
@@ -15,11 +15,14 @@
#include "BMPMenu.h"
#include "ModDlg.h"
+class MainWnd;
+
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
+ MainWnd* m_pMainWnd;
// Attributes
public:
@@ -71,6 +74,7 @@ protected:
afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
afx_msg void OnFilePrintPieceList();
afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
+ afx_msg void OnViewNewView();
//}}AFX_MSG
// Status bar
diff --git a/win/basewnd.cpp b/win/basewnd.cpp
new file mode 100644
index 0000000..320e38a
--- /dev/null
+++ b/win/basewnd.cpp
@@ -0,0 +1,56 @@
+//
+// Base window class
+//
+
+#include "stdafx.h"
+#include "basewnd.h"
+
+BaseWnd::BaseWnd (BaseWnd *parent, int menu_count)
+{
+ m_pMenuItems = new BaseMenuItem[menu_count];
+ m_pParent = parent;
+}
+
+BaseWnd::~BaseWnd ()
+{
+ delete [] m_pMenuItems;
+}
+
+static HCURSOR g_hcurWaitCursorRestore; // old cursor to restore after wait cursor
+
+void BaseWnd::BeginWait ()
+{
+ HCURSOR hcurPrev = SetCursor (LoadCursor (NULL, IDC_WAIT));
+ g_hcurWaitCursorRestore = hcurPrev;
+}
+
+void BaseWnd::EndWait ()
+{
+ SetCursor (g_hcurWaitCursorRestore);
+}
+
+int BaseWnd::MessageBox (const char* text, const char* caption, int flags)
+{
+ return m_pXID->MessageBox (text, caption, flags);
+}
+
+void BaseWnd::ShowMenuItem (int id, bool show)
+{
+ /*
+ CBMPMenu* pMenu = (CBMPMenu*)GetMainMenu(0);
+ CMenu* pMenu = pFrame->GetMenu();
+ return pMenu->GetSubMenu(nIndex);
+ */
+}
+
+void BaseWnd::EnableMenuItem (int id, bool enable)
+{
+}
+
+void BaseWnd::CheckMenuItem (int id, bool check)
+{
+}
+
+void BaseWnd::SetMenuItemText (int id, const char *text)
+{
+}
diff --git a/win/glwindow.cpp b/win/glwindow.cpp
new file mode 100644
index 0000000..0d5fe72
--- /dev/null
+++ b/win/glwindow.cpp
@@ -0,0 +1,190 @@
+//
+// OpenGL window
+//
+
+#include "stdafx.h"
+#include "glwindow.h"
+#include "tools.h"
+
+typedef struct
+{
+ HGLRC m_hrc;
+ CClientDC* m_pDC;
+ CPalette* m_pPal;
+ HWND m_hWnd;
+} GLWindowPrivate;
+
+// ============================================================================
+
+BOOL GLWindowPreTranslateMessage (GLWindow *wnd, MSG *pMsg)
+{
+ switch (pMsg->message)
+ {
+ case WM_PAINT:
+ wnd->OnDraw ();
+ break;
+ case WM_CREATE:
+ wnd->OnInitialUpdate ();
+ break;
+ case WM_DESTROY:
+ wnd->DestroyContext ();
+ break;
+ case WM_SIZE:
+ wnd->OnSize (LOWORD (pMsg->lParam), HIWORD (pMsg->lParam));
+ break;
+ case WM_LBUTTONDOWN:
+ wnd->OnLeftButtonDown (LOWORD (pMsg->lParam), wnd->GetHeight () - HIWORD (pMsg->lParam) - 1,
+ (pMsg->wParam & MK_CONTROL) != 0, (pMsg->wParam & MK_SHIFT) != 0);
+ break;
+ case WM_LBUTTONUP:
+ wnd->OnLeftButtonUp (LOWORD (pMsg->lParam), wnd->GetHeight () - HIWORD (pMsg->lParam) - 1,
+ (pMsg->wParam & MK_CONTROL) != 0, (pMsg->wParam & MK_SHIFT) != 0);
+ break;
+ case WM_LBUTTONDBLCLK:
+ wnd->OnLeftButtonDoubleClick (LOWORD (pMsg->lParam), wnd->GetHeight () - HIWORD (pMsg->lParam) - 1,
+ (pMsg->wParam & MK_CONTROL) != 0, (pMsg->wParam & MK_SHIFT) != 0);
+ break;
+ case WM_RBUTTONDOWN:
+ wnd->OnRightButtonDown (LOWORD (pMsg->lParam), wnd->GetHeight () - HIWORD (pMsg->lParam) - 1,
+ (pMsg->wParam & MK_CONTROL) != 0, (pMsg->wParam & MK_SHIFT) != 0);
+ break;
+ case WM_RBUTTONUP:
+ wnd->OnRightButtonUp (LOWORD (pMsg->lParam), wnd->GetHeight () - HIWORD (pMsg->lParam) - 1,
+ (pMsg->wParam & MK_CONTROL) != 0, (pMsg->wParam & MK_SHIFT) != 0);
+ break;
+ case WM_MOUSEMOVE:
+ wnd->OnMouseMove (LOWORD (pMsg->lParam), wnd->GetHeight () - HIWORD (pMsg->lParam) - 1,
+ (pMsg->wParam & MK_CONTROL) != 0, (pMsg->wParam & MK_SHIFT) != 0);
+ break;
+ }
+
+ return FALSE;
+}
+
+// ============================================================================
+// GLWindow class
+
+GLWindow::GLWindow (GLWindow *share)
+{
+ m_pShare = share;
+ m_pData = (GLWindowPrivate*) malloc (sizeof (GLWindowPrivate));
+ memset (m_pData, 0, sizeof (GLWindowPrivate));
+}
+
+GLWindow::~GLWindow ()
+{
+ free (m_pData);
+}
+
+bool GLWindow::Create (void* data)
+{
+ GLWindowPrivate *prv = (GLWindowPrivate*)m_pData;
+
+ prv->m_hWnd = (HWND)data;
+ prv->m_pDC = new CClientDC (CWnd::FromHandle (prv->m_hWnd));
+ ASSERT (prv->m_pDC != NULL);
+
+ // Fill in the Pixel Format Descriptor
+ PIXELFORMATDESCRIPTOR pfd;
+ memset (&pfd,0, sizeof(PIXELFORMATDESCRIPTOR));
+
+ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW;
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.cColorBits = 24;
+ pfd.cDepthBits = 24;
+ pfd.iLayerType = PFD_MAIN_PLANE;
+
+ int nPixelFormat = OpenGLChoosePixelFormat (prv->m_pDC->m_hDC, &pfd);
+ if (nPixelFormat == 0)
+ return false;
+
+ if (!OpenGLSetPixelFormat (prv->m_pDC->m_hDC, nPixelFormat, &pfd))
+ return false;
+
+ prv->m_pPal = new CPalette;
+
+ if (CreateRGBPalette (prv->m_pDC->m_hDC, &prv->m_pPal))
+ {
+ prv->m_pDC->SelectPalette (prv->m_pPal, FALSE);
+ prv->m_pDC->RealizePalette ();
+ }
+ else
+ {
+ delete prv->m_pPal;
+ prv->m_pPal = NULL;
+ }
+
+ // Create a rendering context.
+ prv->m_hrc = pfnwglCreateContext (prv->m_pDC->m_hDC);
+ if (!prv->m_hrc)
+ return false;
+
+ if (m_pShare)
+ {
+ GLWindowPrivate *share = (GLWindowPrivate*)m_pShare->m_pData;
+ pfnwglShareLists (share->m_hrc, prv->m_hrc);
+ }
+
+ return true;
+}
+
+void GLWindow::DestroyContext ()
+{
+ GLWindowPrivate *prv = (GLWindowPrivate*)m_pData;
+
+ if (prv->m_pPal)
+ {
+ CPalette palDefault;
+ palDefault.CreateStockObject (DEFAULT_PALETTE);
+ prv->m_pDC->SelectPalette (&palDefault, FALSE);
+ delete prv->m_pPal;
+ prv->m_pPal = NULL;
+ }
+
+ if (prv->m_hrc)
+ pfnwglDeleteContext (prv->m_hrc);
+ prv->m_hrc = NULL;
+
+ if (prv->m_pDC)
+ delete prv->m_pDC;
+ prv->m_pDC = NULL;
+}
+
+void GLWindow::OnInitialUpdate ()
+{
+ MakeCurrent ();
+ GL_InitializeExtensions ();
+}
+
+bool GLWindow::MakeCurrent ()
+{
+ GLWindowPrivate *prv = (GLWindowPrivate*)m_pData;
+
+ if (prv->m_pPal)
+ {
+ prv->m_pDC->SelectPalette (prv->m_pPal, FALSE);
+ prv->m_pDC->RealizePalette ();
+ }
+
+ return (pfnwglMakeCurrent (prv->m_pDC->m_hDC, prv->m_hrc) != 0);
+
+// RECT rc;
+// GetClientRect (&rc);
+// m_pFig->Resize (rc.right, rc.bottom);
+}
+
+void GLWindow::SwapBuffers ()
+{
+ GLWindowPrivate *prv = (GLWindowPrivate*)m_pData;
+
+ OpenGLSwapBuffers (prv->m_pDC->m_hDC);
+}
+
+void GLWindow::Redraw ()
+{
+ GLWindowPrivate *prv = (GLWindowPrivate*)m_pData;
+ InvalidateRect (prv->m_hWnd, NULL, FALSE);
+}
+
diff --git a/win/resource.h b/win/resource.h
index cc3bdc3..d7f8f97 100644
--- a/win/resource.h
+++ b/win/resource.h
@@ -635,6 +635,7 @@
#define ID_LOCK_ON 33149
#define ID_PIECE_MIRROR 33150
#define ID_FILE_IMPORTPIECE 33152
+#define ID_VIEW_NEWVIEW 33153
#define ID_VIEW_PIECES_BAR 59425
#define ID_VIEW_TOOLS_BAR 59426
#define ID_VIEW_ANIMATION_BAR 59427
@@ -646,7 +647,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 234
-#define _APS_NEXT_COMMAND_VALUE 33153
+#define _APS_NEXT_COMMAND_VALUE 33154
#define _APS_NEXT_CONTROL_VALUE 1223
#define _APS_NEXT_SYMED_VALUE 121
#endif