#include "StdAfx.h" #include #include "EternityEngine.h" #include "RTCutSceneMakerFrame.h" #include "cwxRenderPanel.h" #include "IRenderBase.h" #include "CommandSet.h" #include "cwxTimeLinePanel.h" #include "cwxTimeLineCtrl.h" #include "cwxEventTimeLinePanel.h" #include "ToolData.h" BEGIN_EVENT_TABLE( cwxRenderPanel, wxPanel ) EVT_SIZE( cwxRenderPanel::OnSize ) EVT_IDLE( cwxRenderPanel::OnIdle ) EVT_MOUSE_EVENTS( cwxRenderPanel::OnMouseEvent ) //EVT_CHAR( cwxRenderPanel::OnKeyDown ) // bintitle. // ÆË¾÷ ¸Þ´º EVT_MENU( POPUP_SELECTED_ACTOR_MOVE, cwxRenderPanel::OnSelectedActorMove ) EVT_MENU( POPUP_SELECTED_ACTOR_ROTATE, cwxRenderPanel::OnSelectedActorRotate ) EVT_MENU( POPUP_SELECTED_PARTICLE_MOVE, cwxRenderPanel::OnSelectedParticleMove ) EVT_MENU( POPUP_SELECTED_PARTICLE_ROTATE, cwxRenderPanel::OnSelectedParticleRotate ) EVT_MENU( POPUP_SELECTED_PARTICLE_UNSELECT, cwxRenderPanel::OnSelectedParticleUnSelect ) END_EVENT_TABLE() cwxRenderPanel::cwxRenderPanel( wxWindow* pParent, wxWindowID id ) : wxPanel( pParent, id ), m_PrevFrameTime( timeGetTime() ), m_pActionTimeLineCtrl( NULL ), m_LocalTime( 0 ), m_bPauseScene( false ), m_pTimeLinePanel( NULL ), m_iNowMode( RP_EM_COUNT ), m_bActorMove( false ) /*m_PlayStartTime( 0 )*/ { m_pRenderer = IRenderBase::Create( (HWND)GetHandle() ); } cwxRenderPanel::~cwxRenderPanel(void) { delete m_pRenderer; } void cwxRenderPanel::SetTimeLinePanel( cwxTimeLinePanel* pTimeLinePanel ) { m_pTimeLinePanel = pTimeLinePanel; } void cwxRenderPanel::OnSize( wxSizeEvent& SizeEvent ) { m_pRenderer->OnResize( SizeEvent.GetSize().GetWidth(), SizeEvent.GetSize().GetHeight() ); } // ÇÁ·¹ÀÓ ¾÷µ¥ÀÌÆ® ¹× ·»´õ¸µÀ» À§ÇÑ ¾ÆÀ̵é À̺¥Æ® void cwxRenderPanel::OnIdle( wxIdleEvent& IdleEvent ) { LOCAL_TIME NowTime = timeGetTime(); LOCAL_TIME FrameTimeDelta = NowTime - m_PrevFrameTime; float fDelta = float(FrameTimeDelta) / 1000.0f; //float fDelta = 0.0f; // ¾×¼Ç ŸÀÓ ¶óÀÎ ÄÁÆ®·ÑÀÇ ´ÜÀ§´Â ÃÊ ´ÜÀ§ÀÓ. // À̺¥Æ® ŸÀÓ ¶óÀÎ ÄÁÆ®·ÑÀÇ ´ÜÀ§´Â 10ms ´ÜÀ§ switch( TOOL_DATA.GetEditMode() ) { case CToolData::EM_PLAY: { if( false == m_bPauseScene ) m_LocalTime += FrameTimeDelta; float fAbsoluteElapsedTime = (float)m_LocalTime * 0.001f; m_pActionTimeLineCtrl = TOOL_DATA.GetActionTimeLine(); m_pActionTimeLineCtrl->UpdateTimeBar( fAbsoluteElapsedTime ); TOOL_DATA.GetEventTLPanel()->SetTime( fAbsoluteElapsedTime ); //TOOL_DATA.GetEventTLPanel()->ReflectData(); } break; case CToolData::EM_FREE_TIME: { // ¾î¶² ŸÀÓ ¶óÀÎÀ» ÄÁÆ®·Ñ Çß´ÂÁö°¡ °ü°Ç! // ´ÜÀ§´Â DWORD ·Î ms ´ÜÀ§. //m_LocalTime = m_pTimeLinePanel->GetNowTime(); m_LocalTime = TOOL_DATA.GetLocalTime(); m_pTimeLinePanel->SyncTimePanels( m_LocalTime ); // ŸÀÓ ¶óÀÎ ÆÐ³ÎµéÀÇ ½Ã°£ ÃàÀ» µ¿Á¶½ÃŲ´Ù. //m_pActionTimeLineCtrl = TOOL_DATA.GetActionTimeLine(); //float fNowTLAxis = m_pActionTimeLineCtrl->GetNowTimeByUnit(); //fNowTLAxis *= 1000.0f; //m_LocalTime = /*m_PlayStartTime +*/ DWORD(fNowTLAxis); } break; } m_pRenderer->OnRender( m_LocalTime, fDelta ); m_PrevFrameTime = NowTime; IdleEvent.RequestMore(); } // Ȱ¼ºÈ­ ºñȰ¼ºÈ­ ¿©ºÎ void cwxRenderPanel::OnActivate( wxActivateEvent& ActiveEvent ) { m_pRenderer->SetActivate( ActiveEvent.GetActive() ); } void cwxRenderPanel::StartPlay( void ) { if( false == m_bPauseScene ) { m_pRenderer->SetMode( IRenderBase::PLAY_MODE ); //m_PlayStartTime = timeGetTime(); //m_LocalTime = m_PlayStartTime; m_LocalTime = 0; } else { m_bPauseScene = false; } } void cwxRenderPanel::PausePlay( void ) { m_bPauseScene = true; } void cwxRenderPanel::StopPlay( void ) { m_pRenderer->SetMode( IRenderBase::EDITOR_MODE ); m_LocalTime = 0; m_bPauseScene = false; m_pActionTimeLineCtrl = TOOL_DATA.GetActionTimeLine(); m_pActionTimeLineCtrl->UpdateTimeBar( 0.0f ); cwxEventTimeLinePanel* pEventTLPanel = TOOL_DATA.GetEventTLPanel(); pEventTLPanel->SetTime( 0.0f ); pEventTLPanel->ReflectData(); } void cwxRenderPanel::ResetPlay( void ) { m_LocalTime = 0; m_pActionTimeLineCtrl = TOOL_DATA.GetActionTimeLine(); m_pActionTimeLineCtrl->UpdateTimeBar( 0.0f ); cwxEventTimeLinePanel* pEventTLPanel = TOOL_DATA.GetEventTLPanel(); pEventTLPanel->SetTime( 0.0f ); pEventTLPanel->ReflectData(); } void cwxRenderPanel::SeeThis( const wxChar* pActorName ) { m_pRenderer->SeeThisActor( pActorName ); } // bintitle. void cwxRenderPanel::OnKeyDown(wxKeyEvent& event) { m_pRenderer->OnKeyDown( event ); } void cwxRenderPanel::OnKeyUp(wxKeyEvent& event) { m_pRenderer->OnKeyUp( event ); } // ¸¶¿ì½º Ŭ¸¯ void cwxRenderPanel::OnMouseEvent( wxMouseEvent& MouseEvent ) { wxPoint Pos = MouseEvent.GetPosition(); if( MouseEvent.LeftDown() ) { m_pRenderer->OnLButtonDown( Pos.x, Pos.y ); if( m_pRenderer->GetSelectedObjectName() && m_pRenderer->GetSelectedObjectType() == IRenderBase::SO_ACTOR ) { m_iNowMode = RP_EM_ACTOR_MOVE; m_PrevMousePoint = MouseEvent.GetPosition(); } } else if( MouseEvent.LeftUp() ) { m_pRenderer->OnLButtonUp( Pos.x, Pos.y ); } else if( MouseEvent.RightUp() ) m_pRenderer->OnRButtonUp( Pos.x, Pos.y ); else if( MouseEvent.RightDown() ) { m_pRenderer->OnRButtonDown( Pos.x, Pos.y ); if( m_pRenderer->IsObjectSelected() && !m_pRenderer->bIsLockSelect() ) { wxPoint Point = MouseEvent.GetPosition(); //if( -1 == Point.x && -1 == Point.y ) //{ // wxSize Size = GetSize(); // Point.x = Size.x / 2; // Point.y = Size.y / 2; //} //else //{ // Point = ScreenToClient( Point ); //} // AUI ÀÇ ´Ù¸¥ ÆÐ³ÎµéÀÌ µé·¯ºÙ°í ³²Àº ¿µ¿ªÀÌ ·»´õ¸µ ÆÐ³ÎÀÌ µÇ±â ¶§¹®¿¡ // Á¤È®ÇÏ°Ô À§Ä¡¸¦ ´Ù½Ã ´õÇØÁà¾ß ÇÑ´Ù. //Point += GetPosition(); // Åø ¹Ù Height ¿ª½Ã Àû¿ë½ÃÄÑ¾ß ÇÔ... ¾Ë¾Æ¿À´Â °É ¸ð¸£°Ú... ±×³É ¼öÄ¡·Î. -_- //Point.y += 87; //CRTCutSceneMakerFrame* pMainFrame = static_cast(TOOL_DATA.GetMainFrame()); //Point.y += pMainFrame->GetMenuBar()->GetSize().y; //Point.y += pMainFrame->GetToolBar()->GetToolSize().y; _PopupContextMenu( Point.x, Point.y ); } } else if( MouseEvent.MiddleDown() ) { m_pRenderer->OnCButtonDown( Pos.x, Pos.y ); } else if( MouseEvent.Dragging() ) { if( MouseEvent.LeftIsDown() ) { //if( RP_EM_COUNT == m_iNowMode ) m_pRenderer->OnLButtonDrag( Pos.x, Pos.y ); } else if( MouseEvent.RightIsDown() ) m_pRenderer->OnRButtonDrag( Pos.x, Pos.y ); else if( MouseEvent.MiddleIsDown() ) m_pRenderer->OnCButtonDrag( Pos.x, Pos.y ); } else if( MouseEvent.GetWheelRotation() != 0 ) { if( RP_EM_COUNT == m_iNowMode ) m_pRenderer->OnMouseWheel( MouseEvent.GetWheelRotation() ); } _ProcessSelectedObjectEdit( MouseEvent ); } void cwxRenderPanel::_ProcessSelectedObjectEdit( wxMouseEvent& MouseEvent ) { // À̵¿Àº Edit Move ¾È´­·¯µµ µÇµµ·Ï ÇÏÀÚ. // Â÷¶ó¸® Move Lock ¿É¼ÇÀ» °Éµµ·Ï ÇÏÀÚ. ±×¸®°í ÀüüÀûÀ¸·Î ¸¶¿ì½º ÀԷ¹ްí ÇÏ´Â ºÎºÐ Á¤¸®ÇؾßÇÏÁö ¾Ê³ª. // ³Ê¹« ¾û¸ÁÀÌ³× ¤Ð¤Ð switch( m_iNowMode ) { case RP_EM_ACTOR_MOVE: { if( MouseEvent.Dragging() ) { if( MouseEvent.LeftIsDown() ) { // ¸¶¿ì½º À§Ä¡¸¦ ¾Ë·ÁÁÖ°í ±× À§Ä¡·Î projection µÇµµ·Ï ·»´õ·¯¿¡¼­ ó¸® // ¸¶¿ì½º µ¨Å¸´Â ·»´õ·¯ ³»ºÎ¿¡¼­ ó¸®Çϵµ·Ï wxPoint NowPos = MouseEvent.GetPosition(); if( 3 < abs( NowPos.x - m_PrevMousePoint.x ) || 3 < abs( NowPos.y - m_PrevMousePoint.y ) ) { m_bActorMove = m_pRenderer->MoveObjectByDragging( m_pRenderer->GetSelectedObjectName(), MouseEvent.GetPosition().x, MouseEvent.GetPosition().y ); } } } if( MouseEvent.LeftUp() ) { m_iNowMode = RP_EM_COUNT; const wchar_t* pActorName = m_pRenderer->GetSelectedObjectName(); int iObjectType = m_pRenderer->GetSelectedObjectType(); //m_pRenderer->SetActorAlpha( pActorName, 1.0f ); //EtVector3 vNewPos = *(m_pRenderer->GetSelectedObjectPos( /*m_pRenderer->GetSelectedObjectName()*/ )); if( pActorName && iObjectType == IRenderBase::SO_ACTOR && m_bActorMove ) { EtVector3 vNewPos; m_pRenderer->GetSelectedObjectPos( &vNewPos ); CActorResPropChange ActorPropChange( &TOOL_DATA, pActorName, pActorName, vNewPos, TOOL_DATA.GetRegResRot(pActorName), TOOL_DATA.GetThisActorsFitYPosToMap(pActorName), TOOL_DATA.GetThisActorsInfluenceLightmap(pActorName), TOOL_DATA.GetMonsterTableID(pActorName), TOOL_DATA.GetThisActorsScaleLock(pActorName) ); TOOL_DATA.RunCommand( &ActorPropChange ); m_bActorMove = false; } } } break; case RP_EM_ACTOR_ROTATE: { // ȸÀü Á¶ÀýÀº ÈÙÀ» ±¼·Á¼­ ÇÏÀÚ. int iWheelDelta = MouseEvent.GetWheelRotation(); if( 0 != iWheelDelta ) { m_strRotateActorName.assign( m_pRenderer->GetSelectedObjectName() ); m_pRenderer->RotateObjectByWheelDelta( iWheelDelta ); } else if( MouseEvent.LeftUp() ) { m_iNowMode = RP_EM_COUNT; //const wchar_t* pActorName = m_pRenderer->GetSelectedObjectName(); if( !m_strRotateActorName.empty() ) { m_pRenderer->SetActorAlpha( m_strRotateActorName.c_str(), 1.0f ); float fRotDegree = m_pRenderer->GetRenderActorRotDegree( m_strRotateActorName.c_str() ); CActorResPropChange ActorPropChange( &TOOL_DATA, m_strRotateActorName.c_str(), m_strRotateActorName.c_str(), TOOL_DATA.GetRegResPos(m_strRotateActorName.c_str()), fRotDegree, TOOL_DATA.GetThisActorsFitYPosToMap(m_strRotateActorName.c_str()), TOOL_DATA.GetThisActorsInfluenceLightmap(m_strRotateActorName.c_str()), TOOL_DATA.GetMonsterTableID(m_strRotateActorName.c_str()), TOOL_DATA.GetThisActorsScaleLock(m_strRotateActorName.c_str()) ); TOOL_DATA.RunCommand( &ActorPropChange ); } } } break; case RP_EM_PARTICLE_MOVE: { if( MouseEvent.Dragging() ) { if( MouseEvent.LeftIsDown() ) { // ¸¶¿ì½º À§Ä¡¸¦ ¾Ë·ÁÁÖ°í ±× À§Ä¡·Î projection µÇµµ·Ï ·»´õ·¯¿¡¼­ ó¸® // ¸¶¿ì½º µ¨Å¸´Â ·»´õ·¯ ³»ºÎ¿¡¼­ ó¸®Çϵµ·Ï m_pRenderer->MoveObjectByDragging( m_pRenderer->GetSelectedObjectName(), MouseEvent.GetPosition().x, MouseEvent.GetPosition().y ); } } if( MouseEvent.LeftUp() ) { m_iNowMode = RP_EM_COUNT; const wchar_t* pActorName = m_pRenderer->GetSelectedObjectName(); EtVector3 vNewPos; m_pRenderer->GetSelectedObjectPos( &vNewPos ); const EventInfo* pEventInfo = TOOL_DATA.GetEventInfoByID( m_pRenderer->GetSelectedObjectID() ); if( pEventInfo ) { ParticleEventInfo* pParticleEventInfo = static_cast(pEventInfo->clone()); pParticleEventInfo->vPos = vNewPos; CEventPropChange EventPropChange( &TOOL_DATA, pParticleEventInfo ); TOOL_DATA.RunCommand( &EventPropChange ); delete pParticleEventInfo; } } } break; case RP_EM_PARTICLE_ROTATE: break; } } void cwxRenderPanel::_PopupContextMenu( int iXPos, int iYPos ) { wxMenu Menu; // ÆíÁý ¸ðµåÀÏ ¶§. switch( TOOL_DATA.GetEditMode() ) { case CToolData::EM_EDIT: { wxString strSelectedObjectName = m_pRenderer->GetSelectedObjectName(); strSelectedObjectName.append( wxT(" Edit") ); Menu.SetTitle( strSelectedObjectName.c_str() ); switch( m_pRenderer->GetSelectedObjectType() ) { case IRenderBase::SO_ACTOR: { //Menu.Append( POPUP_SELECTED_ACTOR_MOVE, wxT("&Move") ); Menu.Append( POPUP_SELECTED_ACTOR_ROTATE, wxT("&Rotate") ); } break; case IRenderBase::SO_PARTICLE: { Menu.Append( POPUP_SELECTED_PARTICLE_MOVE, wxT("&Move") ); //Menu.Append( POPUP_SELECTED_PARTICLE_ROTATE, wxT("&Rotate") ); } break; } } break; case CToolData::EM_PLAY: break; case CToolData::EM_FREE_TIME: break; } PopupMenu( &Menu, iXPos, iYPos ); } void cwxRenderPanel::OnSelectedActorMove( wxCommandEvent& MenuEvent ) { m_iNowMode = RP_EM_ACTOR_MOVE; m_pRenderer->SetActorAlpha( m_pRenderer->GetSelectedObjectName(), 0.5f ); } void cwxRenderPanel::OnSelectedActorRotate( wxCommandEvent& MenuEvent ) { m_iNowMode = RP_EM_ACTOR_ROTATE; m_pRenderer->SetActorAlpha( m_pRenderer->GetSelectedObjectName(), 0.5f ); //m_pRenderer->ShowActorRotate( ); //m_pRenderer->SetActorAlpha( m_pRenderer ); } void cwxRenderPanel::OnSelectedParticleMove( wxCommandEvent& MenuEvent ) { m_iNowMode = RP_EM_PARTICLE_MOVE; } void cwxRenderPanel::OnSelectedParticleRotate( wxCommandEvent& MenuEvent ) { m_iNowMode = RP_EM_PARTICLE_ROTATE; } void cwxRenderPanel::OnSelectedParticleUnSelect( wxCommandEvent& MenuEvent ) { m_iNowMode = RP_EM_COUNT; m_pRenderer->UnSelectObject(); } void cwxRenderPanel::ToggleCamMode( bool bEditCameraOnPlay ) { m_pRenderer->ToggleCamMode( bEditCameraOnPlay ); } void cwxRenderPanel::ToggleShowSpotPos( bool bShowSpotPos ) { m_pRenderer->ToggleShowSpotPos( bShowSpotPos ); } void cwxRenderPanel::ToggleRenderFog( bool bRenderFog ) { m_pRenderer->SetRenderFog( bRenderFog ); } void cwxRenderPanel::ToggleLetterBox( bool bToggleLetterBox ) { m_pRenderer->ToggleLetterBox( bToggleLetterBox ); } void cwxRenderPanel::ToggleWeapon( bool bToggleWeapon ) // bintitle. { m_pRenderer->ToggleWeapon( bToggleWeapon ); } void cwxRenderPanel::CommandPerformed( ICommand* pCommand ) { switch( pCommand->GetTypeID() ) { case CMD_UPDATE_VIEW: case CMD_REGISTER_RES: case CMD_UNREGISTER_RES: case CMD_ACTOR_PROP_CHANGE: case CMD_ACTION_PROP_CHANGE: m_pRenderer->UpdateRenderObject(); break; case CMD_CHANGE_ACTOR_RES: { CChangeActorRes* pActorResChange = static_cast( pCommand ); if( pCommand->IsUndo() ) m_pRenderer->ChangeActor( pActorResChange->GetNewActorName(), pActorResChange->GetOldActorResName() ); else m_pRenderer->ChangeActor( pActorResChange->GetOldActorName(), pActorResChange->GetNewActorResName() ); } break; case CMD_EVENT_PROP_CHANGE: { m_pRenderer->UpdateSelectedObject(); //CEventPropChange* pEventPropChange = static_cast(pCommand); // //if( false == pEventPropChange->m_bUndo ) //{ // if( m_pRenderer->GetSelectedObjectID() == pEventPropChange->m_pNewEventInfo->iID ) // m_pRenderer->UpdateSelectedObject(); //} //else //{ //} } break; case CMD_REMOVE_EVENT: { CEventRemoveCmd* pEventRemove = static_cast(pCommand); if( m_pRenderer->GetSelectedObjectID() == pEventRemove->m_iEventIDToRemove ) m_pRenderer->UnSelectObject(); } break; } }