/* ============ ProcessSubModel ============ */ void ProcessSubModel( void ) { entity_t *e; tree_t *tree; bspbrush_t *b, *bc; node_t *node; BeginModel (); e = &entities[entity_num]; e->firstDrawSurf = numMapDrawSurfs; PatchMapDrawSurfs( e ); // just put all the brushes in an empty leaf // FIXME: patches? node = AllocNode(); node->planenum = PLANENUM_LEAF; for ( b = e->brushes ; b ; b = b->next ) { bc = CopyBrush( b ); bc->next = node->brushlist; node->brushlist = bc; } tree = AllocTree(); tree->headnode = node; ClipSidesIntoTree( e, tree ); // subdivide each drawsurf as required by shader tesselation or fog if ( !nosubdivide ) { SubdivideDrawSurfs( e, tree ); } // merge together all common shaders on the same plane and remove // all colinear points, so extra tjunctions won't be generated if ( !nomerge ) { MergeSides( e, tree ); // !@# testing } // add in any vertexes required to fix tjunctions if ( !notjunc ) { FixTJunctions( e ); } // allocate lightmaps for faces and patches AllocateLightmaps( e ); // add references to the final drawsurfs in the apropriate clusters FilterDrawsurfsIntoTree( e, tree ); EndModel ( node ); FreeTree( tree ); }
/* ============ ProcessWorldModel ============ */ void ProcessWorldModel( void ) { entity_t *e; tree_t *tree; bspface_t *faces; qboolean leaked; BeginModel(); e = &entities[0]; e->firstDrawSurf = 0;//numMapDrawSurfs; // check for patches with adjacent edges that need to LOD together PatchMapDrawSurfs( e ); // build an initial bsp tree using all of the sides // of all of the structural brushes faces = MakeStructuralBspFaceList ( entities[0].brushes ); tree = FaceBSP( faces ); MakeTreePortals (tree); FilterStructuralBrushesIntoTree( e, tree ); // see if the bsp is completely enclosed if ( FloodEntities (tree) ) { // rebuild a better bsp tree using only the // sides that are visible from the inside FillOutside (tree->headnode); // chop the sides to the convex hull of // their visible fragments, giving us the smallest // polygons ClipSidesIntoTree( e, tree ); faces = MakeVisibleBspFaceList( entities[0].brushes ); FreeTree (tree); tree = FaceBSP( faces ); MakeTreePortals( tree ); FilterStructuralBrushesIntoTree( e, tree ); leaked = qfalse; } else { _printf ("**********************\n"); _printf ("******* leaked *******\n"); _printf ("**********************\n"); LeakFile (tree); if ( leaktest ) { _printf ("--- MAP LEAKED, ABORTING LEAKTEST ---\n"); exit (0); } leaked = qtrue; // chop the sides to the convex hull of // their visible fragments, giving us the smallest // polygons ClipSidesIntoTree( e, tree ); } // save out information for visibility processing NumberClusters( tree ); if ( !leaked ) { WritePortalFile( tree ); } if ( glview ) { // dump the portals for debugging WriteGLView( tree, source ); } FloodAreas (tree); // add references to the detail brushes FilterDetailBrushesIntoTree( e, tree ); // create drawsurfs for triangle models AddTriangleModels( tree ); // drawsurfs that cross fog boundaries will need to // be split along the bound if ( !nofog ) { FogDrawSurfs(); // may fragment drawsurfs } // subdivide each drawsurf as required by shader tesselation if ( !nosubdivide ) { SubdivideDrawSurfs( e, tree ); } // merge together all common shaders on the same plane and remove // all colinear points, so extra tjunctions won't be generated if ( !nomerge ) { MergeSides( e, tree ); // !@# testing } // add in any vertexes required to fix tjunctions if ( !notjunc ) { FixTJunctions( e ); } // allocate lightmaps for faces and patches AllocateLightmaps( e ); // add references to the final drawsurfs in the apropriate clusters FilterDrawsurfsIntoTree( e, tree ); EndModel( tree->headnode ); FreeTree (tree); }
/* ============ ProcessWorldModel ============ */ void ProcessWorldModel(void) { int s; entity_t *e; tree_t *tree; bspFace_t *faces; qboolean leaked; xmlNodePtr polyline, leaknode; char level[2]; const char *value; e = &entities[0]; e->firstDrawSurf = 0; //numMapDrawSurfs; // sets integer blockSize from worldspawn "_blocksize" key if it exists value = ValueForKey(e, "_blocksize"); if(value[0] == '\0') value = ValueForKey(e, "blocksize"); if(value[0] == '\0') value = ValueForKey(e, "chopsize"); // sof2 if(value[0] != '\0') { // scan 3 numbers s = sscanf(value, "%d %d %d", &blockSize[0], &blockSize[1], &blockSize[2]); // handle legacy case if(s == 1) { blockSize[1] = blockSize[0]; blockSize[2] = blockSize[0]; } } Sys_Printf("block size = { %d %d %d }\n", blockSize[0], blockSize[1], blockSize[2]); BeginModel(e); // check for patches with adjacent edges that need to LOD together PatchMapDrawSurfs(e); // build an initial bsp tree using all of the sides // of all of the structural brushes faces = MakeStructuralBspFaceList(entities[0].brushes); tree = FaceBSP(faces); MakeTreePortals(tree); FilterStructuralBrushesIntoTree(e, tree); if(drawFlag) { // draw unoptimized portals in new window drawTree = tree; Draw_Scene(DrawTree); } // see if the bsp is completely enclosed if(FloodEntities(tree)) { // rebuild a better bsp tree using only the // sides that are visible from the inside FillOutside(tree->headnode); // chop the sides to the convex hull of // their visible fragments, giving us the smallest // polygons ClipSidesIntoTree(e, tree); faces = MakeVisibleBspFaceList(entities[0].brushes); FreeTree(tree); tree = FaceBSP(faces); MakeTreePortals(tree); FilterStructuralBrushesIntoTree(e, tree); leaked = qfalse; } else { Sys_FPrintf(SYS_NOXML, "**********************\n"); Sys_FPrintf(SYS_NOXML, "******* leaked *******\n"); Sys_FPrintf(SYS_NOXML, "**********************\n"); polyline = LeakFile(tree); leaknode = xmlNewNode(NULL, "message"); xmlNodeSetContent(leaknode, "MAP LEAKED\n"); xmlAddChild(leaknode, polyline); level[0] = (int)'0' + SYS_ERR; level[1] = 0; xmlSetProp(leaknode, "level", (char *)&level); xml_SendNode(leaknode); if(leaktest) { Sys_Printf("--- MAP LEAKED, ABORTING LEAKTEST ---\n"); exit(0); } leaked = qtrue; // chop the sides to the convex hull of // their visible fragments, giving us the smallest // polygons ClipSidesIntoTree(e, tree); } // save out information for visibility processing NumberClusters(tree); if(!leaked) { WritePortalFile(tree); } if(glview) { // dump the portals for debugging WriteGLView(tree, source); } FloodAreas(tree); if(drawFlag) { // draw optimized portals in new window drawTree = tree; Draw_Scene(DrawTree); } // add references to the detail brushes FilterDetailBrushesIntoTree(e, tree); // create drawsurfs for triangle models AddTriangleModels(); // drawsurfs that cross fog boundaries will need to // be split along the bound if(!nofog) { FogDrawSurfs(); // may fragment drawsurfs } // subdivide each drawsurf as required by shader tesselation if(!nosubdivide) { SubdivideDrawSurfs(e, tree); } // merge together all common shaders on the same plane and remove // all colinear points, so extra tjunctions won't be generated if(!nomerge) { MergeSides(e, tree); // !@# testing } // add in any vertexes required to fix tjunctions if(!notjunc) { FixTJunctions(e); } // allocate lightmaps for faces and patches AllocateLightmaps(e); // add references to the final drawsurfs in the apropriate clusters FilterDrawsurfsIntoTree(e, tree); EndModel(e, tree->headnode); FreeTree(tree); }