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

📄 flyrenderview.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
// flyRenderView.cpp : implementation file
//

#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

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

int anim_framerate=10;
int drawflag=0;
float zoom=100;

/////////////////////////////////////////////////////////////////////////////
// CFlyRenderView

IMPLEMENT_DYNCREATE(CFlyRenderView, CView)

CFlyRenderView::CFlyRenderView()
{
	timer=0;
	render_type=0;
	rv=this;
	rot.load_identity();
	flag=0;
	mouse=0;
}

CFlyRenderView::~CFlyRenderView()
{
	rv=0;
}

BEGIN_MESSAGE_MAP(CFlyRenderView, CView)
	//{{AFX_MSG_MAP(CFlyRenderView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_MOUSEWHEEL()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFlyRenderView drawing

void CFlyRenderView::OnDraw(CDC* pDC)
{
	CListCtrl& list=lv->GetListCtrl();
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD type=tree.GetItemData(item);

	switch(type)
	{
	case TREE_TYPE_TEXTURES:
		{
		POSITION pos=list.GetFirstSelectedItemPosition();
		if (pos==0)
			break;
		int i=list.GetNextSelectedItem(pos);
		if (flyengine->piclib[i]->buf)
			DrawPicture(pDC,flyengine->piclib[i]->buf[0],flyengine->piclib[i]->sx,flyengine->piclib[i]->sy,flyengine->piclib[i]->bytespixel);
		}
		break;
	case TREE_TYPE_OBJECTS:
		{
		POSITION pos=list.GetFirstSelectedItemPosition();
		if (pos==0)
			break;
		int i=list.GetNextSelectedItem(pos);
		char buf[255];
		list.GetItemText(i,0,buf,255);
		DrawObject(buf);
		}
		break;
	case TREE_TYPE_LIGHTMAPS:
		{
		POSITION pos=list.GetFirstSelectedItemPosition();
		if (pos==0)
			break;
		int i=list.GetNextSelectedItem(pos);
		DrawPicture(pDC,flyengine->lmpic[i]->bmp,flyengine->lmpic[i]->sizex,flyengine->lmpic[i]->sizey,3);
		}
		break;
	case TREE_TYPE_SOUNDS:
		break;

	default:
		if (active_mode)
		{
			if (drawflag && type>255)
				DrawObject(active_sel);
			else
			if (rend) 
				rend->DrawView();
		}
		else
		{
			if (drawflag && type>255)
				DrawObject((bsp_object *)type);
			else
			if (rend) 
				rend->DrawView();
		}
		break;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CFlyRenderView diagnostics

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

#ifdef _DEBUG
void CFlyRenderView::AssertValid() const
{
	CView::AssertValid();
}

void CFlyRenderView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFlyRenderView message handlers

int CFlyRenderView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	return 0;
}

void CFlyRenderView::OnDestroy() 
{
	CView::OnDestroy();

	if (timer)
		{
		KillTimer(rv->timer);
		timer=0;
		}
	
	GetDocument()->close_texture_cache();
	free_render();
}

void CFlyRenderView::OnTimer(UINT nIDEvent) 
{
	CListCtrl& list=lv->GetListCtrl();
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	DWORD type=0;
	if (item!=0) 
		type=tree.GetItemData(item);

	if (type==TREE_TYPE_OBJECTS)
	{
		if (rend) Invalidate(0);
	}
	else
	if (type==TREE_TYPE_TEXTURES ||
		type==TREE_TYPE_LIGHTMAPS ||
		type==TREE_TYPE_SOUNDS)
		;
	else
	{
		flyengine->step();
	
		if (active_mode)
			lv->update_param_list();
	
		if (rend)
			Invalidate(0);
	}
	
	CView::OnTimer(nIDEvent);
}

BOOL CFlyRenderView::OnEraseBkgnd(CDC* pDC) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return CView::OnEraseBkgnd(pDC);
	DWORD type=tree.GetItemData(item);
	if (rend==0 || 
		type==TREE_TYPE_TEXTURES ||
		type==TREE_TYPE_LIGHTMAPS ||
		type==TREE_TYPE_OBJECTS ||
		type==TREE_TYPE_SOUNDS)
		return CView::OnEraseBkgnd(pDC);
	else return 1;
}

void CFlyRenderView::DrawObject(char *name)
{
	if (rend==0) return;
	
	mesh *o=(mesh *)flyengine->get_model_object(name);
	if (o==0) return;

	if (timer==1 && strstr(o->name,".fao"))
		{
		int anim_time=((anim_mesh *)o)->nframes*1000/anim_framerate;
		((anim_mesh *)o)->set_key((timeGetTime()%anim_time)/(float)anim_time);
		}

	float dist=(o->bbox.max-o->bbox.min).length();
	o->color.vec(1,1,1,1);

	glClearColor(1,1,1,1);
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	gluPerspective( flyengine->camangle, flyengine->aspect, flyengine->viewmindist, flyengine->viewmaxdist);
	glMatrixMode( GL_MODELVIEW );
	glLoadIdentity();
	glTranslatef(0,0,-dist-zoom);
	glMultMatrixf((float *)&rot.m);
	
	o->draw();

	glFinish();
	SwapBuffers(((renderGL *)rend)->hdc);
}

void CFlyRenderView::DrawObject(bsp_object *obj)
{
	if (rend==0) return;

	glClearColor(1,1,1,1);
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	if (obj)
		{
		glMatrixMode( GL_PROJECTION );
		glLoadIdentity();
		gluPerspective( flyengine->camangle, flyengine->aspect, flyengine->viewmindist, flyengine->viewmaxdist);
		glMatrixMode( GL_MODELVIEW );
		glLoadIdentity();
		glTranslatef(0,0,-zoom);
		glMultMatrixf((float *)&rot.m);
		glTranslatef(-obj->pos.x,-obj->pos.y,-obj->pos.z);
		obj->draw();
		}

	glFinish();
	SwapBuffers(((renderGL *)rend)->hdc);
}

void CFlyRenderView::DrawPicture(CDC* pDC,unsigned char *buf,int sx,int sy,int bytespixel)
{
	struct tagBITMAPINFO bmi;
	memset(&bmi,0,sizeof(bmi));

	bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biCompression=BI_RGB;
	bmi.bmiHeader.biXPelsPerMeter=6000;
	bmi.bmiHeader.biYPelsPerMeter=6000;
	bmi.bmiHeader.biClrUsed=0;
	bmi.bmiHeader.biClrImportant=0;
	bmi.bmiHeader.biSizeImage=0;
	bmi.bmiHeader.biWidth=sx;
	bmi.bmiHeader.biHeight=sy;
	bmi.bmiHeader.biPlanes=1;
	bmi.bmiHeader.biBitCount=bytespixel*8;

	int i,j,tx=sx*bytespixel;
	if (tx%4) tx+=(4-tx%4);
	unsigned char *buf2=new unsigned char[tx*sy],*c,cc;
	for( i=0;i<sy;i++ )
		{
		c=&buf2[tx*(sy-i-1)];
		memcpy(c,&buf[i*sx*bytespixel],sx*bytespixel);
		for( j=0;j<sx;j++,c+=bytespixel )
			{
			cc=c[2];
			c[2]=c[0];
			c[0]=cc;
			}
		}

	if (flag%2)
		{
		RECT rect;
		GetClientRect(&rect);
		StretchDIBits(pDC->m_hDC,0,0,rect.right,rect.bottom,0,0,sx,sy,buf2,&bmi,DIB_RGB_COLORS,SRCCOPY);
		}
	else StretchDIBits(pDC->m_hDC,0,0,sx,sy,0,0,sx,sy,buf2,&bmi,DIB_RGB_COLORS,SRCCOPY);

	delete buf2;
}

void CFlyRenderView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD type=tree.GetItemData(item);
	if (type==TREE_TYPE_TEXTURES ||
		type==TREE_TYPE_LIGHTMAPS)
		{
		flag++;
		Invalidate(1);
		}
	else if (mouse==0 && 
			(type==TREE_TYPE_OBJECTS || (drawflag && type>255)))
	{
		mouse=1;
		mousepoint=point;
		SetCapture();
	}
	
	CView::OnLButtonDown(nFlags, point);
}

void CFlyRenderView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	flyengine->noinput=(bActivate==0);
	CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}

void CFlyRenderView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);

	if (rend)
		rend->ResizeView(cx,cy);
}

void CFlyRenderView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if (mouse)
	{
		mouse=0;
		ReleaseCapture();
	}
	CView::OnLButtonUp(nFlags, point);
}

void CFlyRenderView::OnMouseMove(UINT nFlags, CPoint point) 
{
	if (mouse==1)
	{
		vector x(rot.m[0][0],rot.m[1][0],rot.m[2][0]);
		vector y(rot.m[0][1],rot.m[1][1],rot.m[2][1]);
		x.normalize();
		y.normalize();
		mat4x4 r;
		r.load_identity();
		r.rotate((point.x-mousepoint.x)*0.5f,y);
		r.rotate((point.y-mousepoint.y)*0.5f,x);
		rot=r*rot;
		mousepoint=point;
		Invalidate(0);
	}
	else if (mouse==2)
	{
		zoom+=(point.x-mousepoint.x)+(point.y-mousepoint.y);
		mousepoint=point;
		Invalidate(0);
	}

	CView::OnMouseMove(nFlags, point);
}


BOOL CFlyRenderView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	zoom-=zDelta*0.1f;	
	if (zoom<10)
		zoom=10;
	else if (zoom>flyengine->viewmaxdist)
			zoom=flyengine->viewmaxdist;
	Invalidate(0);
	return CView::OnMouseWheel(nFlags, zDelta, pt);
}

void CFlyRenderView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD type=tree.GetItemData(item);
	if (mouse==0 && 
		(type==TREE_TYPE_OBJECTS || (drawflag && type>255)))	
	{
		mouse=2;
		mousepoint=point;
		SetCapture();
	}
	
	CView::OnRButtonDown(nFlags, point);
}

void CFlyRenderView::OnRButtonUp(UINT nFlags, CPoint point) 
{
	if (mouse)
	{
		mouse=0;
		ReleaseCapture();
	}
	
	CView::OnRButtonUp(nFlags, point);
}

⌨️ 快捷键说明

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