From 959831f4ef5a3e797f576c3de08cd65032c997ad Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 13 Jan 2013 18:54:10 +1000 Subject: Remove damned ancient DOS line endings from Irrlicht. Hopefully I did not go overboard. --- .../irrlicht-1.8/examples/25.XmlHandling/Makefile | 132 +-- .../examples/25.XmlHandling/XmlHandling.vcproj | 390 ++++---- .../25.XmlHandling/XmlHandling_vc10.vcxproj | 354 +++---- .../25.XmlHandling/XmlHandling_vc11.vcxproj | 362 +++---- .../examples/25.XmlHandling/XmlHandling_vc8.vcproj | 380 ++++---- .../examples/25.XmlHandling/XmlHandling_vc9.vcproj | 370 +++---- .../irrlicht-1.8/examples/25.XmlHandling/main.cpp | 1010 ++++++++++---------- 7 files changed, 1499 insertions(+), 1499 deletions(-) (limited to 'libraries/irrlicht-1.8/examples/25.XmlHandling') diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/Makefile b/libraries/irrlicht-1.8/examples/25.XmlHandling/Makefile index 92f5655..caa9791 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/Makefile +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/Makefile @@ -1,66 +1,66 @@ -# Makefile for Irrlicht Examples -# It's usually sufficient to change just the target name and source file list -# and be sure that CXX is set to a valid compiler - -# Name of the executable created (.exe will be added automatically if necessary) -Target := 25.XmlHandling -# List of source files, separated by spaces -Sources := main.cpp -# Path to Irrlicht directory, should contain include/ and lib/ -IrrlichtHome := ../.. -# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems -BinPath = ../../bin/$(SYSTEM) - -# general compiler settings (might need to be set when compiling the lib, too) -# preprocessor flags, e.g. defines and include paths -USERCPPFLAGS = -# compiler flags such as optimization flags -USERCXXFLAGS = -O3 -ffast-math -#USERCXXFLAGS = -g -Wall -# linker flags such as additional libraries and link paths -USERLDFLAGS = - -#### -#no changes necessary below this line -#### - -CPPFLAGS = -I$(IrrlichtHome)/include -I/usr/X11R6/include $(USERCPPFLAGS) -CXXFLAGS = $(USERCXXFLAGS) -LDFLAGS = $(USERLDFLAGS) - -#default target is Linux -all: all_linux - -# target specific settings -all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht -all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lXxf86vm -lXext -lX11 -lXcursor -all_linux clean_linux: SYSTEM=Linux -all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc -all_win32 clean_win32 static_win32: SUF=.exe -static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ -all_win32: LDFLAGS += -lopengl32 -lm -static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -# name of the binary - only valid for targets which set SYSTEM -DESTPATH = $(BinPath)/$(Target)$(SUF) - -all_linux all_win32 static_win32: - $(warning Building...) - $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) - -clean: clean_linux clean_win32 - $(warning Cleaning...) - -clean_linux clean_win32: - @$(RM) $(DESTPATH) - -.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 - -#multilib handling -ifeq ($(HOSTTYPE), x86_64) -LIBSELECT=64 -endif -#solaris real-time features -ifeq ($(HOSTTYPE), sun4) -LDFLAGS += -lrt -endif - +# Makefile for Irrlicht Examples +# It's usually sufficient to change just the target name and source file list +# and be sure that CXX is set to a valid compiler + +# Name of the executable created (.exe will be added automatically if necessary) +Target := 25.XmlHandling +# List of source files, separated by spaces +Sources := main.cpp +# Path to Irrlicht directory, should contain include/ and lib/ +IrrlichtHome := ../.. +# Path for the executable. Note that Irrlicht.dll should usually also be there for win32 systems +BinPath = ../../bin/$(SYSTEM) + +# general compiler settings (might need to be set when compiling the lib, too) +# preprocessor flags, e.g. defines and include paths +USERCPPFLAGS = +# compiler flags such as optimization flags +USERCXXFLAGS = -O3 -ffast-math +#USERCXXFLAGS = -g -Wall +# linker flags such as additional libraries and link paths +USERLDFLAGS = + +#### +#no changes necessary below this line +#### + +CPPFLAGS = -I$(IrrlichtHome)/include -I/usr/X11R6/include $(USERCPPFLAGS) +CXXFLAGS = $(USERCXXFLAGS) +LDFLAGS = $(USERLDFLAGS) + +#default target is Linux +all: all_linux + +# target specific settings +all_linux all_win32 static_win32: LDFLAGS += -L$(IrrlichtHome)/lib/$(SYSTEM) -lIrrlicht +all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lXxf86vm -lXext -lX11 -lXcursor +all_linux clean_linux: SYSTEM=Linux +all_win32 clean_win32 static_win32: SYSTEM=Win32-gcc +all_win32 clean_win32 static_win32: SUF=.exe +static_win32: CPPFLAGS += -D_IRR_STATIC_LIB_ +all_win32: LDFLAGS += -lopengl32 -lm +static_win32: LDFLAGS += -lgdi32 -lwinspool -lcomdlg32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 +# name of the binary - only valid for targets which set SYSTEM +DESTPATH = $(BinPath)/$(Target)$(SUF) + +all_linux all_win32 static_win32: + $(warning Building...) + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS) + +clean: clean_linux clean_win32 + $(warning Cleaning...) + +clean_linux clean_win32: + @$(RM) $(DESTPATH) + +.PHONY: all all_win32 static_win32 clean clean_linux clean_win32 + +#multilib handling +ifeq ($(HOSTTYPE), x86_64) +LIBSELECT=64 +endif +#solaris real-time features +ifeq ($(HOSTTYPE), sun4) +LDFLAGS += -lrt +endif + diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling.vcproj b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling.vcproj index 152a415..821dbe0 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling.vcproj +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling.vcproj @@ -1,195 +1,195 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc10.vcxproj b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc10.vcxproj index 2f550a1..e9ed736 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc10.vcxproj +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc10.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 25.XmlHandling - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E} - 25.XmlHandling - Win32Proj - - - - Application - MultiByte - - - Application - MultiByte - - - Application - MultiByte - - - Application - MultiByte - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Level3 - - - Cdecl - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Level3 - - - Cdecl - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + 25.XmlHandling + {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E} + 25.XmlHandling + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\bin\Win32-VisualStudio\ + ..\..\bin\Win64-VisualStudio\ + ..\..\bin\Win32-VisualStudio\ + ..\..\bin\Win64-VisualStudio\ + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level3 + EditAndContinue + + + ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) + true + Console + + + + + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level3 + ProgramDatabase + + + ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) + true + Console + + + + + + + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + + + Level3 + + + Cdecl + + + ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) + false + Console + true + true + + + + + + + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + + + Level3 + + + Cdecl + + + ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) + false + Console + true + true + + + + + + + + + + \ No newline at end of file diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc11.vcxproj b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc11.vcxproj index b150b95..2a9fa6f 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc11.vcxproj +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc11.vcxproj @@ -1,182 +1,182 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - 25.XmlHandling - {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E} - 25.XmlHandling - Win32Proj - - - - Application - MultiByte - v110 - - - Application - MultiByte - v110 - - - Application - MultiByte - v110 - - - Application - MultiByte - v110 - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - ..\..\bin\Win32-VisualStudio\ - ..\..\bin\Win64-VisualStudio\ - AllRules.ruleset - AllRules.ruleset - - - - - AllRules.ruleset - AllRules.ruleset - - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - EnableFastChecks - MultiThreadedDebug - - - Level3 - EditAndContinue - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - Disabled - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - - - Level3 - ProgramDatabase - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - true - Console - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Level3 - - - Cdecl - - - ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - true - Speed - ..\..\include;%(AdditionalIncludeDirectories) - WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - false - - - Level3 - - - Cdecl - - - ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) - false - Console - true - true - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + 25.XmlHandling + {8FDA260E-EF27-4F8C-8720-7AF707DD0D9E} + 25.XmlHandling + Win32Proj + + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\bin\Win32-VisualStudio\ + ..\..\bin\Win64-VisualStudio\ + ..\..\bin\Win32-VisualStudio\ + ..\..\bin\Win64-VisualStudio\ + AllRules.ruleset + AllRules.ruleset + + + + + AllRules.ruleset + AllRules.ruleset + + + + + + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level3 + EditAndContinue + + + ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) + true + Console + + + + + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;WIN64;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level3 + ProgramDatabase + + + ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) + true + Console + + + + + + + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + + + Level3 + + + Cdecl + + + ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories) + false + Console + true + true + + + + + + + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;WIN64;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + + + Level3 + + + Cdecl + + + ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories) + false + Console + true + true + + + + + + + + + + \ No newline at end of file diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc8.vcproj b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc8.vcproj index 0831ba9..2990e65 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc8.vcproj +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc8.vcproj @@ -1,190 +1,190 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc9.vcproj b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc9.vcproj index 79a1048..55233c4 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc9.vcproj +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/XmlHandling_vc9.vcproj @@ -1,185 +1,185 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/examples/25.XmlHandling/main.cpp b/libraries/irrlicht-1.8/examples/25.XmlHandling/main.cpp index 3eb261d..3ae6316 100644 --- a/libraries/irrlicht-1.8/examples/25.XmlHandling/main.cpp +++ b/libraries/irrlicht-1.8/examples/25.XmlHandling/main.cpp @@ -1,505 +1,505 @@ -/** Example 025 Xml Handling - -Demonstrates loading and saving of configurations via XML - -@author Y.M. Bosman \ - -This demo features a fully usable system for configuration handling. The code -can easily be integrated into own apps. - -*/ - -#include - -using namespace irr; -using namespace core; -using namespace scene; -using namespace video; -using namespace io; -using namespace gui; - -#ifdef _IRR_WINDOWS_ -#pragma comment(lib, "Irrlicht.lib") -#endif - - -/* SettingManager class. - -This class loads and writes the settings and manages the options. - -The class makes use of irrMap which is a an associative arrays using a -red-black tree it allows easy mapping of a key to a value, along the way there -is some information on how to use it. -*/ - -class SettingManager -{ -public: - - // Construct setting managers and set default settings - SettingManager(const stringw& settings_file): SettingsFile(settings_file), NullDevice(0) - { - // Irrlicht null device, we want to load settings before we actually created our device, therefore, nulldevice - NullDevice = irr::createDevice(irr::video::EDT_NULL); - - //DriverOptions is an irrlicht map, - //we can insert values in the map in two ways by calling insert(key,value) or by using the [key] operator - //the [] operator overrides values if they already exist - DriverOptions.insert(L"Software", EDT_SOFTWARE); - DriverOptions.insert(L"OpenGL", EDT_OPENGL); - DriverOptions.insert(L"Direct3D9", EDT_DIRECT3D9); - - //some resolution options - ResolutionOptions.insert(L"640x480", dimension2du(640,480)); - ResolutionOptions.insert(L"800x600", dimension2du(800,600)); - ResolutionOptions.insert(L"1024x768", dimension2du(1024,768)); - - //our preferred defaults - SettingMap.insert(L"driver", L"Direct3D9"); - SettingMap.insert(L"resolution", L"640x480"); - SettingMap.insert(L"fullscreen", L"0"); //0 is false - } - - // Destructor, you could store settings automatically on exit of your - // application if you wanted to in our case we simply drop the - // nulldevice - ~SettingManager() - { - if (NullDevice) - { - NullDevice->closeDevice(); - NullDevice->drop(); - } - }; - - /* - Load xml from disk, overwrite default settings - The xml we are trying to load has the following structure - settings nested in sections nested in the root node, like so -
-		
-		
-			
-		
-	
- */ - bool load() - { - //if not able to create device don't attempt to load - if (!NullDevice) - return false; - - irr::io::IXMLReader* xml = NullDevice->getFileSystem()->createXMLReader(SettingsFile); //create xml reader - if (!xml) - return false; - - const stringw settingTag(L"setting"); //we'll be looking for this tag in the xml - stringw currentSection; //keep track of our current section - const stringw videoTag(L"video"); //constant for videotag - - //while there is more to read - while (xml->read()) - { - //check the node type - switch (xml->getNodeType()) - { - //we found a new element - case irr::io::EXN_ELEMENT: - { - //we currently are in the empty or mygame section and find the video tag so we set our current section to video - if (currentSection.empty() && videoTag.equals_ignore_case(xml->getNodeName())) - { - currentSection = videoTag; - } - //we are in the video section and we find a setting to parse - else if (currentSection.equals_ignore_case(videoTag) && settingTag.equals_ignore_case(xml->getNodeName() )) - { - //read in the key - stringw key = xml->getAttributeValueSafe(L"name"); - //if there actually is a key to set - if (!key.empty()) - { - //set the setting in the map to the value, - //the [] operator overrides values if they already exist or inserts a new key value - //pair into the settings map if it was not defined yet - SettingMap[key] = xml->getAttributeValueSafe(L"value"); - } - } - - //.. - // You can add your own sections and tags to read in here - //.. - } - break; - - //we found the end of an element - case irr::io::EXN_ELEMENT_END: - //we were at the end of the video section so we reset our tag - currentSection=L""; - break; - } - } - - // don't forget to delete the xml reader - xml->drop(); - - return true; - } - - // Save the xml to disk. We use the nulldevice. - bool save() - { - - //if not able to create device don't attempt to save - if (!NullDevice) - return false; - - //create xml writer - irr::io::IXMLWriter* xwriter = NullDevice->getFileSystem()->createXMLWriter( SettingsFile ); - if (!xwriter) - return false; - - //write out the obligatory xml header. Each xml-file needs to have exactly one of those. - xwriter->writeXMLHeader(); - - //start element mygame, you replace the label "mygame" with anything you want - xwriter->writeElement(L"mygame"); - xwriter->writeLineBreak(); //new line - - //start section with video settings - xwriter->writeElement(L"video"); - xwriter->writeLineBreak(); //new line - - // getIterator gets us a pointer to the first node of the settings map - // every iteration we increase the iterator which gives us the next map node - // until we reach the end we write settings one by one by using the nodes key and value functions - map::Iterator i = SettingMap.getIterator(); - for(; !i.atEnd(); i++) - { - //write element as - //the second parameter indicates this is an empty element with no children, just attributes - xwriter->writeElement(L"setting",true, L"name", i->getKey().c_str(), L"value",i->getValue().c_str() ); - xwriter->writeLineBreak(); - } - xwriter->writeLineBreak(); - - //close video section - xwriter->writeClosingTag(L"video"); - xwriter->writeLineBreak(); - - //.. - // You can add writing sound settings, savegame information etc - //.. - - //close mygame section - xwriter->writeClosingTag(L"mygame"); - - //delete xml writer - xwriter->drop(); - - return true; - } - - // Set setting in our manager - void setSetting(const stringw& name, const stringw& value) - { - SettingMap[name]=value; - } - - // set setting overload to quickly assign integers to our setting map - void setSetting(const stringw& name, s32 value) - { - SettingMap[name]=stringw(value); - } - - // Get setting as string - stringw getSetting(const stringw& key) const - { - //the find function or irrmap returns a pointer to a map Node - //if the key can be found, otherwise it returns null - //the map node has the function getValue and getKey, as we already know the key, we return node->getValue() - map::Node* n = SettingMap.find(key); - if (n) - return n->getValue(); - else - return L""; - } - - // - bool getSettingAsBoolean(const stringw& key ) const - { - stringw s = getSetting(key); - if (s.empty()) - return false; - return s.equals_ignore_case(L"1"); - } - - // - s32 getSettingAsInteger(const stringw& key) const - { - //we implicitly cast to string instead of stringw because strtol10 does not accept wide strings - const stringc s = getSetting(key); - if (s.empty()) - return 0; - - return strtol10(s.c_str()); - } - -public: - map DriverOptions; //available options for driver config - map ResolutionOptions; //available options for resolution config -private: - SettingManager(const SettingManager& other); // defined but not implemented - SettingManager& operator=(const SettingManager& other); // defined but not implemented - - map SettingMap; //current config - - stringw SettingsFile; // location of the xml, usually the - irr::IrrlichtDevice* NullDevice; -}; - -/* -Application context for global variables -*/ -struct SAppContext -{ - SAppContext() - : Device(0),Gui(0), Driver(0), Settings(0), ShouldQuit(false), - ButtonSave(0), ButtonExit(0), ListboxDriver(0), - ListboxResolution(0), CheckboxFullscreen(0) - { - } - - ~SAppContext() - { - if (Settings) - delete Settings; - - if (Device) - { - Device->closeDevice(); - Device->drop(); - } - } - - IrrlichtDevice* Device; - IGUIEnvironment* Gui; - IVideoDriver* Driver; - SettingManager* Settings; - bool ShouldQuit; - - //settings dialog - IGUIButton* ButtonSave; - IGUIButton* ButtonExit; - IGUIListBox* ListboxDriver; - IGUIListBox* ListboxResolution; - IGUICheckBox* CheckboxFullscreen; -}; - -/* - A typical event receiver. -*/ -class MyEventReceiver : public IEventReceiver -{ -public: - MyEventReceiver(SAppContext & a) : App(a) { } - - virtual bool OnEvent(const SEvent& event) - { - if (event.EventType == EET_GUI_EVENT ) - { - switch ( event.GUIEvent.EventType ) - { - //handle button click events - case EGET_BUTTON_CLICKED: - { - //Our save button was called so we obtain the settings from our dialog and save them - if ( event.GUIEvent.Caller == App.ButtonSave ) - { - //if there is a selection write it - if ( App.ListboxDriver->getSelected() != -1) - App.Settings->setSetting(L"driver", App.ListboxDriver->getListItem(App.ListboxDriver->getSelected())); - - //if there is a selection write it - if ( App.ListboxResolution->getSelected() != -1) - App.Settings->setSetting(L"resolution", App.ListboxResolution->getListItem(App.ListboxResolution->getSelected())); - - App.Settings->setSetting(L"fullscreen", App.CheckboxFullscreen->isChecked()); - - - if (App.Settings->save()) - { - App.Gui->addMessageBox(L"settings save",L"settings saved, please restart for settings to change effect","",true); - } - } - // cancel/exit button clicked, tell the application to exit - else if ( event.GUIEvent.Caller == App.ButtonExit) - { - App.ShouldQuit = true; - } - } - break; - } - } - - return false; - } - -private: - SAppContext & App; -}; - - -/* -Function to create a video settings dialog -This dialog shows the current settings from the configuration xml and allows them to be changed -*/ -void createSettingsDialog(SAppContext& app) -{ - // first get rid of alpha in gui - for (irr::s32 i=0; igetSkin()->getColor((irr::gui::EGUI_DEFAULT_COLOR)i); - col.setAlpha(255); - app.Gui->getSkin()->setColor((irr::gui::EGUI_DEFAULT_COLOR)i, col); - } - - //create video settings windows - gui::IGUIWindow* windowSettings = app.Gui->addWindow(rect(10,10,400,400),true,L"Videosettings"); - app.Gui->addStaticText (L"Select your desired video settings", rect< s32 >(10,20, 200, 40), false, true, windowSettings); - - // add listbox for driver choice - app.Gui->addStaticText (L"Driver", rect< s32 >(10,50, 200, 60), false, true, windowSettings); - app.ListboxDriver = app.Gui->addListBox(rect(10,60,220,120), windowSettings, 1,true); - - //add all available options to the driver choice listbox - map::Iterator i = app.Settings->DriverOptions.getIterator(); - for(; !i.atEnd(); i++) - app.ListboxDriver->addItem(i->getKey().c_str()); - - //set currently selected driver - app.ListboxDriver->setSelected(app.Settings->getSetting("driver").c_str()); - - // add listbox for resolution choice - app.Gui->addStaticText (L"Resolution", rect< s32 >(10,130, 200, 140), false, true, windowSettings); - app.ListboxResolution = app.Gui->addListBox(rect(10,140,220,200), windowSettings, 1,true); - - //add all available options to the resolution listbox - map::Iterator ri = app.Settings->ResolutionOptions.getIterator(); - for(; !ri.atEnd(); ri++) - app.ListboxResolution->addItem(ri->getKey().c_str()); - - //set currently selected resolution - app.ListboxResolution->setSelected(app.Settings->getSetting("resolution").c_str()); - - //add checkbox to toggle fullscreen, initially set to loaded setting - app.CheckboxFullscreen = app.Gui->addCheckBox( - app.Settings->getSettingAsBoolean("fullscreen"), - rect(10,220,220,240), windowSettings, -1, - L"Fullscreen"); - - //last but not least add save button - app.ButtonSave = app.Gui->addButton( - rect(80,250,150,270), windowSettings, 2, - L"Save video settings"); - - //exit/cancel button - app.ButtonExit = app.Gui->addButton( - rect(160,250,240,270), windowSettings, 2, - L"Cancel and exit"); -} - -/* -The main function. Creates all objects and does the XML handling. -*/ -int main() -{ - //create new application context - SAppContext app; - - //create device creation parameters that can get overwritten by our settings file - SIrrlichtCreationParameters param; - param.DriverType = EDT_SOFTWARE; - param.WindowSize.set(640,480); - - // Try to load config. - // I leave it as an exercise of the reader to store the configuration in the local application data folder, - // the only logical place to store config data for games. For all other operating systems I redirect to your manuals - app.Settings = new SettingManager("../../media/settings.xml"); - if ( !app.Settings->load() ) - { - // ... - // Here add your own exception handling, for now we continue because there are defaults set in SettingManager constructor - // ... - } - else - { - //settings xml loaded from disk, - - //map driversetting to driver type and test if the setting is valid - //the DriverOptions map contains string representations mapped to to irrlicht E_DRIVER_TYPE enum - //e.g "direct3d9" will become 4 - //see DriverOptions in the settingmanager class for details - map::Node* driver = app.Settings->DriverOptions.find( app.Settings->getSetting("driver") ); - - if (driver) - { - if ( irr::IrrlichtDevice::isDriverSupported( static_cast( driver->getValue() ))) - { - // selected driver is supported, so we use it. - param.DriverType = static_cast( driver->getValue()); - } - } - - //map resolution setting to dimension in a similar way as demonstrated above - map::Node* res = app.Settings->ResolutionOptions.find( app.Settings->getSetting("resolution") ); - if (res) - { - param.WindowSize = res->getValue(); - } - - //get fullscreen setting from config - param.Fullscreen = app.Settings->getSettingAsBoolean("fullscreen"); - } - - //create the irrlicht device using the settings - app.Device = createDeviceEx(param); - if (app.Device == 0) - { - // You can add your own exception handling on driver failure - exit(0); - } - - app.Device->setWindowCaption(L"Xmlhandling - Irrlicht engine tutorial"); - app.Driver = app.Device->getVideoDriver(); - app.Gui = app.Device->getGUIEnvironment(); - - createSettingsDialog(app); - - //set event receiver so we can respond to gui events - MyEventReceiver receiver(app); - app.Device->setEventReceiver(&receiver); - - //enter main loop - while (!app.ShouldQuit && app.Device->run()) - { - if (app.Device->isWindowActive()) - { - app.Driver->beginScene(true, true, SColor(0,200,200,200)); - app.Gui->drawAll(); - app.Driver->endScene(); - } - app.Device->sleep(10); - } - - //app destroys device in destructor - - return 0; -} - -/* -**/ +/** Example 025 Xml Handling + +Demonstrates loading and saving of configurations via XML + +@author Y.M. Bosman \ + +This demo features a fully usable system for configuration handling. The code +can easily be integrated into own apps. + +*/ + +#include + +using namespace irr; +using namespace core; +using namespace scene; +using namespace video; +using namespace io; +using namespace gui; + +#ifdef _IRR_WINDOWS_ +#pragma comment(lib, "Irrlicht.lib") +#endif + + +/* SettingManager class. + +This class loads and writes the settings and manages the options. + +The class makes use of irrMap which is a an associative arrays using a +red-black tree it allows easy mapping of a key to a value, along the way there +is some information on how to use it. +*/ + +class SettingManager +{ +public: + + // Construct setting managers and set default settings + SettingManager(const stringw& settings_file): SettingsFile(settings_file), NullDevice(0) + { + // Irrlicht null device, we want to load settings before we actually created our device, therefore, nulldevice + NullDevice = irr::createDevice(irr::video::EDT_NULL); + + //DriverOptions is an irrlicht map, + //we can insert values in the map in two ways by calling insert(key,value) or by using the [key] operator + //the [] operator overrides values if they already exist + DriverOptions.insert(L"Software", EDT_SOFTWARE); + DriverOptions.insert(L"OpenGL", EDT_OPENGL); + DriverOptions.insert(L"Direct3D9", EDT_DIRECT3D9); + + //some resolution options + ResolutionOptions.insert(L"640x480", dimension2du(640,480)); + ResolutionOptions.insert(L"800x600", dimension2du(800,600)); + ResolutionOptions.insert(L"1024x768", dimension2du(1024,768)); + + //our preferred defaults + SettingMap.insert(L"driver", L"Direct3D9"); + SettingMap.insert(L"resolution", L"640x480"); + SettingMap.insert(L"fullscreen", L"0"); //0 is false + } + + // Destructor, you could store settings automatically on exit of your + // application if you wanted to in our case we simply drop the + // nulldevice + ~SettingManager() + { + if (NullDevice) + { + NullDevice->closeDevice(); + NullDevice->drop(); + } + }; + + /* + Load xml from disk, overwrite default settings + The xml we are trying to load has the following structure + settings nested in sections nested in the root node, like so +
+		
+		
+			
+		
+	
+ */ + bool load() + { + //if not able to create device don't attempt to load + if (!NullDevice) + return false; + + irr::io::IXMLReader* xml = NullDevice->getFileSystem()->createXMLReader(SettingsFile); //create xml reader + if (!xml) + return false; + + const stringw settingTag(L"setting"); //we'll be looking for this tag in the xml + stringw currentSection; //keep track of our current section + const stringw videoTag(L"video"); //constant for videotag + + //while there is more to read + while (xml->read()) + { + //check the node type + switch (xml->getNodeType()) + { + //we found a new element + case irr::io::EXN_ELEMENT: + { + //we currently are in the empty or mygame section and find the video tag so we set our current section to video + if (currentSection.empty() && videoTag.equals_ignore_case(xml->getNodeName())) + { + currentSection = videoTag; + } + //we are in the video section and we find a setting to parse + else if (currentSection.equals_ignore_case(videoTag) && settingTag.equals_ignore_case(xml->getNodeName() )) + { + //read in the key + stringw key = xml->getAttributeValueSafe(L"name"); + //if there actually is a key to set + if (!key.empty()) + { + //set the setting in the map to the value, + //the [] operator overrides values if they already exist or inserts a new key value + //pair into the settings map if it was not defined yet + SettingMap[key] = xml->getAttributeValueSafe(L"value"); + } + } + + //.. + // You can add your own sections and tags to read in here + //.. + } + break; + + //we found the end of an element + case irr::io::EXN_ELEMENT_END: + //we were at the end of the video section so we reset our tag + currentSection=L""; + break; + } + } + + // don't forget to delete the xml reader + xml->drop(); + + return true; + } + + // Save the xml to disk. We use the nulldevice. + bool save() + { + + //if not able to create device don't attempt to save + if (!NullDevice) + return false; + + //create xml writer + irr::io::IXMLWriter* xwriter = NullDevice->getFileSystem()->createXMLWriter( SettingsFile ); + if (!xwriter) + return false; + + //write out the obligatory xml header. Each xml-file needs to have exactly one of those. + xwriter->writeXMLHeader(); + + //start element mygame, you replace the label "mygame" with anything you want + xwriter->writeElement(L"mygame"); + xwriter->writeLineBreak(); //new line + + //start section with video settings + xwriter->writeElement(L"video"); + xwriter->writeLineBreak(); //new line + + // getIterator gets us a pointer to the first node of the settings map + // every iteration we increase the iterator which gives us the next map node + // until we reach the end we write settings one by one by using the nodes key and value functions + map::Iterator i = SettingMap.getIterator(); + for(; !i.atEnd(); i++) + { + //write element as + //the second parameter indicates this is an empty element with no children, just attributes + xwriter->writeElement(L"setting",true, L"name", i->getKey().c_str(), L"value",i->getValue().c_str() ); + xwriter->writeLineBreak(); + } + xwriter->writeLineBreak(); + + //close video section + xwriter->writeClosingTag(L"video"); + xwriter->writeLineBreak(); + + //.. + // You can add writing sound settings, savegame information etc + //.. + + //close mygame section + xwriter->writeClosingTag(L"mygame"); + + //delete xml writer + xwriter->drop(); + + return true; + } + + // Set setting in our manager + void setSetting(const stringw& name, const stringw& value) + { + SettingMap[name]=value; + } + + // set setting overload to quickly assign integers to our setting map + void setSetting(const stringw& name, s32 value) + { + SettingMap[name]=stringw(value); + } + + // Get setting as string + stringw getSetting(const stringw& key) const + { + //the find function or irrmap returns a pointer to a map Node + //if the key can be found, otherwise it returns null + //the map node has the function getValue and getKey, as we already know the key, we return node->getValue() + map::Node* n = SettingMap.find(key); + if (n) + return n->getValue(); + else + return L""; + } + + // + bool getSettingAsBoolean(const stringw& key ) const + { + stringw s = getSetting(key); + if (s.empty()) + return false; + return s.equals_ignore_case(L"1"); + } + + // + s32 getSettingAsInteger(const stringw& key) const + { + //we implicitly cast to string instead of stringw because strtol10 does not accept wide strings + const stringc s = getSetting(key); + if (s.empty()) + return 0; + + return strtol10(s.c_str()); + } + +public: + map DriverOptions; //available options for driver config + map ResolutionOptions; //available options for resolution config +private: + SettingManager(const SettingManager& other); // defined but not implemented + SettingManager& operator=(const SettingManager& other); // defined but not implemented + + map SettingMap; //current config + + stringw SettingsFile; // location of the xml, usually the + irr::IrrlichtDevice* NullDevice; +}; + +/* +Application context for global variables +*/ +struct SAppContext +{ + SAppContext() + : Device(0),Gui(0), Driver(0), Settings(0), ShouldQuit(false), + ButtonSave(0), ButtonExit(0), ListboxDriver(0), + ListboxResolution(0), CheckboxFullscreen(0) + { + } + + ~SAppContext() + { + if (Settings) + delete Settings; + + if (Device) + { + Device->closeDevice(); + Device->drop(); + } + } + + IrrlichtDevice* Device; + IGUIEnvironment* Gui; + IVideoDriver* Driver; + SettingManager* Settings; + bool ShouldQuit; + + //settings dialog + IGUIButton* ButtonSave; + IGUIButton* ButtonExit; + IGUIListBox* ListboxDriver; + IGUIListBox* ListboxResolution; + IGUICheckBox* CheckboxFullscreen; +}; + +/* + A typical event receiver. +*/ +class MyEventReceiver : public IEventReceiver +{ +public: + MyEventReceiver(SAppContext & a) : App(a) { } + + virtual bool OnEvent(const SEvent& event) + { + if (event.EventType == EET_GUI_EVENT ) + { + switch ( event.GUIEvent.EventType ) + { + //handle button click events + case EGET_BUTTON_CLICKED: + { + //Our save button was called so we obtain the settings from our dialog and save them + if ( event.GUIEvent.Caller == App.ButtonSave ) + { + //if there is a selection write it + if ( App.ListboxDriver->getSelected() != -1) + App.Settings->setSetting(L"driver", App.ListboxDriver->getListItem(App.ListboxDriver->getSelected())); + + //if there is a selection write it + if ( App.ListboxResolution->getSelected() != -1) + App.Settings->setSetting(L"resolution", App.ListboxResolution->getListItem(App.ListboxResolution->getSelected())); + + App.Settings->setSetting(L"fullscreen", App.CheckboxFullscreen->isChecked()); + + + if (App.Settings->save()) + { + App.Gui->addMessageBox(L"settings save",L"settings saved, please restart for settings to change effect","",true); + } + } + // cancel/exit button clicked, tell the application to exit + else if ( event.GUIEvent.Caller == App.ButtonExit) + { + App.ShouldQuit = true; + } + } + break; + } + } + + return false; + } + +private: + SAppContext & App; +}; + + +/* +Function to create a video settings dialog +This dialog shows the current settings from the configuration xml and allows them to be changed +*/ +void createSettingsDialog(SAppContext& app) +{ + // first get rid of alpha in gui + for (irr::s32 i=0; igetSkin()->getColor((irr::gui::EGUI_DEFAULT_COLOR)i); + col.setAlpha(255); + app.Gui->getSkin()->setColor((irr::gui::EGUI_DEFAULT_COLOR)i, col); + } + + //create video settings windows + gui::IGUIWindow* windowSettings = app.Gui->addWindow(rect(10,10,400,400),true,L"Videosettings"); + app.Gui->addStaticText (L"Select your desired video settings", rect< s32 >(10,20, 200, 40), false, true, windowSettings); + + // add listbox for driver choice + app.Gui->addStaticText (L"Driver", rect< s32 >(10,50, 200, 60), false, true, windowSettings); + app.ListboxDriver = app.Gui->addListBox(rect(10,60,220,120), windowSettings, 1,true); + + //add all available options to the driver choice listbox + map::Iterator i = app.Settings->DriverOptions.getIterator(); + for(; !i.atEnd(); i++) + app.ListboxDriver->addItem(i->getKey().c_str()); + + //set currently selected driver + app.ListboxDriver->setSelected(app.Settings->getSetting("driver").c_str()); + + // add listbox for resolution choice + app.Gui->addStaticText (L"Resolution", rect< s32 >(10,130, 200, 140), false, true, windowSettings); + app.ListboxResolution = app.Gui->addListBox(rect(10,140,220,200), windowSettings, 1,true); + + //add all available options to the resolution listbox + map::Iterator ri = app.Settings->ResolutionOptions.getIterator(); + for(; !ri.atEnd(); ri++) + app.ListboxResolution->addItem(ri->getKey().c_str()); + + //set currently selected resolution + app.ListboxResolution->setSelected(app.Settings->getSetting("resolution").c_str()); + + //add checkbox to toggle fullscreen, initially set to loaded setting + app.CheckboxFullscreen = app.Gui->addCheckBox( + app.Settings->getSettingAsBoolean("fullscreen"), + rect(10,220,220,240), windowSettings, -1, + L"Fullscreen"); + + //last but not least add save button + app.ButtonSave = app.Gui->addButton( + rect(80,250,150,270), windowSettings, 2, + L"Save video settings"); + + //exit/cancel button + app.ButtonExit = app.Gui->addButton( + rect(160,250,240,270), windowSettings, 2, + L"Cancel and exit"); +} + +/* +The main function. Creates all objects and does the XML handling. +*/ +int main() +{ + //create new application context + SAppContext app; + + //create device creation parameters that can get overwritten by our settings file + SIrrlichtCreationParameters param; + param.DriverType = EDT_SOFTWARE; + param.WindowSize.set(640,480); + + // Try to load config. + // I leave it as an exercise of the reader to store the configuration in the local application data folder, + // the only logical place to store config data for games. For all other operating systems I redirect to your manuals + app.Settings = new SettingManager("../../media/settings.xml"); + if ( !app.Settings->load() ) + { + // ... + // Here add your own exception handling, for now we continue because there are defaults set in SettingManager constructor + // ... + } + else + { + //settings xml loaded from disk, + + //map driversetting to driver type and test if the setting is valid + //the DriverOptions map contains string representations mapped to to irrlicht E_DRIVER_TYPE enum + //e.g "direct3d9" will become 4 + //see DriverOptions in the settingmanager class for details + map::Node* driver = app.Settings->DriverOptions.find( app.Settings->getSetting("driver") ); + + if (driver) + { + if ( irr::IrrlichtDevice::isDriverSupported( static_cast( driver->getValue() ))) + { + // selected driver is supported, so we use it. + param.DriverType = static_cast( driver->getValue()); + } + } + + //map resolution setting to dimension in a similar way as demonstrated above + map::Node* res = app.Settings->ResolutionOptions.find( app.Settings->getSetting("resolution") ); + if (res) + { + param.WindowSize = res->getValue(); + } + + //get fullscreen setting from config + param.Fullscreen = app.Settings->getSettingAsBoolean("fullscreen"); + } + + //create the irrlicht device using the settings + app.Device = createDeviceEx(param); + if (app.Device == 0) + { + // You can add your own exception handling on driver failure + exit(0); + } + + app.Device->setWindowCaption(L"Xmlhandling - Irrlicht engine tutorial"); + app.Driver = app.Device->getVideoDriver(); + app.Gui = app.Device->getGUIEnvironment(); + + createSettingsDialog(app); + + //set event receiver so we can respond to gui events + MyEventReceiver receiver(app); + app.Device->setEventReceiver(&receiver); + + //enter main loop + while (!app.ShouldQuit && app.Device->run()) + { + if (app.Device->isWindowActive()) + { + app.Driver->beginScene(true, true, SColor(0,200,200,200)); + app.Gui->drawAll(); + app.Driver->endScene(); + } + app.Device->sleep(10); + } + + //app destroys device in destructor + + return 0; +} + +/* +**/ -- cgit v1.1