⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leftview.cpp

📁 <B>《Realtime Rendering》的随书源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// LeftView.cpp : implementation of the CLeftView class
//

#include "stdafx.h"
#include "flyEditor.h"
#include "flyEditorDoc.h"
#include "flyEditorView.h"
#include "flyRenderView.h"
#include "LeftView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CFlyRenderView *rv;
extern CFlyEditorView *lv;
extern int active_mode;
extern bsp_object *active_sel;
CLeftView *tv=0;

/////////////////////////////////////////////////////////////////////////////
// CLeftView

IMPLEMENT_DYNCREATE(CLeftView, CTreeView)

BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
	//{{AFX_MSG_MAP(CLeftView)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit)
	ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
	ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
	ON_COMMAND(ID_EDIT_INSERT, OnEditInsert)
	ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
	ON_UPDATE_COMMAND_UI(ID_EDIT_INSERT, OnUpdateEditInsert)
	ON_COMMAND(ID_EDIT_RENAME, OnEditRename)
	ON_UPDATE_COMMAND_UI(ID_EDIT_RENAME, OnUpdateEditRename)
	ON_UPDATE_COMMAND_UI(ID_DOWN, OnUpdateDown)
	ON_COMMAND(ID_DOWN, OnDown)
	ON_UPDATE_COMMAND_UI(ID_UP, OnUpdateUp)
	ON_COMMAND(ID_UP, OnUp)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
	ON_COMMAND(ID_EDIT_DUPLICATE, OnEditDuplicate)
	ON_UPDATE_COMMAND_UI(ID_EDIT_DUPLICATE, OnUpdateEditDuplicate)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLeftView construction/destruction

CLeftView::CLeftView()
{
	tv=this;
}

CLeftView::~CLeftView()
{
	tv=0;
}

BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CTreeView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing

void CLeftView::OnDraw(CDC* pDC)
{
	CFlyEditorDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
}

void CLeftView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics

#ifdef _DEBUG
void CLeftView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CLeftView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

CFlyEditorDoc* CLeftView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFlyEditorDoc)));
	return (CFlyEditorDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers

void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	if (pResult) *pResult = 0;

	int i,j;
	char buf[256];

	CFlyEditorDoc *doc=GetDocument();

	CListCtrl& list=lv->GetListCtrl();
	
	list.DeleteAllItems();
	list.ModifyStyle(0,LVS_SHOWSELALWAYS);

	for( i=0;i<lv->ncol;i++ )
	{
	lv->colsizes[i]=list.GetColumnWidth(0);
	list.DeleteColumn(0);
	}
	lv->ncol=0;

	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD type=tree.GetItemData(item);

	GetDocument()->find_active();
	if (type>255)
		{
		bsp_object *o;
		if (active_mode)
			o=active_sel;
		else 
			o=(bsp_object *)type;
		lv->set_param_list(o);
		}
	else
	switch(type)
	{
	case TREE_TYPE_TEXTURES:
		list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
		list.InsertColumn( 1, "Size", LVCFMT_LEFT, lv->colsizes[1],0 );
		lv->ncol=2;
		for( i=0;i<doc->npiclib;i++ )
			{
			list.InsertItem(i,doc->piclib[i]->name);
			sprintf(buf,"%ix%ix%i",doc->piclib[i]->sx,doc->piclib[i]->sy,doc->piclib[i]->bytespixel*8);
			list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
			}
		break;
	case TREE_TYPE_LIGHTMAPS:
		list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
		list.InsertColumn( 1, "Size", LVCFMT_LEFT, lv->colsizes[1],0 );
		lv->ncol=2;
		for( i=0;i<doc->nlmpic;i++ )
			{
			sprintf(buf,"lightmap%i",i);
			list.InsertItem(i,buf);
			sprintf(buf,"%ix%ix%i",doc->lmpic[i]->sizex,doc->lmpic[i]->sizey,24);
			list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
			}
		break;
	case TREE_TYPE_OBJECTS:
		{
		list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
		list.InsertColumn( 1, "nvert", LVCFMT_LEFT, lv->colsizes[1],0 );
		list.InsertColumn( 2, "nface", LVCFMT_LEFT, lv->colsizes[2],0 );
		lv->ncol=3;
		mesh *o=doc->model_obj0;
		i=0;
		while(o)
			{
			list.InsertItem(i,o->name);
			sprintf(buf,"%i",o->nv);
			list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
			sprintf(buf,"%i",o->nf);
			list.SetItem(i,2,LVIF_TEXT,buf,0,0,0,0);
			i++;
			o=(mesh *)o->next_obj;
			}
		}
		break;
	case TREE_TYPE_SOUNDS:
		{
		list.InsertColumn( 0, "File", LVCFMT_LEFT, lv->colsizes[0],0 );
		list.InsertColumn( 1, "Length", LVCFMT_LEFT, lv->colsizes[1],0 );
		list.InsertColumn( 2, "Format", LVCFMT_LEFT, lv->colsizes[2],0 );
		lv->ncol=3;
		sound *s=doc->sound_obj0;
		i=0;
		while(s)
			{
			char *c=strrchr(s->name,'.');
			if (c && (c[1]=='w'||c[1]=='W') && (c[2]=='a'||c[2]=='A') && (c[3]=='v'||c[3]=='V'))
				{
				list.InsertItem(i,s->name);
				sprintf(buf,"%ims",s->total_time);
				list.SetItem(i,1,LVIF_TEXT,buf,0,0,0,0);
				if (s->buf[0])
					{
					WAVEFORMATEX format;
					DWORD d;
					s->buf[0]->GetFormat(&format,sizeof(format),&d);
					sprintf(buf,"%ix%ix%i",(int)format.nSamplesPerSec,(int)format.wBitsPerSample,(int)format.nChannels);
					list.SetItem(i,2,LVIF_TEXT,buf,0,0,0,0);
					}
				i++;
				}
			s=(sound *)s->next_obj;
			}
		}
		break;
	case TREE_TYPE_GLOBAL:
		lv->reset_param_list();	
		i=flyengine->get_global_param_desc(0,0);
		for( j=0;j<i;j++ )
			{
			flyengine->get_global_param_desc(j,&lv->pd[j]);
			lv->insert_param(lv->pd[j].name,lv->pd[j].type,lv->pd[j].data);
			}
		lv->fill_param_list();
		break;
	}

	if (active_mode)
		GetDocument()->find_active();

	rv->Invalidate(0);
}

void CLeftView::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

	CTreeCtrl& tree=GetTreeCtrl();
	DWORD type=tree.GetItemData(pTVDispInfo->item.hItem);

	if (type>255)
		{
		CEdit *edit=tree.GetEditControl();
		edit->SetLimitText(30);
		*pResult = 0;
		}
	else
		*pResult = 1;
}

void CLeftView::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;

	if (pTVDispInfo->item.pszText && pTVDispInfo->item.pszText[0] && pTVDispInfo->item.pszText[0]!=' ')
	{
	CTreeCtrl& tree=GetTreeCtrl();
	bsp_object *o=(bsp_object *)tree.GetItemData(pTVDispInfo->item.hItem);

	strcpy(o->long_name,pTVDispInfo->item.pszText);
	char *c;
	while( c=strchr(o->long_name,' ') )
		*c='_';
	bsp_object *obj=flyengine->active_obj0;
	while(obj)
		{
		if (obj->source==o)
			strcpy(obj->long_name,o->long_name);
		obj=(bsp_object *)obj->next_obj;
		}

	tree.SetItemText(pTVDispInfo->item.hItem,o->long_name);
	GetDocument()->SetModifiedFlag();
	}

	*pResult = 0;
}

void CLeftView::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
	if (pResult) 
		*pResult = 0;

	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD type=tree.GetItemData(item);
	char str[256];
	
	switch(pTVKeyDown->wVKey)
	{
	case VK_DELETE:
		if (type>255)
			{
			bsp_object *o=(bsp_object *)type;
			sprintf(str,"Delete object class '%s' and all active instances and references ?",o->long_name);
			HTREEITEM item2=tree.GetParentItem(item);
			if (IDYES==AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION))
				{
				GetDocument()->dll.delete_class(o);
				tree.DeleteItem(item);
				GetDocument()->SetModifiedFlag();
				if (tree.ItemHasChildren(item2)==0)
					tree.SetItemImage(item2,0,0);
				}
			}
		else if (type==TREE_TYPE_DLLS)
			{
			CString s=tree.GetItemText(item);
			sprintf(str,"Delete plugin '%s' and all it's stock and active classes ?",(char *)(LPCSTR)s);
			HTREEITEM item2=tree.GetParentItem(item);
			if (IDYES==AfxMessageBox(str,MB_YESNO|MB_ICONQUESTION))
				{
				GetDocument()->dll.delete_dll((char *)(LPCSTR)s);
				tree.DeleteItem(item);
				GetDocument()->SetModifiedFlag();
				if (tree.ItemHasChildren(item2)==0)
					tree.SetItemImage(item2,0,0);
				}
			}
		rv->Invalidate(0);
		break;
	case VK_INSERT:
		if (flyengine->flydatapath[0]==0)
			AfxMessageBox("You must save the fly file before including new objects.",MB_OK|MB_ICONINFORMATION);
		else
		if (type==TREE_TYPE_OBJECTS)
		{
		char file[256];
		strcpy(file,flyengine->flydatapath);
		strcat(file,"objects\\");
		strcat(file,"*.3ds;*.fao");
		char *c=lv->edit_files("","All object files (*.3ds;*.fao)|*.3ds;*.fao|3dstudio object files (*.3ds)|*.3ds|Fly animated object files (*.fao)|*.fao||",file);
		if (c)
			{
			flyengine->get_model_object(c);
			OnSelchanged(0,0);
			}
		}
		else
		if (type==TREE_TYPE_TEXTURES)
		{
		char file[256];
		strcpy(file,flyengine->flydatapath);
		strcat(file,"maps\\");
		strcat(file,"*.jpg;*.tga");
		char *c=lv->edit_files("","All image files (*.jpg;*.tga)|*.jpg;*.tga|TGA image files (*.tga)|*.tga|JPG image files (*.jpg)|*.jpg||",file);
		if (c)
			{
			flyengine->get_picture(c);
			flyengine->close_texture_cache();
			flyengine->init_texture_cache();
			OnSelchanged(0,0);
			}
		}
		else
		if (type==TREE_TYPE_PLUGINS)
		{
			char str[256];
			strcpy(str,flyengine->flysdkpath);
			strcat(str,"plugin\\*.dll");
			char *file=lv->edit_files("dll","Fly plugin dll files (*.dll)|*.dll||",str);
			if (file)
			{
				int c=flyengine->dll.ncd,i;
				int dll=flyengine->dll.add_dll(file);
				if (dll!=-1)
				{
					flyengine->dll.load_classes(dll,0);
					HTREEITEM item2,item3;
					item2=tree.GetChildItem(item);
					if (item2==0)
						item3=tree.InsertItem(file,item);
					else 
						{
						while( item3=tree.GetNextSiblingItem(item2) )
							item2=item3;
						item3=tree.InsertItem(file,item,item2);
						}
					tree.SetItemData(item3,TREE_TYPE_DLLS);
					tree.SetItemImage(item3,TREE_TYPE_DLLS*2,TREE_TYPE_DLLS*2+1);
					for( i=c;i<flyengine->dll.ncd;i++ )
						{
						item2=tree.InsertItem(flyengine->dll.cd[i]->get_name(),item3);
						tree.SetItemData(item2,TREE_TYPE_STOCK);
						tree.SetItemImage(item2,TREE_TYPE_STOCK*2,TREE_TYPE_STOCK*2+1);
						}
					tree.EnsureVisible(item3);
					tree.SelectItem(item3);
					tree.Expand(item3,TVE_EXPAND);
					GetDocument()->SetModifiedFlag();
				}
			}
		}
		else if (type==TREE_TYPE_STOCK)
		{
			CString s=tree.GetItemText(item);
			bsp_object *o=flyengine->dll.add_class((char *)(LPCSTR)s);
			if (o)
				{
				static int count=1;
				sprintf(str,"new %s %i",(char *)(LPCSTR)s,count++);
				HTREEITEM item2,item3;
				item2=tree.GetChildItem(item);
				if (item2==0)
					item3=tree.InsertItem(str,item);
				else 
					{
					while( item3=tree.GetNextSiblingItem(item2) )
						item2=item3;
					item3=tree.InsertItem(str,item,item2);
					}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -