亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? be_aas_optimize.c

?? 3D 游戲界的大牛人 John Carmack 終于放出了 Q3 的源代碼
?? C
字號:
/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.

This file is part of Quake III Arena source code.

Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

/*****************************************************************************
 * name:		be_aas_optimize.c
 *
 * desc:		decreases the .aas file size after the reachabilities have
 *				been calculated, just dumps all the faces, edges and vertexes
 *
 * $Archive: /MissionPack/code/botlib/be_aas_optimize.c $
 *
 *****************************************************************************/

#include "../game/q_shared.h"
#include "l_libvar.h"
#include "l_memory.h"
#include "l_script.h"
#include "l_precomp.h"
#include "l_struct.h"
#include "aasfile.h"
#include "../game/botlib.h"
#include "../game/be_aas.h"
#include "be_aas_funcs.h"
#include "be_interface.h"
#include "be_aas_def.h"

typedef struct optimized_s
{
	//vertexes
	int numvertexes;
	aas_vertex_t *vertexes;
	//edges
	int numedges;
	aas_edge_t *edges;
	//edge index
	int edgeindexsize;
	aas_edgeindex_t *edgeindex;
	//faces
	int numfaces;
	aas_face_t *faces;
	//face index
	int faceindexsize;
	aas_faceindex_t *faceindex;
	//convex areas
	int numareas;
	aas_area_t *areas;
	//
	int *vertexoptimizeindex;
	int *edgeoptimizeindex;
	int *faceoptimizeindex;
} optimized_t;

//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
int AAS_KeepEdge(aas_edge_t *edge)
{
	return 1;
} //end of the function AAS_KeepFace
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
int AAS_OptimizeEdge(optimized_t *optimized, int edgenum)
{
	int i, optedgenum;
	aas_edge_t *edge, *optedge;

	edge = &aasworld.edges[abs(edgenum)];
	if (!AAS_KeepEdge(edge)) return 0;

	optedgenum = optimized->edgeoptimizeindex[abs(edgenum)];
	if (optedgenum)
	{
		//keep the edge reversed sign
		if (edgenum > 0) return optedgenum;
		else return -optedgenum;
	} //end if

	optedge = &optimized->edges[optimized->numedges];

	for (i = 0; i < 2; i++)
	{
		if (optimized->vertexoptimizeindex[edge->v[i]])
		{
			optedge->v[i] = optimized->vertexoptimizeindex[edge->v[i]];
		} //end if
		else
		{
			VectorCopy(aasworld.vertexes[edge->v[i]], optimized->vertexes[optimized->numvertexes]);
			optedge->v[i] = optimized->numvertexes;
			optimized->vertexoptimizeindex[edge->v[i]] = optimized->numvertexes;
			optimized->numvertexes++;
		} //end else
	} //end for
	optimized->edgeoptimizeindex[abs(edgenum)] = optimized->numedges;
	optedgenum = optimized->numedges;
	optimized->numedges++;
	//keep the edge reversed sign
	if (edgenum > 0) return optedgenum;
	else return -optedgenum;
} //end of the function AAS_OptimizeEdge
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
int AAS_KeepFace(aas_face_t *face)
{
	if (!(face->faceflags & FACE_LADDER)) return 0;
	else return 1;
} //end of the function AAS_KeepFace
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
int AAS_OptimizeFace(optimized_t *optimized, int facenum)
{
	int i, edgenum, optedgenum, optfacenum;
	aas_face_t *face, *optface;

	face = &aasworld.faces[abs(facenum)];
	if (!AAS_KeepFace(face)) return 0;

	optfacenum = optimized->faceoptimizeindex[abs(facenum)];
	if (optfacenum)
	{
		//keep the face side sign
		if (facenum > 0) return optfacenum;
		else return -optfacenum;
	} //end if

	optface = &optimized->faces[optimized->numfaces];
	Com_Memcpy(optface, face, sizeof(aas_face_t));

	optface->numedges = 0;
	optface->firstedge = optimized->edgeindexsize;
	for (i = 0; i < face->numedges; i++)
	{
		edgenum = aasworld.edgeindex[face->firstedge + i];
		optedgenum = AAS_OptimizeEdge(optimized, edgenum);
		if (optedgenum)
		{
			optimized->edgeindex[optface->firstedge + optface->numedges] = optedgenum;
			optface->numedges++;
			optimized->edgeindexsize++;
		} //end if
	} //end for
	optimized->faceoptimizeindex[abs(facenum)] = optimized->numfaces;
	optfacenum = optimized->numfaces;
	optimized->numfaces++;
	//keep the face side sign
	if (facenum > 0) return optfacenum;
	else return -optfacenum;
} //end of the function AAS_OptimizeFace
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
void AAS_OptimizeArea(optimized_t *optimized, int areanum)
{
	int i, facenum, optfacenum;
	aas_area_t *area, *optarea;

	area = &aasworld.areas[areanum];
	optarea = &optimized->areas[areanum];
	Com_Memcpy(optarea, area, sizeof(aas_area_t));

	optarea->numfaces = 0;
	optarea->firstface = optimized->faceindexsize;
	for (i = 0; i < area->numfaces; i++)
	{
		facenum = aasworld.faceindex[area->firstface + i];
		optfacenum = AAS_OptimizeFace(optimized, facenum);
		if (optfacenum)
		{
			optimized->faceindex[optarea->firstface + optarea->numfaces] = optfacenum;
			optarea->numfaces++;
			optimized->faceindexsize++;
		} //end if
	} //end for
} //end of the function AAS_OptimizeArea
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
void AAS_OptimizeAlloc(optimized_t *optimized)
{
	optimized->vertexes = (aas_vertex_t *) GetClearedMemory(aasworld.numvertexes * sizeof(aas_vertex_t));
	optimized->numvertexes = 0;
	optimized->edges = (aas_edge_t *) GetClearedMemory(aasworld.numedges * sizeof(aas_edge_t));
	optimized->numedges = 1; //edge zero is a dummy
	optimized->edgeindex = (aas_edgeindex_t *) GetClearedMemory(aasworld.edgeindexsize * sizeof(aas_edgeindex_t));
	optimized->edgeindexsize = 0;
	optimized->faces = (aas_face_t *) GetClearedMemory(aasworld.numfaces * sizeof(aas_face_t));
	optimized->numfaces = 1; //face zero is a dummy
	optimized->faceindex = (aas_faceindex_t *) GetClearedMemory(aasworld.faceindexsize * sizeof(aas_faceindex_t));
	optimized->faceindexsize = 0;
	optimized->areas = (aas_area_t *) GetClearedMemory(aasworld.numareas * sizeof(aas_area_t));
	optimized->numareas = aasworld.numareas;
	//
	optimized->vertexoptimizeindex = (int *) GetClearedMemory(aasworld.numvertexes * sizeof(int));
	optimized->edgeoptimizeindex = (int *) GetClearedMemory(aasworld.numedges * sizeof(int));
	optimized->faceoptimizeindex = (int *) GetClearedMemory(aasworld.numfaces * sizeof(int));
} //end of the function AAS_OptimizeAlloc
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
void AAS_OptimizeStore(optimized_t *optimized)
{
	//store the optimized vertexes
	if (aasworld.vertexes) FreeMemory(aasworld.vertexes);
	aasworld.vertexes = optimized->vertexes;
	aasworld.numvertexes = optimized->numvertexes;
	//store the optimized edges
	if (aasworld.edges) FreeMemory(aasworld.edges);
	aasworld.edges = optimized->edges;
	aasworld.numedges = optimized->numedges;
	//store the optimized edge index
	if (aasworld.edgeindex) FreeMemory(aasworld.edgeindex);
	aasworld.edgeindex = optimized->edgeindex;
	aasworld.edgeindexsize = optimized->edgeindexsize;
	//store the optimized faces
	if (aasworld.faces) FreeMemory(aasworld.faces);
	aasworld.faces = optimized->faces;
	aasworld.numfaces = optimized->numfaces;
	//store the optimized face index
	if (aasworld.faceindex) FreeMemory(aasworld.faceindex);
	aasworld.faceindex = optimized->faceindex;
	aasworld.faceindexsize = optimized->faceindexsize;
	//store the optimized areas
	if (aasworld.areas) FreeMemory(aasworld.areas);
	aasworld.areas = optimized->areas;
	aasworld.numareas = optimized->numareas;
	//free optimize indexes
	FreeMemory(optimized->vertexoptimizeindex);
	FreeMemory(optimized->edgeoptimizeindex);
	FreeMemory(optimized->faceoptimizeindex);
} //end of the function AAS_OptimizeStore
//===========================================================================
//
// Parameter:				-
// Returns:					-
// Changes Globals:		-
//===========================================================================
void AAS_Optimize(void)
{
	int i, sign;
	optimized_t optimized;

	AAS_OptimizeAlloc(&optimized);
	for (i = 1; i < aasworld.numareas; i++)
	{
		AAS_OptimizeArea(&optimized, i);
	} //end for
	//reset the reachability face pointers
	for (i = 0; i < aasworld.reachabilitysize; i++)
	{
		//NOTE: for TRAVEL_ELEVATOR the facenum is the model number of
		//		the elevator
		if ((aasworld.reachability[i].traveltype & TRAVELTYPE_MASK) == TRAVEL_ELEVATOR) continue;
		//NOTE: for TRAVEL_JUMPPAD the facenum is the Z velocity and the edgenum is the hor velocity
		if ((aasworld.reachability[i].traveltype & TRAVELTYPE_MASK) == TRAVEL_JUMPPAD) continue;
		//NOTE: for TRAVEL_FUNCBOB the facenum and edgenum contain other coded information
		if ((aasworld.reachability[i].traveltype & TRAVELTYPE_MASK) == TRAVEL_FUNCBOB) continue;
		//
		sign = aasworld.reachability[i].facenum;
		aasworld.reachability[i].facenum = optimized.faceoptimizeindex[abs(aasworld.reachability[i].facenum)];
		if (sign < 0) aasworld.reachability[i].facenum = -aasworld.reachability[i].facenum;
		sign = aasworld.reachability[i].edgenum;
		aasworld.reachability[i].edgenum = optimized.edgeoptimizeindex[abs(aasworld.reachability[i].edgenum)];
		if (sign < 0) aasworld.reachability[i].edgenum = -aasworld.reachability[i].edgenum;
	} //end for
	//store the optimized AAS data into aasworld
	AAS_OptimizeStore(&optimized);
	//print some nice stuff :)
	botimport.Print(PRT_MESSAGE, "AAS data optimized.\n");
} //end of the function AAS_Optimize

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看视频91| 日韩视频在线永久播放| 欧美美女bb生活片| 国产三级精品三级在线专区| 亚洲欧美激情在线| 国产成人在线视频网站| 日韩三区在线观看| 一区二区三区欧美日| 国产一区二区三区日韩 | 在线播放日韩导航| 亚洲四区在线观看| 狠狠狠色丁香婷婷综合激情 | 国产v日产∨综合v精品视频| 7777精品伊人久久久大香线蕉完整版 | 国产婷婷一区二区| 麻豆91精品91久久久的内涵| 在线观看视频一区| 亚洲欧美日韩一区| 成人av一区二区三区| 精品国产不卡一区二区三区| 丝袜亚洲另类欧美| 欧美三级电影在线看| 亚洲免费色视频| 97精品超碰一区二区三区| 国产日韩成人精品| 高清成人在线观看| 久久综合久色欧美综合狠狠| 蜜臀精品久久久久久蜜臀| 精品视频免费在线| 亚洲电影一区二区| 欧美日本国产一区| 天堂蜜桃91精品| 91精品国产综合久久香蕉的特点| 亚洲国产精品尤物yw在线观看| 色婷婷久久综合| 亚洲国产精品一区二区www| 色国产精品一区在线观看| 亚洲女人小视频在线观看| 91免费观看视频在线| 亚洲美女一区二区三区| 欧美亚洲国产一区二区三区| 亚洲一区二区三区免费视频| 欧美美女直播网站| 日本成人在线网站| 精品久久久久久无| 成人一道本在线| 亚洲欧美偷拍三级| 欧美精品丝袜久久久中文字幕| 日韩电影免费在线| 久久久一区二区三区| 成人激情电影免费在线观看| 亚洲日本va在线观看| 欧洲精品一区二区三区在线观看| 亚洲mv在线观看| 精品国产青草久久久久福利| 岛国精品一区二区| 亚洲综合免费观看高清完整版在线| 欧美亚洲高清一区二区三区不卡| 蜜臀av性久久久久av蜜臀妖精| 欧美成人一区二区三区在线观看| 99热99精品| 亚洲综合色丁香婷婷六月图片| 91精品国产色综合久久ai换脸| 国产在线日韩欧美| 亚洲欧洲av在线| 91精品国产色综合久久不卡蜜臀| 成人一区在线看| 亚洲午夜免费电影| 久久青草国产手机看片福利盒子 | 自拍偷拍亚洲欧美日韩| 欧美日韩午夜影院| 国产精品18久久久久久久久久久久 | 成人免费精品视频| 午夜精品一区二区三区电影天堂| 久久久欧美精品sm网站| 在线免费观看不卡av| 狠狠色丁香婷婷综合久久片| 一色屋精品亚洲香蕉网站| 欧美一区二区三区视频免费播放| 不卡的av网站| 久久综合综合久久综合| 一区二区三区在线视频观看| 精品久久久三级丝袜| 欧美三级日韩三级| av一区二区三区在线| 久久99精品国产| 午夜亚洲国产au精品一区二区| 欧美国产精品一区二区| 欧美zozozo| 欧美美女喷水视频| 色视频欧美一区二区三区| 国产黄色精品视频| 久久国产夜色精品鲁鲁99| 亚洲成人av免费| 亚洲手机成人高清视频| 久久久国产精品麻豆| 日韩欧美一级在线播放| 欧美老女人第四色| 欧美午夜宅男影院| 色94色欧美sute亚洲线路二| 成人激情图片网| 春色校园综合激情亚洲| 国产一二三精品| 国产一区欧美日韩| 国产精品18久久久久久久网站| 久久99精品网久久| 经典一区二区三区| 精品一区二区三区蜜桃| 麻豆久久久久久久| 看国产成人h片视频| 男人操女人的视频在线观看欧美| 五月婷婷综合在线| 午夜av电影一区| 欧美bbbbb| 国产一区高清在线| 高清beeg欧美| 97aⅴ精品视频一二三区| 91老司机福利 在线| 日本久久精品电影| 欧美色涩在线第一页| 777a∨成人精品桃花网| 日韩精品一区二区三区视频| 久久综合九色综合欧美98| 国产日韩欧美精品在线| 国产欧美va欧美不卡在线| 日韩一区在线免费观看| 亚洲裸体在线观看| 一区二区三区欧美在线观看| 亚洲一区二区三区四区中文字幕| 亚洲在线视频免费观看| 亚洲免费在线观看视频| 视频一区欧美日韩| 久久99精品国产麻豆不卡| 久99久精品视频免费观看| 国产福利一区二区| 国产成人夜色高潮福利影视| 91在线精品秘密一区二区| 不卡av在线网| 91精品国产综合久久香蕉麻豆| 99免费精品在线| 欧美伦理视频网站| 久久久久久久精| 日韩美女一区二区三区| 久久这里只精品最新地址| 久久久午夜电影| 亚洲午夜三级在线| 亚洲一区二区影院| 蜜臀精品久久久久久蜜臀| 成人白浆超碰人人人人| 99国产精品久久| 欧美成人在线直播| 国产精品视频九色porn| 天堂在线一区二区| 美女脱光内衣内裤视频久久影院| 高清视频一区二区| 5566中文字幕一区二区电影| 久久女同精品一区二区| 一级精品视频在线观看宜春院 | 激情六月婷婷久久| 91猫先生在线| 91精品久久久久久久91蜜桃| 亚洲视频精选在线| 蜜桃91丨九色丨蝌蚪91桃色| 福利视频网站一区二区三区| 欧美男生操女生| 欧美国产1区2区| 麻豆精品在线播放| 成人ar影院免费观看视频| 精品久久99ma| 亚洲欧洲三级电影| 国产精品亚洲成人| 日韩一区二区在线看片| 欧美国产乱子伦| 国产成人午夜视频| 欧美美女网站色| 亚洲一二三级电影| 黄色精品一二区| 欧美一区二区三区四区在线观看| 亚洲女厕所小便bbb| 久久成人精品无人区| 成人免费观看视频| 91精品国产综合久久久久久久 | 中文字幕第一区第二区| 蜜桃一区二区三区在线| 懂色av中文一区二区三区| 久久这里只有精品视频网| 日韩极品在线观看| 色视频一区二区| 亚洲精品视频在线观看免费 | 亚洲国产精品ⅴa在线观看| 日韩在线观看一区二区| 欧美日韩国产高清一区| 亚洲私人影院在线观看| 99麻豆久久久国产精品免费优播| 成人小视频在线| 国产三级精品在线| 成人在线视频一区二区| 亚洲精品在线电影| 国产麻豆视频一区| 日韩美女一区二区三区四区|