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

📄 flypvs.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
#include "../../lib/Fly3D.h"
#include "pvsengine.h"
#include "opengl.h"
#include "resource.h"
#include "time.h"

char *szAppName="flyPVS";
int savelog=0;

HDC hdc=0;
HINSTANCE hInstance;
HWND hWndMain;

int sample_count=0,
	cur_side=0,
	cur=-1,
	fail_nodes=0,
	curcount=0;
time_t t1,t2;
short **face_nodes;
char file[256];
char bsp_file_name[256]="";

float VOLUME_FACTOR=1000000.0f;

void DoFrame()
{
	vector v;
	float vol;
	if (curcount==0)
	{
		cur++;
		if (cur>=flyengine->nleaf)
			DestroyWindow(hWndMain);
		else
		if (((pvsEngine *)flyengine)->get_node_random_point(cur,v))
			{
			static_mesh *so=(static_mesh *)flyengine->leaf[cur]->elem;
			v=so->objmesh->bbox.max-so->objmesh->bbox.min;
			vol=v.x*v.y*v.z;
			curcount=(int)(vol/VOLUME_FACTOR)+1;
			}
		else
			fail_nodes++;
	}
	else
	{
		if (((pvsEngine *)flyengine)->get_node_random_point(cur,v))
			{
			((pvsEngine *)flyengine)->sample_node(flyengine->leaf[cur],v);
			sample_count++;
			}
		curcount--;
	}
}

LONG WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	LONG lRet = 1;
	static PAINTSTRUCT ps;
	static RECT rect;

	switch (uMsg) 
	{
	case WM_KEYDOWN:
		if (wParam==VK_LEFT)
			cur_side=(cur_side==0?5:cur_side-1);
		else 
		if (wParam==VK_RIGHT)
			cur_side=((cur_side+1)%6);
		break;
	case WM_CREATE:
		hdc=GetDC(hWnd);
		if (hdc)
			CreateView(hdc);
		InitView();
		SetWindowPos(hWnd,HWND_TOP,0,0,screen_sx,screen_sy,SWP_SHOWWINDOW);
		break;

	case WM_PAINT:
		BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		break;

	case WM_SIZE:
		GetClientRect(hWnd, &rect);
		ResizeView(rect.right,rect.bottom);
		break;

	case WM_ERASEBKGND:
		return 1;

	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;

	case WM_DESTROY:
		DeleteView();
		if (hdc)
			ReleaseDC(hWnd,hdc);
		
		((pvsEngine *)flyengine)->save();

		if(face_nodes)
			{
			for(int i=0;i<flyengine->nfaces;i++)
				delete face_nodes[i];
			delete face_nodes;
			}
		PostQuitMessage(0);
		break;

	default:
		lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
		break;
	}

	return lRet;
}

void MyGetProfile(LPTSTR section, LPTSTR key, LPBYTE lpData, DWORD cbData)
{
	HKEY key1,key2,key3,key4;

	if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,"Software",0,KEY_READ,&key1))
	{
		if (ERROR_SUCCESS==RegOpenKeyEx(key1,"Paralelo",0,KEY_READ,&key2))
		{
			if (ERROR_SUCCESS==RegOpenKeyEx(key2,"Fly3D",0,KEY_READ,&key3))
			{
				if (ERROR_SUCCESS==RegOpenKeyEx(key3,section,0,KEY_READ,&key4))
				{
					RegQueryValueEx(key4, key, 0, 0, lpData, &cbData);
					RegCloseKey(key4);
				}
				RegCloseKey(key3);
			}
			RegCloseKey(key2);
		}
		RegCloseKey(key1);
	}
}

void MyWriteProfile(LPTSTR section, LPCTSTR key, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
{
	HKEY key1,key2,key3,key4;
	DWORD d;

	if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,"Software",0,KEY_READ,&key1))
	{
		if (ERROR_SUCCESS==RegCreateKeyEx(key1,"Paralelo",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key2,&d))
		{
			if (ERROR_SUCCESS==RegCreateKeyEx(key2,"Fly3D",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key3,&d))
			{
				if (ERROR_SUCCESS==RegCreateKeyEx(key3, section,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key4,&d))
				{
					RegSetValueEx(key4, key, 0, dwType, lpData, cbData);
					RegCloseKey(key4);
				}
				RegCloseKey(key3);
			}
			RegCloseKey(key2);
		}
		RegCloseKey(key1);
	}
}

int OpenBspFileDialog(HWND hWnd,char *file)
{
	OPENFILENAME ofn;

	memset(&ofn,0,sizeof(OPENFILENAME));
	char filename[256]="";
	strcpy(filename,file);

	ofn.lStructSize=sizeof(OPENFILENAME);
	ofn.hwndOwner=hWnd;
	ofn.hInstance=hInstance;
	ofn.lpstrFilter="bsp fly file (*.bsp)\0*.bsp\0";
	ofn.lpstrDefExt="bsp";
	ofn.lpstrFile=filename;
	ofn.nMaxFile=255;
	ofn.lpstrTitle="Open Fly Scene";
	ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
	
	if (GetOpenFileName(&ofn))
	{
		strcpy(file,filename);
		if (filename[0])
			return 1;
	}
	return 0;
}

BOOL FAR PASCAL flypvsProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uiMsg)
	{
	case WM_INITDIALOG:
		{
		MyGetProfile("viewbsp","filename", (unsigned char *)&bsp_file_name, 256);
		SetWindowText(GetDlgItem(hWnd,IDC_BSPFILE),bsp_file_name);
		if (bsp_file_name[0]==0)
			EnableWindow(GetDlgItem(hWnd,IDOK),0);
		char str[256];
		double d=pow(VOLUME_FACTOR/1000,1.0/3.0);
		sprintf(str,"%.2lf",d);
		SetDlgItemText(hWnd,IDC_SAMPLESVOLUME,str);
		if (screen_sx==128)
			SendDlgItemMessage(hWnd,IDC_SIZE128,BM_SETCHECK,1,0);
		else
		if (screen_sx==256)
			SendDlgItemMessage(hWnd,IDC_SIZE256,BM_SETCHECK,1,0);
		else SendDlgItemMessage(hWnd,IDC_SIZE64,BM_SETCHECK,1,0);
		CheckDlgButton(hWnd,IDC_SAVETXT,savelog);
		}
		break;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_BROWSE:
			if (OpenBspFileDialog(hWnd,bsp_file_name))
				if (bsp_file_name[0])
				{
					EnableWindow(GetDlgItem(hWnd,IDOK),1);
					SetDlgItemText(hWnd,IDC_BSPFILE,bsp_file_name);
				}
				else EnableWindow(GetDlgItem(hWnd,IDOK),0);
			break;
		case IDOK:
			{
			char str[256];
			float f;
			GetDlgItemText(hWnd,IDC_SAMPLESVOLUME,str,255);
			sscanf(str,"%f",&f);
			VOLUME_FACTOR=f*f*f*1000.0f;
			if (IsDlgButtonChecked(hWnd,IDC_SIZE128))
				screen_sx=screen_sy=128;
			else 
			if (IsDlgButtonChecked(hWnd,IDC_SIZE256))
				screen_sx=screen_sy=256;
			else screen_sx=screen_sy=64;
			savelog=IsDlgButtonChecked(hWnd,IDC_SAVETXT);
			MyWriteProfile("viewbsp","filename", REG_SZ, (unsigned char *)&bsp_file_name, sizeof(char)*strlen(bsp_file_name)+1);
			EndDialog (hWnd, IDOK);
			}
			break;
		case IDCANCEL:
			EndDialog (hWnd, IDCANCEL);
			break;
		}
		break;
	}
	return FALSE;
} 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
	hInstance=hInst;
	
	if (IDCANCEL==DialogBox(hInst,MAKEINTRESOURCE(IDD_FLYPVS),0,(DLGPROC)flypvsProc))
		return 0;

	set_engine(new pvsEngine,0,hInst,FLYAPPID_VIEWBSPGL);
	
	if(((pvsEngine *)flyengine)->opendata(bsp_file_name)==0)
	{
		MessageBox(0, "Could not open scene files!", "ViewBSPgl", MB_OK | MB_ICONEXCLAMATION);
		free_engine();
		return 0;
	}

	MSG msg;
	WNDCLASS wndclass;
	memset(&wndclass,0,sizeof(WNDCLASS));

	wndclass.lpfnWndProc   = (WNDPROC)MainWndProc;
	wndclass.hInstance     = hInst;
	wndclass.hIcon         = 0;
	wndclass.hCursor       = 0;
	wndclass.hbrBackground = 0;
	wndclass.lpszMenuName  = szAppName;
	wndclass.lpszClassName = szAppName;

	if (!RegisterClass(&wndclass))
		return FALSE;

	hWndMain = CreateWindow(szAppName, szAppName,
					WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
					0, 0, screen_sx, screen_sy,	NULL, NULL, hInst, NULL);
	if (!hWndMain)
		return 0;

	time(&t1);

	while (1) 
		{
		while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE) 
			{
			if (GetMessage(&msg, NULL, 0, 0)) 
				{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
				}
			else 
				{
				char str[256];
				time(&t2);
				int dt=(int)(t2-t1);
				sprintf(str,
					"Nodes:\t%i\nInvalid:\t%i\nSamples:\t%i\nTime:\t%02i:%02i:%02i",
					flyengine->nleaf,fail_nodes,sample_count,dt/3600,(dt/60)%60,dt%60);
				MessageBox(0,str,"ViewBSPgl",MB_OK|MB_ICONINFORMATION);
				free_engine();
				return 1;
				}
			}
		DoFrame();
		}

	return 0;
}

⌨️ 快捷键说明

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