diff options
| author | tma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2005-09-28 18:55:31 +0000 | 
|---|---|---|
| committer | tma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2005-09-28 18:55:31 +0000 | 
| commit | ec912002d3f75729c627cf467903c4607a529495 (patch) | |
| tree | b944aa3ec6a159d4607b3bb25cb09640bca02ddb /q3map/facebsp.c | |
| parent | ea1ca0473a510a02fff82788a2a6c8d95a6bf2d3 (diff) | |
| download | ioquake3-aero-ec912002d3f75729c627cf467903c4607a529495.tar.gz ioquake3-aero-ec912002d3f75729c627cf467903c4607a529495.zip  | |
* Removed q3map and associated common and libs directories
git-svn-id: svn://svn.icculus.org/quake3/trunk@123 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'q3map/facebsp.c')
| -rw-r--r-- | q3map/facebsp.c | 379 | 
1 files changed, 0 insertions, 379 deletions
diff --git a/q3map/facebsp.c b/q3map/facebsp.c deleted file mode 100644 index a146a21..0000000 --- a/q3map/facebsp.c +++ /dev/null @@ -1,379 +0,0 @@ -/* -=========================================================================== -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 -=========================================================================== -*/ - -#include "qbsp.h" - - -int			c_faceLeafs; - - -/* -================ -AllocBspFace -================ -*/ -bspface_t	*AllocBspFace( void ) { -	bspface_t	*f; - -	f = malloc(sizeof(*f)); -	memset( f, 0, sizeof(*f) ); - -	return f; -} - -/* -================ -FreeBspFace -================ -*/ -void	FreeBspFace( bspface_t *f ) { -	if ( f->w ) { -		FreeWinding( f->w ); -	} -	free( f ); -} - - -/* -================ -SelectSplitPlaneNum -================ -*/ -int hintsplit; - -#define	BLOCK_SIZE	1024 -int SelectSplitPlaneNum( node_t *node, bspface_t *list ) { -	bspface_t	*split; -	bspface_t	*check; -	bspface_t	*bestSplit; -	int			splits, facing, front, back; -	int			side; -	plane_t		*plane; -	int			value, bestValue; -	int			i; -	vec3_t		normal; -	float		dist; -	int			planenum; - -	hintsplit = qfalse; -	// if it is crossing a 1k block boundary, force a split -	for ( i = 0 ; i < 2 ; i++ ) { -		dist = BLOCK_SIZE * ( floor( node->mins[i] / BLOCK_SIZE ) + 1 );	 -		if ( node->maxs[i] > dist ) { -			VectorClear( normal ); -			normal[i] = 1; -			planenum = FindFloatPlane( normal, dist ); -			return planenum; -		} -	} - -	// pick one of the face planes -	bestValue = -99999; -	bestSplit = list; - -	for ( split = list ; split ; split = split->next ) { -		split->checked = qfalse; -	} - -	for ( split = list ; split ; split = split->next ) { -		if ( split->checked ) { -			continue; -		} -		plane = &mapplanes[ split->planenum ]; -		splits = 0; -		facing = 0; -		front = 0; -		back = 0; -		for ( check = list ; check ; check = check->next ) { -			if ( check->planenum == split->planenum ) { -				facing++; -				check->checked = qtrue;	// won't need to test this plane again -				continue; -			} -			side = WindingOnPlaneSide( check->w, plane->normal, plane->dist ); -			if ( side == SIDE_CROSS ) { -				splits++; -			} else if ( side == SIDE_FRONT ) { -				front++; -			} else if ( side == SIDE_BACK ) { -				back++; -			} -		} -		value =  5*facing - 5*splits; // - abs(front-back); -		if ( plane->type < 3 ) { -			value+=5;		// axial is better -		} -		value += split->priority;		// prioritize hints higher - -		if ( value > bestValue ) { -			bestValue = value; -			bestSplit = split; -		} -	} - -	if ( bestValue == -99999 ) { -		return -1; -	} - -	if (bestSplit->hint) -		hintsplit = qtrue; - -	return bestSplit->planenum; -} - -int	CountFaceList( bspface_t *list ) { -	int		c; -	c = 0; -	for ( ; list ; list = list->next ) { -		c++; -	} -	return c; -} - -/* -================ -BuildFaceTree_r -================ -*/ -void	BuildFaceTree_r( node_t *node, bspface_t *list ) { -	bspface_t	*split; -	bspface_t	*next; -	int			side; -	plane_t		*plane; -	bspface_t	*newFace; -	bspface_t	*childLists[2]; -	winding_t	*frontWinding, *backWinding; -	int			i; -	int			splitPlaneNum; - -	i = CountFaceList( list ); - -	splitPlaneNum = SelectSplitPlaneNum( node, list ); -	// if we don't have any more faces, this is a node -	if ( splitPlaneNum == -1 ) { -		node->planenum = PLANENUM_LEAF; -		c_faceLeafs++; -		return; -	} - -	// partition the list -	node->planenum = splitPlaneNum; -	node->hint = hintsplit; -	plane = &mapplanes[ splitPlaneNum ]; -	childLists[0] = NULL; -	childLists[1] = NULL; -	for ( split = list ; split ; split = next ) { -		next = split->next; - -		if ( split->planenum == node->planenum ) { -			FreeBspFace( split ); -			continue; -		} - -		side = WindingOnPlaneSide( split->w, plane->normal, plane->dist ); - -		if ( side == SIDE_CROSS ) { -			ClipWindingEpsilon( split->w, plane->normal, plane->dist, CLIP_EPSILON * 2, -				&frontWinding, &backWinding ); -			if ( frontWinding ) { -				newFace = AllocBspFace(); -				newFace->w = frontWinding; -				newFace->next = childLists[0]; -				newFace->planenum = split->planenum; -				newFace->priority = split->priority; -				newFace->hint = split->hint; -				childLists[0] = newFace; -			} -			if ( backWinding ) { -				newFace = AllocBspFace(); -				newFace->w = backWinding; -				newFace->next = childLists[1]; -				newFace->planenum = split->planenum; -				newFace->priority = split->priority; -				newFace->hint = split->hint; -				childLists[1] = newFace; -			} -			FreeBspFace( split ); -		} else if ( side == SIDE_FRONT ) { -			split->next = childLists[0]; -			childLists[0] = split; -		} else if ( side == SIDE_BACK ) { -			split->next = childLists[1]; -			childLists[1] = split; -		} -	} - - -	// recursively process children -	for ( i = 0 ; i < 2 ; i++ ) { -		node->children[i] = AllocNode(); -		node->children[i]->parent = node; -		VectorCopy( node->mins, node->children[i]->mins ); -		VectorCopy( node->maxs, node->children[i]->maxs ); -	} - -	for ( i = 0 ; i < 3 ; i++ ) { -		if ( plane->normal[i] == 1 ) { -			node->children[0]->mins[i] = plane->dist; -			node->children[1]->maxs[i] = plane->dist; -			break; -		} -	} - -	for ( i = 0 ; i < 2 ; i++ ) { -		BuildFaceTree_r ( node->children[i], childLists[i]); -	} -} - - -/* -================ -FaceBSP - -List will be freed before returning -================ -*/ -tree_t *FaceBSP( bspface_t *list ) { -	tree_t		*tree; -	bspface_t	*face; -	int			i; -	int			count; - -	qprintf( "--- FaceBSP ---\n" ); - -	tree = AllocTree (); - -	count = 0; -	for ( face = list ; face ; face = face->next ) { -		count++; -		for ( i = 0 ; i < face->w->numpoints ; i++ ) { -			AddPointToBounds( face->w->p[i], tree->mins, tree->maxs); -		} -	} -	qprintf( "%5i faces\n", count ); - -	tree->headnode = AllocNode(); -	VectorCopy( tree->mins, tree->headnode->mins ); -	VectorCopy( tree->maxs, tree->headnode->maxs ); -	c_faceLeafs = 0; - -	BuildFaceTree_r ( tree->headnode, list ); - -	qprintf( "%5i leafs\n", c_faceLeafs ); - -	return tree; -} - - -/* -================= -BspFaceForPortal -================= -*/ -bspface_t *BspFaceForPortal( portal_t *p ) { -	bspface_t	*f; - -	f = AllocBspFace(); -	f->w = CopyWinding( p->winding ); -	f->planenum = p->onnode->planenum & ~1; - -	return f; -} - - - -/* -================= -MakeStructuralBspFaceList -================= -*/ -bspface_t	*MakeStructuralBspFaceList( bspbrush_t *list ) { -	bspbrush_t	*b; -	int			i; -	side_t		*s; -	winding_t	*w; -	bspface_t	*f, *flist; - -	flist = NULL; -	for ( b = list ; b ; b = b->next ) { -		if ( b->detail ) { -			continue; -		} -		for ( i = 0 ; i < b->numsides ; i++ ) { -			s = &b->sides[i]; -			w = s->winding; -			if ( !w ) { -				continue; -			} -			f = AllocBspFace(); -			f->w = CopyWinding( w ); -			f->planenum = s->planenum & ~1; -			f->next = flist; -			if (s->surfaceFlags & SURF_HINT) { -				//f->priority = HINT_PRIORITY; -				f->hint = qtrue; -			} -			flist = f; -		} -	} - -	return flist; -} - -/* -================= -MakeVisibleBspFaceList -================= -*/ -bspface_t	*MakeVisibleBspFaceList( bspbrush_t *list ) { -	bspbrush_t	*b; -	int			i; -	side_t		*s; -	winding_t	*w; -	bspface_t	*f, *flist; - -	flist = NULL; -	for ( b = list ; b ; b = b->next ) { -		if ( b->detail ) { -			continue; -		} -		for ( i = 0 ; i < b->numsides ; i++ ) { -			s = &b->sides[i]; -			w = s->visibleHull; -			if ( !w ) { -				continue; -			} -			f = AllocBspFace(); -			f->w = CopyWinding( w ); -			f->planenum = s->planenum & ~1; -			f->next = flist; -			if (s->surfaceFlags & SURF_HINT) { -				//f->priority = HINT_PRIORITY; -				f->hint = qtrue; -			} -			flist = f; -		} -	} - -	return flist; -} -  | 
