doom3-gpl
Doom 3 GPL source release
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CVarSystem.h
Go to the documentation of this file.
1 /*
2 ===========================================================================
3 
4 Doom 3 GPL Source Code
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
6 
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
8 
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13 
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
21 
22 In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
23 
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
25 
26 ===========================================================================
27 */
28 
29 #ifndef __CVARSYSTEM_H__
30 #define __CVARSYSTEM_H__
31 
32 /*
33 ===============================================================================
34 
35  Console Variables (CVars) are used to hold scalar or string variables
36  that can be changed or displayed at the console as well as accessed
37  directly in code.
38 
39  CVars are mostly used to hold settings that can be changed from the
40  console or saved to and loaded from configuration files. CVars are also
41  occasionally used to communicate information between different modules
42  of the program.
43 
44  CVars are restricted from having the same names as console commands to
45  keep the console interface from being ambiguous.
46 
47  CVars can be accessed from the console in three ways:
48  cvarName prints the current value
49  cvarName X sets the value to X if the variable exists
50  set cvarName X as above, but creates the CVar if not present
51 
52  CVars may be declared in the global namespace, in classes and in functions.
53  However declarations in classes and functions should always be static to
54  save space and time. Making CVars static does not change their
55  functionality due to their global nature.
56 
57  CVars should be contructed only through one of the constructors with name,
58  value, flags and description. The name, value and description parameters
59  to the constructor have to be static strings, do not use va() or the like
60  functions returning a string.
61 
62  CVars may be declared multiple times using the same name string. However,
63  they will all reference the same value and changing the value of one CVar
64  changes the value of all CVars with the same name.
65 
66  CVars should always be declared with the correct type flag: CVAR_BOOL,
67  CVAR_INTEGER or CVAR_FLOAT. If no such flag is specified the CVar
68  defaults to type string. If the CVAR_BOOL flag is used there is no need
69  to specify an argument auto-completion function because the CVar gets
70  one assigned automatically.
71 
72  CVars are automatically range checked based on their type and any min/max
73  or valid string set specified in the constructor.
74 
75  CVars are always considered cheats except when CVAR_NOCHEAT, CVAR_INIT,
76  CVAR_ROM, CVAR_ARCHIVE, CVAR_USERINFO, CVAR_SERVERINFO, CVAR_NETWORKSYNC
77  is set.
78 
79 ===============================================================================
80 */
81 
82 typedef enum {
83  CVAR_ALL = -1, // all flags
84  CVAR_BOOL = BIT(0), // variable is a boolean
85  CVAR_INTEGER = BIT(1), // variable is an integer
86  CVAR_FLOAT = BIT(2), // variable is a float
87  CVAR_SYSTEM = BIT(3), // system variable
88  CVAR_RENDERER = BIT(4), // renderer variable
89  CVAR_SOUND = BIT(5), // sound variable
90  CVAR_GUI = BIT(6), // gui variable
91  CVAR_GAME = BIT(7), // game variable
92  CVAR_TOOL = BIT(8), // tool variable
93  CVAR_USERINFO = BIT(9), // sent to servers, available to menu
94  CVAR_SERVERINFO = BIT(10), // sent from servers, available to menu
95  CVAR_NETWORKSYNC = BIT(11), // cvar is synced from the server to clients
96  CVAR_STATIC = BIT(12), // statically declared, not user created
97  CVAR_CHEAT = BIT(13), // variable is considered a cheat
98  CVAR_NOCHEAT = BIT(14), // variable is not considered a cheat
99  CVAR_INIT = BIT(15), // can only be set from the command-line
100  CVAR_ROM = BIT(16), // display only, cannot be set by user at all
101  CVAR_ARCHIVE = BIT(17), // set to cause it to be saved to a config file
102  CVAR_MODIFIED = BIT(18) // set when the variable is modified
103 } cvarFlags_t;
104 
105 
106 /*
107 ===============================================================================
108 
109  idCVar
110 
111 ===============================================================================
112 */
113 
114 class idCVar {
115 public:
116  // Never use the default constructor.
117  idCVar( void ) { assert( typeid( this ) != typeid( idCVar ) ); }
118 
119  // Always use one of the following constructors.
120  idCVar( const char *name, const char *value, int flags, const char *description,
122  idCVar( const char *name, const char *value, int flags, const char *description,
124  idCVar( const char *name, const char *value, int flags, const char *description,
126 
127  virtual ~idCVar( void ) {}
128 
129  const char * GetName( void ) const { return internalVar->name; }
130  int GetFlags( void ) const { return internalVar->flags; }
131  const char * GetDescription( void ) const { return internalVar->description; }
132  float GetMinValue( void ) const { return internalVar->valueMin; }
133  float GetMaxValue( void ) const { return internalVar->valueMax; }
134  const char ** GetValueStrings( void ) const { return valueStrings; }
136 
137  bool IsModified( void ) const { return ( internalVar->flags & CVAR_MODIFIED ) != 0; }
140 
141  const char * GetString( void ) const { return internalVar->value; }
142  bool GetBool( void ) const { return ( internalVar->integerValue != 0 ); }
143  int GetInteger( void ) const { return internalVar->integerValue; }
144  float GetFloat( void ) const { return internalVar->floatValue; }
145 
146  void SetString( const char *value ) { internalVar->InternalSetString( value ); }
147  void SetBool( const bool value ) { internalVar->InternalSetBool( value ); }
148  void SetInteger( const int value ) { internalVar->InternalSetInteger( value ); }
149  void SetFloat( const float value ) { internalVar->InternalSetFloat( value ); }
150 
151  void SetInternalVar( idCVar *cvar ) { internalVar = cvar; }
152 
153  static void RegisterStaticVars( void );
154 
155 protected:
156  const char * name; // name
157  const char * value; // value
158  const char * description; // description
159  int flags; // CVAR_? flags
160  float valueMin; // minimum value
161  float valueMax; // maximum value
162  const char ** valueStrings; // valid value strings
163  argCompletion_t valueCompletion; // value auto-completion function
164  int integerValue; // atoi( string )
165  float floatValue; // atof( value )
166  idCVar * internalVar; // internal cvar
167  idCVar * next; // next statically declared cvar
168 
169 private:
170  void Init( const char *name, const char *value, int flags, const char *description,
171  float valueMin, float valueMax, const char **valueStrings, argCompletion_t valueCompletion );
172 
173  virtual void InternalSetString( const char *newValue ) {}
174  virtual void InternalSetBool( const bool newValue ) {}
175  virtual void InternalSetInteger( const int newValue ) {}
176  virtual void InternalSetFloat( const float newValue ) {}
177 
178  static idCVar * staticVars;
179 };
180 
181 ID_INLINE idCVar::idCVar( const char *name, const char *value, int flags, const char *description,
182  argCompletion_t valueCompletion ) {
183  if ( !valueCompletion && ( flags & CVAR_BOOL ) ) {
184  valueCompletion = idCmdSystem::ArgCompletion_Boolean;
185  }
186  Init( name, value, flags, description, 1, -1, NULL, valueCompletion );
187 }
188 
189 ID_INLINE idCVar::idCVar( const char *name, const char *value, int flags, const char *description,
190  float valueMin, float valueMax, argCompletion_t valueCompletion ) {
191  Init( name, value, flags, description, valueMin, valueMax, NULL, valueCompletion );
192 }
193 
194 ID_INLINE idCVar::idCVar( const char *name, const char *value, int flags, const char *description,
195  const char **valueStrings, argCompletion_t valueCompletion ) {
196  Init( name, value, flags, description, 1, -1, valueStrings, valueCompletion );
197 }
198 
199 
200 /*
201 ===============================================================================
202 
203  idCVarSystem
204 
205 ===============================================================================
206 */
207 
209 public:
210  virtual ~idCVarSystem( void ) {}
211 
212  virtual void Init( void ) = 0;
213  virtual void Shutdown( void ) = 0;
214  virtual bool IsInitialized( void ) const = 0;
215 
216  // Registers a CVar.
217  virtual void Register( idCVar *cvar ) = 0;
218 
219  // Finds the CVar with the given name.
220  // Returns NULL if there is no CVar with the given name.
221  virtual idCVar * Find( const char *name ) = 0;
222 
223  // Sets the value of a CVar by name.
224  virtual void SetCVarString( const char *name, const char *value, int flags = 0 ) = 0;
225  virtual void SetCVarBool( const char *name, const bool value, int flags = 0 ) = 0;
226  virtual void SetCVarInteger( const char *name, const int value, int flags = 0 ) = 0;
227  virtual void SetCVarFloat( const char *name, const float value, int flags = 0 ) = 0;
228 
229  // Gets the value of a CVar by name.
230  virtual const char * GetCVarString( const char *name ) const = 0;
231  virtual bool GetCVarBool( const char *name ) const = 0;
232  virtual int GetCVarInteger( const char *name ) const = 0;
233  virtual float GetCVarFloat( const char *name ) const = 0;
234 
235  // Called by the command system when argv(0) doesn't match a known command.
236  // Returns true if argv(0) is a variable reference and prints or changes the CVar.
237  virtual bool Command( const idCmdArgs &args ) = 0;
238 
239  // Command and argument completion using callback for each valid string.
240  virtual void CommandCompletion( void(*callback)( const char *s ) ) = 0;
241  virtual void ArgCompletion( const char *cmdString, void(*callback)( const char *s ) ) = 0;
242 
243  // Sets/gets/clears modified flags that tell what kind of CVars have changed.
244  virtual void SetModifiedFlags( int flags ) = 0;
245  virtual int GetModifiedFlags( void ) const = 0;
246  virtual void ClearModifiedFlags( int flags ) = 0;
247 
248  // Resets variables with one of the given flags set.
249  virtual void ResetFlaggedVariables( int flags ) = 0;
250 
251  // Removes auto-completion from the flagged variables.
252  virtual void RemoveFlaggedAutoCompletion( int flags ) = 0;
253 
254  // Writes variables with one of the given flags set to the given file.
255  virtual void WriteFlaggedVariables( int flags, const char *setCmd, idFile *f ) const = 0;
256 
257  // Moves CVars to and from dictionaries.
258  virtual const idDict * MoveCVarsToDict( int flags ) const = 0;
259  virtual void SetCVarsFromDict( const idDict &dict ) = 0;
260 };
261 
262 extern idCVarSystem * cvarSystem;
263 
264 
265 /*
266 ===============================================================================
267 
268  CVar Registration
269 
270  Each DLL using CVars has to declare a private copy of the static variable
271  idCVar::staticVars like this: idCVar * idCVar::staticVars = NULL;
272  Furthermore idCVar::RegisterStaticVars() has to be called after the
273  cvarSystem pointer is set when the DLL is first initialized.
274 
275 ===============================================================================
276 */
277 
278 ID_INLINE void idCVar::Init( const char *name, const char *value, int flags, const char *description,
279  float valueMin, float valueMax, const char **valueStrings, argCompletion_t valueCompletion ) {
280  this->name = name;
281  this->value = value;
282  this->flags = flags;
283  this->description = description;
284  this->flags = flags | CVAR_STATIC;
285  this->valueMin = valueMin;
286  this->valueMax = valueMax;
287  this->valueStrings = valueStrings;
288  this->valueCompletion = valueCompletion;
289  this->integerValue = 0;
290  this->floatValue = 0.0f;
291  this->internalVar = this;
292  if ( staticVars != (idCVar *)0xFFFFFFFF ) {
293  this->next = staticVars;
294  staticVars = this;
295  } else {
296  cvarSystem->Register( this );
297  }
298 }
299 
300 ID_INLINE void idCVar::RegisterStaticVars( void ) {
301  if ( staticVars != (idCVar *)0xFFFFFFFF ) {
302  for ( idCVar *cvar = staticVars; cvar; cvar = cvar->next ) {
303  cvarSystem->Register( cvar );
304  }
305  staticVars = (idCVar *)0xFFFFFFFF;
306  }
307 }
308 
309 #endif /* !__CVARSYSTEM_H__ */
virtual void CommandCompletion(void(*callback)(const char *s))=0
virtual void SetCVarInteger(const char *name, const int value, int flags=0)=0
GLsizei const GLfloat * value
Definition: glext.h:3614
idCVar * next
Definition: CVarSystem.h:167
argCompletion_t GetValueCompletion(void) const
Definition: CVarSystem.h:135
assert(prefInfo.fullscreenBtn)
virtual bool Command(const idCmdArgs &args)=0
void(* argCompletion_t)(const idCmdArgs &args, void(*callback)(const char *s))
Definition: CmdSystem.h:69
virtual void SetCVarFloat(const char *name, const float value, int flags=0)=0
virtual bool IsInitialized(void) const =0
float GetFloat(void) const
Definition: CVarSystem.h:144
float floatValue
Definition: CVarSystem.h:165
virtual void WriteFlaggedVariables(int flags, const char *setCmd, idFile *f) const =0
virtual void SetModifiedFlags(int flags)=0
virtual int GetCVarInteger(const char *name) const =0
const char ** GetValueStrings(void) const
Definition: CVarSystem.h:134
prefInfo callback
#define BIT(num)
Definition: Lib.h:92
int GetFlags(void) const
Definition: CVarSystem.h:130
const char * name
Definition: CVarSystem.h:156
const char ** valueStrings
Definition: CVarSystem.h:162
void Init(const char *name, const char *value, int flags, const char *description, float valueMin, float valueMax, const char **valueStrings, argCompletion_t valueCompletion)
Definition: CVarSystem.h:278
virtual void SetCVarString(const char *name, const char *value, int flags=0)=0
GLdouble s
Definition: glext.h:2935
idCVar * internalVar
Definition: CVarSystem.h:166
virtual void InternalSetString(const char *newValue)
Definition: CVarSystem.h:173
int flags
Definition: CVarSystem.h:159
virtual void ArgCompletion(const char *cmdString, void(*callback)(const char *s))=0
virtual ~idCVarSystem(void)
Definition: CVarSystem.h:210
void SetModified(void)
Definition: CVarSystem.h:138
virtual ~idCVar(void)
Definition: CVarSystem.h:127
Definition: File.h:50
virtual idCVar * Find(const char *name)=0
virtual void InternalSetFloat(const float newValue)
Definition: CVarSystem.h:176
static void ArgCompletion_Boolean(const idCmdArgs &args, void(*callback)(const char *s))
Definition: CmdSystem.h:131
virtual void Init(void)=0
void SetString(const char *value)
Definition: CVarSystem.h:146
void SetInternalVar(idCVar *cvar)
Definition: CVarSystem.h:151
float valueMin
Definition: CVarSystem.h:160
Definition: Dict.h:65
#define NULL
Definition: Lib.h:88
virtual const char * GetCVarString(const char *name) const =0
void SetInteger(const int value)
Definition: CVarSystem.h:148
virtual void SetCVarBool(const char *name, const bool value, int flags=0)=0
int GetInteger(void) const
Definition: CVarSystem.h:143
static idCVar * staticVars
Definition: CVarSystem.h:178
virtual float GetCVarFloat(const char *name) const =0
static void RegisterStaticVars(void)
Definition: CVarSystem.h:300
virtual void Shutdown(void)=0
virtual void InternalSetBool(const bool newValue)
Definition: CVarSystem.h:174
idCVarSystem * cvarSystem
Definition: CVarSystem.cpp:487
int integerValue
Definition: CVarSystem.h:164
const char * GetString(void) const
Definition: CVarSystem.h:141
virtual int GetModifiedFlags(void) const =0
virtual void Register(idCVar *cvar)=0
bool GetBool(void) const
Definition: CVarSystem.h:142
void ClearModified(void)
Definition: CVarSystem.h:139
tuple f
Definition: idal.py:89
const char * description
Definition: CVarSystem.h:158
virtual void ResetFlaggedVariables(int flags)=0
virtual void InternalSetInteger(const int newValue)
Definition: CVarSystem.h:175
const GLcharARB * name
Definition: glext.h:3629
bool IsModified(void) const
Definition: CVarSystem.h:137
const char * GetDescription(void) const
Definition: CVarSystem.h:131
virtual bool GetCVarBool(const char *name) const =0
void SetBool(const bool value)
Definition: CVarSystem.h:147
virtual const idDict * MoveCVarsToDict(int flags) const =0
virtual void RemoveFlaggedAutoCompletion(int flags)=0
argCompletion_t valueCompletion
Definition: CVarSystem.h:163
float GetMinValue(void) const
Definition: CVarSystem.h:132
float valueMax
Definition: CVarSystem.h:161
void SetFloat(const float value)
Definition: CVarSystem.h:149
virtual void ClearModifiedFlags(int flags)=0
float GetMaxValue(void) const
Definition: CVarSystem.h:133
const char * GetName(void) const
Definition: CVarSystem.h:129
virtual void SetCVarsFromDict(const idDict &dict)=0
cvarFlags_t
Definition: CVarSystem.h:82
const char * value
Definition: CVarSystem.h:157
idCVar(void)
Definition: CVarSystem.h:117