/* * ProcessSubModel */ static void ProcessSubModel(void){ entity_t *e; int start, end; tree_t *tree; bsp_brush_t *list; vec3_t mins, maxs; e = &entities[entity_num]; start = e->first_brush; end = start + e->num_brushes; mins[0] = mins[1] = mins[2] = -MAX_WORLD_WIDTH; maxs[0] = maxs[1] = maxs[2] = MAX_WORLD_WIDTH; list = MakeBspBrushList(start, end, mins, maxs); if(!nocsg) list = ChopBrushes(list); tree = BrushBSP(list, mins, maxs); MakeTreePortals(tree); MarkVisibleSides(tree, start, end); MakeFaces(tree->head_node); FixTjuncs(tree->head_node); WriteBSP(tree->head_node); FreeTree(tree); }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== tree_t *ProcessWorldBrushes( int brush_start, int brush_end ) { bspbrush_t *brushes; tree_t *tree; node_t *node; vec3_t mins, maxs; //take the whole world mins[0] = map_mins[0] - 8; mins[1] = map_mins[1] - 8; mins[2] = map_mins[2] - 8; maxs[0] = map_maxs[0] + 8; maxs[1] = map_maxs[1] + 8; maxs[2] = map_maxs[2] + 8; //reset the brush bsp ResetBrushBSP(); // the makelist and chopbrushes could be cached between the passes... //create a list with brushes that are within the given mins/maxs //some brushes will be cut and only the part that falls within the //mins/maxs will be in the bush list brushes = MakeBspBrushList( brush_start, brush_end, mins, maxs ); // if ( !brushes ) { node = AllocNode(); node->planenum = PLANENUM_LEAF; node->contents = CONTENTS_SOLID; tree = Tree_Alloc(); tree->headnode = node; VectorCopy( mins, tree->mins ); VectorCopy( maxs, tree->maxs ); } //end if else { //Carves any intersecting solid brushes into the minimum number //of non-intersecting brushes. if ( !nocsg ) { brushes = ChopBrushes( brushes ); /* if (create_aas) { brushes = MergeBrushes(brushes); } //end if*/ } //end if //if the conversion is cancelled if ( cancelconversion ) { FreeBrushList( brushes ); return NULL; } //end if //create the actual bsp tree tree = BrushBSP( brushes, mins, maxs ); } //end else //return the tree return tree; } //end of the function ProcessWorldBrushes
/* ============ ProcessSubModel ============ */ void ProcessSubModel( ) { entity_t *e; int start, end; tree_t *tree; bspbrush_t *list; Vector mins, maxs; e = &entities[entity_num]; start = e->firstbrush; end = start + e->numbrushes; mins[0] = mins[1] = mins[2] = MIN_COORD_INTEGER; maxs[0] = maxs[1] = maxs[2] = MAX_COORD_INTEGER; list = MakeBspBrushList (start, end, mins, maxs, FULL_DETAIL); if (!nocsg) list = ChopBrushes (list); tree = BrushBSP (list, mins, maxs); // This would wind up crashing the engine because we'd have a negative leaf index in dmodel_t::headnode. if ( tree->headnode->planenum == PLANENUM_LEAF ) { const char *pClassName = ValueForKey( e, "classname" ); const char *pTargetName = ValueForKey( e, "targetname" ); Error( "bmodel %d has no head node (class '%s', targetname '%s')", entity_num, pClassName, pTargetName ); } MakeTreePortals (tree); #if DEBUG_BRUSHMODEL if ( entity_num == DEBUG_BRUSHMODEL ) WriteGLView( tree, "tree_all" ); #endif MarkVisibleSides (tree, start, end, FULL_DETAIL); MakeFaces (tree->headnode); FixTjuncs( tree->headnode, NULL ); WriteBSP( tree->headnode, NULL ); #if DEBUG_BRUSHMODEL if ( entity_num == DEBUG_BRUSHMODEL ) { WriteGLView( tree, "tree_vis" ); WriteGLViewFaces( tree, "tree_faces" ); } #endif FreeTree (tree); }
static void ProcessBlock_Thread(int blocknum){ int xblock, yblock; vec3_t mins, maxs; bsp_brush_t *brushes; tree_t *tree; node_t *node; yblock = block_yl + blocknum / (block_xh - block_xl + 1); xblock = block_xl + blocknum % (block_xh - block_xl + 1); Com_Verbose("############### block %2i,%2i ###############\n", xblock, yblock); mins[0] = xblock * 1024; mins[1] = yblock * 1024; mins[2] = -MAX_WORLD_WIDTH; maxs[0] = (xblock + 1) * 1024; maxs[1] = (yblock + 1) * 1024; maxs[2] = MAX_WORLD_WIDTH; ThreadLock(); // the makelist and chopbrushes could be cached between the passes... brushes = MakeBspBrushList(brush_start, brush_end, mins, maxs); if(!brushes){ node = AllocNode(); node->plane_num = PLANENUM_LEAF; node->contents = CONTENTS_SOLID; block_nodes[xblock + 5][yblock + 5] = node; ThreadUnlock(); return; } if(!nocsg) brushes = ChopBrushes(brushes); tree = BrushBSP(brushes, mins, maxs); ThreadUnlock(); block_nodes[xblock + 5][yblock + 5] = tree->head_node; }
//----------------------------------------------------------------------------- // Clips all occluder brushes against each other //----------------------------------------------------------------------------- static tree_t *ClipOccluderBrushes( ) { // Create a list of all occluder brushes in the level CUtlVector< mapbrush_t * > mapBrushes( 1024, 1024 ); for ( entity_num=0; entity_num < g_MainMap->num_entities; ++entity_num ) { if (!IsFuncOccluder(entity_num)) continue; entity_t *e = &entities[entity_num]; int end = e->firstbrush + e->numbrushes; int i; for ( i = e->firstbrush; i < end; ++i ) { mapBrushes.AddToTail( &g_MainMap->mapbrushes[i] ); } } int nBrushCount = mapBrushes.Count(); if ( nBrushCount == 0 ) return NULL; Vector mins, maxs; mins[0] = mins[1] = mins[2] = MIN_COORD_INTEGER; maxs[0] = maxs[1] = maxs[2] = MAX_COORD_INTEGER; bspbrush_t *list = MakeBspBrushList( mapBrushes.Base(), nBrushCount, mins, maxs ); if (!nocsg) list = ChopBrushes (list); tree_t *tree = BrushBSP (list, mins, maxs); MakeTreePortals (tree); MarkVisibleSides (tree, mapBrushes.Base(), nBrushCount); MakeFaces( tree->headnode ); // NOTE: This will output the occluder face vertices + planes FixTjuncs( tree->headnode, NULL ); return tree; }
void ProcessBlock_Thread (int threadnum, int blocknum) { int xblock, yblock; Vector mins, maxs; bspbrush_t *brushes; tree_t *tree; node_t *node; yblock = block_yl + blocknum / (block_xh-block_xl+1); xblock = block_xl + blocknum % (block_xh-block_xl+1); qprintf ("############### block %2i,%2i ###############\n", xblock, yblock); mins[0] = xblock*BLOCKS_SIZE; mins[1] = yblock*BLOCKS_SIZE; mins[2] = MIN_COORD_INTEGER; maxs[0] = (xblock+1)*BLOCKS_SIZE; maxs[1] = (yblock+1)*BLOCKS_SIZE; maxs[2] = MAX_COORD_INTEGER; // the makelist and chopbrushes could be cached between the passes... brushes = MakeBspBrushList (brush_start, brush_end, mins, maxs, NO_DETAIL); if (!brushes) { node = AllocNode (); node->planenum = PLANENUM_LEAF; node->contents = CONTENTS_SOLID; block_nodes[xblock+BLOCKX_OFFSET][yblock+BLOCKY_OFFSET] = node; return; } FixupAreaportalWaterBrushes( brushes ); if (!nocsg) brushes = ChopBrushes (brushes); tree = BrushBSP (brushes, mins, maxs); block_nodes[xblock+BLOCKX_OFFSET][yblock+BLOCKY_OFFSET] = tree->headnode; }