www.pudn.com > sancedit.rar > MapGenView.cpp


// MapGenView.cpp : implementation of the CMapGenView class 
// 
 
#include "stdafx.h" 
#include "MapGen.h" 
 
#include "MapGenDoc.h" 
#include "MapGenView.h" 
 
#include "OgreFrameWork.h" 
#include "ControlDialog.h" 
#include ".\mapgenview.h" 
 
 
#define SHIFTED 0x8000 
//#ifdef _DEBUG 
//#define new DEBUG_NEW 
//#endif 
using namespace Ogre; 
 
// CMapGenView 
 
IMPLEMENT_DYNCREATE(CMapGenView, CView) 
 
BEGIN_MESSAGE_MAP(CMapGenView, CView) 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
	ON_WM_SIZE() 
	ON_WM_CHAR() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
END_MESSAGE_MAP() 
 
// CMapGenView construction/destruction 
 
CMapGenView::CMapGenView() 
: isInit(false) 
{ 
	// TODO: add construction code here 
 
} 
 
CMapGenView::~CMapGenView() 
{ 
} 
 
BOOL CMapGenView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
// CMapGenView drawing 
 
void CMapGenView::OnDraw(CDC* /*pDC*/) 
{ 
 
 
	CMapGenDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	 
	/*if (!pDoc) 
		return;*/ 
	if(COgreFrameWork::GetInstance()->IsInitOgre()) 
	{ 
 
		COgreFrameWork::GetInstance()->mWindow->update(); 
 
		 
	} 
	else 
	{ 
		COgreFrameWork::GetInstance()->InitOgre(this); 
		COgreFrameWork::GetInstance()->SetupScene(); 
 
		Invalidate(); 
	} 
	 
 
	 
 
 
	// TODO: add draw code for native data here 
} 
 
 
// CMapGenView printing 
 
BOOL CMapGenView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CMapGenView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CMapGenView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
 
// CMapGenView diagnostics 
 
#ifdef _DEBUG 
void CMapGenView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CMapGenView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CMapGenDoc* CMapGenView::GetDocument() const // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMapGenDoc))); 
	return (CMapGenDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
 
// CMapGenView message handlers 
 
void CMapGenView::setupResources(void) 
{ 
	// Load resource paths from config file 
        ConfigFile cf; 
        cf.load("resources.cfg"); 
 
        // Go through all sections & settings in the file 
        ConfigFile::SectionIterator seci = cf.getSectionIterator(); 
 
        String secName, typeName, archName; 
        while (seci.hasMoreElements()) 
        { 
            secName = seci.peekNextKey(); 
            ConfigFile::SettingsMultiMap *settings = seci.getNext(); 
            ConfigFile::SettingsMultiMap::iterator i; 
            for (i = settings->begin(); i != settings->end(); ++i) 
            { 
                typeName = i->first; 
                archName = i->second; 
                ResourceGroupManager::getSingleton().addResourceLocation( 
                    archName, typeName, secName); 
            } 
		} 
} 
 
void CMapGenView::OnSize(UINT nType, int cx, int cy) 
{ 
	CView::OnSize(nType, cx, cy); 
 
	// TODO: 在此处添加消息处理程序代码 
 
	COgreFrameWork::GetInstance()->WindowMovedOrResized(); 
} 
 
void CMapGenView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
	// TODO: 在此添加消息处理程序代码和/或调用默认值 
	float vec[3]; 
 
	vec[0] = 0; 
	vec[1] = 0; 
	vec[2] = 0; 
 
	//char str[128]; 
	//sprintf(str,"%d",nChar); 
	//OutputDebugString(str); 
	//if (nChar == ) 
 
	switch (nChar)  
	{ 
	// move forward 
	case 'a': 
	case 'A': 
		vec[2] = -5; 
	    COgreFrameWork::GetInstance()->CameraMove(vec); 
		Invalidate(TRUE); 
		break; 
	// move backward 
	case 'z': 
	case 'Z': 
		vec[2] = 5; 
	    COgreFrameWork::GetInstance()->CameraMove(vec); 
		Invalidate(TRUE); 
		break; 
 
	// edit mode = rotate 
	case 'r': 
	case 'R': 
	    CControlDialog::GetInstance()->EditModeRotate(); 
		break; 
	// edit mode = translate 
	case 't': 
	case 'T': 
	    CControlDialog::GetInstance()->EditModeTranslate(); 
		break; 
	// edit mode = scale 
	case 's': 
	case 'S': 
	    CControlDialog::GetInstance()->EditModeScale(); 
		break; 
 
 
	} 
 
 
	CView::OnChar(nChar, nRepCnt, nFlags); 
 
	 
} 
 
void CMapGenView::OnMouseMove(UINT nFlags, CPoint point) 
{ 
	float delta; 
	float rdelta; 
	int nVirtKey; 
	char *selectedNode; 
	bool bEditing = false; 
 
	rdelta =  (point.x - m_MouseDownPoint.x) * (point.x - m_MouseDownPoint.x); 
	rdelta += (point.y - m_MouseDownPoint.y) * (point.y - m_MouseDownPoint.y); 
	rdelta = sqrt(rdelta); 
 
	if (GetCapture()==this)  
	{ 
//VK_MENU 
		selectedNode = CControlDialog::GetInstance()->GetSelectedNodeName(); 
 
		nVirtKey = GetKeyState (VK_CONTROL);	 
		if ((nVirtKey & SHIFTED) && (selectedNode != NULL))  
		{ 
			bEditing = true; 
			eEditMode eMode; 
			eMode = CControlDialog::GetInstance()->GetEditMode(); 
			switch (eMode) { 
				case eROTATE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.11; 
					COgreFrameWork::GetInstance()->RotateNode(selectedNode,0,delta); 
					break; 
				case eTRANSLATE: 
					delta = (point.y - m_MouseDownPoint.y) * -0.13; 
					COgreFrameWork::GetInstance()->TranslateNode(selectedNode,0,delta); 
					break; 
				case eSCALE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.03; 
					COgreFrameWork::GetInstance()->ScaleNode(selectedNode,0,delta); 
					break; 
			} 
		}  
		 
		nVirtKey = GetKeyState (VK_SHIFT);	 
		if ((nVirtKey & SHIFTED) && (selectedNode != NULL)) { 
			bEditing = true; 
			eEditMode eMode; 
			eMode = CControlDialog::GetInstance()->GetEditMode(); 
			switch (eMode)  
			{ 
				case eROTATE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.11; 
					COgreFrameWork::GetInstance()->RotateNode(selectedNode,1,delta); 
					break; 
				case eTRANSLATE: 
					delta = (point.y - m_MouseDownPoint.y) * -0.13; 
					COgreFrameWork::GetInstance()->TranslateNode(selectedNode,1,delta); 
					break; 
				case eSCALE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.03; 
					COgreFrameWork::GetInstance()->ScaleNode(selectedNode,1,delta); 
					break; 
			} 
		}  
		 
		nVirtKey = GetKeyState (VK_MENU);	 
		if ((nVirtKey & SHIFTED) && (selectedNode != NULL)) { 
			bEditing = true; 
			eEditMode eMode; 
			eMode = CControlDialog::GetInstance()->GetEditMode(); 
			switch (eMode) { 
				case eROTATE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.11; 
					COgreFrameWork::GetInstance()->RotateNode(selectedNode,2,delta); 
					break; 
				case eTRANSLATE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.13; 
					COgreFrameWork::GetInstance()->TranslateNode(selectedNode,2,delta); 
					break; 
				case eSCALE: 
					delta = (point.x - m_MouseDownPoint.x) * 0.02; 
					COgreFrameWork::GetInstance()->ScaleNode(selectedNode,2,delta); 
					break; 
			} 
		}  
		 
		if (bEditing == false) { 
			float rotX,rotY; 
			rotX = (point.x - m_MouseDownPoint.x) * 0.003; 
			rotY = (point.y - m_MouseDownPoint.y) * 0.003; 
			COgreFrameWork::GetInstance()->CameraRotate(rotX,rotY); 
		} 
 
		 
		// redraw the view 
		Invalidate(TRUE); 
		// remember the mouse point 
		m_MouseDownPoint = point; 
	}; 
 
	CView::OnMouseMove(nFlags, point); 
} 
 
void CMapGenView::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
	m_MouseDownPoint=point; 
// capture mouse movements even outside window borders 
	SetCapture(); 
 
	CView::OnLButtonDown(nFlags, point); 
 
} 
 
void CMapGenView::OnLButtonUp(UINT nFlags, CPoint point) 
{ 
	m_MouseDownPoint=CPoint(0,0); 
// release mouse capture 
	ReleaseCapture(); 
	 
	CView::OnLButtonUp(nFlags, point); 
 
 
}