DragonNest/Client/EtWorldPainter/EnviLightPaneView.cpp

408 lines
12 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// EnviLightPaneView.cpp : implementation file
//
#include "stdafx.h"
#include "EtWorldPainter.h"
#include "EnviLightPaneView.h"
#include "UserMessage.h"
#include "EnviLightBase.h"
#include "EnviControl.h"
#include "RenderBase.h"
#include "FileServer.h"
// CEnviLightPaneView
IMPLEMENT_DYNCREATE(CEnviLightPaneView, CFormView)
CEnviLightPaneView::CEnviLightPaneView()
: CFormView(CEnviLightPaneView::IDD)
{
m_bActivate = false;
m_pContextMenu = new CMenu;
m_pContextMenu->LoadMenu( IDR_CONTEXTMENU );
m_hRoot = NULL;
m_nDirCount = 1;
m_nSpotCount = 1;
m_nPointCount = 1;
}
CEnviLightPaneView::~CEnviLightPaneView()
{
CEnviLightBase::Reset();
ResetPropertyGrid();
SAFE_DELETE( m_pContextMenu );
}
void CEnviLightPaneView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_Tree);
}
BEGIN_MESSAGE_MAP(CEnviLightPaneView, CFormView)
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_MESSAGE( UM_REFRESH_PANE_VIEW, OnRefresh )
ON_MESSAGE( XTPWM_PROPERTYGRID_NOTIFY, OnNotifyGrid )
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CEnviLightPaneView::OnTvnSelchangedTree1)
ON_COMMAND(ID_ENVILIGHT_ADDDIRECTIONLIGHT, &CEnviLightPaneView::OnEnvilightAdddirectionlight)
ON_COMMAND(ID_ENVILIGHT_ADDPOINTLIGHT, &CEnviLightPaneView::OnEnvilightAddpointlight)
ON_COMMAND(ID_ENVILIGHT_ADDSPOTLIGHT, &CEnviLightPaneView::OnEnvilightAddspotlight)
ON_COMMAND(ID_ENVILIGHT_REMOVELIGHT, &CEnviLightPaneView::OnEnvilightRemovelight)
ON_MESSAGE( UM_PROPERTY_PANE_SET_MODIFY, OnSetModify )
ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()
// CEnviLightPaneView diagnostics
#ifdef _DEBUG
void CEnviLightPaneView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CEnviLightPaneView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
// CEnviLightPaneView message handlers
void CEnviLightPaneView::OnInitialUpdate()
{
__super::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if( m_bActivate == true ) return;
m_bActivate = true;
CRect rcRect;
GetClientRect( &rcRect );
m_PropertyGrid.Create( rcRect, this, 0 );
m_PropertyGrid.SetCustomColors( RGB(200, 200, 200), 0, RGB(182, 210, 189), RGB(247, 243, 233), 0);
CBitmap bitmap;
bitmap.LoadBitmap( IDB_ENVIICON );
m_ImageList.Create( 16, 16, ILC_COLOR24|ILC_MASK, 4, 1 );
m_ImageList.Add( &bitmap, RGB(0,255,0) );
m_Tree.EnableMultiSelect();
m_Tree.DeleteAllItems();
m_Tree.SetImageList( &m_ImageList, TVSIL_NORMAL );
CEnviLightBase::Reset();
m_hRoot = m_Tree.InsertItem( "Light Folder", 2, 3 );
SendMessage( UM_REFRESH_PANE_VIEW );
}
void CEnviLightPaneView::OnSize(UINT nType, int cx, int cy)
{
__super::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if( m_Tree ) {
m_Tree.SetWindowPos( NULL, 0, 0, cx, cy / 2, SWP_FRAMECHANGED );
}
if( m_PropertyGrid ) {
m_PropertyGrid.SetWindowPos( NULL, 0, cy/2, cx, cy, SWP_FRAMECHANGED );
}
}
BOOL CEnviLightPaneView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
}
LRESULT CEnviLightPaneView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
if( !m_PropertyGrid ) return S_OK;
ResetPropertyGrid();
// RefreshPropertyGrid( g_EnviPropertyDefine );
m_Tree.DeleteAllItems();
m_Tree.SetImageList( &m_ImageList, TVSIL_NORMAL );
CEnviLightBase::Reset();
m_hRoot = m_Tree.InsertItem( "Light Folder", 2, 3 );
m_nDirCount = 1;
m_nSpotCount = 1;
m_nPointCount = 1;
CEnviElement *pElement = CEnviControl::GetInstance().GetActiveElement();
if( pElement ) {
SLightInfo *pInfo;
CString szLightName;
for( DWORD i=0; i<pElement->GetInfo().GetLightCount(); i++ ) {
pInfo = pElement->GetInfo().GetLight(i)->pInfo;
szLightName.Empty();
switch( pInfo->Type ) {
case LT_DIRECTIONAL:
szLightName.Format( "Direction Light - %02d", m_nDirCount );
m_nDirCount++;
break;
case LT_POINT:
szLightName.Format( "Point Light - %02d", m_nPointCount );
m_nPointCount++;
break;
case LT_SPOT:
szLightName.Format( "Spot Light - %02d", m_nSpotCount );
m_nSpotCount++;
break;
}
HTREEITEM hItem = m_Tree.InsertItem( szLightName, 0, 1, m_hRoot );
CEnviLightBase::AddLight( hItem, pElement, i );
}
}
m_Tree.Expand( m_hRoot, TVE_EXPAND );
CRenderBase::GetInstance().InitializeEnviLight( pElement );
CRenderBase::GetInstance().InitializeEnviLensFlare( pElement );
CGlobalValue::GetInstance().RefreshRender();
return S_OK;
}
LRESULT CEnviLightPaneView::OnNotifyGrid( WPARAM wParam, LPARAM lParam )
{
return ProcessNotifyGrid( wParam, lParam );
}
void CEnviLightPaneView::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
CalcSelectItemList();
CEnviLightBase::s_pFocus = NULL;
ResetPropertyGrid();
if( m_SelectItemList.GetCount() == 1 ) {
CEnviLightBase *pBase = CEnviLightBase::FindLight( m_SelectItemList.GetHead() );
if( pBase ) {
pBase->SetFocus( true );
RefreshPropertyGrid( pBase->GetPropertyDefine() );
}
}
CGlobalValue::GetInstance().RefreshRender();
*pResult = 0;
}
void CEnviLightPaneView::CalcSelectItemList()
{
m_SelectItemList.RemoveAll();
m_Tree.GetSelectedList( m_SelectItemList );
}
void CEnviLightPaneView::OnSetValue( CUnionValueProperty *pVariable, DWORD dwIndex )
{
CalcSelectItemList();
if( m_SelectItemList.GetCount() == 1 ) {
CEnviLightBase *pBase = CEnviLightBase::FindLight( m_SelectItemList.GetHead() );
pBase->OnSetValue( pVariable, dwIndex );
}
}
void CEnviLightPaneView::OnChangeValue( CUnionValueProperty *pVariable, DWORD dwIndex )
{
CalcSelectItemList();
if( m_SelectItemList.GetCount() == 1 ) {
CEnviLightBase *pBase = CEnviLightBase::FindLight( m_SelectItemList.GetHead() );
pBase->OnChangeValue( pVariable, dwIndex );
CRenderBase::GetInstance().InitializeEnviLight( pBase->GetElement(), false );
CRenderBase::GetInstance().InitializeEnviLensFlare( pBase->GetElement(), false );
CGlobalValue::GetInstance().RefreshRender();
}
}
void CEnviLightPaneView::OnEnvilightAdddirectionlight()
{
CEnviElement *pElement = CEnviControl::GetInstance().GetActiveElement();
if( !pElement ) return;
SLightInfo LightInfo;
LightInfo.Type = LT_DIRECTIONAL;
LightInfo.Diffuse = EtColor( 0.5f, 0.5f, 0.5f, 1.f );
LightInfo.Specular = EtColor( 1.f, 1.f, 1.f, 1.f );
LightInfo.Direction = EtVector3( -1.f, -1.f, -1.f );
EtVec3Normalize( &LightInfo.Direction, &LightInfo.Direction );
CString szLightName;
szLightName.Format( "Direction Light - %02d", m_nDirCount );
HTREEITEM hItem = m_Tree.InsertItem( szLightName, 0, 1, m_hRoot );
pElement->GetInfo().AddLight( LightInfo );
CEnviLightBase::AddLight( hItem, pElement, pElement->GetInfo().GetLightCount() - 1 );
m_Tree.Expand( m_hRoot, TVE_EXPAND );
m_Tree.SelectItems( hItem, hItem, TRUE );
m_Tree.FocusItem( hItem );
CRenderBase::GetInstance().InitializeEnviLight( pElement, true );
CRenderBase::GetInstance().InitializeEnviLensFlare( pElement, true );
CGlobalValue::GetInstance().RefreshRender();
}
void CEnviLightPaneView::OnEnvilightAddpointlight()
{
// TODO: Add your command handler code here
CEnviElement *pElement = CEnviControl::GetInstance().GetActiveElement();
if( !pElement ) return;
MatrixEx *pCamera = CRenderBase::GetInstance().GetLastUpdateCamera();
SLightInfo LightInfo;
LightInfo.Type = LT_POINT;
LightInfo.Diffuse = EtColor( 0.5f, 0.5f, 0.5f, 1.f );
LightInfo.Specular = EtColor( 1.f, 1.f, 1.f, 1.f );
LightInfo.Position = pCamera->m_vPosition + ( pCamera->m_vZAxis * 500.f );
LightInfo.fRange = 1000.f;
CString szLightName;
szLightName.Format( "Point Light - %02d", m_nPointCount );
HTREEITEM hItem = m_Tree.InsertItem( szLightName, 0, 1, m_hRoot );
pElement->GetInfo().AddLight( LightInfo );
CEnviLightBase::AddLight( hItem, pElement, pElement->GetInfo().GetLightCount() - 1 );
m_Tree.Expand( m_hRoot, TVE_EXPAND );
m_Tree.SelectItems( hItem, hItem, TRUE );
m_Tree.FocusItem( hItem );
CRenderBase::GetInstance().InitializeEnviLight( pElement, true );
CRenderBase::GetInstance().InitializeEnviLensFlare( pElement, true );
CGlobalValue::GetInstance().RefreshRender();
}
void CEnviLightPaneView::OnEnvilightAddspotlight()
{
// TODO: Add your command handler code here
CEnviElement *pElement = CEnviControl::GetInstance().GetActiveElement();
if( !pElement ) return;
MatrixEx *pCamera = CRenderBase::GetInstance().GetLastUpdateCamera();
SLightInfo LightInfo;
LightInfo.Type = LT_SPOT;
LightInfo.Diffuse = EtColor( 0.5f, 0.5f, 0.5f, 1.f );
LightInfo.Specular = EtColor( 1.f, 1.f, 1.f, 1.f );
LightInfo.Position = pCamera->m_vPosition + ( pCamera->m_vZAxis * 500.f );
LightInfo.Direction = pCamera->m_vZAxis;
LightInfo.fTheta = cos( EtToRadian( 15.0f ) );
LightInfo.fPhi = cos( EtToRadian( 30.0f ) );
EtVec3Normalize( &LightInfo.Direction, &LightInfo.Direction );
CString szLightName;
szLightName.Format( "Spot Light - %02d", m_nSpotCount );
HTREEITEM hItem = m_Tree.InsertItem( szLightName, 0, 1, m_hRoot );
pElement->GetInfo().AddLight( LightInfo );
CEnviLightBase::AddLight( hItem, pElement, pElement->GetInfo().GetLightCount() - 1 );
m_Tree.Expand( m_hRoot, TVE_EXPAND );
m_Tree.SelectItems( hItem, hItem, TRUE );
m_Tree.FocusItem( hItem );
CRenderBase::GetInstance().InitializeEnviLight( pElement, true );
CRenderBase::GetInstance().InitializeEnviLensFlare( pElement, true );
CGlobalValue::GetInstance().RefreshRender();
}
void CEnviLightPaneView::OnEnvilightRemovelight()
{
// TODO: Add your command handler code here
CEnviElement *pElement = CEnviControl::GetInstance().GetActiveElement();
if( !pElement ) return;
CalcSelectItemList();
POSITION p = m_SelectItemList.GetHeadPosition();
HTREEITEM hti;
while(p) {
hti = m_SelectItemList.GetNext( p );
CEnviLightBase *pBase = CEnviLightBase::FindLight( hti );
if( !pBase ) continue;
for( DWORD i=0; i<pElement->GetInfo().GetLightCount(); i++ ) {
if( pElement->GetInfo().GetLight(i)->pInfo == pBase->GetLightInfo() ) {
pElement->GetInfo().RemoveLight(i);
break;
}
}
CEnviLightBase::RemoveLight( hti );
m_Tree.DeleteItem( hti );
}
CRenderBase::GetInstance().InitializeEnviLight( pElement, true );
CRenderBase::GetInstance().InitializeEnviLensFlare( pElement, true );
CGlobalValue::GetInstance().RefreshRender();
}
void CEnviLightPaneView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
// TODO: Add your message handler code here
CRect rcRect;
GetClientRect( &rcRect );
// if( !( point.x > rcRect.left && point.x < rcRect.right && point.y > rcRect.top && point.y < rcRect.bottom ) ) return;
CMenu *pMenu = m_pContextMenu->GetSubMenu(3);
if( !CFileServer::GetInstance().IsConnect() ) return;
if( CEnviControl::GetInstance().GetActiveElement() ) {
if( CEnviControl::GetInstance().GetActiveElement()->GetInfo().GetName() == "Edit Set" ) {
pMenu->EnableMenuItem( ID_ENVILIGHT_ADDDIRECTIONLIGHT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_ENVILIGHT_ADDPOINTLIGHT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_ENVILIGHT_ADDSPOTLIGHT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->EnableMenuItem( ID_ENVILIGHT_REMOVELIGHT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
return;
}
}
CalcSelectItemList();
int nSelectCount = (int)m_SelectItemList.GetCount();
if( nSelectCount == 0 ) {
pMenu->EnableMenuItem( ID_ENVILIGHT_REMOVELIGHT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED );
}
else {
pMenu->EnableMenuItem( ID_ENVILIGHT_ADDDIRECTIONLIGHT, MF_BYCOMMAND | MF_ENABLED );
// <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ϴ<EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3>´<EFBFBD>.
pMenu->EnableMenuItem( ID_ENVILIGHT_ADDPOINTLIGHT, MF_BYCOMMAND | MF_ENABLED );
pMenu->EnableMenuItem( ID_ENVILIGHT_ADDSPOTLIGHT, MF_BYCOMMAND | MF_ENABLED );
pMenu->EnableMenuItem( ID_ENVILIGHT_REMOVELIGHT, MF_BYCOMMAND | MF_ENABLED );
}
pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
LRESULT CEnviLightPaneView::OnSetModify( WPARAM wParam, LPARAM lParam )
{
CUnionValueProperty *pVariable = (CUnionValueProperty *)lParam;
if( lParam == NULL )
ModifyItem( wParam, (LPARAM)m_pVecVariable[wParam] );
else ModifyItem( wParam, (LPARAM)lParam );
return S_OK;
}