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);
}