]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/filters.cpp
fix
[xonotic/netradiant.git] / radiant / filters.cpp
index 9bd8503575cc2409dd3dfa3b6bea376e7b4688d1..5e0b069e85bae39ab2c98b722bfb04db78bd11ed 100644 (file)
@@ -30,13 +30,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include "stdafx.h"
 
+// type 1 = texture filter (name)
+// type 3 = entity filter (name)
+// type 2 = QER_* shader flags
+// type 4 = entity classes
+// type 5 = surface flags (q2)
+// type 6 = content flags (q2)
+// type 7 = content flags - no match (q2)
 bfilter_t *FilterAdd(bfilter_t *pFilter, int type, int bmask, char *str, int exclude)
 {
        bfilter_t *pNew = new bfilter_t;
        pNew->next = pFilter;
        pNew->attribute = type;
        if (type == 1 || type == 3) pNew->string = str;
-       if (type == 2 || type == 4) pNew->mask = bmask;
+       if (type == 2 || type == 4 || type == 5 || type == 6 || type == 7) pNew->mask = bmask;
        if (g_qeglobals.d_savedinfo.exclude & exclude)
                pNew->active = true;
        else
@@ -44,6 +51,21 @@ bfilter_t *FilterAdd(bfilter_t *pFilter, int type, int bmask, char *str, int exc
        return pNew;
 }
 
+bfilter_t *FilterCreate (int type, int bmask, char *str, int exclude)
+{
+       g_qeglobals.d_savedinfo.filters = FilterAdd(g_qeglobals.d_savedinfo.filters, type, bmask, str, exclude);
+       Syn_Printf("Added filter %s (type: %i, bmask: %i, exclude: %i)\n", str, type, bmask, exclude);
+       return g_qeglobals.d_savedinfo.filters;
+}
+
+extern void PerformFiltering();
+
+void FiltersActivate (void)
+{
+       PerformFiltering();
+       Sys_UpdateWindows(W_XY|W_CAMERA);
+}
+
   // removes the filter list at *pFilter, returns NULL pointer
 bfilter_t *FilterListDelete(bfilter_t *pFilter)
 {
@@ -137,7 +159,7 @@ bool FilterBrush(brush_t *pb)
                || !strncmp( pb->owner->eclass->name, "func", 4)
                || !strncmp( pb->owner->eclass->name, "trigger", 7) ) && !pb->patchBrush )
        {
-               bool filterbrush;
+               bool filterbrush = false;
                for (face_t *f=pb->brush_faces;f!=NULL;f = f->next)
                {
                        filterbrush=false;
@@ -145,8 +167,10 @@ bool FilterBrush(brush_t *pb)
                        filters != NULL;
                        filters = filters->next)
                        {
+                               if (!filters->active)
+                                       continue;
                                // exclude by attribute 1 brush->face->pShader->getName()
-                               if (filters->active && filters->attribute == 1)
+                               if (filters->attribute == 1)
                                {
                                        if (strstr(f->pShader->getName(),filters->string))
                                        {
@@ -155,14 +179,38 @@ bool FilterBrush(brush_t *pb)
                                        }
                                }
                                // exclude by attribute 2 brush->face->pShader->getFlags()
-                               else if (filters->active
-                                       && filters->attribute == 2)
+                               else if (filters->attribute == 2)
                                {
                                        if (f->pShader->getFlags() & filters->mask)
                                        {
                                                filterbrush=true;
                                                break;
                                        }
+                               // quake2 - 5 == surface flags, 6 == content flags 
+                               }
+                               else if (filters->attribute == 5)
+                               {
+                                       if (f->texdef.flags && f->texdef.flags & filters->mask)
+                                       {
+                                               filterbrush=true;
+                                               break;
+                                       }
+                               }
+                               else if (filters->attribute == 6)
+                               {
+                                       if (f->texdef.contents && f->texdef.contents & filters->mask)
+                                       {
+                                               filterbrush=true;
+                                               break;
+                                       }
+                               }
+                               else if (filters->attribute == 7)
+                               {
+                                       if (f->texdef.contents && !(f->texdef.contents & filters->mask))
+                                       {
+                                               filterbrush=true;
+                                               break;
+                                       }
                                }
                        }
                        if (!filterbrush)