]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bobtoolz/visfind.cpp
* fixed ufoai surface plugin (don't give a stack variable pointer to the button callb...
[xonotic/netradiant.git] / contrib / bobtoolz / visfind.cpp
index 28525ff98b185d5fd75acf05c5f2ba5af7ef48d1..6a54ab4496d1eceb79b328d66ec4a846fc129f49 100644 (file)
-// Requries parts of the q3 tools source to compile\r
-// Date: Oct 5, 2001\r
-// Written by: Brad Whitehead (whiteheb@gamerstv.net)\r
-\r
-#include "StdAfx.h"\r
-#include "dialogs/dialogs-gtk.h"\r
-#include "DWinding.h"\r
-#include "bsploader.h"\r
-\r
-typedef struct {\r
-       int             portalclusters;\r
-       int             leafbytes;       //leafbytes = ((portalclusters+63)&~63)>>3;\r
-} vis_header;\r
-\r
-// added because int shift = 32; i = 0xFFFFFFFF >> shift; \r
-// then i = 0xFFFFFFFF, when it should = 0\r
-const unsigned long bitmasks[33] =\r
-{\r
-       0x00000000,\r
-       0x00000001, 0x00000003, 0x00000007, 0x0000000F,\r
-       0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,\r
-       0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,\r
-       0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,\r
-       0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,\r
-       0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,\r
-       0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,\r
-       0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF\r
-};\r
-\r
-int bsp_leafnumfororigin(vec3_t origin)\r
-{\r
-       dnode_t         *node;\r
-       dplane_t        *plane;\r
-       float           d;\r
-\r
-       // TODO: check if origin is in the map??\r
-\r
-       node = dnodes;\r
-       while (true)\r
-       {\r
-               plane = &dplanes[node->planeNum];\r
-               d = DotProduct (origin, plane->normal) - plane->dist;\r
-               if ( d >= 0 )\r
-                       if ( node->children[0] < 0 )\r
-                               return -(node->children[0]+1);\r
-                       else\r
-                               node = &dnodes[node->children[0]];\r
-               else\r
-                       if ( node->children[1] < 0 )\r
-                               return -(node->children[1]+1);\r
-                       else\r
-                               node = &dnodes[node->children[1]];\r
-       }\r
-       return 0;\r
-}\r
-\r
-int bsp_leafnumforcluster(int cluster)\r
-{\r
-       dleaf_t *l;\r
-       int i;\r
-\r
-       for ( i = 0, l = dleafs; i < numleafs; i++, l++ )\r
-               if ( l->cluster == cluster ) return(i);\r
-       return(0);\r
-}\r
-\r
-// leaf1 = origin leaf\r
-// leaf2 = leaf to test for\r
-/*int bsp_InPVS(int cluster1, int cluster2)\r
-{\r
-       vis_header              *vheader;\r
-       byte                    *visdata;\r
-\r
-       vheader = (vis_header *) visBytes;\r
-       visdata = visBytes + VIS_HEADER_SIZE;\r
-\r
-       return( *( visdata + ( cluster1 * vheader->leafbytes ) + (cluster2 / 8) ) & ( 1 << ( cluster2 % 8 ) ) );\r
-}*/\r
-\r
-void bsp_setbitvectorlength( byte *v, int length_bits, int length_vector )\r
-{\r
-       int i;\r
-\r
-       i = length_bits/8;\r
-\r
-       *(v+i) = (byte) bitmasks[length_bits % 8];\r
-\r
-       memset((v+i+1), 0, length_vector-i-1);\r
-}\r
-\r
-\r
-void bsp_bitvectorsubtract(byte *first, byte *second, byte *out, int length)\r
-{\r
-\r
-       int i;\r
-\r
-       for ( i = 0; i < length; i++ )\r
-               *(out+i) = *(first+i) & ~(*(second+i));\r
-}\r
-\r
-int bsp_countclusters(byte *bitvector, int length)\r
-{\r
-       int i, j, c;\r
-\r
-       c = 0;\r
-       for ( i = 0; i < length; i++ )\r
-               for ( j = 0; j < 8; j++ )\r
-                       if ( (*(bitvector+i) & (1 << j)) ) c++;\r
-       return(c);\r
-}\r
-\r
-int bsp_countclusters_mask(byte *bitvector, byte *maskvector, int length)\r
-{\r
-       int i, j, c;\r
-\r
-       c = 0;\r
-       for ( i = 0; i < length; i++ )\r
-               for ( j = 0; j < 8; j++ )\r
-                       if ( (*(bitvector+i) & (1 << j)) && (*(maskvector+i) & (1 << j)) ) c++;\r
-       return(c);\r
-}\r
-\r
-void AddCluster(list<DWinding*> *pointlist, dleaf_t    *cl, qboolean* repeatlist, vec3_t clr)\r
-{\r
-       DWinding*       w;\r
-       \r
-       int* leafsurf = &dleafsurfaces[cl->firstLeafSurface];\r
-       for(int k = 0; k < cl->numLeafSurfaces; k++, leafsurf++)\r
-       {\r
-               if(repeatlist[*leafsurf])\r
-                       continue;\r
-\r
-               dsurface_t* surf = &drawSurfaces[*leafsurf];\r
-               if(surf->surfaceType != MST_PLANAR)\r
-                       continue;\r
-\r
-               qdrawVert_t* vert = &drawVerts[surf->firstVert];\r
-               if(surf->firstVert + surf->numVerts > numDrawVerts)\r
-                       DoMessageBox("Warning", "Warning", MB_OK);\r
-\r
-               w = new DWinding();\r
-               w->AllocWinding(surf->numVerts);\r
-\r
-               for (int l = 0; l < surf->numVerts; l++, vert++)\r
-               {\r
-                       (w->p[l])[0] = vert->xyz[0];\r
-                       (w->p[l])[1] = vert->xyz[1];\r
-                       (w->p[l])[2] = vert->xyz[2];\r
-\r
-                       w->clr[0] = clr[0]; \r
-                       w->clr[1] = clr[1]; \r
-                       w->clr[2] = clr[2]; \r
-               }\r
-               pointlist->push_back(w);\r
-\r
-               repeatlist[*leafsurf] = true;\r
-       }\r
-}\r
-\r
-/*\r
-=============\r
-CreateTrace\r
-=============\r
-*/\r
-list<DWinding*> *CreateTrace( dleaf_t *leaf, int c, vis_header *header, byte *visdata, byte *seen )\r
-{\r
-       byte            *vis;\r
-       int                     i, j, clusterNum;\r
-       list<DWinding*> *pointlist = new list<DWinding*>;\r
-       qboolean*       repeatlist = new qboolean[numDrawSurfaces];\r
-       dleaf_t         *cl;\r
-\r
-       vec3_t clrRnd[5] =      {\r
-               {0.f, 0.f, 1.f},\r
-               {0.f, 1.f, 1.f},\r
-               {1.f, 0.f, 0.f},\r
-               {1.f, 0.f, 1.f},\r
-               {1.f, 1.f, 0.f},\r
-       };\r
-\r
-       vec3_t clrGreen =       {0.f, 1.f, 0.f};\r
-       \r
-       memset(repeatlist, 0, sizeof(qboolean)*numDrawSurfaces);\r
-       \r
-       vis = visdata + ( c * header->leafbytes );\r
-\r
-       clusterNum = 0;\r
-\r
-       AddCluster(pointlist, &(dleafs[bsp_leafnumforcluster( c )]), repeatlist, clrGreen);\r
-\r
-       for ( i = 0; i < header->leafbytes; i++ )\r
-       {\r
-               for ( j = 0; j < 8; j++ )\r
-               {\r
-                       cl = &(dleafs[bsp_leafnumforcluster( clusterNum )]);\r
-\r
-                       if ( ( *(vis + i) & (1 << j) ) && (*(seen+i) & (1 << j)) && (leaf->area == cl->area))\r
-                               AddCluster(pointlist, cl, repeatlist, clrRnd[rand()%5]);\r
-                       clusterNum++;\r
-               }\r
-       }\r
-\r
-       delete repeatlist;\r
-\r
-       return pointlist;\r
-}\r
-\r
-/*\r
-=============\r
-TraceCluster\r
-\r
-setup for CreateTrace\r
-=============\r
-*/\r
-list<DWinding*> *TraceCluster (int leafnum)\r
-{\r
-       byte                    seen[(MAX_MAP_LEAFS/8) + 1];\r
-       vis_header              *vheader;\r
-       byte                    *visdata;\r
-       dleaf_t                 *leaf;\r
-\r
-       vheader = (vis_header *) visBytes;\r
-       visdata = visBytes + sizeof(vis_header);\r
-\r
-       memset(seen, 0xFF, sizeof(seen));\r
-       bsp_setbitvectorlength(seen, vheader->portalclusters, sizeof(seen));\r
-\r
-       leaf = &(dleafs[leafnum]);\r
-\r
-       return CreateTrace(leaf, leaf->cluster, vheader, visdata, seen);\r
-}\r
-\r
-list<DWinding *>* BuildTrace(char* filename, vec3_t v_origin)\r
-{\r
-       if(!LoadBSPFile(filename))\r
-               return NULL;\r
-       \r
-       int leafnum = bsp_leafnumfororigin(v_origin);\r
-\r
-       list<DWinding*> *pointlist = TraceCluster(leafnum);\r
-\r
-       FreeBSPData();\r
-\r
-       return pointlist;\r
-}\r
+// Requries parts of the q3 tools source to compile
+// Date: Oct 5, 2001
+// Written by: Brad Whitehead (whiteheb@gamerstv.net)
+
+#include "StdAfx.h"
+#include "dialogs/dialogs-gtk.h"
+#include "DWinding.h"
+#include "bsploader.h"
+
+typedef struct {
+       int             portalclusters;
+       int             leafbytes;       //leafbytes = ((portalclusters+63)&~63)>>3;
+} vis_header;
+
+// added because int shift = 32; i = 0xFFFFFFFF >> shift; 
+// then i = 0xFFFFFFFF, when it should = 0
+const unsigned long bitmasks[33] =
+{
+       0x00000000,
+       0x00000001, 0x00000003, 0x00000007, 0x0000000F,
+       0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
+       0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
+       0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
+       0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
+       0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
+       0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
+       0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
+};
+
+int bsp_leafnumfororigin(vec3_t origin)
+{
+       dnode_t         *node;
+       dplane_t        *plane;
+       float           d;
+
+       // TODO: check if origin is in the map??
+
+       node = dnodes;
+       while (true)
+       {
+               plane = &dplanes[node->planeNum];
+               d = DotProduct (origin, plane->normal) - plane->dist;
+               if ( d >= 0 )
+                       if ( node->children[0] < 0 )
+                               return -(node->children[0]+1);
+                       else
+                               node = &dnodes[node->children[0]];
+               else
+                       if ( node->children[1] < 0 )
+                               return -(node->children[1]+1);
+                       else
+                               node = &dnodes[node->children[1]];
+       }
+       return 0;
+}
+
+int bsp_leafnumforcluster(int cluster)
+{
+       dleaf_t *l;
+       int i;
+
+       for ( i = 0, l = dleafs; i < numleafs; i++, l++ )
+               if ( l->cluster == cluster ) return(i);
+       return(0);
+}
+
+// leaf1 = origin leaf
+// leaf2 = leaf to test for
+/*int bsp_InPVS(int cluster1, int cluster2)
+{
+       vis_header              *vheader;
+       byte                    *visdata;
+
+       vheader = (vis_header *) visBytes;
+       visdata = visBytes + VIS_HEADER_SIZE;
+
+       return( *( visdata + ( cluster1 * vheader->leafbytes ) + (cluster2 / 8) ) & ( 1 << ( cluster2 % 8 ) ) );
+}*/
+
+void bsp_setbitvectorlength( byte *v, int length_bits, int length_vector )
+{
+       int i;
+
+       i = length_bits/8;
+
+       *(v+i) = (byte) bitmasks[length_bits % 8];
+
+       memset((v+i+1), 0, length_vector-i-1);
+}
+
+
+void bsp_bitvectorsubtract(byte *first, byte *second, byte *out, int length)
+{
+
+       int i;
+
+       for ( i = 0; i < length; i++ )
+               *(out+i) = *(first+i) & ~(*(second+i));
+}
+
+int bsp_countclusters(byte *bitvector, int length)
+{
+       int i, j, c;
+
+       c = 0;
+       for ( i = 0; i < length; i++ )
+               for ( j = 0; j < 8; j++ )
+                       if ( (*(bitvector+i) & (1 << j)) ) c++;
+       return(c);
+}
+
+int bsp_countclusters_mask(byte *bitvector, byte *maskvector, int length)
+{
+       int i, j, c;
+
+       c = 0;
+       for ( i = 0; i < length; i++ )
+               for ( j = 0; j < 8; j++ )
+                       if ( (*(bitvector+i) & (1 << j)) && (*(maskvector+i) & (1 << j)) ) c++;
+       return(c);
+}
+
+void AddCluster(list<DWinding*> *pointlist, dleaf_t    *cl, qboolean* repeatlist, vec3_t clr)
+{
+       DWinding*       w;
+       
+       int* leafsurf = &dleafsurfaces[cl->firstLeafSurface];
+       for(int k = 0; k < cl->numLeafSurfaces; k++, leafsurf++)
+       {
+               if(repeatlist[*leafsurf])
+                       continue;
+
+               dsurface_t* surf = &drawSurfaces[*leafsurf];
+               if(surf->surfaceType != MST_PLANAR)
+                       continue;
+
+               qdrawVert_t* vert = &drawVerts[surf->firstVert];
+               if(surf->firstVert + surf->numVerts > numDrawVerts)
+                       DoMessageBox("Warning", "Warning", MB_OK);
+
+               w = new DWinding();
+               w->AllocWinding(surf->numVerts);
+
+               for (int l = 0; l < surf->numVerts; l++, vert++)
+               {
+                       (w->p[l])[0] = vert->xyz[0];
+                       (w->p[l])[1] = vert->xyz[1];
+                       (w->p[l])[2] = vert->xyz[2];
+
+                       w->clr[0] = clr[0]; 
+                       w->clr[1] = clr[1]; 
+                       w->clr[2] = clr[2]; 
+               }
+               pointlist->push_back(w);
+
+               repeatlist[*leafsurf] = true;
+       }
+}
+
+/*
+=============
+CreateTrace
+=============
+*/
+list<DWinding*> *CreateTrace( dleaf_t *leaf, int c, vis_header *header, byte *visdata, byte *seen )
+{
+       byte            *vis;
+       int                     i, j, clusterNum;
+       list<DWinding*> *pointlist = new list<DWinding*>;
+       qboolean*       repeatlist = new qboolean[numDrawSurfaces];
+       dleaf_t         *cl;
+
+       vec3_t clrRnd[5] =      {
+               {0.f, 0.f, 1.f},
+               {0.f, 1.f, 1.f},
+               {1.f, 0.f, 0.f},
+               {1.f, 0.f, 1.f},
+               {1.f, 1.f, 0.f},
+       };
+
+       vec3_t clrGreen =       {0.f, 1.f, 0.f};
+       
+       memset(repeatlist, 0, sizeof(qboolean)*numDrawSurfaces);
+       
+       vis = visdata + ( c * header->leafbytes );
+
+       clusterNum = 0;
+
+       AddCluster(pointlist, &(dleafs[bsp_leafnumforcluster( c )]), repeatlist, clrGreen);
+
+       for ( i = 0; i < header->leafbytes; i++ )
+       {
+               for ( j = 0; j < 8; j++ )
+               {
+                       cl = &(dleafs[bsp_leafnumforcluster( clusterNum )]);
+
+                       if ( ( *(vis + i) & (1 << j) ) && (*(seen+i) & (1 << j)) && (leaf->area == cl->area))
+                               AddCluster(pointlist, cl, repeatlist, clrRnd[rand()%5]);
+                       clusterNum++;
+               }
+       }
+
+       delete repeatlist;
+
+       return pointlist;
+}
+
+/*
+=============
+TraceCluster
+
+setup for CreateTrace
+=============
+*/
+list<DWinding*> *TraceCluster (int leafnum)
+{
+       byte                    seen[(MAX_MAP_LEAFS/8) + 1];
+       vis_header              *vheader;
+       byte                    *visdata;
+       dleaf_t                 *leaf;
+
+       vheader = (vis_header *) visBytes;
+       visdata = visBytes + sizeof(vis_header);
+
+       memset(seen, 0xFF, sizeof(seen));
+       bsp_setbitvectorlength(seen, vheader->portalclusters, sizeof(seen));
+
+       leaf = &(dleafs[leafnum]);
+
+       return CreateTrace(leaf, leaf->cluster, vheader, visdata, seen);
+}
+
+list<DWinding *>* BuildTrace(char* filename, vec3_t v_origin)
+{
+       if(!LoadBSPFile(filename))
+               return NULL;
+       
+       int leafnum = bsp_leafnumfororigin(v_origin);
+
+       list<DWinding*> *pointlist = TraceCluster(leafnum);
+
+       FreeBSPData();
+
+       return pointlist;
+}