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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? r_main.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
?? 第 1 頁 / 共 3 頁
字號:
			} while (node);
		}
	}

#if 0
	for (i=0 ; i<r_worldmodel->vis->numclusters ; i++)
	{
		if (vis[i>>3] & (1<<(i&7)))
		{
			node = (mnode_t *)&r_worldmodel->leafs[i];	// FIXME: cluster
			do
			{
				if (node->visframe == r_visframecount)
					break;
				node->visframe = r_visframecount;
				node = node->parent;
			} while (node);
		}
	}
#endif
}

/*
** R_DrawNullModel
**
** IMPLEMENT THIS!
*/
void R_DrawNullModel( void )
{
}

/*
=============
R_DrawEntitiesOnList
=============
*/
void R_DrawEntitiesOnList (void)
{
	int			i;
	qboolean	translucent_entities = false;

	if (!r_drawentities->value)
		return;

	// all bmodels have already been drawn by the edge list
	for (i=0 ; i<r_newrefdef.num_entities ; i++)
	{
		currententity = &r_newrefdef.entities[i];

		if ( currententity->flags & RF_TRANSLUCENT )
		{
			translucent_entities = true;
			continue;
		}

		if ( currententity->flags & RF_BEAM )
		{
			modelorg[0] = -r_origin[0];
			modelorg[1] = -r_origin[1];
			modelorg[2] = -r_origin[2];
			VectorCopy( vec3_origin, r_entorigin );
			R_DrawBeam( currententity );
		}
		else
		{
			currentmodel = currententity->model;
			if (!currentmodel)
			{
				R_DrawNullModel();
				continue;
			}
			VectorCopy (currententity->origin, r_entorigin);
			VectorSubtract (r_origin, r_entorigin, modelorg);

			switch (currentmodel->type)
			{
			case mod_sprite:
				R_DrawSprite ();
				break;

			case mod_alias:
				R_AliasDrawModel ();
				break;

			default:
				break;
			}
		}
	}

	if ( !translucent_entities )
		return;

	for (i=0 ; i<r_newrefdef.num_entities ; i++)
	{
		currententity = &r_newrefdef.entities[i];

		if ( !( currententity->flags & RF_TRANSLUCENT ) )
			continue;

		if ( currententity->flags & RF_BEAM )
		{
			modelorg[0] = -r_origin[0];
			modelorg[1] = -r_origin[1];
			modelorg[2] = -r_origin[2];
			VectorCopy( vec3_origin, r_entorigin );
			R_DrawBeam( currententity );
		}
		else
		{
			currentmodel = currententity->model;
			if (!currentmodel)
			{
				R_DrawNullModel();
				continue;
			}
			VectorCopy (currententity->origin, r_entorigin);
			VectorSubtract (r_origin, r_entorigin, modelorg);

			switch (currentmodel->type)
			{
			case mod_sprite:
				R_DrawSprite ();
				break;

			case mod_alias:
				R_AliasDrawModel ();
				break;

			default:
				break;
			}
		}
	}
}


/*
=============
R_BmodelCheckBBox
=============
*/
int R_BmodelCheckBBox (float *minmaxs)
{
	int			i, *pindex, clipflags;
	vec3_t		acceptpt, rejectpt;
	float		d;

	clipflags = 0;

	for (i=0 ; i<4 ; i++)
	{
	// generate accept and reject points
	// FIXME: do with fast look-ups or integer tests based on the sign bit
	// of the floating point values

		pindex = pfrustum_indexes[i];

		rejectpt[0] = minmaxs[pindex[0]];
		rejectpt[1] = minmaxs[pindex[1]];
		rejectpt[2] = minmaxs[pindex[2]];
		
		d = DotProduct (rejectpt, view_clipplanes[i].normal);
		d -= view_clipplanes[i].dist;

		if (d <= 0)
			return BMODEL_FULLY_CLIPPED;

		acceptpt[0] = minmaxs[pindex[3+0]];
		acceptpt[1] = minmaxs[pindex[3+1]];
		acceptpt[2] = minmaxs[pindex[3+2]];

		d = DotProduct (acceptpt, view_clipplanes[i].normal);
		d -= view_clipplanes[i].dist;

		if (d <= 0)
			clipflags |= (1<<i);
	}

	return clipflags;
}


/*
===================
R_FindTopnode

Find the first node that splits the given box
===================
*/
mnode_t *R_FindTopnode (vec3_t mins, vec3_t maxs)
{
	mplane_t	*splitplane;
	int			sides;
	mnode_t *node;

	node = r_worldmodel->nodes;

	while (1)
	{
		if (node->visframe != r_visframecount)
			return NULL;		// not visible at all
		
		if (node->contents != CONTENTS_NODE)
		{
			if (node->contents != CONTENTS_SOLID)
				return	node; // we've reached a non-solid leaf, so it's
							//  visible and not BSP clipped
			return NULL;	// in solid, so not visible
		}
		
		splitplane = node->plane;
		sides = BOX_ON_PLANE_SIDE(mins, maxs, (cplane_t *)splitplane);
		
		if (sides == 3)
			return node;	// this is the splitter
		
	// not split yet; recurse down the contacted side
		if (sides & 1)
			node = node->children[0];
		else
			node = node->children[1];
	}
}


/*
=============
RotatedBBox

Returns an axially aligned box that contains the input box at the given rotation
=============
*/
void RotatedBBox (vec3_t mins, vec3_t maxs, vec3_t angles, vec3_t tmins, vec3_t tmaxs)
{
	vec3_t	tmp, v;
	int		i, j;
	vec3_t	forward, right, up;

	if (!angles[0] && !angles[1] && !angles[2])
	{
		VectorCopy (mins, tmins);
		VectorCopy (maxs, tmaxs);
		return;
	}

	for (i=0 ; i<3 ; i++)
	{
		tmins[i] = 99999;
		tmaxs[i] = -99999;
	}

	AngleVectors (angles, forward, right, up);

	for ( i = 0; i < 8; i++ )
	{
		if ( i & 1 )
			tmp[0] = mins[0];
		else
			tmp[0] = maxs[0];

		if ( i & 2 )
			tmp[1] = mins[1];
		else
			tmp[1] = maxs[1];

		if ( i & 4 )
			tmp[2] = mins[2];
		else
			tmp[2] = maxs[2];


		VectorScale (forward, tmp[0], v);
		VectorMA (v, -tmp[1], right, v);
		VectorMA (v, tmp[2], up, v);

		for (j=0 ; j<3 ; j++)
		{
			if (v[j] < tmins[j])
				tmins[j] = v[j];
			if (v[j] > tmaxs[j])
				tmaxs[j] = v[j];
		}
	}
}

/*
=============
R_DrawBEntitiesOnList
=============
*/
void R_DrawBEntitiesOnList (void)
{
	int			i, clipflags;
	vec3_t		oldorigin;
	vec3_t		mins, maxs;
	float		minmaxs[6];
	mnode_t		*topnode;

	if (!r_drawentities->value)
		return;

	VectorCopy (modelorg, oldorigin);
	insubmodel = true;
	r_dlightframecount = r_framecount;

	for (i=0 ; i<r_newrefdef.num_entities ; i++)
	{
		currententity = &r_newrefdef.entities[i];
		currentmodel = currententity->model;
		if (!currentmodel)
			continue;
		if (currentmodel->nummodelsurfaces == 0)
			continue;	// clip brush only
		if ( currententity->flags & RF_BEAM )
			continue;
		if (currentmodel->type != mod_brush)
			continue;
	// see if the bounding box lets us trivially reject, also sets
	// trivial accept status
		RotatedBBox (currentmodel->mins, currentmodel->maxs,
			currententity->angles, mins, maxs);
		VectorAdd (mins, currententity->origin, minmaxs);
		VectorAdd (maxs, currententity->origin, (minmaxs+3));

		clipflags = R_BmodelCheckBBox (minmaxs);
		if (clipflags == BMODEL_FULLY_CLIPPED)
			continue;	// off the edge of the screen

		topnode = R_FindTopnode (minmaxs, minmaxs+3);
		if (!topnode)
			continue;	// no part in a visible leaf

		VectorCopy (currententity->origin, r_entorigin);
		VectorSubtract (r_origin, r_entorigin, modelorg);

		r_pcurrentvertbase = currentmodel->vertexes;

	// FIXME: stop transforming twice
		R_RotateBmodel ();

	// calculate dynamic lighting for bmodel
		R_PushDlights (currentmodel);

		if (topnode->contents == CONTENTS_NODE)
		{
		// not a leaf; has to be clipped to the world BSP
			r_clipflags = clipflags;
			R_DrawSolidClippedSubmodelPolygons (currentmodel, topnode);
		}
		else
		{
		// falls entirely in one leaf, so we just put all the
		// edges in the edge list and let 1/z sorting handle
		// drawing order
			R_DrawSubmodelPolygons (currentmodel, clipflags, topnode);
		}

	// put back world rotation and frustum clipping		
	// FIXME: R_RotateBmodel should just work off base_vxx
		VectorCopy (base_vpn, vpn);
		VectorCopy (base_vup, vup);
		VectorCopy (base_vright, vright);
		VectorCopy (oldorigin, modelorg);
		R_TransformFrustum ();
	}

	insubmodel = false;
}


/*
================
R_EdgeDrawing
================
*/
void R_EdgeDrawing (void)
{
	edge_t	ledges[NUMSTACKEDGES +
				((CACHE_SIZE - 1) / sizeof(edge_t)) + 1];
	surf_t	lsurfs[NUMSTACKSURFACES +
				((CACHE_SIZE - 1) / sizeof(surf_t)) + 1];

	if ( r_newrefdef.rdflags & RDF_NOWORLDMODEL )
		return;

	if (auxedges)
	{
		r_edges = auxedges;
	}
	else
	{
		r_edges =  (edge_t *)
				(((long)&ledges[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
	}

	if (r_surfsonstack)
	{
		surfaces =  (surf_t *)
				(((long)&lsurfs[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
		surf_max = &surfaces[r_cnumsurfs];
	// surface 0 doesn't really exist; it's just a dummy because index 0
	// is used to indicate no edge attached to surface
		surfaces--;
		R_SurfacePatch ();
	}

	R_BeginEdgeFrame ();

	if (r_dspeeds->value)
	{
		rw_time1 = Sys_Milliseconds ();
	}

	R_RenderWorld ();

	if (r_dspeeds->value)
	{
		rw_time2 = Sys_Milliseconds ();
		db_time1 = rw_time2;
	}

	R_DrawBEntitiesOnList ();

	if (r_dspeeds->value)
	{
		db_time2 = Sys_Milliseconds ();
		se_time1 = db_time2;
	}

	R_ScanEdges ();
}

//=======================================================================


/*
=============
R_CalcPalette

=============
*/
void R_CalcPalette (void)
{
	static qboolean modified;
	byte	palette[256][4], *in, *out;
	int		i, j;
	float	alpha, one_minus_alpha;
	vec3_t	premult;
	int		v;

	alpha = r_newrefdef.blend[3];
	if (alpha <= 0)
	{
		if (modified)
		{	// set back to default
			modified = false;
			R_GammaCorrectAndSetPalette( ( const unsigned char * ) d_8to24table );
			return;
		}
		return;
	}

	modified = true;
	if (alpha > 1)
		alpha = 1;

	premult[0] = r_newrefdef.blend[0]*alpha*255;
	premult[1] = r_newrefdef.blend[1]*alpha*255;
	premult[2] = r_newrefdef.blend[2]*alpha*255;

	one_minus_alpha = (1.0 - alpha);

	in = (byte *)d_8to24table;
	out = palette[0];

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩高清不卡一区| 韩日精品视频一区| 久久精品亚洲一区二区三区浴池| 91视频一区二区| 麻豆精品视频在线| 亚洲黄色免费网站| 国产午夜精品久久久久久久| 欧美色爱综合网| 伊人开心综合网| 欧美一区二区视频观看视频| 欧美伦理视频网站| 中日韩免费视频中文字幕| 欧美日韩大陆一区二区| www.欧美日韩| 国产精品一卡二| 日本中文一区二区三区| 亚洲人成电影网站色mp4| 国产三级三级三级精品8ⅰ区| 欧美日韩免费观看一区三区| 色综合久久综合网97色综合| 粉嫩av一区二区三区| 美美哒免费高清在线观看视频一区二区| 亚洲精品乱码久久久久久久久 | 91美女在线看| 国产福利一区在线| 韩国毛片一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 天堂蜜桃一区二区三区| 日韩av一二三| 日韩影院在线观看| 天天综合日日夜夜精品| 亚洲已满18点击进入久久| 国产精品久久久一本精品 | 国产精品中文有码| 卡一卡二国产精品| 日韩va欧美va亚洲va久久| 婷婷成人综合网| 日韩综合小视频| 图片区日韩欧美亚洲| 亚洲成人激情综合网| 亚洲高清在线精品| 亚洲高清久久久| 婷婷久久综合九色综合绿巨人| 亚洲一区二区视频在线观看| 亚洲午夜激情网页| 日日摸夜夜添夜夜添精品视频| 日日夜夜精品视频免费| 日韩国产精品久久久久久亚洲| 日韩va亚洲va欧美va久久| 天堂一区二区在线| 久久精品国产精品亚洲精品| 狠狠久久亚洲欧美| 懂色一区二区三区免费观看| av中文字幕一区| 91免费观看视频在线| 欧洲人成人精品| 91精品国产aⅴ一区二区| 精品噜噜噜噜久久久久久久久试看| 欧美精品一区视频| 国产精品剧情在线亚洲| 亚洲欧美激情在线| 欧美a一区二区| 国产精品911| 一本色道**综合亚洲精品蜜桃冫| 欧美综合一区二区三区| 91精品久久久久久久91蜜桃| 久久久精品国产免费观看同学| 中文字幕精品三区| 亚洲最大色网站| 麻豆成人av在线| 粗大黑人巨茎大战欧美成人| 在线视频观看一区| 日韩精品中文字幕在线一区| 国产三区在线成人av| 一区二区三区四区av| 久久精品国产精品青草| 99久久99久久久精品齐齐| 欧美福利视频导航| 国产日韩欧美高清在线| 亚洲一级在线观看| 国产伦理精品不卡| 欧美性猛交一区二区三区精品| 日韩精品一区国产麻豆| 中文字幕在线不卡一区| 美女视频黄a大片欧美| 成人av在线网| 日韩午夜小视频| 中文字幕一区二区三区不卡在线| 午夜国产不卡在线观看视频| 国产精品一区免费在线观看| 在线视频综合导航| 久久久久久电影| 首页综合国产亚洲丝袜| 国产成人综合网| 91精品国产综合久久蜜臀| 老司机精品视频在线| 成人深夜在线观看| 91麻豆精品国产自产在线观看一区 | 亚洲另类色综合网站| 黑人巨大精品欧美黑白配亚洲| 91福利在线免费观看| 国产女主播视频一区二区| 午夜精品久久久久久久久久| 播五月开心婷婷综合| 欧美xxxxx牲另类人与| 亚洲国产一区二区三区| av网站免费线看精品| 日韩欧美国产成人一区二区| 亚洲午夜羞羞片| 91麻豆免费看| 亚洲国产成人一区二区三区| 蜜臀久久久久久久| 欧美日韩在线直播| 亚洲三级在线免费| 成人免费毛片片v| 久久久www成人免费毛片麻豆| 日韩精品电影一区亚洲| 欧美午夜不卡视频| 亚洲另类在线视频| 99re这里只有精品视频首页| 国产午夜精品美女毛片视频| 理论电影国产精品| 欧美一区二区三区日韩视频| 亚洲一区二区三区国产| 在线视频国内一区二区| 亚洲欧美成aⅴ人在线观看| 成人美女视频在线看| 久久女同性恋中文字幕| 国产最新精品精品你懂的| 日韩一区国产二区欧美三区| 日韩中文字幕麻豆| 在线播放国产精品二区一二区四区| 亚洲一级二级在线| 欧美美女直播网站| 亚洲一区二区在线播放相泽| 欧美在线观看视频在线| 亚洲一区在线看| 欧美无砖专区一中文字| 亚洲成av人片一区二区梦乃| 欧美日韩在线一区二区| 亚洲va欧美va人人爽午夜| 欧美精品日韩一区| 蜜臀av一区二区在线免费观看| 日韩久久久久久| 久久99国产精品久久99 | 亚洲人一二三区| 色香蕉成人二区免费| 亚洲第一福利一区| 91精品综合久久久久久| 久久99精品久久久久久| 久久只精品国产| 成人免费福利片| 亚洲欧美经典视频| 欧美日韩国产综合久久 | 在线一区二区三区四区| 亚洲精品成a人| 制服丝袜国产精品| 久久99精品久久久久久动态图 | 精品日韩在线观看| 国产99一区视频免费| 狠狠色丁香久久婷婷综| 国产午夜三级一区二区三| 99热精品国产| 五月激情综合色| 欧美精品一区二区三区一线天视频| 高清不卡在线观看av| 一区二区三区四区蜜桃| 欧美人成免费网站| 国产精品夜夜嗨| 一区二区高清视频在线观看| 91麻豆精品国产91久久久使用方法 | 极品少妇xxxx精品少妇| 国产精品污污网站在线观看| 色视频一区二区| 奇米影视一区二区三区小说| 久久精品视频在线免费观看| 色婷婷av一区二区三区大白胸 | 亚洲日本免费电影| 91麻豆精品国产91久久久 | 午夜精品123| 国产网红主播福利一区二区| 91福利资源站| 国产精品一二三在| 亚洲无人区一区| 国产亚洲成aⅴ人片在线观看| 色综合久久久久网| 精品一区二区影视| 一区二区三区不卡在线观看| 亚洲精品一区二区三区福利| 91国产福利在线| 国产成人精品亚洲午夜麻豆| 午夜精品免费在线| 国产精品久久久久7777按摩| 日韩无一区二区| 色综合天天综合色综合av | 精品综合久久久久久8888| 中文字幕日韩欧美一区二区三区| 欧美疯狂性受xxxxx喷水图片| 99久久er热在这里只有精品15| 免费精品视频最新在线|