Update CVar system
							parent
							
								
									e92ad7cccd
								
							
						
					
					
						commit
						cc20ee9fb5
					
				@ -1,6 +1,49 @@
 | 
			
		||||
The engine provides a CVar (configuration variable) system in <runtime/config.h>, that is used heavily in the engine to configure its various features.
 | 
			
		||||
The engine provides a CVar (configuration variable) system in `<runtime/config.h>`, that is used heavily in the engine to configure its various features.
 | 
			
		||||
 | 
			
		||||
**TODO: In depth description**
 | 
			
		||||
## Creating CVars
 | 
			
		||||
 | 
			
		||||
CVars are created with one of the `RT_CVAR_` macros in `<runtime/config.h>`. These take a name, the description string and the default value respectively.
 | 
			
		||||
The convention used in the engine is to define CVars at the top of the file that uses them.
 | 
			
		||||
CVars use a tagged union to store values of different types. The macro used to define the cvar also sets the type.
 | 
			
		||||
At the time of writing this, the following types are available:
 | 
			
		||||
 
 | 
			
		||||
| Type | Creation macro | Union member |
 | 
			
		||||
|---------|------|----------|
 | 
			
		||||
| int | `RT_CVAR_I` | `.i` |
 | 
			
		||||
| float | `RT_CVAR_F` | `.f` |
 | 
			
		||||
| string | `RT_CVAR_S` | `.s` |
 | 
			
		||||
| size_t | `RT_CVAR_SZ` | `.sz` |
 | 
			
		||||
 | 
			
		||||
CVars must be registered to be able to retrieve them from other parts of the code (including changing them from configuration files).
 | 
			
		||||
This is done via `rtRegisterCVAR`.
 | 
			
		||||
The game provides a callback to launcher called RegisterCVARs that is called *before initialization*.
 | 
			
		||||
After registering the game cvars, the launcher loads and parses the game-config file, which then can modify these variables.
 | 
			
		||||
 | 
			
		||||
In the engine, each subsystem (runtime, renderer, asset_compiler, ...) handles its own CVars.
 | 
			
		||||
Aside from the runtime, the launcher program makes sure to register these in the correct order and loads the associated configuration files.
 | 
			
		||||
 | 
			
		||||
## Config-Files
 | 
			
		||||
 | 
			
		||||
Config files, by convention, are placed in the 'cfg' directory and use the file extension '.cfg'.
 | 
			
		||||
They use [INI file syntax](https://en.wikipedia.org/wiki/INI_file).
 | 
			
		||||
Currently, the system ignores sections.
 | 
			
		||||
 | 
			
		||||
Config files are loaded using the function `rtProcessConfigFiles` which takes a number of files, loads them and parses their contents.
 | 
			
		||||
 | 
			
		||||
Currently, the following configuration files are used by the engine:
 | 
			
		||||
 | 
			
		||||
| File | Purpose |
 | 
			
		||||
|----|------|
 | 
			
		||||
| cfg/engine_early.cfg | Configures the basic runtime systems (AIO, resource system, asserts, ...) |
 | 
			
		||||
| cfg/launcher.cfg | Configures the launcher executable (Window mode, renderer to use, game-lib, ...)
 | 
			
		||||
| cfg/renderer.cfg | Configures render parameters |
 | 
			
		||||
| cfg/game.cfg | Game-specific configuration |
 | 
			
		||||
 | 
			
		||||
## Listening to changes
 | 
			
		||||
 | 
			
		||||
The cvar system allows the user to register "change event handlers" for particular CVars.
 | 
			
		||||
This is done via `rtRegisterCVARChangeEventHandler`, which takes a callback of the form: `void ChangeEventHandler(rt_cvar *cvar, void *userdata)`.
 | 
			
		||||
Whenever the system is notified of a cvar change (`rtNotifyCVARChange`) all registered callbacks for the changed cvar are called.
 | 
			
		||||
 | 
			
		||||
## CVar naming convention
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user