]> icculus.org git repositories - divverent/netradiant.git/blob - plugins/entity/filters.cpp
NOW I do it right: #woxblox#
[divverent/netradiant.git] / plugins / entity / filters.cpp
1 /*
2 Copyright (C) 2001-2006, William Joseph.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #include "filters.h"
23
24 #include "ifilter.h"
25
26 #include <list>
27
28 class EntityFilterWrapper : public Filter
29 {
30   bool m_active;
31   bool m_invert;
32   EntityFilter& m_filter;
33 public:
34   EntityFilterWrapper(EntityFilter& filter, bool invert) : m_invert(invert), m_filter(filter)
35   {
36   }
37   void setActive(bool active)
38   {
39     m_active = active;
40   }
41   bool active()
42   {
43     return m_active;
44   }
45   bool filter(const Entity& entity)
46   {
47     return m_invert ^ m_filter.filter(entity);
48   }
49 };
50
51
52 typedef std::list<EntityFilterWrapper> EntityFilters;
53 EntityFilters g_entityFilters;
54
55 void add_entity_filter(EntityFilter& filter, int mask, bool invert)
56 {
57   g_entityFilters.push_back(EntityFilterWrapper(filter, invert));
58   GlobalFilterSystem().addFilter(g_entityFilters.back(), mask);
59 }
60
61 bool entity_filtered(Entity& entity)
62 {
63   for(EntityFilters::iterator i = g_entityFilters.begin(); i != g_entityFilters.end(); ++i)
64   {
65     if((*i).active() && (*i).filter(entity))
66     {
67       return true;
68     }
69   }
70   return false;
71 }
72