a50b74a8b2c23a1c35862805baf03dafc54cd581
[xonotic/netradiant.git] / include / ieclass.h
1 /*
2    Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3    For a list of contributors, see the accompanying CONTRIBUTORS file.
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 /// \file ieclass.h
23 /// \brief Entity Class definition loader API.
24
25
26 #if !defined( INCLUDED_IECLASS_H )
27 #define INCLUDED_IECLASS_H
28
29 #include "generic/constant.h"
30
31 #define MAX_FLAGS   16
32
33 // eclass show flags
34
35 #define     ECLASS_LIGHT      0x00000001
36 #define     ECLASS_ANGLE      0x00000002
37 #define     ECLASS_PATH       0x00000004
38 #define     ECLASS_MISCMODEL  0x00000008
39
40 class Shader;
41
42 class EntityClass;
43 class ListAttributeType;
44
45 class EntityClassCollector
46 {
47 public:
48 virtual void insert( EntityClass* eclass ) = 0;
49 virtual void insert( const char* name, const ListAttributeType& list ){
50 }
51 };
52
53 struct EntityClassScanner
54 {
55         INTEGER_CONSTANT( Version, 1 );
56         STRING_CONSTANT( Name, "eclass" );
57
58         void ( *scanFile )( EntityClassCollector& collector, const char* filename );
59         const char* ( *getExtension )( );
60 };
61
62 #include "modulesystem.h"
63
64 template<typename Type>
65 class ModuleRef;
66 typedef ModuleRef<EntityClassScanner> EClassModuleRef;
67
68 template<typename Type>
69 class Modules;
70 typedef Modules<EntityClassScanner> EClassModules;
71
72 template<typename Type>
73 class ModulesRef;
74 typedef ModulesRef<EntityClassScanner> EClassModulesRef;
75
76
77
78
79
80
81 class EntityClassVisitor
82 {
83 public:
84 virtual void visit( EntityClass* eclass ) = 0;
85 };
86
87 class ModuleObserver;
88
89
90 struct EntityClassManager
91 {
92         INTEGER_CONSTANT( Version, 1 );
93         STRING_CONSTANT( Name, "eclassmanager" );
94
95         EntityClass* ( *findOrInsert )( const char* name, bool has_brushes );
96         const ListAttributeType* ( *findListType )(const char* name);
97         void ( *forEach )( EntityClassVisitor& visitor );
98         void ( *attach )( ModuleObserver& observer );
99         void ( *detach )( ModuleObserver& observer );
100         void ( *realise )();
101         void ( *unrealise )();
102 };
103
104 template<typename Type>
105 class GlobalModule;
106 typedef GlobalModule<EntityClassManager> GlobalEntityClassManagerModule;
107
108 template<typename Type>
109 class GlobalModuleRef;
110 typedef GlobalModuleRef<EntityClassManager> GlobalEntityClassManagerModuleRef;
111
112 inline EntityClassManager& GlobalEntityClassManager(){
113         return GlobalEntityClassManagerModule::getTable();
114 }
115
116 #endif