// PropRenderView.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "EtWorldPainter.h" #include "PropRenderView.h" #include "UserMessage.h" #include "RenderBase.h" #include "FileServer.h" #include "SundriesFuncEx.h" #include "TEtWorld.h" #include "TEtWorldSector.h" #include "PropPoolControl.h" #include "GlobalValue.h" #include "PaneDefine.h" #include "MainFrm.h" #include "TEtWorldProp.h" #include "EnviControl.h" #include "EnviLightBase.h" #include "AxisRenderObject.h" #include "EtWorldPainterDoc.h" #include "EtWorldPainterView.h" #include "DummyView.h" #include "PropPropertiesPaneView.h" #include "TEtWorldActProp.h" // CPropRenderView IMPLEMENT_DYNCREATE(CPropRenderView, CFormView) CPropRenderView::CPropRenderView() : CFormView(CPropRenderView::IDD) , CInputReceiver( true ) { m_nMouseFlag = 0; m_LocalTime = m_PrevLocalTime = 0; m_bRefreshScene = true; m_PrevMousePos = m_MousePos = CPoint( 0, 0 ); m_bLockSelect = false; m_bEnableCopy = false; m_EditMode = EM_BRUSH; m_pCurAction = NULL; m_pOutlineFilter = NULL; } CPropRenderView::~CPropRenderView() { SAFE_DELETE( m_pCurAction ); SAFE_DELETE( m_pOutlineFilter ); } void CPropRenderView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CPropRenderView, CFormView) ON_WM_PAINT() ON_WM_ERASEBKGND() 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 ) END_MESSAGE_MAP() // CPropRenderView Áø´ÜÀÔ´Ï´Ù. #ifdef _DEBUG void CPropRenderView::AssertValid() const { CFormView::AssertValid(); } #ifndef _WIN32_WCE void CPropRenderView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif #endif //_DEBUG // CPropRenderView ¸Þ½ÃÁö 󸮱âÀÔ´Ï´Ù. void CPropRenderView::OnInitialUpdate() { __super::OnInitialUpdate(); if( !m_pOutlineFilter ) { m_pOutlineFilter = (CEtOutlineFilter*)EternityEngine::CreateFilter( SF_OUTLINE );; } } LRESULT CPropRenderView::OnCustomRender( WPARAM wParam, LPARAM lParam ) { CString szStr; szStr = "Prop Edit Mode : "; switch( m_EditMode ) { case EM_BRUSH: { szStr += "Add Prop"; if( !CGlobalValue::GetInstance().IsActiveRenderView( this ) ) break; SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); DWORD dwColor; if( CGlobalValue::GetInstance().m_CheckOutGrid == -1 ) dwColor = 0xFFFF0000; else dwColor = 0xFFFFFF00; pSector->UpdateBrush( m_MousePos.x, m_MousePos.y, (float)CGlobalValue::GetInstance().m_nBrushDiameter * 100.f, dwColor ); } break; case EM_MODIFY: { szStr += "Modify Prop"; if( m_nMouseFlag & LB_DOWN ) { if( !CGlobalValue::GetInstance().IsActiveRenderView( this ) ) break; if( GetAKState( VK_CONTROL ) < 0 ) CalcPropIndex( m_MousePos.x, m_MousePos.y, 1 ); else if( GetAKState( VK_MENU ) < 0 ) CalcPropIndex( m_MousePos.x, m_MousePos.y, 2 ); else CalcPropIndex( m_MousePos.x, m_MousePos.y, 0 ); } if( m_bLockSelect ) szStr += " - Lock"; } break; } if( CGlobalValue::GetInstance().IsCheckOutMe() ) EternityEngine::DrawText2D( EtVector2( 0.f, 0.05f ), szStr, 0xffffff00 ); if( CEnviLightBase::s_pFocus ) { CEnviLightBase::s_pFocus->OnCustomDraw(); } return S_OK; } LRESULT CPropRenderView::OnOpenView( WPARAM wParam, LPARAM lParam ) { m_nMouseFlag = 0; m_PrevLocalTime = 0; m_bRefreshScene = true; m_MousePos = CPoint( 0, 0 ); m_EditMode = EM_BRUSH; CGlobalValue::GetInstance().m_pVecSelectPropList.clear(); CGlobalValue::GetInstance().m_bControlAxis = false; CWnd *pWnd = GetPaneWnd( PROPPROP_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); /* CEnviControl::GetInstance().ActivateElement( "Edit Set" ); pWnd = GetPaneWnd( ENVI_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); */ pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); CTEtWorld::GetInstance().SetCurrentGrid( CGlobalValue::GetInstance().m_szSelectGrid ); SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector != -1 ) { CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( pSector ) pSector->ShowProp( true ); } ResetCamera(); CGlobalValue::GetInstance().ApplyRenderOption(); return S_OK; } LRESULT CPropRenderView::OnCloseView( WPARAM wParam, LPARAM lParam ) { if( CGlobalValue::GetInstance().IsModify( CGlobalValue::GetInstance().m_nActiveView ) ) CGlobalValue::GetInstance().Save( CGlobalValue::GetInstance().m_nActiveView ); SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector != -1 ) { CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); pSector->Show( false ); for( DWORD i=0; iSetSelect( false ); } CGlobalValue::GetInstance().m_pVecSelectPropList.clear(); } CTEtWorld::GetInstance().SetCurrentGrid( NULL ); CWnd *pWnd = GetPaneWnd( SKINMNG_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 0, -1 ); pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, -1 ); CGlobalValue::GetInstance().m_bMaintenanceCamera = true; s_PropActionCommander.Reset(); SAFE_RELEASE_SPTR( m_hOutline ); // m_pOutlineFilter->ClearOutlineObject(); return S_OK; } LRESULT CPropRenderView::OnRefresh( WPARAM wParam, LPARAM lParam ) { CRenderBase::GetInstance().Process( CGlobalValue::PROP ); if( wParam == 1 ) RefreshScene(); m_Camera = *CRenderBase::GetInstance().GetLastUpdateCamera(); 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 ) && !IsPushKey( DIK_LCONTROL ) ) { 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; } else { if( IsPushKey( DIK_LCONTROL ) && IsPushKey( DIK_C ) ) { int nPaneID = ((CMainFrame*)AfxGetMainWnd())->GetFocusPaneID(); if( nPaneID == PROPPROP_PANE ) { if( CGlobalValue::GetInstance().m_pVecSelectPropList.size() == 1 ) { CWnd *pPropPropWnd = GetPaneWnd( PROPPROP_PANE ); if( ((CPropPropertiesPaneView*)pPropPropWnd)->GetCurrentSelectIndex() == 7 ) { CEtWorldProp *pProp = CGlobalValue::GetInstance().m_pVecSelectPropList[0]; if( pProp ) { CTEtWorldActProp *pActProp = dynamic_cast(pProp); if( pActProp && pActProp->GetActionIndex() != -1 ) { CEtActionBase::ActionElementStruct *pStruct = pActProp->GetElement( pActProp->GetActionIndex() ); if( pStruct ) { std::string szName = pStruct->szName; if( !szName.empty() ) { //////////////////////////////////////////////////////////////// if( ::OpenClipboard( NULL ) ) { HGLOBAL hBlock = NULL; int nLength = (int)strlen( szName.c_str() ); ::EmptyClipboard(); hBlock = ::GlobalAlloc( GMEM_SHARE, sizeof( char ) * ( nLength + 1 ) ); if( hBlock ) { char *szText = ( char * )::GlobalLock( hBlock ); if( szText ) { memcpy( szText, szName.c_str(), nLength*sizeof(char) ); szText[nLength] = '\0'; ::GlobalUnlock( hBlock ); } ::SetClipboardData( CF_TEXT, hBlock ); } ::CloseClipboard(); if( hBlock ) ::GlobalFree( hBlock ); } //////////////////////////////////////////////////////////////// } } } } } } } } } if( m_bRefreshScene == true ) { CRenderBase::GetInstance().UpdateCamera( m_Camera ); Invalidate(); } else Sleep(1); m_bRefreshScene = false; return S_OK; } void CPropRenderView::OnInputReceive( int nReceiverState, LOCAL_TIME LocalTime ) { if( !CGlobalValue::GetInstance().IsActiveRenderView( this ) ) return; // Light Control if( CEnviLightBase::s_pFocus ) { if( CEnviLightBase::s_pFocus->OnInputReceive( nReceiverState, LocalTime, this ) == false ) return; } m_Camera = *CRenderBase::GetInstance().GetLastUpdateCamera(); if( nReceiverState & IR_KEY_DOWN ) { } 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(); } else if( m_nMouseFlag & WB_DOWN ) { m_Camera.m_vPosition += m_Camera.m_vXAxis * ( -GetMouseVariation().x ) * CGlobalValue::GetInstance().m_fCamSpeed; m_Camera.m_vPosition += m_Camera.m_vYAxis * ( GetMouseVariation().y ) * CGlobalValue::GetInstance().m_fCamSpeed; RefreshScene(); } if( IsInMouseRect( this ) ) { CPoint pointTemp = m_MousePos; GetCursorPos( &m_MousePos ); ScreenToClient( &m_MousePos ); if( CGlobalValue::GetInstance().IsCheckOutMe() ) { switch( m_EditMode ) { case EM_BRUSH: if( CGlobalValue::GetInstance().m_cDrawType == 1 ) { if( m_nMouseFlag & LB_DOWN ) { ApplyProp( m_MousePos.x, m_MousePos.y ); } } RefreshScene(); break; case EM_MODIFY: { if( !( m_nMouseFlag & LB_DOWN ) ) { ControlProp( m_MousePos.x, m_MousePos.y ); } else if( m_nMouseFlag & LB_DOWN && pointTemp == m_PrevMousePos && GetAKState( VK_LSHIFT ) < 0 && m_bEnableCopy ) { if( m_pCurAction == NULL ) { m_pCurAction = new CActionElementBrushProp( true ); m_pCurAction->SetDesc( "Clone Prop" ); } SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) break; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); DNVector(CEtWorldProp *) pVecList; for( DWORD i=0; iSetSelect( false ); pVecList.push_back( pSector->CloneProp( CGlobalValue::GetInstance().m_pVecSelectPropList[i], m_pCurAction ) ); ((CTEtWorldProp*)pVecList[i])->SetSelect( true ); } CAxisRenderObject::m_nSelectAxis = CGlobalValue::GetInstance().m_nSelectAxis; CGlobalValue::GetInstance().m_pVecSelectPropList = pVecList; m_bEnableCopy = false; ReleaseAKState( VK_LSHIFT ); m_pCurAction->AddAction(); m_pCurAction = NULL; } RefreshScene(); } break; } } else { if( m_EditMode == EM_BRUSH ) RefreshScene(); } } if( m_EditMode == EM_MODIFY ) { if( m_nMouseFlag & LB_DOWN ) { GetCursorPos( &m_MousePos ); ScreenToClient( &m_MousePos ); if( CGlobalValue::GetInstance().m_bControlAxis == true ) { ControlProp( (int)GetMouseVariation().x, (int)GetMouseVariation().y ); } 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 ); m_PrevMousePos = m_MousePos; switch( m_EditMode ) { case EM_BRUSH: if( CGlobalValue::GetInstance().IsCheckOutMe() ) { ApplyProp( m_MousePos.x, m_MousePos.y ); RefreshScene(); } break; case EM_MODIFY: { SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) break; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); pSector->BeginRectBrush( m_MousePos.x, m_MousePos.y ); if( GetAKState( VK_LSHIFT ) < 0 ) { int nCount = (int)CGlobalValue::GetInstance().m_pVecSelectPropList.size(); if( (int)CGlobalValue::GetInstance().m_pVecSelectPropList.size() == nCount ) { m_bEnableCopy = true; } } if( GetAKState( VK_LCONTROL ) < 0 ) CalcPropIndex( m_MousePos.x, m_MousePos.y, 1, true ); else if( GetAKState( VK_MENU ) < 0 ) CalcPropIndex( m_MousePos.x, m_MousePos.y, 2, true ); else CalcPropIndex( m_MousePos.x, m_MousePos.y, 0, true ); RefreshScene(); } break; } } } if( nReceiverState & IR_MOUSE_LB_UP ) { m_nMouseFlag &= ~LB_DOWN; switch( m_EditMode ) { case EM_BRUSH: if( CGlobalValue::GetInstance().m_cDrawType == 1 ) { if( m_pCurAction ) { m_pCurAction->AddAction(); m_pCurAction = NULL; } } break; case EM_MODIFY: if( m_pCurAction ) { m_pCurAction->AddAction(); m_pCurAction = NULL; } m_bEnableCopy = false; // CGlobalValue::GetInstance().m_bControlAxis = false; RefreshScene(); break; } } 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; } if( nReceiverState & IR_KEY_DOWN ) { if( CGlobalValue::GetInstance().IsCheckOutMe() ) { if( IsPushKey( DIK_TAB ) ) { ToggleEditMode(); RefreshScene(); } if( m_EditMode == EM_MODIFY && IsPushKey( DIK_LCONTROL ) && IsPushKey( DIK_A ) ) { CalcPropIndex( -1, -1, 3 ); RefreshScene(); } if( IsPushKey( DIK_DELETE ) ) { DeleteProp(); RefreshScene(); } if( IsPushKey( DIK_ESCAPE ) ) { CalcPropIndex( -1, -1, 4 ); RefreshScene(); } if( IsPushKey( DIK_SCROLL ) ) { if( GetKeyState( VK_SCROLL ) == 0xffffff81 ) { if( CGlobalValue::GetInstance().m_pVecSelectPropList.size() > 0 ) m_bLockSelect = true; else { // keybd_event( VK_SCROLL, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0 ); m_bLockSelect = false; } } else m_bLockSelect = false; RefreshScene(); } } } m_PrevLocalTime = LocalTime; CRenderBase::GetInstance().UpdateCamera( m_Camera ); if( nReceiverState & IR_KEY_DOWN ) CGlobalValue::GetInstance().CheckAccelerationKey( this ); } void CPropRenderView::OnPaint() { CPaintDC dc(this); // device context for painting CRenderBase::GetInstance().Render( CGlobalValue::PROP ); } BOOL CPropRenderView::OnEraseBkgnd(CDC* pDC) { // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº»°ªÀ» È£ÃâÇÕ´Ï´Ù. if( CFileServer::GetInstance().IsConnect() == false ) return CFormView::OnEraseBkgnd(pDC); return FALSE; } void CPropRenderView::ResetCamera() { if( CGlobalValue::GetInstance().m_bMaintenanceCamera == true ) { m_Camera = *CRenderBase::GetInstance().GetLastUpdateCamera(); return; } SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( pSector ) { m_Camera.Identity(); m_Camera.m_vPosition = *pSector->GetOffset(); m_Camera.m_vPosition.y = pSector->GetHeightToWorld( m_Camera.m_vPosition.x, m_Camera.m_vPosition.z ) + 500.f; } CRenderBase::GetInstance().UpdateCamera( m_Camera ); } void CPropRenderView::ApplyProp( int nX, int nY ) { SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) return; CPropPoolStage *pStage = g_PropPoolControl.GetCurrentStage(); if( !pStage ) return; if( pStage->IsEmpty() ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( m_pCurAction == NULL ) { m_pCurAction = new CActionElementBrushProp( true ); m_pCurAction->SetDesc( "Add Prop" ); } pSector->AddProp( nX, nY, pStage, m_pCurAction, CGlobalValue::GetInstance().m_nBrushDiameter * 100.f, CGlobalValue::GetInstance().m_fBrushHardness, CGlobalValue::GetInstance().m_rHeight, CGlobalValue::GetInstance().m_rRadian, CGlobalValue::GetInstance().m_bRandomPosition, CGlobalValue::GetInstance().m_bRandomRotationX, CGlobalValue::GetInstance().m_bRandomRotationY, CGlobalValue::GetInstance().m_bRandomRotationZ, CGlobalValue::GetInstance().m_bLockHeightNormal, CGlobalValue::GetInstance().m_bLockScaleAxis, CGlobalValue::GetInstance().m_rScaleXRange, CGlobalValue::GetInstance().m_rScaleYRange, CGlobalValue::GetInstance().m_rScaleZRange, CGlobalValue::GetInstance().m_fHeightDigPer, CGlobalValue::GetInstance().m_fMinPropDistance, CGlobalValue::GetInstance().m_bIgnoreDistanceSize ); if( CGlobalValue::GetInstance().m_cDrawType == 0 ) { m_pCurAction->AddAction(); m_pCurAction = NULL; } RefreshProperties(); CWnd *pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); CGlobalValue::GetInstance().SetModify(); } void CPropRenderView::DeleteProp() { SAFE_RELEASE_SPTR( m_hOutline ); // m_pOutlineFilter->ClearOutlineObject(); SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) return; if( m_pCurAction == NULL ) { m_pCurAction = new CActionElementBrushProp( false ); m_pCurAction->SetDesc( "Delete Prop" ); } CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); for( DWORD i=0; iGetSector() ) { assert(0); continue; // ÀÌ·² ÀÏÀº ¾ø°ÚÁö? } pSector->DeleteProp( pProp ); // Áö¿ìÁö ¸»°í Undo/Redo ¸®½ºÆ®¿¡ ³Ö´Â´Ù. ((CActionElementBrushProp*)m_pCurAction)->AddProp( pProp ); // SAFE_DELETE( pProp ); } m_pCurAction->AddAction(); m_pCurAction = NULL; CGlobalValue::GetInstance().m_bControlAxis = false; CGlobalValue::GetInstance().m_pVecSelectPropList.clear(); RefreshScene(); RefreshProperties(); CWnd *pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); CGlobalValue::GetInstance().SetModify(); } void CPropRenderView::ToggleEditMode() { EDIT_MODE PrevMode = m_EditMode; m_EditMode = ( m_EditMode == EM_BRUSH ) ? EM_MODIFY : EM_BRUSH; for( DWORD i=0; iSetSelect( false ); } CGlobalValue::GetInstance().m_pVecSelectPropList.clear(); CGlobalValue::GetInstance().m_bControlAxis = false; m_bEnableCopy = false; } void CPropRenderView::RefreshProperties() { CWnd *pWnd = GetPaneWnd( PROPPROP_PANE ); if( pWnd ) { pWnd->SendMessage( UM_REFRESH_PANE_VIEW, ( CGlobalValue::GetInstance().m_pVecSelectPropList.size() > 0 ) ? 1 : 0 ); } } void CPropRenderView::ControlProp( int nX, int nY ) { SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( CGlobalValue::GetInstance().m_bControlAxis == true && m_nMouseFlag & LB_DOWN ) { if( !CGlobalValue::GetInstance().m_pVecSelectPropList.empty() ) { EtVector3 vTempPos = ((CTEtWorldProp*)CGlobalValue::GetInstance().m_pVecSelectPropList[0])->GetMatEx()->m_vPosition; float fScale = EtVec3Length( &( vTempPos - CRenderBase::GetInstance().GetLastUpdateCamera()->m_vPosition ) ) / 1000.f; for( DWORD i=0; iMoveAxis( nX, nY, fScale ); } } if( nX != 0 || nY != 0 ) { RefreshProperties(); } CGlobalValue::GetInstance().SetModify(); if( !m_pCurAction ) { char cModifyType = 0; if( GetAKState( VK_LCONTROL ) < 0 ) cModifyType = 1; if( GetAKState( VK_LMENU ) < 0 ) cModifyType = 2; m_pCurAction = new CActionElementModifyProp( cModifyType ); for( DWORD i=0; iAddProp( CGlobalValue::GetInstance().m_pVecSelectPropList[i] ); } if( cModifyType == 0 ) m_pCurAction->SetDesc( "Modify Prop - Move" ); else if( cModifyType == 1 ) m_pCurAction->SetDesc( "Modify Prop - Rotate" ); else if( cModifyType == 2 ) m_pCurAction->SetDesc( "Modify Prop - Scale" ); } } else { EtVector3 vOrig, vDir; CRenderBase::GetInstance().GetCameraHandle()->CalcPositionAndDir( nX, nY, vOrig, vDir ); int nAxisTemp = -1; bool bControlBody = false; for( DWORD i=0; iCheckAxis( vOrig, vDir ) == true ) { if( CGlobalValue::GetInstance().m_nSelectAxis != 3 ) { nAxisTemp = CGlobalValue::GetInstance().m_nSelectAxis; break; } else bControlBody = true; } } if( nAxisTemp != -1 ) { CGlobalValue::GetInstance().m_nSelectAxis = nAxisTemp; CAxisRenderObject::m_nSelectAxis = nAxisTemp; CGlobalValue::GetInstance().m_bControlAxis = true; } else if( bControlBody ) { CGlobalValue::GetInstance().m_nSelectAxis = 3; CAxisRenderObject::m_nSelectAxis = 3; CGlobalValue::GetInstance().m_bControlAxis = true; } SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( pSector ) { DNVector(CEtWorldProp *) pVecList; pSector->PickProp( nX, nY, pVecList ); SAFE_RELEASE_SPTR( m_hOutline ); if( !pVecList.empty() ) { m_hOutline = (new CEtOutlineObject( pVecList[0]->GetObjectHandle() ) )->GetMySmartPtr(); m_hOutline->SetColor( EtColor(0.2f, 0.5f, 1.0f, 1.0f) ); m_hOutline->SetWidth( 1.f ); // m_hOutline->SetSolid( true ); float fFastSpeed = 1000.0f; m_hOutline->Show( true , fFastSpeed ); } } } } void CPropRenderView::CalcPropIndex( int nX, int nY, char cFlag, bool bClick ) { if( m_bLockSelect ) return; if( cFlag != 4 && CGlobalValue::GetInstance().m_bControlAxis == true ) { if( bClick == false ) return; if( CGlobalValue::GetInstance().m_nSelectAxis != 3 ) return; } DWORD dwColor; if( CGlobalValue::GetInstance().m_CheckOutGrid == -1 ) dwColor = 0xFFFF0000; else dwColor = 0xFFFFFF00; SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( !pSector ) return; DNVector(CEtWorldProp *) pVecList; if( cFlag < 3 ) pSector->UpdateRectBrush( nX, nY, dwColor, pVecList ); // ¹üÀ§·Î ¼±Åýÿ£ ÄÁÆ®·Ñ ¶ôµÇÀִ°Š°­Á¦·Î ¸®½ºÆ®¿¡¼­ »«´Ù. DNVector(CEtWorldProp *) pVecListTemp; for( DWORD i=0; iIsControlLock() ) continue; pVecListTemp.push_back( pVecList[i] ); } pVecList.clear(); for( DWORD i=0; iGetPropCount(); i++ ) ((CTEtWorldProp*)pSector->GetPropFromIndex(i))->SetSelect( false ); switch( cFlag ) { case 0: { if( GetAKState( VK_SPACE ) < 0 && CGlobalValue::GetInstance().m_bControlAxis == true ) { bool bValid = true; for( DWORD i=0; iGetPropCount(); i++ ) { CGlobalValue::GetInstance().m_pVecSelectPropList.push_back( pSector->GetPropFromIndex(i) ); } break; case 4: CGlobalValue::GetInstance().m_bControlAxis = false; CGlobalValue::GetInstance().m_pVecSelectPropList.clear(); break; } for( DWORD i=0; iSetSelect( true ); RefreshProperties(); CWnd *pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 1 ); } void CPropRenderView::ClearOutline() { /* if( m_pOutlineFilter ) m_pOutlineFilter->ClearOutlineObject(); */ SAFE_RELEASE_SPTR( m_hOutline ); } CActionElementBrushProp::CActionElementBrushProp( bool bAddRemove ) : CActionElement( &s_PropActionCommander ) { m_bAddRemove = bAddRemove; if( m_bAddRemove == true ) m_bLastActionUndo = false; else m_bLastActionUndo = true; } CActionElementBrushProp::~CActionElementBrushProp() { if( m_bLastActionUndo == true ) { SAFE_DELETE_PVEC( m_pVecProp ); } else { SAFE_DELETE_VEC( m_pVecProp ); } } bool CActionElementBrushProp::Redo() { CEtWorldPainterView *pView = (CEtWorldPainterView *)CGlobalValue::GetInstance().m_pParentView; if( pView ) { CPropRenderView *pPropRenderView = dynamic_cast(pView->GetDummyView()->GetTabViewStruct(CGlobalValue::PROP)->pView); if( pPropRenderView ) pPropRenderView->ClearOutline(); } if( m_bAddRemove == true ) { for( DWORD i=0; iGetSector(); ((CTEtWorldProp*)m_pVecProp[i])->LoadObject(); pSector->InsertProp( m_pVecProp[i] ); } m_bLastActionUndo = false; } else { for( DWORD i=0; iGetSector(); pSector->DeleteProp( m_pVecProp[i] ); ((CTEtWorldProp*)m_pVecProp[i])->FreeObject(); } m_bLastActionUndo = true; } CWnd *pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); CGlobalValue::GetInstance().RefreshRender(); return true; } bool CActionElementBrushProp::Undo() { CEtWorldPainterView *pView = (CEtWorldPainterView *)CGlobalValue::GetInstance().m_pParentView; if( pView ) { CPropRenderView *pPropRenderView = dynamic_cast(pView->GetDummyView()->GetTabViewStruct(CGlobalValue::PROP)->pView); if( pPropRenderView ) pPropRenderView->ClearOutline(); } if( m_bAddRemove == true ) { for( DWORD i=0; iGetSector(); pSector->DeleteProp( m_pVecProp[i] ); ((CTEtWorldProp*)m_pVecProp[i])->FreeObject(); } m_bLastActionUndo = true; } else { for( DWORD i=0; iGetSector(); ((CTEtWorldProp*)m_pVecProp[i])->LoadObject(); pSector->InsertProp( m_pVecProp[i] ); } m_bLastActionUndo = false; CGlobalValue::GetInstance().m_pVecSelectPropList.clear(); CWnd *pWnd = GetPaneWnd( PROPPROP_PANE ); if( pWnd ) { pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); } pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); } CGlobalValue::GetInstance().RefreshRender(); return true; } void CActionElementBrushProp::AddProp( CEtWorldProp *pProp ) { if( m_bAddRemove == true ) { } else { ((CTEtWorldProp*)pProp)->FreeObject(); } m_pVecProp.push_back( pProp ); } CActionElementModifyProp::CActionElementModifyProp( char cType ) : CActionElement( &s_PropActionCommander ) { m_cType = cType; } CActionElementModifyProp::~CActionElementModifyProp() { } bool CActionElementModifyProp::Redo() { CEtWorldPainterView *pView = (CEtWorldPainterView *)CGlobalValue::GetInstance().m_pParentView; if( pView ) { CPropRenderView *pPropRenderView = dynamic_cast(pView->GetDummyView()->GetTabViewStruct(CGlobalValue::PROP)->pView); if( pPropRenderView ) pPropRenderView->ClearOutline(); } for( DWORD i=0; iSetPosition( m_vVecRedo[i] ); break; case 1: pProp->SetRotation( m_vVecRedo[i] ); break; case 2: pProp->SetScale( m_vVecRedo[i] ); break; } ((CTEtWorldProp*)pProp)->UpdateMatrixEx(); } CWnd *pWnd = GetPaneWnd( PROPPROP_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, ( CGlobalValue::GetInstance().m_pVecSelectPropList.size() > 0 ) ? 1 : 0 ); pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); CGlobalValue::GetInstance().RefreshRender(); return true; } bool CActionElementModifyProp::Undo() { CEtWorldPainterView *pView = (CEtWorldPainterView *)CGlobalValue::GetInstance().m_pParentView; if( pView ) { CPropRenderView *pPropRenderView = dynamic_cast(pView->GetDummyView()->GetTabViewStruct(CGlobalValue::PROP)->pView); if( pPropRenderView ) pPropRenderView->ClearOutline(); } for( DWORD i=0; iGetPosition() ); pProp->SetPosition( m_vVecModify[i] ); break; case 1: m_vVecRedo.push_back( *pProp->GetRotation() ); pProp->SetRotation( m_vVecModify[i] ); break; case 2: m_vVecRedo.push_back( *pProp->GetScale() ); pProp->SetScale( m_vVecModify[i] ); break; } ((CTEtWorldProp*)pProp)->UpdateMatrixEx(); } CWnd *pWnd = GetPaneWnd( PROPPROP_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, ( CGlobalValue::GetInstance().m_pVecSelectPropList.size() > 0 ) ? 1 : 0 ); pWnd = GetPaneWnd( PROPLIST_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW ); CGlobalValue::GetInstance().RefreshRender(); return true; } void CActionElementModifyProp::AddProp( CEtWorldProp *pProp ) { m_pVecProp.push_back( pProp ); switch( m_cType ) { case 0: // Position m_vVecModify.push_back( *pProp->GetPrePosition() ); // ¼öÁ¤ break; case 1: // Rotate m_vVecModify.push_back( *pProp->GetPreRotation() ); // ¼öÁ¤ break; case 2: // Scale m_vVecModify.push_back( *pProp->GetScale() ); break; } }