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

📄 unpak.cpp

📁 体现了lod(level of detail)算法 包括网格细分,空间层次
💻 CPP
字号:
/*
	unpak.c			Copyright (C) 1998-2000 Vitaly Ovtchinnikov
										and Damir Sagidullin
*/
#include <windows.h>

//#include "console.h"
#include "unpak.h"

//------------------- DEFINITIONS & CONSTANTS -------------------//

//-------------------------- VARIABLES --------------------------//

//-------------------------- FUNCTIONS --------------------------//

int		PackFileOpen (packfile_t *pf, const char *zname)
{
	int		x, max;
	unz_file_info	file_info;

	strcat (pf->pak_name, zname);

	pf->uf = unzOpen (pf->pak_name);
	if (!pf->uf)
	{
		MessageBox(NULL, "Can't open file \"%s\"", "Error", NULL);
		return 0;
	}
	unzGetGlobalInfo (pf->uf, &pf->gi);
	pf->fi = (fileinfo_t *)malloc (sizeof(fileinfo_t)*pf->gi.number_entry);
	if (!pf->fi)
	{
		MessageBox(NULL, "Not enought memory to load pak file \"%s\"", "Error", NULL);
		unzClose (pf->uf);
		return 0;
	}

	max = pf->gi.number_entry;

	for (x=0; x<max; x++)
	{
		unzGetCurrentFileInfo (pf->uf,&file_info, pf->fi[x].name,sizeof(pf->fi[x].name),NULL,0,NULL,0);
		pf->fi[x].attr = file_info.external_fa;
		pf->fi[x].offset = file_info.offset;
		pf->fi[x].size = file_info.uncompressed_size;
		pf->fi[x].c_offset = file_info.c_offset;
		unzGoToNextFile (pf->uf);
	}
	return 1;
}

void	PackFileClose (packfile_t *pf)
{
	if (pf->fi)
	{
		free (pf->fi);
		pf->fi = NULL;
	}
	if (pf->uf)
	{
		unzClose (pf->uf);
		pf->uf = NULL;
	}
}

int		PackFileGet (packfile_t *pf, char *fname, char **buf)
{
	int		num;
	DWORD	err;
	for (num = 0; num<(int)pf->gi.number_entry; num++)
	{
		if (!stricmp(fname, pf->fi[num].name)) break;
	}

	if (num >= (int)pf->gi.number_entry)
	{
		MessageBox(NULL, "File \"%s:%s\" not found", "Error", NULL);
		return 0;
	}

	*buf = (char *)malloc (pf->fi[num].size);

	unzLocateFileMy (pf->uf, num, pf->fi[num].c_offset);

	unzOpenCurrentFile (pf->uf);
	err = unzReadCurrentFile (pf->uf,*buf,pf->fi[num].size);
	unzCloseCurrentFile (pf->uf);

	if (err!=pf->fi[num].size)
	{
		MessageBox(NULL, "Can't extract file \"%s:%s\"", "Error", NULL);
		free (*buf);
		*buf = NULL;
		return 0;
	}

	return pf->fi[num].size;
}

int		PackFileGetFilesNumber (packfile_t *pf)
{
	return pf->gi.number_entry;
}

char	*PackFileGetFileName (packfile_t *pf, int num)
{
	if (num >= (int)pf->gi.number_entry) return NULL;
	return pf->fi[num].name;
}

int		MyPackFileGet (packfile_t *pf, char *fname, unsigned char **buf)
{
	int		num;
	DWORD	err;
	for (num = 0; num<(int)pf->gi.number_entry; num++)
	{
		if (!stricmp(fname, pf->fi[num].name)) break;
	}

	if (num >= (int)pf->gi.number_entry)
	{
		MessageBox(NULL, "Can not find file in zip archive", "Error", NULL);
		return 0;
	}

	unzLocateFileMy (pf->uf, num, pf->fi[num].c_offset);

	unzOpenCurrentFile (pf->uf);
	err = unzReadCurrentFile (pf->uf,*buf,pf->fi[num].size);
	unzCloseCurrentFile (pf->uf);

	if (err!=pf->fi[num].size)
	{
		MessageBox(NULL, "Can't extract file \"%s:%s\"", "Error", NULL);
		free (*buf);
		*buf = NULL;
		return 0;
	}

	return pf->fi[num].size;
}

⌨️ 快捷键说明

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