From 49e437f18152be997cccdb3abb970d22deca44ca Mon Sep 17 00:00:00 2001 From: uis Date: Fri, 16 Aug 2024 05:20:24 +0300 Subject: [PATCH] tools: deduplicate leakfile.c across q3map2 and q2map This is purely conveniece change. So change of leakfile in one place will update it for all compilers. --- tools/quake2/q2map/leakfile.c | 179 +-------------------------------- tools/quake2/q2map/qbsp.c | 5 +- tools/quake2/q2map/qbsp.h | 2 +- tools/quake3/q3map2/leakfile.c | 125 +---------------------- tools/shared/map/leakfile.c | 127 +++++++++++++++++++++++ 5 files changed, 134 insertions(+), 304 deletions(-) mode change 100644 => 120000 tools/quake2/q2map/leakfile.c mode change 100644 => 120000 tools/quake3/q3map2/leakfile.c create mode 100644 tools/shared/map/leakfile.c diff --git a/tools/quake2/q2map/leakfile.c b/tools/quake2/q2map/leakfile.c deleted file mode 100644 index d8034a04..00000000 --- a/tools/quake2/q2map/leakfile.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - Copyright (C) 1999-2007 id Software, Inc. and contributors. - For a list of contributors, see the accompanying CONTRIBUTORS file. - - This file is part of GtkRadiant. - - GtkRadiant 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. - - GtkRadiant 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 GtkRadiant; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "qbsp.h" - -/* - ============================================================================== - - LEAF FILE GENERATION - - Save out name.line for qe3 to read - ============================================================================== - */ - - -/* - ============= - LeakFile - - Finds the shortest possible chain of portals - that leads from the outside leaf to a specifically - occupied leaf - ============= - */ - -/* - void LeakFile (tree_t *tree) - { - vec3_t mid; - FILE *linefile; - char filename[1024]; - node_t *node; - int count; - - if (!tree->outside_node.occupied) - return; - - Sys_Printf ("--- LeakFile ---\n"); - - // - // write the points to the file - // - sprintf (filename, "%s.lin", source); - linefile = fopen (filename, "w"); - if (!linefile) - Error ("Couldn't open %s\n", filename); - - count = 0; - node = &tree->outside_node; - while (node->occupied > 1) - { - int next; - portal_t *p, *nextportal; - node_t *nextnode; - int s; - - // find the best portal exit - next = node->occupied; - for (p=node->portals ; p ; p = p->next[!s]) - { - s = (p->nodes[0] == node); - if (p->nodes[s]->occupied - && p->nodes[s]->occupied < next) - { - nextportal = p; - nextnode = p->nodes[s]; - next = nextnode->occupied; - } - } - node = nextnode; - WindingCenter (nextportal->winding, mid); - fprintf (linefile, "%f %f %f\n", mid[0], mid[1], mid[2]); - count++; - } - // add the occupant center - GetVectorForKey (node->occupant, "origin", mid); - - fprintf (linefile, "%f %f %f\n", mid[0], mid[1], mid[2]); - Sys_Printf ("%5i point linefile\n", count+1); - - fclose (linefile); - } - */ - -/* - ============= - LeakFile - - Finds the shortest possible chain of portals - that leads from the outside leaf to a specifically - occupied leaf - - TTimo: builds a polyline xml node - ============= - */ -xmlNodePtr LeakFile( tree_t *tree ){ - vec3_t mid; - FILE *linefile; - char filename[1024]; - node_t *node; - int count; - xmlNodePtr xml_node, point; - - if ( !tree->outside_node.occupied ) { - return NULL; - } - - Sys_FPrintf( SYS_VRB,"--- LeakFile ---\n" ); - - // - // write the points to the file - // - sprintf( filename, "%s.lin", source ); - linefile = fopen( filename, "w" ); - if ( !linefile ) { - Error( "Couldn't open %s\n", filename ); - } - - xml_node = xmlNewNode( NULL, "polyline" ); - - count = 0; - node = &tree->outside_node; - while ( node->occupied > 1 ) - { - int next; - portal_t *p, *nextportal; - node_t *nextnode; - int s; - - // find the best portal exit - next = node->occupied; - for ( p = node->portals ; p ; p = p->next[!s] ) - { - s = ( p->nodes[0] == node ); - if ( p->nodes[s]->occupied - && p->nodes[s]->occupied < next ) { - nextportal = p; - nextnode = p->nodes[s]; - next = nextnode->occupied; - } - } - node = nextnode; - WindingCenter( nextportal->winding, mid ); - fprintf( linefile, "%f %f %f\n", mid[0], mid[1], mid[2] ); - point = xml_NodeForVec( mid ); - xmlAddChild( xml_node, point ); - count++; - } - // add the occupant center - GetVectorForKey( node->occupant, "origin", mid ); - - fprintf( linefile, "%f %f %f\n", mid[0], mid[1], mid[2] ); - point = xml_NodeForVec( mid ); - xmlAddChild( xml_node, point ); - Sys_FPrintf( SYS_VRB, "%9d point linefile\n", count + 1 ); - - fclose( linefile ); - - return xml_node; -} diff --git a/tools/quake2/q2map/leakfile.c b/tools/quake2/q2map/leakfile.c new file mode 120000 index 00000000..ed5d4648 --- /dev/null +++ b/tools/quake2/q2map/leakfile.c @@ -0,0 +1 @@ +../../shared/map/leakfile.c \ No newline at end of file diff --git a/tools/quake2/q2map/qbsp.c b/tools/quake2/q2map/qbsp.c index 1642c1d2..4e71f023 100644 --- a/tools/quake2/q2map/qbsp.c +++ b/tools/quake2/q2map/qbsp.c @@ -162,6 +162,7 @@ void ProcessWorldModel( void ){ qboolean optimize; xmlNodePtr polyline, leaknode; char level[ 2 ]; + char lineFilePath[ 1024 ]; e = &entities[entity_num]; @@ -169,6 +170,8 @@ void ProcessWorldModel( void ){ brush_end = brush_start + e->numbrushes; leaked = false; + sprintf( lineFilePath, "%s.lin", source ); + // // perform per-block operations // @@ -238,7 +241,7 @@ void ProcessWorldModel( void ){ Sys_FPrintf( SYS_NOXML, "**********************\n" ); Sys_FPrintf( SYS_NOXML, "******* leaked *******\n" ); Sys_FPrintf( SYS_NOXML, "**********************\n" ); - polyline = LeakFile( tree ); + polyline = LeakFile( tree, lineFilePath ); leaknode = xmlNewNode( NULL, "message" ); xmlNodeAddContent( leaknode, "MAP LEAKED\n" ); xmlAddChild( leaknode, polyline ); diff --git a/tools/quake2/q2map/qbsp.h b/tools/quake2/q2map/qbsp.h index 8f3ef9e0..da6c2b1a 100644 --- a/tools/quake2/q2map/qbsp.h +++ b/tools/quake2/q2map/qbsp.h @@ -338,7 +338,7 @@ void WriteGLView( tree_t *tree, char *source ); // leakfile.c //void LeakFile (tree_t *tree); -xmlNodePtr LeakFile( tree_t *tree ); +xmlNodePtr LeakFile( tree_t *tree, const char *lineFilePath ); //============================================================================= diff --git a/tools/quake3/q3map2/leakfile.c b/tools/quake3/q3map2/leakfile.c deleted file mode 100644 index 243af8a3..00000000 --- a/tools/quake3/q3map2/leakfile.c +++ /dev/null @@ -1,124 +0,0 @@ -/* ------------------------------------------------------------------------------- - - Copyright (C) 1999-2007 id Software, Inc. and contributors. - For a list of contributors, see the accompanying CONTRIBUTORS file. - - This file is part of GtkRadiant. - - GtkRadiant 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. - - GtkRadiant 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 GtkRadiant; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - ---------------------------------------------------------------------------------- - - This code has been altered significantly from its original form, to support - several games based on the Quake III Arena engine, in the form of "Q3Map2." - - ------------------------------------------------------------------------------- */ - - - -/* marker */ -#define LEAKFILE_C - - - -/* dependencies */ -#include "q3map2.h" - - - -/* - ============================================================================== - - LEAK FILE GENERATION - - Save out name.lin for qe3 to read - ============================================================================== - */ - - -/* - ============= - LeakFile - - Finds the shortest possible chain of portals - that leads from the outside leaf to a specifically - occupied leaf - - TTimo: builds a polyline xml node - ============= - */ -xmlNodePtr LeakFile( tree_t *tree, const char *filename ){ - vec3_t mid; - FILE *linefile; - node_t *node; - int count; - xmlNodePtr xml_node, point; - - if ( !tree->outside_node.occupied ) { - return NULL; - } - - Sys_FPrintf( SYS_VRB,"--- LeakFile ---\n" ); - - // - // write the points to the file - // - linefile = fopen( filename, "w" ); - if ( !linefile ) { - Error( "Couldn't open %s\n", filename ); - } - - xml_node = xmlNewNode( NULL, (xmlChar*)"polyline" ); - - count = 0; - node = &tree->outside_node; - while ( node->occupied > 1 ) - { - int next; - portal_t *p, *nextportal = NULL; - node_t *nextnode = NULL; - int s; - - // find the best portal exit - next = node->occupied; - for ( p = node->portals ; p ; p = p->next[!s] ) - { - s = ( p->nodes[0] == node ); - if ( p->nodes[s]->occupied - && p->nodes[s]->occupied < next ) { - nextportal = p; - nextnode = p->nodes[s]; - next = nextnode->occupied; - } - } - node = nextnode; - WindingCenter( nextportal->winding, mid ); - fprintf( linefile, "%f %f %f\n", mid[0], mid[1], mid[2] ); - point = xml_NodeForVec( mid ); - xmlAddChild( xml_node, point ); - count++; - } - // add the occupant center - GetVectorForKey( node->occupant, "origin", mid ); - - fprintf( linefile, "%f %f %f\n", mid[0], mid[1], mid[2] ); - point = xml_NodeForVec( mid ); - xmlAddChild( xml_node, point ); - Sys_FPrintf( SYS_VRB, "%9d point linefile\n", count + 1 ); - - fclose( linefile ); - - return xml_node; -} diff --git a/tools/quake3/q3map2/leakfile.c b/tools/quake3/q3map2/leakfile.c new file mode 120000 index 00000000..ed5d4648 --- /dev/null +++ b/tools/quake3/q3map2/leakfile.c @@ -0,0 +1 @@ +../../shared/map/leakfile.c \ No newline at end of file diff --git a/tools/shared/map/leakfile.c b/tools/shared/map/leakfile.c new file mode 100644 index 00000000..ab49f6eb --- /dev/null +++ b/tools/shared/map/leakfile.c @@ -0,0 +1,127 @@ +/* ------------------------------------------------------------------------------- + + Copyright (C) 1999-2007 id Software, Inc. and contributors. + For a list of contributors, see the accompanying CONTRIBUTORS file. + + This file is part of GtkRadiant. + + GtkRadiant 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. + + GtkRadiant 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 GtkRadiant; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + ---------------------------------------------------------------------------------- + + This code has been altered significantly from its original form, to support + several games based on the Quake III Arena engine, in the form of "Q3Map2." + + ------------------------------------------------------------------------------- */ + + + +/* marker */ +#define LEAKFILE_C + + +/* dependencies */ +#ifdef Q3MAP_VERSION +#include "q3map2.h" +#else +#include "qbsp.h" +#endif + + + +/* + ============================================================================== + + LEAK FILE GENERATION + + Save out name.lin for qe3 to read + ============================================================================== + */ + + +/* + ============= + LeakFile + + Finds the shortest possible chain of portals + that leads from the outside leaf to a specifically + occupied leaf + + TTimo: builds a polyline xml node + ============= + */ +xmlNodePtr LeakFile( tree_t *tree, const char *filename ){ + vec3_t mid; + FILE *linefile; + node_t *node; + int count; + xmlNodePtr xml_node, point; + + if ( !tree->outside_node.occupied ) { + return NULL; + } + + Sys_FPrintf( SYS_VRB,"--- LeakFile ---\n" ); + + // + // write the points to the file + // + linefile = fopen( filename, "w" ); + if ( !linefile ) { + Error( "Couldn't open %s\n", filename ); + } + + xml_node = xmlNewNode( NULL, (xmlChar*)"polyline" ); + + count = 0; + node = &tree->outside_node; + while ( node->occupied > 1 ) + { + int next; + portal_t *p, *nextportal = NULL; + node_t *nextnode = NULL; + int s; + + // find the best portal exit + next = node->occupied; + for ( p = node->portals ; p ; p = p->next[!s] ) + { + s = ( p->nodes[0] == node ); + if ( p->nodes[s]->occupied + && p->nodes[s]->occupied < next ) { + nextportal = p; + nextnode = p->nodes[s]; + next = nextnode->occupied; + } + } + node = nextnode; + WindingCenter( nextportal->winding, mid ); + fprintf( linefile, "%f %f %f\n", mid[0], mid[1], mid[2] ); + point = xml_NodeForVec( mid ); + xmlAddChild( xml_node, point ); + count++; + } + // add the occupant center + GetVectorForKey( node->occupant, "origin", mid ); + + fprintf( linefile, "%f %f %f\n", mid[0], mid[1], mid[2] ); + point = xml_NodeForVec( mid ); + xmlAddChild( xml_node, point ); + Sys_FPrintf( SYS_VRB, "%9d point linefile\n", count + 1 ); + + fclose( linefile ); + + return xml_node; +} -- 2.39.2