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

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

?? r_bsp.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
字號:
/*
Copyright (C) 1997-2001 Id Software, Inc.

This program 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.

This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
// r_bsp.c

#include "r_local.h"

//
// current entity info
//
qboolean		insubmodel;
entity_t		*currententity;
vec3_t			modelorg;		// modelorg is the viewpoint reletive to
								// the currently rendering entity
vec3_t			r_entorigin;	// the currently rendering entity in world
								// coordinates

float			entity_rotation[3][3];

int				r_currentbkey;

typedef enum {touchessolid, drawnode, nodrawnode} solidstate_t;

#define MAX_BMODEL_VERTS	500			// 6K
#define MAX_BMODEL_EDGES	1000		// 12K

static mvertex_t	*pbverts;
static bedge_t		*pbedges;
static int			numbverts, numbedges;

static mvertex_t	*pfrontenter, *pfrontexit;

static qboolean		makeclippededge;


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

/*
================
R_EntityRotate
================
*/
void R_EntityRotate (vec3_t vec)
{
	vec3_t	tvec;

	VectorCopy (vec, tvec);
	vec[0] = DotProduct (entity_rotation[0], tvec);
	vec[1] = DotProduct (entity_rotation[1], tvec);
	vec[2] = DotProduct (entity_rotation[2], tvec);
}


/*
================
R_RotateBmodel
================
*/
void R_RotateBmodel (void)
{
	float	angle, s, c, temp1[3][3], temp2[3][3], temp3[3][3];

// TODO: should use a look-up table
// TODO: should really be stored with the entity instead of being reconstructed
// TODO: could cache lazily, stored in the entity
// TODO: share work with R_SetUpAliasTransform

// yaw
	angle = currententity->angles[YAW];		
	angle = angle * M_PI*2 / 360;
	s = sin(angle);
	c = cos(angle);

	temp1[0][0] = c;
	temp1[0][1] = s;
	temp1[0][2] = 0;
	temp1[1][0] = -s;
	temp1[1][1] = c;
	temp1[1][2] = 0;
	temp1[2][0] = 0;
	temp1[2][1] = 0;
	temp1[2][2] = 1;


// pitch
	angle = currententity->angles[PITCH];		
	angle = angle * M_PI*2 / 360;
	s = sin(angle);
	c = cos(angle);

	temp2[0][0] = c;
	temp2[0][1] = 0;
	temp2[0][2] = -s;
	temp2[1][0] = 0;
	temp2[1][1] = 1;
	temp2[1][2] = 0;
	temp2[2][0] = s;
	temp2[2][1] = 0;
	temp2[2][2] = c;

	R_ConcatRotations (temp2, temp1, temp3);

// roll
	angle = currententity->angles[ROLL];		
	angle = angle * M_PI*2 / 360;
	s = sin(angle);
	c = cos(angle);

	temp1[0][0] = 1;
	temp1[0][1] = 0;
	temp1[0][2] = 0;
	temp1[1][0] = 0;
	temp1[1][1] = c;
	temp1[1][2] = s;
	temp1[2][0] = 0;
	temp1[2][1] = -s;
	temp1[2][2] = c;

	R_ConcatRotations (temp1, temp3, entity_rotation);

//
// rotate modelorg and the transformation matrix
//
	R_EntityRotate (modelorg);
	R_EntityRotate (vpn);
	R_EntityRotate (vright);
	R_EntityRotate (vup);

	R_TransformFrustum ();
}


/*
================
R_RecursiveClipBPoly

Clip a bmodel poly down the world bsp tree
================
*/
void R_RecursiveClipBPoly (bedge_t *pedges, mnode_t *pnode, msurface_t *psurf)
{
	bedge_t		*psideedges[2], *pnextedge, *ptedge;
	int			i, side, lastside;
	float		dist, frac, lastdist;
	mplane_t	*splitplane, tplane;
	mvertex_t	*pvert, *plastvert, *ptvert;
	mnode_t		*pn;
	int			area;

	psideedges[0] = psideedges[1] = NULL;

	makeclippededge = false;

// transform the BSP plane into model space
// FIXME: cache these?
	splitplane = pnode->plane;
	tplane.dist = splitplane->dist -
			DotProduct(r_entorigin, splitplane->normal);
	tplane.normal[0] = DotProduct (entity_rotation[0], splitplane->normal);
	tplane.normal[1] = DotProduct (entity_rotation[1], splitplane->normal);
	tplane.normal[2] = DotProduct (entity_rotation[2], splitplane->normal);

// clip edges to BSP plane
	for ( ; pedges ; pedges = pnextedge)
	{
		pnextedge = pedges->pnext;

	// set the status for the last point as the previous point
	// FIXME: cache this stuff somehow?
		plastvert = pedges->v[0];
		lastdist = DotProduct (plastvert->position, tplane.normal) -
				   tplane.dist;

		if (lastdist > 0)
			lastside = 0;
		else
			lastside = 1;

		pvert = pedges->v[1];

		dist = DotProduct (pvert->position, tplane.normal) - tplane.dist;

		if (dist > 0)
			side = 0;
		else
			side = 1;

		if (side != lastside)
		{
		// clipped
			if (numbverts >= MAX_BMODEL_VERTS)
				return;

		// generate the clipped vertex
			frac = lastdist / (lastdist - dist);
			ptvert = &pbverts[numbverts++];
			ptvert->position[0] = plastvert->position[0] +
					frac * (pvert->position[0] -
					plastvert->position[0]);
			ptvert->position[1] = plastvert->position[1] +
					frac * (pvert->position[1] -
					plastvert->position[1]);
			ptvert->position[2] = plastvert->position[2] +
					frac * (pvert->position[2] -
					plastvert->position[2]);

		// split into two edges, one on each side, and remember entering
		// and exiting points
		// FIXME: share the clip edge by having a winding direction flag?
			if (numbedges >= (MAX_BMODEL_EDGES - 1))
			{
				ri.Con_Printf (PRINT_ALL,"Out of edges for bmodel\n");
				return;
			}

			ptedge = &pbedges[numbedges];
			ptedge->pnext = psideedges[lastside];
			psideedges[lastside] = ptedge;
			ptedge->v[0] = plastvert;
			ptedge->v[1] = ptvert;

			ptedge = &pbedges[numbedges + 1];
			ptedge->pnext = psideedges[side];
			psideedges[side] = ptedge;
			ptedge->v[0] = ptvert;
			ptedge->v[1] = pvert;

			numbedges += 2;

			if (side == 0)
			{
			// entering for front, exiting for back
				pfrontenter = ptvert;
				makeclippededge = true;
			}
			else
			{
				pfrontexit = ptvert;
				makeclippededge = true;
			}
		}
		else
		{
		// add the edge to the appropriate side
			pedges->pnext = psideedges[side];
			psideedges[side] = pedges;
		}
	}

// if anything was clipped, reconstitute and add the edges along the clip
// plane to both sides (but in opposite directions)
	if (makeclippededge)
	{
		if (numbedges >= (MAX_BMODEL_EDGES - 2))
		{
			ri.Con_Printf (PRINT_ALL,"Out of edges for bmodel\n");
			return;
		}

		ptedge = &pbedges[numbedges];
		ptedge->pnext = psideedges[0];
		psideedges[0] = ptedge;
		ptedge->v[0] = pfrontexit;
		ptedge->v[1] = pfrontenter;

		ptedge = &pbedges[numbedges + 1];
		ptedge->pnext = psideedges[1];
		psideedges[1] = ptedge;
		ptedge->v[0] = pfrontenter;
		ptedge->v[1] = pfrontexit;

		numbedges += 2;
	}

// draw or recurse further
	for (i=0 ; i<2 ; i++)
	{
		if (psideedges[i])
		{
		// draw if we've reached a non-solid leaf, done if all that's left is a
		// solid leaf, and continue down the tree if it's not a leaf
			pn = pnode->children[i];

		// we're done with this branch if the node or leaf isn't in the PVS
			if (pn->visframe == r_visframecount)
			{
				if (pn->contents != CONTENTS_NODE)
				{
					if (pn->contents != CONTENTS_SOLID)
					{
						if (r_newrefdef.areabits)
						{
							area = ((mleaf_t *)pn)->area;
							if (! (r_newrefdef.areabits[area>>3] & (1<<(area&7)) ) )
								continue;		// not visible
						}

						r_currentbkey = ((mleaf_t *)pn)->key;
						R_RenderBmodelFace (psideedges[i], psurf);
					}
				}
				else
				{
					R_RecursiveClipBPoly (psideedges[i], pnode->children[i],
									  psurf);
				}
			}
		}
	}
}


/*
================
R_DrawSolidClippedSubmodelPolygons

Bmodel crosses multiple leafs
================
*/
void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel, mnode_t *topnode)
{
	int			i, j, lindex;
	vec_t		dot;
	msurface_t	*psurf;
	int			numsurfaces;
	mplane_t	*pplane;
	mvertex_t	bverts[MAX_BMODEL_VERTS];
	bedge_t		bedges[MAX_BMODEL_EDGES], *pbedge;
	medge_t		*pedge, *pedges;

// FIXME: use bounding-box-based frustum clipping info?

	psurf = &pmodel->surfaces[pmodel->firstmodelsurface];
	numsurfaces = pmodel->nummodelsurfaces;
	pedges = pmodel->edges;

	for (i=0 ; i<numsurfaces ; i++, psurf++)
	{
	// find which side of the node we are on
		pplane = psurf->plane;

		dot = DotProduct (modelorg, pplane->normal) - pplane->dist;

	// draw the polygon
		if (( !(psurf->flags & SURF_PLANEBACK) && (dot < -BACKFACE_EPSILON)) ||
			((psurf->flags & SURF_PLANEBACK) && (dot > BACKFACE_EPSILON)))
			continue;

	// FIXME: use bounding-box-based frustum clipping info?

	// copy the edges to bedges, flipping if necessary so always
	// clockwise winding
	// FIXME: if edges and vertices get caches, these assignments must move
	// outside the loop, and overflow checking must be done here
		pbverts = bverts;
		pbedges = bedges;
		numbverts = numbedges = 0;
		pbedge = &bedges[numbedges];
		numbedges += psurf->numedges;

		for (j=0 ; j<psurf->numedges ; j++)
		{
		   lindex = pmodel->surfedges[psurf->firstedge+j];

			if (lindex > 0)
			{
				pedge = &pedges[lindex];
				pbedge[j].v[0] = &r_pcurrentvertbase[pedge->v[0]];
				pbedge[j].v[1] = &r_pcurrentvertbase[pedge->v[1]];
			}
			else
			{
				lindex = -lindex;
				pedge = &pedges[lindex];
				pbedge[j].v[0] = &r_pcurrentvertbase[pedge->v[1]];
				pbedge[j].v[1] = &r_pcurrentvertbase[pedge->v[0]];
			}

			pbedge[j].pnext = &pbedge[j+1];
		}

		pbedge[j-1].pnext = NULL;	// mark end of edges

		if ( !( psurf->texinfo->flags & ( SURF_TRANS66 | SURF_TRANS33 ) ) )
			R_RecursiveClipBPoly (pbedge, topnode, psurf);
		else
			R_RenderBmodelFace( pbedge, psurf );
	}
}


/*
================
R_DrawSubmodelPolygons

All in one leaf
================
*/
void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags, mnode_t *topnode)
{
	int			i;
	vec_t		dot;
	msurface_t	*psurf;
	int			numsurfaces;
	mplane_t	*pplane;

// FIXME: use bounding-box-based frustum clipping info?

	psurf = &pmodel->surfaces[pmodel->firstmodelsurface];
	numsurfaces = pmodel->nummodelsurfaces;

	for (i=0 ; i<numsurfaces ; i++, psurf++)
	{
	// find which side of the node we are on
		pplane = psurf->plane;

		dot = DotProduct (modelorg, pplane->normal) - pplane->dist;

	// draw the polygon
		if (((psurf->flags & SURF_PLANEBACK) && (dot < -BACKFACE_EPSILON)) ||
			(!(psurf->flags & SURF_PLANEBACK) && (dot > BACKFACE_EPSILON)))
		{
			r_currentkey = ((mleaf_t *)topnode)->key;

		// FIXME: use bounding-box-based frustum clipping info?
			R_RenderFace (psurf, clipflags);
		}
	}
}


int c_drawnode;

/*
================
R_RecursiveWorldNode
================
*/
void R_RecursiveWorldNode (mnode_t *node, int clipflags)
{
	int			i, c, side, *pindex;
	vec3_t		acceptpt, rejectpt;
	mplane_t	*plane;
	msurface_t	*surf, **mark;
	float		d, dot;
	mleaf_t		*pleaf;

	if (node->contents == CONTENTS_SOLID)
		return;		// solid

	if (node->visframe != r_visframecount)
		return;

// cull the clipping planes if not trivial accept
// FIXME: the compiler is doing a lousy job of optimizing here; it could be
//  twice as fast in ASM
	if (clipflags)
	{
		for (i=0 ; i<4 ; i++)
		{
			if (! (clipflags & (1<<i)) )
				continue;	// don't need to clip against it

		// 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] = (float)node->minmaxs[pindex[0]];
			rejectpt[1] = (float)node->minmaxs[pindex[1]];
			rejectpt[2] = (float)node->minmaxs[pindex[2]];
			
			d = DotProduct (rejectpt, view_clipplanes[i].normal);
			d -= view_clipplanes[i].dist;
			if (d <= 0)
				return;
			acceptpt[0] = (float)node->minmaxs[pindex[3+0]];
			acceptpt[1] = (float)node->minmaxs[pindex[3+1]];
			acceptpt[2] = (float)node->minmaxs[pindex[3+2]];

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

			if (d >= 0)
				clipflags &= ~(1<<i);	// node is entirely on screen
		}
	}

c_drawnode++;

// if a leaf node, draw stuff
	if (node->contents != -1)
	{
		pleaf = (mleaf_t *)node;

		// check for door connected areas
		if (r_newrefdef.areabits)
		{
			if (! (r_newrefdef.areabits[pleaf->area>>3] & (1<<(pleaf->area&7)) ) )
				return;		// not visible
		}

		mark = pleaf->firstmarksurface;
		c = pleaf->nummarksurfaces;

		if (c)
		{
			do
			{
				(*mark)->visframe = r_framecount;
				mark++;
			} while (--c);
		}

		pleaf->key = r_currentkey;
		r_currentkey++;		// all bmodels in a leaf share the same key
	}
	else
	{
	// node is just a decision point, so go down the apropriate sides

	// find which side of the node we are on
		plane = node->plane;

		switch (plane->type)
		{
		case PLANE_X:
			dot = modelorg[0] - plane->dist;
			break;
		case PLANE_Y:
			dot = modelorg[1] - plane->dist;
			break;
		case PLANE_Z:
			dot = modelorg[2] - plane->dist;
			break;
		default:
			dot = DotProduct (modelorg, plane->normal) - plane->dist;
			break;
		}
	
		if (dot >= 0)
			side = 0;
		else
			side = 1;

	// recurse down the children, front side first
		R_RecursiveWorldNode (node->children[side], clipflags);

	// draw stuff
		c = node->numsurfaces;

		if (c)
		{
			surf = r_worldmodel->surfaces + node->firstsurface;

			if (dot < -BACKFACE_EPSILON)
			{
				do
				{
					if ((surf->flags & SURF_PLANEBACK) &&
						(surf->visframe == r_framecount))
					{
						R_RenderFace (surf, clipflags);
					}

					surf++;
				} while (--c);
			}
			else if (dot > BACKFACE_EPSILON)
			{
				do
				{
					if (!(surf->flags & SURF_PLANEBACK) &&
						(surf->visframe == r_framecount))
					{
						R_RenderFace (surf, clipflags);
					}

					surf++;
				} while (--c);
			}

		// all surfaces on the same node share the same sequence number
			r_currentkey++;
		}

	// recurse down the back side
		R_RecursiveWorldNode (node->children[!side], clipflags);
	}
}



/*
================
R_RenderWorld
================
*/
void R_RenderWorld (void)
{

	if (!r_drawworld->value)
		return;
	if ( r_newrefdef.rdflags & RDF_NOWORLDMODEL )
		return;

	c_drawnode=0;

	// auto cycle the world frame for texture animation
	r_worldentity.frame = (int)(r_newrefdef.time*2);
	currententity = &r_worldentity;

	VectorCopy (r_origin, modelorg);
	currentmodel = r_worldmodel;
	r_pcurrentvertbase = currentmodel->vertexes;

	R_RecursiveWorldNode (currentmodel->nodes, 15);
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
波多野结衣中文字幕一区 | 色呦呦一区二区三区| 一本一本大道香蕉久在线精品| 色噜噜狠狠成人中文综合| 欧美精品一卡二卡| 久久人人97超碰com| 国产精品家庭影院| 精品写真视频在线观看| 91美女片黄在线观看91美女| xnxx国产精品| 一区二区中文字幕在线| 日韩av电影一区| 色婷婷国产精品| 久久久久久电影| 免费成人在线观看| 91黄色免费观看| 成人avav影音| 欧美国产精品中文字幕| 五月婷婷久久综合| 91在线视频免费91| 欧美一级午夜免费电影| 亚洲一区二区三区视频在线 | 久久蜜桃av一区精品变态类天堂| 亚洲女与黑人做爰| 99在线精品视频| 亚洲精品一区在线观看| 亚洲嫩草精品久久| 色香蕉成人二区免费| 国产视频一区二区在线| 国产91综合一区在线观看| 91搞黄在线观看| www欧美成人18+| 日韩不卡在线观看日韩不卡视频| 色诱亚洲精品久久久久久| 中文字幕在线视频一区| 国产在线精品免费av| 欧美tickling挠脚心丨vk| 一区二区三区欧美激情| 首页综合国产亚洲丝袜| 欧美日产在线观看| 亚洲伊人色欲综合网| 在线看国产一区| 亚洲免费观看高清完整| 欧美中文字幕一区| 亚洲午夜视频在线观看| 色综合久久综合网| 天天做天天摸天天爽国产一区 | 在线观看亚洲a| 亚洲激情自拍偷拍| 欧美午夜电影一区| 一级女性全黄久久生活片免费| 国产一区二区在线免费观看| 国产午夜亚洲精品不卡| 国产ts人妖一区二区| 日韩三级精品电影久久久| 蜜臀av性久久久久av蜜臀妖精| 欧美午夜精品一区二区蜜桃| 亚洲国产精品久久一线不卡| 色综合久久久久综合99| 日韩电影在线观看网站| 欧美电视剧免费观看| 成人一区二区三区在线观看| 中文成人综合网| 6080午夜不卡| 色综合色综合色综合色综合色综合| 国产精品久久久久久久久搜平片 | 欧美性猛交xxxxxxxx| 久久精品国产99国产精品| 日韩视频在线你懂得| 久久av老司机精品网站导航| 国产精品亲子伦对白| 99re66热这里只有精品3直播| 石原莉奈在线亚洲二区| 精品国一区二区三区| 国产精品亚洲一区二区三区在线| 国产精品色在线观看| 欧美亚洲免费在线一区| 国产91富婆露脸刺激对白| **欧美大码日韩| xf在线a精品一区二区视频网站| 国产69精品久久久久毛片| 亚洲成a人v欧美综合天堂 | 99综合电影在线视频| 欧美美女网站色| 国产精品二区一区二区aⅴ污介绍| 亚洲人成影院在线观看| 99久久伊人精品| 欧美日韩精品三区| 欧美高清一级片在线观看| 97精品久久久午夜一区二区三区| 欧美日韩国产123区| 日韩免费视频一区二区| 亚洲欧美激情视频在线观看一区二区三区 | 视频一区在线播放| av亚洲产国偷v产偷v自拍| 久久精品人人做人人综合| 紧缚捆绑精品一区二区| 欧美成人激情免费网| 高清免费成人av| 国产精品久久国产精麻豆99网站| 99久久伊人久久99| 亚洲激情图片一区| 精品少妇一区二区三区在线播放 | 中文字幕亚洲一区二区av在线| 国产·精品毛片| 亚洲欧洲美洲综合色网| 在线精品视频小说1| 韩国视频一区二区| 夜夜亚洲天天久久| 精品剧情在线观看| 欧洲另类一二三四区| 九一九一国产精品| 亚洲制服欧美中文字幕中文字幕| 欧美电影在哪看比较好| 国产精品一区二区免费不卡 | 青青草伊人久久| wwwwww.欧美系列| 99久久久久久| 国产成人亚洲综合a∨猫咪| 亚洲一卡二卡三卡四卡五卡| 欧美激情综合五月色丁香| 在线不卡免费av| 欧美老肥妇做.爰bbww视频| 成人h精品动漫一区二区三区| 韩国精品一区二区| 开心九九激情九九欧美日韩精美视频电影 | 国产亲近乱来精品视频| 亚洲精品一区二区三区精华液| 欧美精品高清视频| 欧美一区二区免费| 欧美一区二区视频在线观看2020| 99精品视频一区二区三区| 国产福利不卡视频| 久久精品国内一区二区三区| 亚洲免费观看高清完整| 亚洲综合清纯丝袜自拍| 性感美女久久精品| 亚洲成人精品影院| 热久久久久久久| 国产不卡高清在线观看视频| 国产1区2区3区精品美女| 色综合一区二区三区| 欧美一级国产精品| 国产精品久久久久久久午夜片 | 国内精品伊人久久久久av影院| 丝袜国产日韩另类美女| 美国精品在线观看| 中文字幕日韩一区二区| 有码一区二区三区| 亚洲成人动漫av| 亚洲成人自拍一区| 色综合久久久久综合99| 2024国产精品| 亚洲精品精品亚洲| 国产福利一区在线| 欧美久久久久中文字幕| 中文字幕在线不卡视频| 美女视频黄免费的久久| 色88888久久久久久影院野外| 欧美成人r级一区二区三区| 亚洲综合色网站| 色婷婷亚洲精品| 激情小说欧美图片| 蓝色福利精品导航| 日韩亚洲欧美高清| 午夜视频一区在线观看| 亚洲制服丝袜在线| 美女视频一区在线观看| 91免费视频大全| 国产欧美一区二区在线| 亚洲欧美怡红院| 国产成人午夜精品5599| 成人丝袜18视频在线观看| 久久国产尿小便嘘嘘尿| 欧美日本国产一区| 五月天婷婷综合| 欧美人妖巨大在线| 日韩国产精品久久久| 2019国产精品| 国产91在线|亚洲| 亚洲欧美日韩中文播放 | 欧美一区二区美女| 久久99精品一区二区三区三区| 精品美女一区二区| 国产成人精品一区二区三区网站观看| 久久女同性恋中文字幕| 成人激情电影免费在线观看| 亚洲欧美一区二区三区极速播放| 欧亚洲嫩模精品一区三区| 污片在线观看一区二区| 日韩欧美电影一区| 色婷婷av久久久久久久| 久久国产夜色精品鲁鲁99| 欧美国产国产综合| 91精品国产一区二区| 成熟亚洲日本毛茸茸凸凹| 亚洲免费av高清| 精品成人一区二区三区| 91麻豆精品国产91| 成人激情校园春色|