DragonNest/Client/EtWorldPainter/RandomDungeonRenderView.cpp

251 lines
7 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// RandomDungeonRenderView.cpp : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
//
#include "stdafx.h"
#include "MainFrm.h"
#include "EtWorldPainter.h"
#include "RandomDungeonRenderView.h"
#include "TEtRandomDungeon.h"
#include "EtMaze.h"
#include "UserMessage.h"
#include "RenderBase.h"
#include "FileServer.h"
#include "SundriesFuncEx.h"
#include "PaneDefine.h"
#include "EtMatrixEx.h"
#include "TdDummyActor.h"
// CRandomDungeonRenderView
IMPLEMENT_DYNCREATE(CRandomDungeonRenderView, CFormView)
CRandomDungeonRenderView::CRandomDungeonRenderView()
: CFormView(CRandomDungeonRenderView::IDD)
, CInputReceiver( true )
{
m_bActivate = false;
m_bDraw2DMap = true;
m_n2DMapType = 2;
m_nDraw2DMapLevel = 0;
}
CRandomDungeonRenderView::~CRandomDungeonRenderView()
{
}
void CRandomDungeonRenderView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CRandomDungeonRenderView, CFormView)
ON_WM_PAINT()
ON_MESSAGE( UM_REFRESH_VIEW, OnRefresh )
ON_MESSAGE( UM_CUSTOM_RENDER, OnCustomRender )
ON_MESSAGE( UM_SELECT_CHANGE_OPEN_VIEW, OnOpenView )
ON_MESSAGE( UM_SELECT_CHANGE_CLOSE_VIEW, OnCloseView )
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CRandomDungeonRenderView <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
#ifdef _DEBUG
void CRandomDungeonRenderView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CRandomDungeonRenderView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
void CRandomDungeonRenderView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: <20><><EFBFBD>⿡ Ư<><C6AF>ȭ<EFBFBD><C8AD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
if( m_bActivate == true ) return;
m_bActivate = true;
}
// CRandomDungeonRenderView <20>޽<EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
void CRandomDungeonRenderView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRenderBase::GetInstance().Render( CGlobalValue::RDUNGEON );
if( m_bDraw2DMap ) {
CTEtRandomDungeon::GetInstance().DrawMazeToDC( 10, 10, m_nDraw2DMapLevel, m_n2DMapType, &dc );
if( CGlobalValue::GetInstance().m_bSimulation == true ) {
CRect rcRect;
MatrixEx *pCross = CTdDummyActor::GetInstance().GetDummyCross();
EtVector3 *pOffset = CTEtRandomDungeon::GetInstance().GetOffset();
IntVec3 *pSize = CTEtRandomDungeon::GetInstance().GetDungeonSize();
float fBlockSize = CTEtRandomDungeon::GetInstance().GetBlockSize();
rcRect.left = 17 + (int)( ( ( pCross->m_vPosition.x - pOffset->x ) + ( pSize->nX * fBlockSize / 2.f ) ) * ( 15.f / fBlockSize ) );
rcRect.top = 17 + (int)( ( ( -pCross->m_vPosition.z - pOffset->z ) + ( pSize->nY * fBlockSize / 2.f ) ) * ( 15.f / fBlockSize ) );
rcRect.right = rcRect.left + 3;
rcRect.bottom = rcRect.top + 3;
dc.FillSolidRect( &rcRect, RGB( 255, 0, 0 ) );
}
}
}
LRESULT CRandomDungeonRenderView::OnCustomRender( WPARAM wParam, LPARAM lParam )
{
CTEtRandomDungeon::GetInstance().RenderDungeon();
return S_OK;
}
LRESULT CRandomDungeonRenderView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
CRenderBase::GetInstance().Process( CGlobalValue::RDUNGEON );
if( wParam == 1 ) RefreshScene();
if( CGlobalValue::GetInstance().IsActiveRenderView( this ) ) {
LOCAL_TIME LocalTime = CRenderBase::GetInstance().GetLocalTime();
if( IsPushKey( DIK_W ) ) {
m_Camera.m_vPosition += m_Camera.m_vZAxis * ( ( 1000.f * GetPushKeyDelta(DIK_W,LocalTime) ) * CGlobalValue::GetInstance().m_fCamSpeed );
RefreshScene();
}
if( IsPushKey( DIK_S ) ) {
m_Camera.m_vPosition -= m_Camera.m_vZAxis * ( ( 1000.f * GetPushKeyDelta(DIK_S,LocalTime) ) * CGlobalValue::GetInstance().m_fCamSpeed );
RefreshScene();
}
if( IsPushKey( DIK_A ) ) {
m_Camera.m_vPosition -= m_Camera.m_vXAxis * ( ( 1000.f * GetPushKeyDelta(DIK_A,LocalTime) ) * CGlobalValue::GetInstance().m_fCamSpeed );
RefreshScene();
}
if( IsPushKey( DIK_D ) ) {
m_Camera.m_vPosition += m_Camera.m_vXAxis * ( ( 1000.f * GetPushKeyDelta(DIK_D,LocalTime) ) * CGlobalValue::GetInstance().m_fCamSpeed );
RefreshScene();
}
CRenderBase::GetInstance().UpdateCamera( m_Camera );
}
else if( CGlobalValue::GetInstance().m_bSimulation == true ) {
m_bRefreshScene = true;
}
if( m_bRefreshScene == true )
Invalidate();
else Sleep(1);
m_bRefreshScene = false;
return S_OK;
}
void CRandomDungeonRenderView::OnInputReceive( int nReceiverState, LOCAL_TIME LocalTime )
{
if( !CGlobalValue::GetInstance().IsActiveRenderView( this ) ) return;
if( nReceiverState & IR_KEY_DOWN ) {
if( IsPushKey( DIK_F5 ) ) {
CTEtRandomDungeon::GetInstance().Destroy();
CTEtRandomDungeon::GetInstance().Initialize( CGlobalValue::GetInstance().m_nDungeonSeed );
CTEtRandomDungeon::GetInstance().GenerateMaze( CGlobalValue::GetInstance().m_DungeonSize.nX, CGlobalValue::GetInstance().m_DungeonSize.nY, CGlobalValue::GetInstance().m_DungeonSize.nZ,
CGlobalValue::GetInstance().m_nDungeonSparseness, CGlobalValue::GetInstance().m_nDungeonRandomness, CGlobalValue::GetInstance().m_nDungeonDeadendRemove );
CWnd *pWnd = GetPaneWnd( RANDOM_DEFAULT_PANE );
if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW );
RefreshScene();
}
if( IsPushKey( DIK_F2 ) ) {
m_bDraw2DMap = !m_bDraw2DMap;
RefreshScene();
}
if( IsPushKey( DIK_F3 ) ) {
m_n2DMapType++;
if( m_n2DMapType > 2 ) m_n2DMapType = 0;
RefreshScene();
}
if( IsPushKey( DIK_F4 ) ) {
m_nDraw2DMapLevel++;
if( m_nDraw2DMapLevel >= CTEtRandomDungeon::GetInstance().GetMaze()->GetLevel() ) m_nDraw2DMapLevel = 0;
RefreshScene();
}
}
if( nReceiverState & IR_MOUSE_MOVE ) {
if( m_nMouseFlag & RB_DOWN ) {
m_Camera.RotateYAxis( GetMouseVariation().x / 4.f );
m_Camera.RotatePitch( GetMouseVariation().y / 4.f );
RefreshScene();
}
}
if( nReceiverState & IR_MOUSE_WHEEL ) {
if( IsInMouseRect( this ) == true ) {
m_Camera.m_vPosition += ( m_Camera.m_vZAxis * 0.4f *( GetMouseVariation().z * CGlobalValue::GetInstance().m_fCamSpeed ) );
RefreshScene();
}
}
if( nReceiverState & IR_MOUSE_LB_DOWN ) {
if( IsInMouseRect( this ) == true ) {
m_nMouseFlag |= LB_DOWN;
GetCursorPos( &m_MousePos );
ScreenToClient( &m_MousePos );
}
}
if( nReceiverState & IR_MOUSE_LB_UP ) {
m_nMouseFlag &= ~LB_DOWN;
}
if( nReceiverState & IR_MOUSE_RB_DOWN ) {
if( IsInMouseRect( this ) == true ) {
m_nMouseFlag |= RB_DOWN;
}
}
if( nReceiverState & IR_MOUSE_RB_UP ) {
m_nMouseFlag &= ~RB_DOWN;
}
if( nReceiverState & IR_MOUSE_WB_DOWN ) {
m_nMouseFlag |= WB_DOWN;
}
if( nReceiverState & IR_MOUSE_WB_UP ) {
m_nMouseFlag &= ~WB_DOWN;
}
m_PrevLocalTime = LocalTime;
/*
if( CRenderBase::GetInstance().GetCameraHandle() )
CRenderBase::GetInstance().GetCameraHandle()->Update( m_Camera );
*/
CRenderBase::GetInstance().UpdateCamera( m_Camera );
}
BOOL CRandomDungeonRenderView::OnEraseBkgnd(CDC* pDC)
{
// TODO: <20><><EFBFBD><20>޽<EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ڵ带 <20>߰<EFBFBD> <20><>/<2F>Ǵ<EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
if( CFileServer::GetInstance().IsConnect() == false )
return CFormView::OnEraseBkgnd(pDC);
return FALSE;
}
LRESULT CRandomDungeonRenderView::OnOpenView( WPARAM wParam, LPARAM lParam )
{
return S_OK;
}
LRESULT CRandomDungeonRenderView::OnCloseView( WPARAM wParam, LPARAM lParam )
{
CTEtRandomDungeon::GetInstance().Destroy();
return S_OK;
}