This class is a helper class for loading and building scripts, with a basic pre-processor that supports conditional compilation, include directives, and metadata declarations.
If you do not want process metadata then you can compile the add-on with the define AS_PROCESS_METADATA 0, which will exclude the code for processing this. This define can be made in the project settings or directly in the header.
class CScriptBuilder { public: // Load and build a script file from disk int BuildScriptFromFile(asIScriptEngine *engine, const char *module, const char *filename); // Build a script file from a memory buffer int BuildScriptFromMemory(asIScriptEngine *engine, const char *module, const char *script, const char *sectionname = ""); // Add a pre-processor define for conditional compilation void DefineWord(const char *word); // Get metadata declared for class types and interfaces const char *GetMetadataStringForType(int typeId); // Get metadata declared for functions const char *GetMetadataStringForFunc(int funcId); // Get metadata declared for global variables const char *GetMetadataStringForVar(int varIdx); };
#include "commonfuncs.as"
void main()
{
// Call a function from the included file
CommonFunc();
}
This is especially useful when scripts are shared between different binaries, for example, in a client/server application.
Example script with conditional compilation:
class CObject
{
void Process()
{
#if SERVER
// Do some server specific processing
#endif
#if CLIENT
// Do some client specific processing
#endif
// Do some common processing
}
}
Exactly what the metadata looks like is up to the application. The builder class doesn't impose any rules, except that the metadata should be added between brackets []. After the script has been built the application can obtain the metadata strings and interpret them as it sees fit.
Example script with metadata:
[factory func = CreateOgre,
editable: myPosition,
editable: myStrength [10, 100]]
class COgre
{
vector3 myPosition;
int myStrength;
}
[factory]
COgre @CreateOgre()
{
return @COgre();
}
Example usage:
CScriptBuilder builder; int r = builder.BuildScriptFromMemory(engine, "my module", script); if( r >= 0 ) { // Find global variables that have been marked as editable by user int count = engine->GetGlobalVarCount("my module"); for( int n = 0; n < count; n++ ) { string metadata = builder.GetMetadataStringForVar(n); if( metadata == "editable" ) { // Show the global variable in a GUI ... } } }
1.5.9