more eol-style
[xonotic/netradiant.git] / contrib / bobtoolz / cportals.cpp
index d56c6b4c499705e307a78d65cdaa37ce0c73c2c0..d05591c3caee30b0c58af88bee9ee8e5944cf8d6 100644 (file)
-/*\r
-BobToolz plugin for GtkRadiant\r
-Copyright (C) 2001 Gordon Biggans\r
-\r
-This library is free software; you can redistribute it and/or\r
-modify it under the terms of the GNU Lesser General Public\r
-License as published by the Free Software Foundation; either\r
-version 2.1 of the License, or (at your option) any later version.\r
-\r
-This library is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-Lesser General Public License for more details.\r
-\r
-You should have received a copy of the GNU Lesser General Public\r
-License along with this library; if not, write to the Free Software\r
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-*/\r
-\r
-#include "StdAfx.h"\r
-#include "CPortals.h"\r
-#include "misc.h"\r
-\r
-#define LINE_BUF 1000\r
-#define MSG_PREFIX "bobToolz plugin: "\r
-\r
-// these classes are far less of a mess than my code was, \r
-// thanq to G.DeWan 4 the prtview source on which it was based\r
-\r
-CBspPortal::CBspPortal()\r
-{\r
-       memset(this, 0, sizeof(CBspPortal));\r
-}\r
-\r
-CBspPortal::~CBspPortal()\r
-{\r
-       delete[] point;\r
-}\r
-\r
-void ClampFloat(float* p)\r
-{\r
-       double i;\r
-       double frac = modf(*p, &i);\r
-\r
-       if(!frac)\r
-               return;\r
-\r
-       if(fabs(*p - ceil(*p)) < MAX_ROUND_ERROR)\r
-               *p = ceilf(*p);\r
-\r
-       if(fabs(*p - floor(*p)) < MAX_ROUND_ERROR)\r
-               *p = floorf(*p);\r
-}\r
-\r
-bool CBspPortal::Build(char *def, unsigned int pointCnt, bool bInverse)\r
-{\r
-       char *c = def;\r
-       unsigned int n;\r
-\r
-       point_count = pointCnt;\r
-\r
-       if(point_count < 3)\r
-               return FALSE;\r
-\r
-       point = new CBspPoint[point_count];\r
-\r
-       for(n = 0; n < point_count; n++)\r
-       {\r
-               for(; *c != 0 && *c != '('; c++);\r
-\r
-               if(*c == 0)\r
-                       return FALSE;\r
-\r
-               c++;\r
-\r
-               int x;\r
-               if(bInverse)\r
-                       x = point_count - n - 1;\r
-               else\r
-                       x = n;\r
-\r
-               sscanf(c, "%f %f %f", &point[x].p[0], &point[x].p[1], &point[x].p[2]);\r
-\r
-               ClampFloat(&point[x].p[0]);\r
-               ClampFloat(&point[x].p[1]);\r
-               ClampFloat(&point[x].p[2]);\r
-       }\r
-\r
-       return TRUE;\r
-}\r
-\r
-CPortals::CPortals()\r
-{\r
-       memset(this, 0, sizeof(CPortals));\r
-}\r
-\r
-CPortals::~CPortals()\r
-{\r
-       Purge();\r
-}\r
-\r
-void CPortals::Purge()\r
-{\r
-       if(node)\r
-               delete[] node;\r
-       node = NULL;\r
-       node_count = 0;\r
-}\r
-\r
-void CPortals::Load()\r
-{\r
-       char buf[LINE_BUF+1];\r
-\r
-       memset(buf, 0, LINE_BUF + 1);\r
-       \r
-       Purge();\r
-\r
-       Sys_Printf(MSG_PREFIX "Loading portal file %s.\n", fn);\r
-\r
-       FILE *in;\r
-\r
-       in = fopen(fn, "rt");\r
-\r
-       if(in == NULL)\r
-       {\r
-               Sys_Printf("  ERROR - could not open file.\n");\r
-\r
-               return;\r
-       }\r
-\r
-       if(!fgets(buf, LINE_BUF, in))\r
-       {\r
-               fclose(in);\r
-\r
-               Sys_Printf("  ERROR - File ended prematurely.\n");\r
-\r
-               return;\r
-       }\r
-\r
-       if(strncmp("PRT1", buf, 4) != 0)\r
-       {\r
-               fclose(in);\r
-\r
-               Sys_Printf("  ERROR - File header indicates wrong file type (should be \"PRT1\").\n");\r
-\r
-               return;\r
-       }\r
-\r
-       if(!fgets(buf, LINE_BUF, in))\r
-       {\r
-               fclose(in);\r
-\r
-               Sys_Printf("  ERROR - File ended prematurely.\n");\r
-\r
-               return;\r
-       }\r
-\r
-       sscanf(buf, "%u", &node_count);\r
-\r
-       if(node_count > 0xFFFF)\r
-       {\r
-               fclose(in);\r
-\r
-               node_count = 0;\r
-\r
-               Sys_Printf("  ERROR - Extreme number of nodes, aborting.\n");\r
-\r
-               return;\r
-       }\r
-\r
-       if(!fgets(buf, LINE_BUF, in))\r
-       {\r
-               fclose(in);\r
-\r
-               node_count = 0;\r
-\r
-               Sys_Printf("  ERROR - File ended prematurely.\n");\r
-\r
-               return;\r
-       }\r
-\r
-       unsigned int p_count;\r
-       sscanf(buf, "%u", &p_count);\r
-\r
-       if(!fgets(buf, LINE_BUF, in))\r
-       {\r
-               fclose(in);\r
-\r
-               node_count = 0;\r
-\r
-               Sys_Printf("  ERROR - File ended prematurely.\n");\r
-\r
-               return;\r
-       }\r
-\r
-       unsigned int p_count2;\r
-       sscanf(buf, "%u", &p_count2);\r
-\r
-       node = new CBspNode[node_count];\r
-\r
-       unsigned int i;\r
-       for(i = 0; i < p_count; i++)\r
-       {\r
-               if(!fgets(buf, LINE_BUF, in))\r
-               {\r
-                       fclose(in);\r
-\r
-                       node_count = 0;\r
-\r
-                       Sys_Printf("  ERROR - File ended prematurely.\n");\r
-\r
-                       return;\r
-               }\r
-\r
-               unsigned int dummy, node1, node2;\r
-               sscanf(buf, "%u %u %u", &dummy, &node1, &node2);\r
-\r
-               node[node1].portal_count++;\r
-               node[node2].portal_count++;\r
-       }\r
-\r
-       for(i = 0; i < p_count2; i++)\r
-       {\r
-               if(!fgets(buf, LINE_BUF, in))\r
-               {\r
-                       fclose(in);\r
-\r
-                       node_count = 0;\r
-\r
-                       Sys_Printf("  ERROR - File ended prematurely.\n");\r
-\r
-                       return;\r
-               }\r
-\r
-               unsigned int dummy, node1;\r
-               sscanf(buf, "%u %u", &dummy, &node1);\r
-\r
-               node[node1].portal_count++;\r
-       }\r
-\r
-       for(i = 0; i < node_count; i++)\r
-               node[i].portal = new CBspPortal[node[i].portal_count];\r
-\r
-       fclose(in);\r
-\r
-       in = fopen(fn, "rt");\r
-\r
-       fgets(buf, LINE_BUF, in);\r
-       fgets(buf, LINE_BUF, in);\r
-       fgets(buf, LINE_BUF, in);\r
-       fgets(buf, LINE_BUF, in);\r
-\r
-       unsigned int n;\r
-       for(n = 0; n < p_count; n++)\r
-       {\r
-               if(!fgets(buf, LINE_BUF, in))\r
-               {\r
-                       fclose(in);\r
-\r
-                       Purge();\r
-\r
-                       Sys_Printf("  ERROR - Could not find information for portal number %d of %d.\n", n + 1, p_count);\r
-\r
-                       return;\r
-               }\r
-\r
-               unsigned int pCount, node1, node2;\r
-               sscanf(buf, "%u %u %u", &pCount, &node1, &node2);\r
-\r
-               if(!node[node1].AddPortal(buf, pCount, FALSE))\r
-               {\r
-                       fclose(in);\r
-\r
-                       Purge();\r
-\r
-                       Sys_Printf("  ERROR - Information for portal number %d of %d is not formatted correctly.\n", n + 1, p_count);\r
-\r
-                       return;\r
-               }\r
-\r
-               if(!node[node2].AddPortal(buf, pCount, TRUE))\r
-               {\r
-                       fclose(in);\r
-\r
-                       Purge();\r
-\r
-                       Sys_Printf("  ERROR - Information for portal number %d of %d is not formatted correctly.\n", n + 1, p_count);\r
-\r
-                       return;\r
-               }\r
-       }\r
-\r
- for(n = 0; n < p_count2; n++)\r
-       {\r
-               if(!fgets(buf, LINE_BUF, in))\r
-               {\r
-                       fclose(in);\r
-\r
-                       Purge();\r
-\r
-                       Sys_Printf("  ERROR - Could not find information for portal number %d of %d.\n", n + 1, p_count);\r
-\r
-                       return;\r
-               }\r
-\r
-               unsigned int pCount, node1;\r
-               sscanf(buf, "%u %u", &pCount, &node1);\r
-\r
-               if(!node[node1].AddPortal(buf, pCount, FALSE))\r
-               {\r
-                       fclose(in);\r
-\r
-                       Purge();\r
-\r
-                       Sys_Printf("  ERROR - Information for portal number %d of %d is not formatted correctly.\n", n + 1, p_count);\r
-\r
-                       return;\r
-               }\r
-       }\r
-\r
-       fclose(in);\r
-}\r
-\r
-CBspNode::CBspNode()\r
-{\r
-       portal = NULL;\r
-       portal_count = 0;\r
-       portal_next = 0;\r
-}\r
-\r
-CBspNode::~CBspNode()\r
-{\r
-       if(portal != NULL)\r
-               delete[] portal;\r
-}\r
-\r
-bool CBspNode::AddPortal(char *def, unsigned int pointCnt, bool bInverse)\r
-{\r
-       return portal[portal_next++].Build(def, pointCnt, bInverse);\r
-}\r
+/*
+BobToolz plugin for GtkRadiant
+Copyright (C) 2001 Gordon Biggans
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include "StdAfx.h"
+#include "CPortals.h"
+#include "misc.h"
+
+#define LINE_BUF 1000
+#define MSG_PREFIX "bobToolz plugin: "
+
+// these classes are far less of a mess than my code was, 
+// thanq to G.DeWan 4 the prtview source on which it was based
+
+CBspPortal::CBspPortal()
+{
+       memset(this, 0, sizeof(CBspPortal));
+}
+
+CBspPortal::~CBspPortal()
+{
+       delete[] point;
+}
+
+void ClampFloat(float* p)
+{
+       double i;
+       double frac = modf(*p, &i);
+
+       if(!frac)
+               return;
+
+       if(fabs(*p - ceil(*p)) < MAX_ROUND_ERROR)
+               *p = ceilf(*p);
+
+       if(fabs(*p - floor(*p)) < MAX_ROUND_ERROR)
+               *p = floorf(*p);
+}
+
+bool CBspPortal::Build(char *def, unsigned int pointCnt, bool bInverse)
+{
+       char *c = def;
+       unsigned int n;
+
+       point_count = pointCnt;
+
+       if(point_count < 3)
+               return FALSE;
+
+       point = new CBspPoint[point_count];
+
+       for(n = 0; n < point_count; n++)
+       {
+               for(; *c != 0 && *c != '('; c++);
+
+               if(*c == 0)
+                       return FALSE;
+
+               c++;
+
+               int x;
+               if(bInverse)
+                       x = point_count - n - 1;
+               else
+                       x = n;
+
+               sscanf(c, "%f %f %f", &point[x].p[0], &point[x].p[1], &point[x].p[2]);
+
+               ClampFloat(&point[x].p[0]);
+               ClampFloat(&point[x].p[1]);
+               ClampFloat(&point[x].p[2]);
+       }
+
+       return TRUE;
+}
+
+CPortals::CPortals()
+{
+       memset(this, 0, sizeof(CPortals));
+}
+
+CPortals::~CPortals()
+{
+       Purge();
+}
+
+void CPortals::Purge()
+{
+       if(node)
+               delete[] node;
+       node = NULL;
+       node_count = 0;
+}
+
+void CPortals::Load()
+{
+       char buf[LINE_BUF+1];
+
+       memset(buf, 0, LINE_BUF + 1);
+       
+       Purge();
+
+       Sys_Printf(MSG_PREFIX "Loading portal file %s.\n", fn);
+
+       FILE *in;
+
+       in = fopen(fn, "rt");
+
+       if(in == NULL)
+       {
+               Sys_Printf("  ERROR - could not open file.\n");
+
+               return;
+       }
+
+       if(!fgets(buf, LINE_BUF, in))
+       {
+               fclose(in);
+
+               Sys_Printf("  ERROR - File ended prematurely.\n");
+
+               return;
+       }
+
+       if(strncmp("PRT1", buf, 4) != 0)
+       {
+               fclose(in);
+
+               Sys_Printf("  ERROR - File header indicates wrong file type (should be \"PRT1\").\n");
+
+               return;
+       }
+
+       if(!fgets(buf, LINE_BUF, in))
+       {
+               fclose(in);
+
+               Sys_Printf("  ERROR - File ended prematurely.\n");
+
+               return;
+       }
+
+       sscanf(buf, "%u", &node_count);
+
+       if(node_count > 0xFFFF)
+       {
+               fclose(in);
+
+               node_count = 0;
+
+               Sys_Printf("  ERROR - Extreme number of nodes, aborting.\n");
+
+               return;
+       }
+
+       if(!fgets(buf, LINE_BUF, in))
+       {
+               fclose(in);
+
+               node_count = 0;
+
+               Sys_Printf("  ERROR - File ended prematurely.\n");
+
+               return;
+       }
+
+       unsigned int p_count;
+       sscanf(buf, "%u", &p_count);
+
+       if(!fgets(buf, LINE_BUF, in))
+       {
+               fclose(in);
+
+               node_count = 0;
+
+               Sys_Printf("  ERROR - File ended prematurely.\n");
+
+               return;
+       }
+
+       unsigned int p_count2;
+       sscanf(buf, "%u", &p_count2);
+
+       node = new CBspNode[node_count];
+
+       unsigned int i;
+       for(i = 0; i < p_count; i++)
+       {
+               if(!fgets(buf, LINE_BUF, in))
+               {
+                       fclose(in);
+
+                       node_count = 0;
+
+                       Sys_Printf("  ERROR - File ended prematurely.\n");
+
+                       return;
+               }
+
+               unsigned int dummy, node1, node2;
+               sscanf(buf, "%u %u %u", &dummy, &node1, &node2);
+
+               node[node1].portal_count++;
+               node[node2].portal_count++;
+       }
+
+       for(i = 0; i < p_count2; i++)
+       {
+               if(!fgets(buf, LINE_BUF, in))
+               {
+                       fclose(in);
+
+                       node_count = 0;
+
+                       Sys_Printf("  ERROR - File ended prematurely.\n");
+
+                       return;
+               }
+
+               unsigned int dummy, node1;
+               sscanf(buf, "%u %u", &dummy, &node1);
+
+               node[node1].portal_count++;
+       }
+
+       for(i = 0; i < node_count; i++)
+               node[i].portal = new CBspPortal[node[i].portal_count];
+
+       fclose(in);
+
+       in = fopen(fn, "rt");
+
+       fgets(buf, LINE_BUF, in);
+       fgets(buf, LINE_BUF, in);
+       fgets(buf, LINE_BUF, in);
+       fgets(buf, LINE_BUF, in);
+
+       unsigned int n;
+       for(n = 0; n < p_count; n++)
+       {
+               if(!fgets(buf, LINE_BUF, in))
+               {
+                       fclose(in);
+
+                       Purge();
+
+                       Sys_Printf("  ERROR - Could not find information for portal number %d of %d.\n", n + 1, p_count);
+
+                       return;
+               }
+
+               unsigned int pCount, node1, node2;
+               sscanf(buf, "%u %u %u", &pCount, &node1, &node2);
+
+               if(!node[node1].AddPortal(buf, pCount, FALSE))
+               {
+                       fclose(in);
+
+                       Purge();
+
+                       Sys_Printf("  ERROR - Information for portal number %d of %d is not formatted correctly.\n", n + 1, p_count);
+
+                       return;
+               }
+
+               if(!node[node2].AddPortal(buf, pCount, TRUE))
+               {
+                       fclose(in);
+
+                       Purge();
+
+                       Sys_Printf("  ERROR - Information for portal number %d of %d is not formatted correctly.\n", n + 1, p_count);
+
+                       return;
+               }
+       }
+
+ for(n = 0; n < p_count2; n++)
+       {
+               if(!fgets(buf, LINE_BUF, in))
+               {
+                       fclose(in);
+
+                       Purge();
+
+                       Sys_Printf("  ERROR - Could not find information for portal number %d of %d.\n", n + 1, p_count);
+
+                       return;
+               }
+
+               unsigned int pCount, node1;
+               sscanf(buf, "%u %u", &pCount, &node1);
+
+               if(!node[node1].AddPortal(buf, pCount, FALSE))
+               {
+                       fclose(in);
+
+                       Purge();
+
+                       Sys_Printf("  ERROR - Information for portal number %d of %d is not formatted correctly.\n", n + 1, p_count);
+
+                       return;
+               }
+       }
+
+       fclose(in);
+}
+
+CBspNode::CBspNode()
+{
+       portal = NULL;
+       portal_count = 0;
+       portal_next = 0;
+}
+
+CBspNode::~CBspNode()
+{
+       if(portal != NULL)
+               delete[] portal;
+}
+
+bool CBspNode::AddPortal(char *def, unsigned int pointCnt, bool bInverse)
+{
+       return portal[portal_next++].Build(def, pointCnt, bInverse);
+}