From f9158592e1478b2013afc7041d9ed041cf2d2f4a Mon Sep 17 00:00:00 2001
From: David Walter Seikel
Date: Mon, 13 Jan 2014 19:47:58 +1000
Subject: Update Irrlicht to 1.8.1. Include actual change markers this time.
lol
---
.../tools/FileToHeader/FileToHeader.cbp | 48 +
.../irrlicht-1.8.1/tools/FileToHeader/Makefile | 35 +
.../irrlicht-1.8.1/tools/FileToHeader/main.cpp | 175 +++
.../irrlicht-1.8.1/tools/GUIEditor/CGUIAttribute.h | 169 +++
.../tools/GUIEditor/CGUIAttributeEditor.cpp | 120 ++
.../tools/GUIEditor/CGUIAttributeEditor.h | 54 +
.../tools/GUIEditor/CGUIBoolAttribute.h | 68 ++
.../tools/GUIEditor/CGUIColorAttribute.h | 179 +++
.../tools/GUIEditor/CGUIDummyEditorStub.h | 59 +
.../tools/GUIEditor/CGUIEditFactory.cpp | 120 ++
.../tools/GUIEditor/CGUIEditFactory.h | 53 +
.../tools/GUIEditor/CGUIEditWindow.cpp | 356 ++++++
.../tools/GUIEditor/CGUIEditWindow.h | 88 ++
.../tools/GUIEditor/CGUIEditWorkspace.cpp | 927 +++++++++++++++
.../tools/GUIEditor/CGUIEditWorkspace.h | 168 +++
.../tools/GUIEditor/CGUIEnumAttribute.h | 114 ++
.../irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.cpp | 340 ++++++
.../irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.h | 128 +++
.../tools/GUIEditor/CGUIStringAttribute.h | 70 ++
.../tools/GUIEditor/CGUITextureAttribute.h | 140 +++
.../tools/GUIEditor/CGUITextureCacheBrowser.cpp | 336 ++++++
.../tools/GUIEditor/CGUITextureCacheBrowser.h | 88 ++
.../tools/GUIEditor/CMemoryReadWriteFile.cpp | 95 ++
.../tools/GUIEditor/CMemoryReadWriteFile.h | 73 ++
.../irrlicht-1.8.1/tools/GUIEditor/EGUIEditTypes.h | 61 +
.../tools/GUIEditor/GUI Editor_v8.sln | 20 +
.../tools/GUIEditor/GUI Editor_v8.vcproj | 295 +++++
.../tools/GUIEditor/GUI Editor_v9.sln | 20 +
.../tools/GUIEditor/GUI Editor_v9.vcproj | 293 +++++
.../tools/GUIEditor/GUI Editor_vc10.vcxproj | 213 ++++
.../GUIEditor/GUI Editor_vc10.vcxproj.filters | 88 ++
.../tools/GUIEditor/GUI Editor_vc11.vcxproj | 217 ++++
.../GUIEditor/GUI Editor_vc11.vcxproj.filters | 88 ++
.../tools/GUIEditor/GUIEditor_gcc.cbp | 77 ++
libraries/irrlicht-1.8.1/tools/GUIEditor/Makefile | 43 +
libraries/irrlicht-1.8.1/tools/GUIEditor/main.cpp | 76 ++
.../tools/IrrFontTool/newFontTool/CFontTool.cpp | 801 +++++++++++++
.../tools/IrrFontTool/newFontTool/CFontTool.h | 78 ++
.../IrrFontTool/newFontTool/CVectorFontTool.h | 1199 ++++++++++++++++++++
.../tools/IrrFontTool/newFontTool/Makefile | 38 +
.../IrrFontTool/newFontTool/irrFontTool_v8.sln | 20 +
.../IrrFontTool/newFontTool/irrFontTool_v8.vcproj | 201 ++++
.../IrrFontTool/newFontTool/irrFontTool_v9.sln | 20 +
.../IrrFontTool/newFontTool/irrFontTool_v9.vcproj | 202 ++++
.../IrrFontTool/newFontTool/irrFontTool_vc10.sln | 20 +
.../newFontTool/irrFontTool_vc10.vcxproj | 203 ++++
.../IrrFontTool/newFontTool/irrFontTool_vc11.sln | 20 +
.../newFontTool/irrFontTool_vc11.vcxproj | 207 ++++
.../tools/IrrFontTool/newFontTool/main.cpp | 493 ++++++++
.../tools/IrrFontTool/oldFontTool/source.zip | Bin 0 -> 37849 bytes
.../irrlicht-1.8.1/tools/IrrFontTool/readme.txt | 13 +
.../irrlicht-1.8.1/tools/MeshConverter/Makefile | 38 +
.../tools/MeshConverter/MeshConverter.cbp | 54 +
.../tools/MeshConverter/MeshConverter_v9.vcproj | 187 +++
.../tools/MeshConverter/MeshConverter_vc10.vcxproj | 192 ++++
.../tools/MeshConverter/MeshConverter_vc11.vcxproj | 196 ++++
.../irrlicht-1.8.1/tools/MeshConverter/main.cpp | 108 ++
libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.jpg | Bin 0 -> 41602 bytes
libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.txt | 7 +
59 files changed, 9791 insertions(+)
create mode 100644 libraries/irrlicht-1.8.1/tools/FileToHeader/FileToHeader.cbp
create mode 100644 libraries/irrlicht-1.8.1/tools/FileToHeader/Makefile
create mode 100644 libraries/irrlicht-1.8.1/tools/FileToHeader/main.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttribute.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIBoolAttribute.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIColorAttribute.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIDummyEditorStub.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditFactory.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditFactory.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWindow.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWindow.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEnumAttribute.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIStringAttribute.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureAttribute.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/EGUIEditTypes.h
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.sln
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.vcproj
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.sln
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.vcproj
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/GUIEditor_gcc.cbp
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/Makefile
create mode 100644 libraries/irrlicht-1.8.1/tools/GUIEditor/main.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.h
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CVectorFontTool.h
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/Makefile
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/main.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/oldFontTool/source.zip
create mode 100644 libraries/irrlicht-1.8.1/tools/IrrFontTool/readme.txt
create mode 100644 libraries/irrlicht-1.8.1/tools/MeshConverter/Makefile
create mode 100644 libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter.cbp
create mode 100644 libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_v9.vcproj
create mode 100644 libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc10.vcxproj
create mode 100644 libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc11.vcxproj
create mode 100644 libraries/irrlicht-1.8.1/tools/MeshConverter/main.cpp
create mode 100644 libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.jpg
create mode 100644 libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.txt
(limited to 'libraries/irrlicht-1.8.1/tools')
diff --git a/libraries/irrlicht-1.8.1/tools/FileToHeader/FileToHeader.cbp b/libraries/irrlicht-1.8.1/tools/FileToHeader/FileToHeader.cbp
new file mode 100644
index 0000000..e6c1a2d
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/FileToHeader/FileToHeader.cbp
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/FileToHeader/Makefile b/libraries/irrlicht-1.8.1/tools/FileToHeader/Makefile
new file mode 100644
index 0000000..e9cd818
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/FileToHeader/Makefile
@@ -0,0 +1,35 @@
+# Makefile for FileToHeader
+Target = FileToHeader
+Sources = main.cpp
+
+# general compiler settings
+CPPFLAGS = -I../../include
+CXXFLAGS = -O3 -ffast-math -Wall
+#CXXFLAGS = -g -Wall
+
+#default target is Linux
+all: all_linux
+
+ifeq ($(HOSTTYPE), x86_64)
+LIBSELECT=64
+endif
+
+# target specific settings
+all_linux clean_linux: SYSTEM=Linux
+all_win32: LDFLAGS = -L../../lib/Win32-gcc
+all_win32 clean_win32: SYSTEM=Win32-gcc
+all_win32 clean_win32: SUF=.exe
+# name of the binary - only valid for targets which set SYSTEM
+DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF)
+
+all_linux all_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 clean clean_linux clean_win32
diff --git a/libraries/irrlicht-1.8.1/tools/FileToHeader/main.cpp b/libraries/irrlicht-1.8.1/tools/FileToHeader/main.cpp
new file mode 100644
index 0000000..b3cc7a7
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/FileToHeader/main.cpp
@@ -0,0 +1,175 @@
+// Copyright (C) 2012 Gaz Davidson
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+/***
+ This tool creates a .h file from a given input file by encoding it into a C string,
+ allowing you to build your resources directly into your binaries, just like Irrlicht's
+ built-in font.
+
+ To distribute your app as a single executable file of minimal size:
+
+ 1. Put all your resources into a single directory and add it to Irrlicht's filesystem
+ as a folder through IFileSystem::addArchive. Develop and test your app as usual.
+ 2. Open IrrCompileConfig.h and comment out all the options that your app does not use.
+ This will reduce the size of the Irrlicht library considerably.
+ * You should remove the D3D video drivers, because they rely on external DLLs.
+ * You should keep either the TAR or ZIP archive loader, used in step 6.
+ * If you remove the JPEG loader, you don't have to say you use JPEG code in your
+ documentation.
+ 3. Recompile Irrlicht as a static library, editing the IRR_STATIC_LIB line in
+ IrrCompileConfig.h.
+ The next time you compile your application it will take a while longer, but
+ Irrlicht will be built into your binary.
+ 4. TAR or ZIP your resource directory using your favourite archiving tool (ie 7zip).
+ * If you chose ZIP but compiled without zlib, don't compress this archive or it
+ won't open.
+ 5. Run this tool to convert your resource file into a .h file, like so:
+ FileToHeader res.zip > EmbeddedResources.h
+ 6. Add the .h file to your project, create the embedded read file then mount as a
+ ZIP or TAR archive instead of the folder, like so:
+ io::IReadFile *f = io::createEmbeddedFile(device->getFileSystem(), "res.zip");
+ device->getFileSystem()->addFileArchive(f);
+ archive->drop();
+ 7. Recompile your app.
+ * If you use Microsoft's compiler, make sure your CRT (common run-time) is
+ the static library version, otherwise you'll have a dependency on the CRT DLLs.
+ Your binary should now be completely portable; you can distribute just the exe file.
+ 8. Optional: Use UPX (upx.sf.net) to compress your binary.
+*/
+
+#include
+#include
+#include
+
+using namespace std;
+
+int main(int argc, char* argv[])
+{
+ if (argc < 2)
+ {
+ // print usage
+ cerr << "You must to specify at least one input file" << endl;
+ cerr << "usage: " << argv[0] << " [file2...]" << endl;
+ cerr << "outputs a header file to stdout, so for example use";
+ return 1;
+ }
+
+ int i = 1;
+
+ // write file header
+ cout << "// File made by FileToHeader, part of the Irrlicht Engine" << endl
+ << endl
+ << "#ifndef _EMBEDDED_FILES_H_INCLUDED_" << endl
+ << "#define _EMBEDDED_FILES_H_INCLUDED_" << endl
+ << endl
+ << "#include \"irrTypes.h\"" << endl
+ << "#include \"IReadFile.h\"" << endl
+ << "#include \"IFileSystem.h\"" << endl
+ << endl
+ << "namespace irr" << endl
+ << "{" << endl
+ << "namespace io" << endl
+ << "{" << endl
+ << endl
+ << " const c8* EmbeddedFileData[] = " << endl
+ << " {" << endl;
+
+ // store sizes and file names
+ stringstream sizes;
+ stringstream names;
+ sizes << "const u32 EmbeddedFileSizes[] = {";
+ names << "const c8* EmbeddedFileNames[] = {";
+ int fileCount = 0;
+
+ // char to hex digit table, probably doesn't help for speed due to fstream. better than using sprintf though
+ char hextable[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
+
+ while (i < argc)
+ {
+ // open and seek to end of file
+ ifstream input;
+ input.open(argv[i], ios::in | ios::binary | ios::ate);
+
+ if (input.is_open())
+ {
+ int size = input.tellg();
+ input.seekg(0, ios::beg);
+ // read the file into RAM
+ char *entireFile = new char[size];
+ input.read(entireFile, size);
+
+ if (fileCount)
+ {
+ sizes << ", ";
+ names << ", ";
+ cout << "," << endl;
+ }
+
+ // save file size and name
+ sizes << size;
+ names << '"' << argv[i] << '"';
+
+ // write the file data
+ cout << " \"";
+ for (int count=0; count < size; ++count)
+ {
+ if (count && (count % 16) == 0)
+ cout << "\"" << endl << " \"";
+
+ cout << "\\x" << hextable[(entireFile[count] >> 4) & 0xF] << hextable[entireFile[count] & 0x0F];
+ }
+ cout << "\"";
+
+ delete [] entireFile;
+ //
+ input.close();
+
+ fileCount++;
+ }
+ else
+ {
+ cerr << "Failed to open file: " << argv[i] << endl;
+ }
+
+ ++i;
+ }
+
+ // close binary file list and write file metadata
+ cout << endl
+ << " , 0};" << endl
+ << endl
+ << " const u32 EmbeddedFileCount = " << fileCount << ";" << endl
+ << " " << sizes.str() << "};" << endl
+ << " " << names.str() << "};" << endl
+ << endl;
+
+ // write functions to create embedded IReadFiles
+ cout << " IReadFile* createEmbeddedFile(IFileSystem *fs, u32 index)" << endl
+ << " {" << endl
+ << " if (EmbeddedFileCount < index)" << endl
+ << " return 0;" << endl
+ << endl
+ << " return fs->createMemoryReadFile((void*)EmbeddedFileData[index], " << endl
+ << " EmbeddedFileSizes[index], EmbeddedFileNames[index]);" << endl
+ << " }" << endl
+ << endl
+ << " IReadFile* createEmbeddedFile(IFileSystem *fs, path filename)" << endl
+ << " {" << endl
+ << " for (u32 i=0; i < EmbeddedFileCount; ++i)" << endl
+ << " if (filename == EmbeddedFileNames[i])" << endl
+ << " return createEmbeddedFile(fs, i);" << endl
+ << endl
+ << " return 0;" << endl
+ << " }" << endl
+ << endl;
+
+ // write footer
+ cout << "} // namespace io" << endl
+ << "} // namespace irr" << endl
+ << endl
+ << "#endif // _EMBEDDED_FILES_H_INCLUDED_" << endl;
+
+ return 0;
+}
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttribute.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttribute.h
new file mode 100644
index 0000000..0585498
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttribute.h
@@ -0,0 +1,169 @@
+/*
+ This base class is used by the Attribute editor for making your own attribute types.
+
+ The attribute editor will try and create an attribute called "AttribType_attribute",
+ and if it fails, it will create a "string_attribute".
+
+*/
+
+#ifndef __C_GUI_ATTRIBUTE_H_INCLUDED__
+#define __C_GUI_ATTRIBUTE_H_INCLUDED__
+
+#include "IGUIElement.h"
+#include "IGUIEnvironment.h"
+#include "IGUIFont.h"
+#include "IGUIStaticText.h"
+#include "IAttributes.h"
+#include "CGUIEditWorkspace.h"
+
+namespace irr
+{
+
+namespace gui
+{
+
+ const u32 ATTRIBEDIT_ATTRIB_CHANGED=MAKE_IRR_ID('A','T','T','R');
+
+ class CGUIAttribute : public IGUIElement
+ {
+ public:
+ //! constructor
+ CGUIAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) :
+ IGUIElement(EGUIET_ELEMENT, environment, parent, -1, core::rect(0, 0, 100, 100) ),
+ AttribName(0), Attribs(0), Index(0), MyParentID(myParentID)
+ {
+
+ #ifdef _DEBUG
+ setDebugName("CGUIAttribute");
+ #endif
+
+ AttribName = environment->addStaticText(0,
+ core::rect(0, 0,
+ 100, Environment->getSkin()->getFont()->getDimension(L"A").Height),
+ false, false, this, -1, false);
+ AttribName->grab();
+ AttribName->setSubElement(true);
+ AttribName->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ }
+
+ virtual ~CGUIAttribute()
+ {
+ if (Attribs)
+ Attribs->drop();
+ if (AttribName)
+ AttribName->drop();
+ }
+
+ virtual bool OnEvent(const SEvent &e)
+ {
+ if (IsEnabled)
+ {
+ switch (e.EventType)
+ {
+ case EET_GUI_EVENT:
+ switch (e.GUIEvent.EventType)
+ {
+ case EGET_ELEMENT_FOCUSED:
+ if (Parent && isMyChild(e.GUIEvent.Caller))
+ Parent->bringToFront(this);
+ break;
+ case EGET_ELEMENT_HOVERED:
+ case EGET_ELEMENT_LEFT:
+ return IGUIElement::OnEvent(e);
+ case EGET_ELEMENT_FOCUS_LOST:
+ updateAttrib();
+ return IGUIElement::OnEvent(e);
+ default:
+ return updateAttrib();
+ }
+ break;
+ case EET_KEY_INPUT_EVENT:
+ return true;
+ default:
+ break;
+ }
+ }
+
+ return IGUIElement::OnEvent(e);
+ }
+
+ //! sets the attribute to use
+ virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex)
+ {
+ if (Attribs)
+ Attribs->drop();
+ Attribs = attribs;
+ if (Attribs)
+ Attribs->grab();
+ Index = attribIndex;
+
+ core::stringw name(attribs->getAttributeName(attribIndex));
+ name += L" (";
+ name += attribs->getAttributeTypeString(attribIndex);
+ name += L")";
+ AttribName->setText(name.c_str());
+
+ core::rect r = Parent->getAbsolutePosition();
+ core::rect r2(0, 5,
+ r.getWidth(), Environment->getSkin()->getFont()->getDimension(L"A").Height + 10 );
+
+ AttribName->setRelativePosition(r2);
+
+ // get minimum height
+ s32 y=0;
+ core::list::Iterator it = Children.begin();
+ for (; it != Children.end(); ++it)
+ {
+ if (y < (*it)->getRelativePosition().LowerRightCorner.Y)
+ y = (*it)->getRelativePosition().LowerRightCorner.Y;
+ }
+ setMinSize( core::dimension2du(0, y+5));
+
+ updateAttrib(false);
+ }
+
+ //! sets the parent ID, for identifying where events came from
+ void setParentID(s32 parentID)
+ {
+ MyParentID = parentID;
+ }
+
+ //! save the attribute and possibly post the event to its parent
+ virtual bool updateAttrib(bool sendEvent=true)
+ {
+ if (Attribs && IsEnabled && sendEvent)
+ {
+ // build event and pass to parent
+ SEvent event;
+ event.EventType = (EEVENT_TYPE)ATTRIBEDIT_ATTRIB_CHANGED;
+ event.UserEvent.UserData1 = MyParentID;
+ event.UserEvent.UserData2 = Index;
+ return Parent->OnEvent(event);
+ }
+
+ return true;
+ }
+
+ virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0)
+ {
+ IGUIElement::serializeAttributes(out, options);
+ }
+
+ virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
+ {
+ IGUIElement::deserializeAttributes(in, options);
+ if (AttribName)
+ AttribName->setText(Text.c_str());
+ }
+
+ protected:
+ IGUIStaticText* AttribName;
+ io::IAttributes* Attribs;
+ u32 Index;
+ s32 MyParentID;
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.cpp
new file mode 100644
index 0000000..45913b6
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.cpp
@@ -0,0 +1,120 @@
+
+#include "CGUIAttributeEditor.h"
+#include "IGUIEnvironment.h"
+#include "IFileSystem.h"
+#include "IVideoDriver.h"
+#include "IAttributes.h"
+#include "IGUIFont.h"
+#include "IGUIScrollBar.h"
+#include "CGUIEditWorkspace.h"
+#include "CGUIAttribute.h"
+#include "CGUIStringAttribute.h"
+
+namespace irr
+{
+namespace gui
+{
+
+using namespace core;
+using namespace io;
+
+CGUIAttributeEditor::CGUIAttributeEditor(IGUIEnvironment* environment, s32 id, IGUIElement *parent) :
+ CGUIPanel(environment, parent, id, rect(0, 0, 100, 100)),
+ Attribs(0), Panel(0)
+{
+ #ifdef _DEBUG
+ setDebugName("CGUIAttributeEditor");
+ #endif
+
+ // create attributes
+ Attribs = environment->getFileSystem()->createEmptyAttributes(Environment->getVideoDriver());
+
+ calculateClientArea();
+ resizeInnerPane();
+
+ // refresh attrib list
+ refreshAttribs();
+
+ IGUIScrollBar* sb = getVScrollBar();
+ core::rect r = sb->getRelativePosition();
+ r.LowerRightCorner.Y -= 16;
+ sb->setRelativePosition(r);
+}
+
+CGUIAttributeEditor::~CGUIAttributeEditor()
+{
+ for (u32 i=0; iremove();
+ AttribList[i]->drop();
+ }
+ AttribList.clear();
+
+ Attribs->drop();
+}
+
+
+IAttributes* CGUIAttributeEditor::getAttribs()
+{
+ return Attribs;
+}
+
+void CGUIAttributeEditor::refreshAttribs()
+{
+ // clear the attribute list
+ u32 i;
+ for (i=0; iremove();
+ AttribList[i]->drop();
+ }
+ AttribList.clear();
+
+ position2di top(10, 5);
+ rect r(top.X, top.Y,
+ getClientArea().getWidth() - 10,
+ 5 + Environment->getSkin()->getFont()->getDimension(L"A").Height);
+
+ // add attribute elements
+ u32 c = Attribs->getAttributeCount();
+ for (i=0; igetAttributeTypeString(i);
+ str += "_attribute";
+ CGUIAttribute* n = (CGUIAttribute*)Environment->addGUIElement(str.c_str(), 0);
+
+ // if this doesn't exist, use a string editor
+ if (!n)
+ n = (CGUIAttribute*)Environment->addGUIElement("string_attribute", 0);
+
+ if (n)
+ {
+ AttribList.push_back(n);
+ n->setParentID(getID());
+ n->grab();
+ }
+
+ // We can't set "this" as parent above as we need functionality
+ // of the overloaded addChild which isn't called in the constructor.
+ // (that's a general Irrlicht messup with too fat constructors)
+ addChild(n);
+
+ AttribList[i]->setSubElement(true);
+ AttribList[i]->setRelativePosition(r);
+ AttribList[i]->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ AttribList[i]->setAttrib(Attribs, i);
+ r += position2di(0, AttribList[i]->getRelativePosition().getHeight() + 5);
+ }
+}
+
+void CGUIAttributeEditor::updateAttribs()
+{
+ for (u32 i=0; iupdateAttrib(false);
+}
+
+} // namespace gui
+} // namespace irr
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.h
new file mode 100644
index 0000000..0bcdab5
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIAttributeEditor.h
@@ -0,0 +1,54 @@
+#ifndef __C_GUI_ATTRIBUTE_EDITOR_H_INCLUDED__
+#define __C_GUI_ATTRIBUTE_EDITOR_H_INCLUDED__
+
+#include "IGUIElement.h"
+#include "CGUIPanel.h"
+#include "irrArray.h"
+#include "IAttributes.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ class CGUIAttribute;
+
+
+ class CGUIAttributeEditor : public CGUIPanel
+ {
+ public:
+
+ //! constructor
+ CGUIAttributeEditor(IGUIEnvironment* environment, s32 id, IGUIElement *parent=0);
+
+ //! destructor
+ ~CGUIAttributeEditor();
+
+ // gets the current attributes list
+ virtual io::IAttributes* getAttribs();
+
+ // update the attribute list after making a change
+ void refreshAttribs();
+
+ // save the attributes
+ void updateAttribs();
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_ATTRIBUTEEDITOR];
+ }
+
+ private:
+
+ core::array AttribList; // attributes editing controls
+ io::IAttributes* Attribs; // current attributes
+ CGUIPanel* Panel;
+ };
+
+} // end namespace gui
+} // end namespace irr
+
+#endif // __C_GUI_ATTRIBUTE_EDITOR_H_INCLUDED__
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIBoolAttribute.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIBoolAttribute.h
new file mode 100644
index 0000000..b0521db
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIBoolAttribute.h
@@ -0,0 +1,68 @@
+#ifndef __C_GUI_BOOL_ATTRIBUTE_H_INCLUDED__
+#define __C_GUI_BOOL_ATTRIBUTE_H_INCLUDED__
+
+#include "CGUIAttribute.h"
+#include "IGUICheckBox.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ class CGUIBoolAttribute : public CGUIAttribute
+ {
+ public:
+ //
+ CGUIBoolAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) :
+ CGUIAttribute(environment, parent, myParentID), AttribCheckBox(0)
+ {
+
+ core::rect r = getAbsolutePosition();
+ core::rect r2(0, Environment->getSkin()->getFont()->getDimension(L"A").Height + 10,
+ r.getWidth() - 5,
+ Environment->getSkin()->getFont()->getDimension(L"A").Height*2 + 15 );
+
+ AttribCheckBox = environment->addCheckBox(false, r2, this);
+ AttribCheckBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ AttribCheckBox->setSubElement(true);
+ AttribCheckBox->grab();
+ }
+
+ virtual ~CGUIBoolAttribute()
+ {
+ if (AttribCheckBox)
+ AttribCheckBox->drop();
+ }
+
+ virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex)
+ {
+ AttribCheckBox->setChecked(attribs->getAttributeAsBool(attribIndex));
+ CGUIAttribute::setAttrib(attribs, attribIndex);
+ }
+
+ // save the attribute and possibly post the event to its parent
+ virtual bool updateAttrib(bool sendEvent=true)
+ {
+ if (!Attribs)
+ return true;
+
+ Attribs->setAttribute(Index, AttribCheckBox->isChecked());
+
+ return CGUIAttribute::updateAttrib(sendEvent);
+ }
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_BOOLATTRIBUTE];
+ }
+
+ private:
+ IGUICheckBox* AttribCheckBox;
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIColorAttribute.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIColorAttribute.h
new file mode 100644
index 0000000..e0c5212
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIColorAttribute.h
@@ -0,0 +1,179 @@
+#ifndef __C_GUI_COLOR_ATTRIBUTE_H_INCLUDED__
+#define __C_GUI_COLOR_ATTRIBUTE_H_INCLUDED__
+
+#include "CGUIAttribute.h"
+#include "IGUIStaticText.h"
+#include "IGUIScrollBar.h"
+#include "IGUITabControl.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+ class CGUIColorAttribute : public CGUIAttribute
+ {
+ public:
+ //
+ CGUIColorAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) :
+ CGUIAttribute(environment, parent, myParentID),
+ AttribSliderA(0), AttribSliderR(0), AttribSliderG(0), AttribSliderB(0),
+ AttribEditBox(0), AttribColor(0)
+ {
+ s32 fh = Environment->getSkin()->getFont()->getDimension(L"A").Height;
+
+ core::rect r0(getAbsolutePosition()),
+ r2(0, fh + 5, r0.getWidth() - 5, fh*2 + 10 ),
+ r3(r2),
+ r4(r2.getWidth() - 20, 3, r2.getWidth() - 3, r2.getHeight()-3);
+
+ AttribColor = Environment->addTab(r4, this, 0);
+ AttribColor->grab();
+ AttribColor->setDrawBackground(true);
+ AttribColor->setSubElement(true);
+ AttribColor->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+
+ s32 h=2;
+ r2 += core::position2di(0, h*4 + Environment->getSkin()->getSize(EGDS_WINDOW_BUTTON_WIDTH)*2);
+ r3.LowerRightCorner.Y = r3.UpperLeftCorner.Y + Environment->getSkin()->getSize(EGDS_WINDOW_BUTTON_WIDTH)/2;
+
+ AttribSliderA = environment->addScrollBar(true, r3, this, -1);
+ AttribSliderA->setMax(255);
+ AttribSliderA->grab();
+ AttribSliderA->setSubElement(true);
+ AttribSliderA->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ r3 += core::position2di(0, r3.getHeight()+h);
+ AttribSliderR = environment->addScrollBar(true, r3, this, -1);
+ AttribSliderR->setMax(255);
+ AttribSliderR->grab();
+ AttribSliderR->setSubElement(true);
+ AttribSliderR->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ r3 += core::position2di(0, r3.getHeight()+h);
+ AttribSliderG = environment->addScrollBar(true, r3, this, -1);
+ AttribSliderG->setMax(255);
+ AttribSliderG->grab();
+ AttribSliderG->setSubElement(true);
+ AttribSliderG->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ r3 += core::position2di(0, r3.getHeight()+h);
+ AttribSliderB = environment->addScrollBar(true, r3, this, -1);
+ AttribSliderB->setMax(255);
+ AttribSliderB->grab();
+ AttribSliderB->setSubElement(true);
+ AttribSliderB->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+
+ // add editbox
+ AttribEditBox = environment->addEditBox(
+ L"",
+ r2,
+ true, this, -1);
+ AttribEditBox->grab();
+ AttribEditBox->setSubElement(true);
+ AttribEditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ }
+
+ virtual ~CGUIColorAttribute()
+ {
+ if (AttribSliderA)
+ AttribSliderA->drop();
+ if (AttribSliderR)
+ AttribSliderR->drop();
+ if (AttribSliderG)
+ AttribSliderG->drop();
+ if (AttribSliderB)
+ AttribSliderB->drop();
+ if (AttribEditBox)
+ AttribEditBox->drop();
+ if (AttribColor)
+ AttribColor->drop();
+ }
+
+ virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex)
+ {
+ video::SColor col = attribs->getAttributeAsColor(attribIndex);
+
+ AttribSliderA->setPos(col.getAlpha());
+ AttribSliderR->setPos(col.getRed());
+ AttribSliderG->setPos(col.getGreen());
+ AttribSliderB->setPos(col.getBlue());
+ AttribEditBox->setText( attribs->getAttributeAsStringW(attribIndex).c_str() );
+ AttribColor->setBackgroundColor(col);
+
+ CGUIAttribute::setAttrib(attribs, attribIndex);
+ }
+
+ virtual bool OnEvent(const SEvent &e)
+ {
+ switch (e.EventType)
+ {
+
+ case EET_GUI_EVENT:
+ switch (e.GUIEvent.EventType)
+ {
+ case EGET_EDITBOX_ENTER:
+ case EGET_ELEMENT_FOCUS_LOST:
+ if (e.GUIEvent.Caller == AttribEditBox)
+ {
+ // update scrollbars from textbox
+ Attribs->setAttribute(Index, AttribEditBox->getText());
+ video::SColor col = Attribs->getAttributeAsColor(Index);
+ AttribSliderA->setPos(col.getAlpha());
+ AttribSliderR->setPos(col.getRed());
+ AttribSliderG->setPos(col.getGreen());
+ AttribSliderB->setPos(col.getBlue());
+ // update colour
+ AttribColor->setBackgroundColor(col);
+ }
+ break;
+ case EGET_SCROLL_BAR_CHANGED:
+ {
+ // update editbox from scrollbars
+ video::SColor col( AttribSliderA->getPos(), AttribSliderR->getPos(),
+ AttribSliderG->getPos(), AttribSliderB->getPos());
+
+ Attribs->setAttribute(Index, col);
+ AttribEditBox->setText( Attribs->getAttributeAsStringW(Index).c_str());
+ // update colour
+ AttribColor->setBackgroundColor(col);
+ }
+ return updateAttrib();
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return CGUIAttribute::OnEvent(e);
+ }
+
+ // save the attribute and possibly post the event to its parent
+ virtual bool updateAttrib(bool sendEvent=true)
+ {
+ if (!Attribs)
+ return true;
+
+ Attribs->setAttribute(Index, AttribEditBox->getText());
+ AttribEditBox->setText(Attribs->getAttributeAsStringW(Index).c_str());
+ return CGUIAttribute::updateAttrib(sendEvent);
+ }
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_COLORATTRIBUTE];
+ }
+
+ private:
+ IGUIScrollBar* AttribSliderA;
+ IGUIScrollBar* AttribSliderR;
+ IGUIScrollBar* AttribSliderG;
+ IGUIScrollBar* AttribSliderB;
+ IGUIEditBox* AttribEditBox;
+ IGUITab* AttribColor;
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIDummyEditorStub.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIDummyEditorStub.h
new file mode 100644
index 0000000..635501a
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIDummyEditorStub.h
@@ -0,0 +1,59 @@
+/*
+ This is a custom editor for stubbing problematic elements out,
+ for example elements which include modal screens
+*/
+
+#ifndef __C_GUI_DUMMY_EDITOR_STUB_H_INCLUDED__
+#define __C_GUI_DUMMY_EDITOR_STUB_H_INCLUDED__
+
+#include "IGUIElement.h"
+#include "IGUIEnvironment.h"
+#include "IGUIStaticText.h"
+
+namespace irr
+{
+
+namespace gui
+{
+ class CGUIDummyEditorStub : public IGUIElement
+ {
+ public:
+ //! constructor
+ CGUIDummyEditorStub(IGUIEnvironment* environment, IGUIElement *parent, const char *text) :
+ IGUIElement(EGUIET_ELEMENT, environment, parent, -1, core::rect(0, 0, 100, 100) ),
+ TextBox(0), TypeName(text)
+ {
+
+ #ifdef _DEBUG
+ setDebugName("CGUIDummyEditorStub");
+ #endif
+
+ core::dimension2du d = Environment->getSkin()->getFont()->getDimension(L"A");
+ s32 h = d.Height / 2;
+ s32 w = d.Width / 2;
+
+ TextBox = environment->addStaticText(core::stringw(text).c_str(),
+ core::rect(50-w, 50-h, 50+w, 50+h),
+ false, false, this, -1, false);
+ TextBox->grab();
+ TextBox->setSubElement(true);
+ TextBox->setAlignment(EGUIA_CENTER, EGUIA_CENTER, EGUIA_CENTER, EGUIA_CENTER);
+ }
+
+ virtual ~CGUIDummyEditorStub()
+ {
+ if (TextBox)
+ TextBox->drop();
+ }
+ virtual const c8* getTypeName() const { return TypeName.c_str(); }
+
+ protected:
+ IGUIStaticText* TextBox;
+ core::stringc TypeName;
+
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditFactory.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditFactory.cpp
new file mode 100644
index 0000000..9552745
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditFactory.cpp
@@ -0,0 +1,120 @@
+#include "CGUIEditFactory.h"
+#include "IGUIEnvironment.h"
+#include "irrString.h"
+
+#include "EGUIEditTypes.h"
+
+#include "CGUIEditWorkspace.h"
+#include "CGUIEditWindow.h"
+#include "CGUIPanel.h"
+#include "CGUITextureCacheBrowser.h"
+#include "CGUIAttributeEditor.h"
+#include "CGUIStringAttribute.h"
+#include "CGUIBoolAttribute.h"
+#include "CGUIEnumAttribute.h"
+#include "CGUIColorAttribute.h"
+#include "CGUITextureAttribute.h"
+#include "CGUIDummyEditorStub.h"
+
+namespace irr
+{
+namespace gui
+{
+
+CGUIEditFactory::CGUIEditFactory(IGUIEnvironment* env)
+: Environment(env)
+{
+ #ifdef _DEBUG
+ setDebugName("CGUIEditFactory");
+ #endif
+
+ // don't grab the gui environment here to prevent cyclic references
+}
+
+
+CGUIEditFactory::~CGUIEditFactory()
+{
+}
+
+
+//! adds an element to the environment based on its type name
+IGUIElement* CGUIEditFactory::addGUIElement(const c8* typeName, IGUIElement* parent)
+{
+ /*
+ here we create elements, add them to the manager, and then drop them
+ */
+
+ core::stringc elementType(typeName);
+ IGUIElement* ret=0;
+ if (!parent)
+ parent = Environment->getRootGUIElement();
+
+ // editor workspace
+ if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_GUIEDIT]))
+ ret = new CGUIEditWorkspace(Environment, -1, 0);
+ // editor window
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_GUIEDITWINDOW]))
+ ret = new CGUIEditWindow(Environment, core::rect(0,0,100,100), 0);
+ // Klasker's GUI Panel
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_GUIPANEL]))
+ ret = new CGUIPanel(Environment, 0);
+ // texture cache browser
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_TEXTUREBROWSER]))
+ ret = new CGUITextureCacheBrowser(Environment, -1, 0);
+ // block of attribute editors
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_ATTRIBUTEEDITOR]))
+ ret = new CGUIAttributeEditor(Environment, -1, 0);
+ //! single attribute editors
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_STRINGATTRIBUTE]))
+ ret = new CGUIStringAttribute(Environment, 0, -1);
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_BOOLATTRIBUTE]))
+ ret = new CGUIBoolAttribute(Environment, 0, -1);
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_ENUMATTRIBUTE]))
+ ret = new CGUIEnumAttribute(Environment, 0, -1);
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_COLORATTRIBUTE]))
+ ret = new CGUIColorAttribute(Environment, 0, -1);
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_COLORFATTRIBUTE]))
+ ret = new CGUIColorAttribute(Environment, 0, -1);
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_TEXTUREATTRIBUTE]))
+ ret = new CGUITextureAttribute(Environment, 0, -1);
+ // stubs and custom editors
+ else if (elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_CONTEXTMENUEDITOR]) ||
+ elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_MENUEDITOR]) ||
+ elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_FILEDIALOGEDITOR]) ||
+ elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_COLORDIALOGEDITOR]) ||
+ elementType == core::stringc(GUIEditElementTypeNames[EGUIEDIT_MODALSCREENEDITOR]) )
+ ret = new CGUIDummyEditorStub(Environment, 0, typeName);
+
+ // add the element to its parent
+ if (ret)
+ parent->addChild(ret);
+
+ // the environment now has the reference, so we can drop the element
+ if (ret)
+ ret->drop();
+
+ return ret;
+}
+
+
+//! returns amount of element types this factory is able to create
+s32 CGUIEditFactory::getCreatableGUIElementTypeCount() const
+{
+ return EGUIEDIT_COUNT;
+}
+
+
+//! returns type name of a createable element type
+const c8* CGUIEditFactory::getCreateableGUIElementTypeName(s32 idx) const
+{
+ if (idx>=0 && idx rectangle, IGUIElement *parent)
+ : IGUIWindow(environment, parent, -1, rectangle),
+ Dragging(false), IsDraggable(true), Resizing(false), SelectedElement(0),
+ AttribEditor(0), OptionEditor(0), EnvEditor(0)
+{
+ #ifdef _DEBUG
+ setDebugName("CGUIEditWindow");
+ #endif
+
+ // we can't tab out of this window
+ setTabGroup(true);
+ // we can ctrl+tab to it
+ setTabStop(true);
+ // the tab order number is auto-assigned
+ setTabOrder(-1);
+
+ // set window text
+ setText(L"GUI Editor");
+
+ // return if we have no skin.
+ IGUISkin *skin = environment->getSkin();
+ if (!skin)
+ return;
+
+ s32 th = skin->getSize(EGDS_WINDOW_BUTTON_WIDTH);
+
+ setRelativePosition(core::rect(50,50,250,500));
+ setMinSize(core::dimension2du(200,200));
+
+ IGUITabControl *TabControl = environment->addTabControl(core::rect(1,th+5,199,449), this, false, true);
+ TabControl->setSubElement(true);
+ TabControl->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+
+ TabControl->addTab(L"Tools");
+ //L"Texture Cache Browser"
+ //L"Font Browser"
+ //L"Font Generator"
+ //L"Sprite Editor"
+ //Environment->addGUIElement("textureCacheBrowser", this);
+
+ IGUITab* EditorTab = TabControl->addTab(L"Editor");
+ OptionEditor = (CGUIAttributeEditor*) environment->addGUIElement("attributeEditor", EditorTab);
+ OptionEditor->grab();
+ OptionEditor->setID(EGUIEDCE_OPTION_EDITOR);
+ OptionEditor->setRelativePositionProportional(core::rect(0.0f, 0.0f, 1.0f, 1.0f));
+ OptionEditor->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+
+ if (Parent && Parent->getParent() == Environment->getRootGUIElement())
+ {
+ IGUITab* EnvTab = TabControl->addTab(L"Env");
+ EnvEditor = (CGUIAttributeEditor*) environment->addGUIElement("attributeEditor", EnvTab);
+ EnvEditor->grab();
+ EnvEditor->setID(EGUIEDCE_ENV_EDITOR);
+ EnvEditor->setRelativePositionProportional(core::rect(0.0f, 0.0f, 1.0f, 1.0f));
+ EnvEditor->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+ }
+ IGUITab* ElementTab = TabControl->addTab(L"Element");
+
+ AttribEditor = (CGUIAttributeEditor*) environment->addGUIElement("attributeEditor", ElementTab);
+ AttribEditor->grab();
+ AttribEditor->setID(EGUIEDCE_ATTRIB_EDITOR);
+ AttribEditor->setRelativePositionProportional(core::rect(0.0f, 0.0f, 1.0f, 1.0f));
+ AttribEditor->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+
+ IGUITab* TreeTab = TabControl->addTab(L"Tree");
+ TreeView = environment->addTreeView(core::rect(0,0,0,0), TreeTab);
+ TreeView->setRelativePositionProportional(core::rect(0.0f, 0.0f, 1.0f, 1.0f));
+ TreeView->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+ IGUITreeViewNode* treenode = TreeView->getRoot();
+ //treenode->addChildFront(L"Elements");
+ ResizeButton = environment->addButton(core::rect(199-th,449-th,199,449), this);
+ ResizeButton->setDrawBorder(false);
+ ResizeButton->setEnabled(false);
+ ResizeButton->setSpriteBank(skin->getSpriteBank());
+ ResizeButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_RESIZE), skin->getColor(EGDC_WINDOW_SYMBOL));
+ ResizeButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_RESIZE), skin->getColor(EGDC_WINDOW_SYMBOL));
+ ResizeButton->grab();
+ ResizeButton->setSubElement(true);
+ ResizeButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT);
+ updateTree();
+}
+
+
+//! destructor
+CGUIEditWindow::~CGUIEditWindow()
+{
+ // drop everything
+ if (AttribEditor)
+ AttribEditor->drop();
+ if (EnvEditor)
+ EnvEditor->drop();
+ if (OptionEditor)
+ OptionEditor->drop();
+ if (ResizeButton)
+ ResizeButton->drop();
+}
+
+IGUITreeView* CGUIEditWindow::getTreeView() const
+{
+ return TreeView;
+}
+CGUIAttributeEditor* CGUIEditWindow::getEnvironmentEditor() const
+{
+ return EnvEditor;
+}
+
+CGUIAttributeEditor* CGUIEditWindow::getAttributeEditor() const
+{
+ return AttribEditor;
+}
+
+CGUIAttributeEditor* CGUIEditWindow::getOptionEditor() const
+{
+ return OptionEditor;
+}
+
+IGUITreeViewNode* CGUIEditWindow::getTreeNode(IGUIElement* element, IGUITreeViewNode* searchnode)
+{
+ IGUITreeViewNode* child = searchnode->getFirstChild();
+ while (child)
+ {
+ if (((IGUIElement*) child->getData()) == element)
+ return child;
+
+ if (child->hasChildren())
+ {
+ IGUITreeViewNode* foundnode = getTreeNode(element, child);
+ if (foundnode)
+ return foundnode;
+ }
+ child = child->getNextSibling();
+ }
+ return 0;
+}
+
+void CGUIEditWindow::addChildrenToTree(IGUIElement* parentElement, IGUITreeViewNode* treenode)
+{
+ core::stringw name = core::stringw(parentElement->getTypeName());
+ if (parentElement->getID() != -1)
+ name += core::stringw(L" [") + core::stringw(parentElement->getID()) + core::stringw(L"]");
+
+ IGUITreeViewNode* newnode = treenode->addChildBack(name.c_str());
+ newnode->setData((void*)parentElement);
+ core::list children = parentElement->getChildren();
+
+ for (core::list::Iterator i = children.begin(); i != children.end(); i++ )
+ {
+ if(core::stringc((*i)->getTypeName()) != "GUIEditor" && !(*i)->isSubElement())
+ addChildrenToTree(*i, newnode);
+ }
+}
+
+void CGUIEditWindow::updateTree()
+{
+ TreeView->getRoot()->clearChildren();
+ IGUIElement* root = Environment->getRootGUIElement();
+ addChildrenToTree(root, TreeView->getRoot());
+ TreeView->getRoot()->getFirstChild()->setExpanded(true);
+}
+
+void CGUIEditWindow::setSelectedElement(IGUIElement *sel)
+{
+ // save changes
+ AttribEditor->updateAttribs();
+ IGUITreeViewNode* elementTreeNode = getTreeNode(sel, TreeView->getRoot());
+
+ if (elementTreeNode)
+ {
+ elementTreeNode->setSelected(true);
+ while (elementTreeNode)
+ {
+ elementTreeNode->setExpanded(true);
+ elementTreeNode = elementTreeNode->getParent();
+ }
+ }
+
+ io::IAttributes* Attribs = AttribEditor->getAttribs();
+
+ if (SelectedElement && sel != SelectedElement)
+ {
+ // deserialize attributes
+ SelectedElement->deserializeAttributes(Attribs);
+ }
+ // clear the attributes list
+ Attribs->clear();
+ SelectedElement = sel;
+
+ // get the new attributes
+ if (SelectedElement)
+ SelectedElement->serializeAttributes(Attribs);
+
+ AttribEditor->refreshAttribs();
+}
+
+//! draws the element and its children.
+//! same code as for a window
+void CGUIEditWindow::draw()
+{
+ if (!IsVisible)
+ return;
+
+ IGUISkin* skin = Environment->getSkin();
+
+ core::rect rect = AbsoluteRect;
+
+ // draw body fast
+ rect = skin->draw3DWindowBackground(this, true, skin->getColor(EGDC_ACTIVE_BORDER),
+ AbsoluteRect, &AbsoluteClippingRect);
+
+ if (Text.size())
+ {
+ rect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
+ rect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y);
+ rect.LowerRightCorner.X -= skin->getSize(EGDS_WINDOW_BUTTON_WIDTH) + 5;
+
+ IGUIFont* font = skin->getFont();
+ if (font)
+ font->draw(Text.c_str(), rect, skin->getColor(EGDC_ACTIVE_CAPTION), false, true, &AbsoluteClippingRect);
+ }
+
+ IGUIElement::draw();
+}
+
+
+//! called if an event happened.
+bool CGUIEditWindow::OnEvent(const SEvent &event)
+{
+ switch(event.EventType)
+ {
+ case EET_GUI_EVENT:
+ switch(event.GUIEvent.EventType)
+ {
+ case EGET_ELEMENT_FOCUS_LOST:
+ if (event.GUIEvent.Caller == this ||
+ event.GUIEvent.Caller == ResizeButton)
+ {
+ Dragging = false;
+ Resizing = false;
+ }
+ break;
+ default:
+ break;
+ }
+
+ break;
+ case EET_MOUSE_INPUT_EVENT:
+ switch(event.MouseInput.Event)
+ {
+ case EMIE_LMOUSE_PRESSED_DOWN:
+ {
+ DragStart.X = event.MouseInput.X;
+ DragStart.Y = event.MouseInput.Y;
+
+ IGUIElement* clickedElement = getElementFromPoint(DragStart);
+
+ if (clickedElement == this)
+ {
+ Dragging = IsDraggable;
+ //Environment->setFocus(this);
+ if (Parent)
+ Parent->bringToFront(this);
+ return true;
+ }
+ else if (clickedElement == ResizeButton)
+ {
+ Resizing = true;
+ //Environment->setFocus(this);
+ if (Parent)
+ Parent->bringToFront(this);
+ return true;
+ }
+ break;
+ }
+ case EMIE_LMOUSE_LEFT_UP:
+ if (Dragging || Resizing)
+ {
+ Dragging = false;
+ Resizing = false;
+ return true;
+ }
+ break;
+ case EMIE_MOUSE_MOVED:
+ if (Dragging || Resizing)
+ {
+ // gui window should not be dragged outside of its parent
+ if (Parent)
+ if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
+ event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
+ event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
+ event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
+
+ return true;
+ core::position2di diff(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y);
+ if (Dragging)
+ {
+ move(diff);
+ DragStart.X = event.MouseInput.X;
+ DragStart.Y = event.MouseInput.Y;
+ }
+ else if (Resizing)
+ {
+ core::position2di dp = RelativeRect.LowerRightCorner + diff;
+ setRelativePosition(core::rect(RelativeRect.UpperLeftCorner, dp));
+ DragStart += dp - RelativeRect.LowerRightCorner + diff;
+ }
+
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+
+ return Parent ? Parent->OnEvent(event) : false;
+}
+
+bool CGUIEditWindow::isDraggable() const
+{
+ return IsDraggable;
+}
+
+void CGUIEditWindow::setDraggable(bool draggable)
+{
+ IsDraggable = draggable;
+
+ if (Dragging && !IsDraggable)
+ Dragging = false;
+}
+
+
+// we're supposed to supply these if we're creating an IGUIWindow
+// but we don't need them so we'll just return null
+
+//! Returns the rectangle of the drawable area (without border, without titlebar and without scrollbars)
+core::rect CGUIEditWindow::getClientRect() const {return core::recti();}
+IGUIButton* CGUIEditWindow::getCloseButton() const {return 0;}
+IGUIButton* CGUIEditWindow::getMinimizeButton() const {return 0;}
+IGUIButton* CGUIEditWindow::getMaximizeButton() const {return 0;}
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWindow.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWindow.h
new file mode 100644
index 0000000..4b1d72f
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWindow.h
@@ -0,0 +1,88 @@
+#ifndef __C_GUI_EDITOR_H_INCLUDED__
+#define __C_GUI_EDITOR_H_INCLUDED__
+
+
+#include "IGUIWindow.h"
+#include "CGUIAttributeEditor.h"
+//#include "IGUIStaticText.h"
+#include "IGUIButton.h"
+#include "IGUITreeView.h"
+#include "irrArray.h"
+#include "IAttributes.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+ class CGUIEditWindow : public IGUIWindow
+ {
+ public:
+
+ //! constructor
+ CGUIEditWindow(IGUIEnvironment* environment, core::rect rectangle, IGUIElement *parent);
+
+ //! destructor
+ ~CGUIEditWindow();
+
+ //! this part draws the window
+ virtual void draw();
+ //! handles events
+ virtual bool OnEvent(const SEvent &event);
+
+ //! change selection
+ virtual void setSelectedElement(IGUIElement *sel);
+
+ //! get draggable
+ virtual bool isDraggable() const;
+
+ //! get draggable
+ virtual void setDraggable(bool draggable);
+
+ // not used
+ virtual core::rect getClientRect() const;
+ virtual IGUIButton* getCloseButton() const;
+ virtual IGUIButton* getMinimizeButton() const;
+ virtual IGUIButton* getMaximizeButton() const;
+ virtual void setDrawBackground(bool draw) { }
+ virtual bool getDrawBackground() const { return true; }
+ virtual void setDrawTitlebar(bool draw) { }
+ virtual bool getDrawTitlebar() const { return true; }
+
+ IGUITreeView* getTreeView() const;
+ CGUIAttributeEditor* getAttributeEditor() const;
+ CGUIAttributeEditor* getOptionEditor() const;
+ CGUIAttributeEditor* getEnvironmentEditor() const;
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_GUIEDITWINDOW];
+ }
+
+ void updateTree();
+ private:
+
+ void addChildrenToTree(IGUIElement* parentElement, IGUITreeViewNode* treenode);
+ IGUITreeViewNode* getTreeNode(IGUIElement* element, IGUITreeViewNode* searchnode);
+ // for dragging the window
+ bool Dragging;
+ bool IsDraggable;
+ bool Resizing;
+ core::position2d DragStart;
+
+ IGUIElement* SelectedElement; // current selected element
+
+ CGUIAttributeEditor* AttribEditor; // edits the current attribute
+ CGUIAttributeEditor* OptionEditor; // edits the options for the window
+ CGUIAttributeEditor* EnvEditor; // edits attributes for the environment
+ IGUITreeView* TreeView; // tree view of all elements in scene
+ IGUIButton* ResizeButton;
+
+ };
+
+} // end namespace gui
+} // end namespace irr
+
+#endif // __C_GUI_EDITOR_H_INCLUDED__
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.cpp
new file mode 100644
index 0000000..a45e5d3
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.cpp
@@ -0,0 +1,927 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt / Gaz Davidson
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+// Thanks to Midnight for all his testing, bug fixes and patches :)
+
+#include "CGUIEditWorkspace.h"
+#include "IGUIEnvironment.h"
+#include "IVideoDriver.h"
+#include "IOSOperator.h"
+#include "IReadFile.h"
+#include "IFileSystem.h"
+#include "IXMLWriter.h"
+#include "IGUISkin.h"
+#include "IGUIElementFactory.h"
+#include "CGUIEditWindow.h"
+#include "IGUIContextMenu.h"
+#include "IGUIFileOpenDialog.h"
+#include "IGUITreeView.h"
+#include "CGUIAttribute.h"
+#include "CMemoryReadWriteFile.h"
+
+namespace irr
+{
+namespace gui
+{
+
+//! constructor
+CGUIEditWorkspace::CGUIEditWorkspace(IGUIEnvironment* environment, s32 id, IGUIElement *parent)
+: IGUIElement(EGUIET_ELEMENT, environment, parent ? parent : environment->getRootGUIElement(), id, environment->getRootGUIElement()->getAbsolutePosition()),
+ CurrentMode(EGUIEDM_SELECT), MouseOverMode(EGUIEDM_SELECT),
+ GridSize(10,10), MenuCommandStart(0x3D17), DrawGrid(false), UseGrid(true),
+ MouseOverElement(0), SelectedElement(0), EditorWindow(0)
+{
+ #ifdef _DEBUG
+ setDebugName("CGUIEditWorkspace");
+ #endif
+
+ // this element is never saved.
+ setSubElement(true);
+
+ // it resizes to fit a resizing window
+ setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+
+ EditorWindow = (CGUIEditWindow*) Environment->addGUIElement("GUIEditWindow", this);
+ if (EditorWindow)
+ {
+ EditorWindow->grab();
+ EditorWindow->setSubElement(true);
+
+ Environment->setFocus(EditorWindow);
+ serializeAttributes(EditorWindow->getOptionEditor()->getAttribs());
+ EditorWindow->getOptionEditor()->refreshAttribs();
+
+ if (EditorWindow->getEnvironmentEditor())
+ {
+ Environment->serializeAttributes(EditorWindow->getEnvironmentEditor()->getAttribs());
+ EditorWindow->getEnvironmentEditor()->refreshAttribs();
+ }
+ }
+}
+
+
+//! destructor
+CGUIEditWorkspace::~CGUIEditWorkspace()
+{
+ if (EditorWindow)
+ EditorWindow->drop();
+}
+
+
+void CGUIEditWorkspace::setMenuCommandIDStart(s32 id)
+{
+ MenuCommandStart = id;
+}
+
+CGUIEditWorkspace::EGUIEDIT_MODE CGUIEditWorkspace::getModeFromPos(core::position2di p)
+{
+ if (SelectedElement)
+ {
+ core::rect r = SelectedElement->getAbsolutePosition();
+
+ if (TLRect.isPointInside(p))
+ return EGUIEDM_RESIZE_TL;
+
+ else if (TRRect.isPointInside(p))
+ return EGUIEDM_RESIZE_TR;
+
+ else if (BLRect.isPointInside(p) )
+ return EGUIEDM_RESIZE_BL;
+
+ else if (BRRect.isPointInside(p))
+ return EGUIEDM_RESIZE_BR;
+
+ else if (TopRect.isPointInside(p))
+ return EGUIEDM_RESIZE_T;
+
+ else if (BRect.isPointInside(p))
+ return EGUIEDM_RESIZE_B;
+
+ else if (LRect.isPointInside(p))
+ return EGUIEDM_RESIZE_L;
+
+ else if (RRect.isPointInside(p))
+ return EGUIEDM_RESIZE_R;
+
+ else if (getEditableElementFromPoint(SelectedElement, p) == SelectedElement)
+ return EGUIEDM_MOVE;
+
+ else
+ return EGUIEDM_SELECT;
+ }
+
+ return EGUIEDM_SELECT;
+
+}
+
+IGUIElement* CGUIEditWorkspace::getEditableElementFromPoint(IGUIElement *start, const core::position2di &point, s32 index )
+{
+ IGUIElement* target = 0;
+
+ // we have to search from back to front.
+
+ core::list::ConstIterator it = start->getChildren().getLast();
+ s32 count=0;
+ while(it != start->getChildren().end())
+ {
+ target = getEditableElementFromPoint((*it),point);
+ if (target)
+ {
+ if (!target->isSubElement() && !isMyChild(target) && target != this)
+ {
+ if (index == count)
+ return target;
+ else
+ count++;
+ }
+ else
+ target = 0;
+ }
+ --it;
+ }
+
+ if (start->getAbsolutePosition().isPointInside(point))
+ target = start;
+
+ return target;
+}
+
+void CGUIEditWorkspace::setSelectedElement(IGUIElement *sel)
+{
+ IGUIElement* focus = Environment->getFocus();
+ // we only give focus back to children
+ if (!isMyChild(focus))
+ focus = 0;
+
+ if (SelectedElement != Parent)
+ {
+ if (SelectedElement != sel && EditorWindow)
+ {
+ EditorWindow->setSelectedElement(sel);
+ SelectedElement = sel;
+ }
+ }
+ else
+ SelectedElement = 0;
+
+ if (focus)
+ Environment->setFocus(focus);
+ else
+ Environment->setFocus(this);
+}
+
+IGUIElement* CGUIEditWorkspace::getSelectedElement()
+{
+ return SelectedElement;
+}
+void CGUIEditWorkspace::selectNextSibling()
+{
+ IGUIElement* p=0;
+
+ if (SelectedElement && SelectedElement->getParent())
+ p = SelectedElement->getParent();
+ else
+ p = Parent;
+
+ core::list::ConstIterator it = p->getChildren().begin();
+ // find selected element
+ if (SelectedElement)
+ while (*it != SelectedElement)
+ ++it;
+ if (it !=p->getChildren().end())
+ ++it;
+ // find next non sub-element
+ while (it != p->getChildren().end() && (*it)->isSubElement())
+ ++it;
+
+ if (it != p->getChildren().end())
+ setSelectedElement(*it);
+}
+void CGUIEditWorkspace::selectPreviousSibling()
+{
+ IGUIElement* p=0;
+
+ if (SelectedElement && SelectedElement->getParent())
+ p = SelectedElement->getParent();
+ else
+ p = Parent;
+
+ core::list::ConstIterator it = p->getChildren().getLast();
+ // find selected element
+ if (SelectedElement)
+ while (*it != SelectedElement)
+ --it;
+ if (it != p->getChildren().end())
+ --it;
+ // find next non sub-element
+ while (it != p->getChildren().end() && (*it)->isSubElement())
+ --it;
+
+ if (it != p->getChildren().end())
+ setSelectedElement(*it);
+}
+
+//! called if an event happened.
+bool CGUIEditWorkspace::OnEvent(const SEvent &e)
+{
+ IGUIFileOpenDialog* dialog=0;
+ switch(e.EventType)
+ {
+ case ATTRIBEDIT_ATTRIB_CHANGED:
+ {
+ switch (e.UserEvent.UserData1)
+ {
+ case EGUIEDCE_ATTRIB_EDITOR:
+ {
+ // update selected items attributes
+ if (SelectedElement)
+ {
+ SelectedElement->deserializeAttributes(EditorWindow->getAttributeEditor()->getAttribs());
+ EditorWindow->updateTree();
+ }
+ return true;
+ }
+ case EGUIEDCE_OPTION_EDITOR:
+ {
+ // update editor options
+ deserializeAttributes(EditorWindow->getOptionEditor()->getAttribs());
+ return true;
+ }
+ case EGUIEDCE_ENV_EDITOR:
+ {
+ // update environment
+ Environment->deserializeAttributes(EditorWindow->getEnvironmentEditor()->getAttribs());
+ return true;
+ }
+ }
+ }
+ break;
+
+ case EET_KEY_INPUT_EVENT:
+ if (!e.KeyInput.PressedDown)
+ {
+ switch (e.KeyInput.Key)
+ {
+ case KEY_DELETE:
+ if (SelectedElement)
+ {
+ IGUIElement* el = SelectedElement;
+ setSelectedElement(0);
+ MouseOverElement = 0;
+ el->remove();
+ EditorWindow->updateTree();
+ }
+ break;
+ case KEY_KEY_X:
+ if (e.KeyInput.Control && SelectedElement)
+ {
+ // cut
+ CopySelectedElementXML();
+ // delete element
+ IGUIElement *el = SelectedElement;
+ setSelectedElement(0);
+ MouseOverElement = 0;
+ el->remove();
+ }
+ break;
+ case KEY_KEY_C:
+ // copy
+ if (e.KeyInput.Control && SelectedElement)
+ {
+ CopySelectedElementXML();
+ }
+ break;
+ case KEY_KEY_V:
+ // paste
+ if (e.KeyInput.Control)
+ {
+ PasteXMLToSelectedElement();
+ }
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+ break;
+
+ case EET_MOUSE_INPUT_EVENT:
+
+ switch(e.MouseInput.Event)
+ {
+ case EMIE_MOUSE_WHEEL:
+ {
+ f32 wheel = e.MouseInput.Wheel;
+
+ if (wheel > 0)
+ selectPreviousSibling();
+ else
+ selectNextSibling();
+ }
+ break;
+ case EMIE_LMOUSE_PRESSED_DOWN:
+ {
+ core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
+
+ IGUIElement* newSelection = getElementFromPoint(p);
+
+ if (newSelection != this && isMyChild(newSelection) ) // redirect event
+ {
+ Environment->setFocus(newSelection);
+ return true;
+ }
+
+ // hide the gui editor
+ if (EditorWindow)
+ EditorWindow->setVisible(false);
+
+ if (CurrentMode == EGUIEDM_SELECT)
+ {
+ if (SelectedElement)
+ {
+ // start moving or dragging
+ CurrentMode = getModeFromPos(p);
+
+ if (CurrentMode == EGUIEDM_MOVE)
+ StartMovePos = SelectedElement->getAbsolutePosition().UpperLeftCorner;
+
+ DragStart = p;
+ SelectedArea = SelectedElement->getAbsolutePosition();
+ }
+
+ if (CurrentMode < EGUIEDM_MOVE)
+ {
+ // selecting an element...
+ MouseOverElement = getEditableElementFromPoint(Parent, p);
+
+ if (MouseOverElement == Parent)
+ MouseOverElement = 0;
+
+ setSelectedElement(MouseOverElement);
+ }
+ }
+
+ break;
+ }
+ case EMIE_RMOUSE_PRESSED_DOWN:
+ if (CurrentMode == EGUIEDM_SELECT_NEW_PARENT || CurrentMode >= EGUIEDM_MOVE)
+ {
+ // cancel dragging
+ CurrentMode = EGUIEDM_SELECT;
+ }
+ else
+ {
+ DragStart = core::position2di(e.MouseInput.X,e.MouseInput.Y);
+ // root menu
+ IGUIContextMenu* mnu = Environment->addContextMenu(
+ core::rect(e.MouseInput.X, e.MouseInput.Y, e.MouseInput.Y+100, e.MouseInput.Y+100),this);
+ mnu->addItem(L"File",-1,true,true);
+ mnu->addItem(L"Edit",-1,true,true);
+ mnu->addItem(L"View",-1,true,true);
+ mnu->addItem(SelectedElement ? L"Add child" : L"Add" ,-1,true,true);
+
+ // file menu
+ IGUIContextMenu* sub = mnu->getSubMenu(0);
+ IGUIContextMenu* sub2 =0;
+
+ sub->addItem(L"New", MenuCommandStart + EGUIEDMC_FILE_NEW );
+ sub->addItem(L"Load...",MenuCommandStart + EGUIEDMC_FILE_LOAD);
+ sub->addItem(L"Save...",MenuCommandStart + EGUIEDMC_FILE_SAVE);
+
+ // edit menu
+ sub = mnu->getSubMenu(1);
+ sub->addItem(L"Cut (ctrl+x)", MenuCommandStart + EGUIEDMC_CUT_ELEMENT, (SelectedElement != 0));
+ sub->addItem(L"Copy (ctrl+c)", MenuCommandStart + EGUIEDMC_COPY_ELEMENT, (SelectedElement != 0));
+ sub->addItem(L"Paste (ctrl+v)", MenuCommandStart + EGUIEDMC_PASTE_ELEMENT,
+ (core::stringc(Environment->getOSOperator()->getTextFromClipboard()) != ""));
+ sub->addItem(L"Delete (del)", MenuCommandStart + EGUIEDMC_DELETE_ELEMENT, (SelectedElement != 0));
+ sub->addSeparator();
+ sub->addItem(L"Set parent", MenuCommandStart + EGUIEDMC_SET_PARENT, (SelectedElement != 0));
+ sub->addItem(L"Bring to front", MenuCommandStart + EGUIEDMC_BRING_TO_FRONT, (SelectedElement != 0));
+ sub->addSeparator();
+ sub->addItem(L"Save to XML...", MenuCommandStart + EGUIEDMC_SAVE_ELEMENT, (SelectedElement != 0));
+
+ sub = mnu->getSubMenu(2);
+ // view menu
+ if (EditorWindow)
+ sub->addItem(EditorWindow->isVisible() ? L"Hide window" : L"Show window", MenuCommandStart + EGUIEDMC_TOGGLE_EDITOR);
+
+ sub = mnu->getSubMenu(3);
+
+ s32 i,j,c=0;
+ sub->addItem(L"Default factory",-1,true, true);
+
+ // add elements from each factory
+ for (i=0; u32(i) < Environment->getRegisteredGUIElementFactoryCount(); ++i)
+ {
+ sub2 = sub->getSubMenu(i);
+
+ IGUIElementFactory *f = Environment->getGUIElementFactory(i);
+
+ for (j=0; j< f->getCreatableGUIElementTypeCount(); ++j)
+ {
+ sub2->addItem(core::stringw(f->getCreateableGUIElementTypeName(j)).c_str(), MenuCommandStart + EGUIEDMC_COUNT + c);
+ c++;
+ }
+
+ if (u32(i+1) < Environment->getRegisteredGUIElementFactoryCount())
+ {
+ core::stringw strFact;
+ strFact = L"Factory ";
+ strFact += i+1;
+ sub->addItem(strFact.c_str(),-1, true, true);
+ }
+ }
+ sub->addSeparator();
+ sub->addItem(L"From XML...", MenuCommandStart + EGUIEDMC_INSERT_XML);
+
+ // set focus to menu
+ Environment->setFocus(mnu);
+
+ }
+ break;
+ case EMIE_LMOUSE_LEFT_UP:
+
+ // make window visible again
+ if (EditorWindow)
+ EditorWindow->setVisible(true);
+ if (CurrentMode == EGUIEDM_SELECT_NEW_PARENT)
+ {
+ if (SelectedElement)
+ {
+ MouseOverElement = getEditableElementFromPoint(Parent,
+ core::position2di(e.MouseInput.X,e.MouseInput.Y));
+ if (MouseOverElement)
+ {
+ MouseOverElement->addChild(SelectedElement);
+ setSelectedElement(0);
+ setSelectedElement(SelectedElement);
+ }
+ }
+ CurrentMode = EGUIEDM_SELECT;
+ }
+ else if (CurrentMode >= EGUIEDM_MOVE)
+ {
+ IGUIElement *sel = SelectedElement;
+ // unselect
+ setSelectedElement(0);
+
+ // move
+ core::position2d p(0,0);
+ if (sel->getParent())
+ p = sel->getParent()->getAbsolutePosition().UpperLeftCorner;
+
+ sel->setRelativePosition(SelectedArea - p);
+
+ // select
+ setSelectedElement(sel);
+
+ // reset selection mode...
+ CurrentMode = EGUIEDM_SELECT;
+ }
+ break;
+ case EMIE_MOUSE_MOVED:
+ // always on top
+ Parent->bringToFront(this);
+
+ // if selecting
+ if (CurrentMode == EGUIEDM_SELECT || CurrentMode == EGUIEDM_SELECT_NEW_PARENT)
+ {
+
+ core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
+
+ // highlight the element that the mouse is over
+ MouseOverElement = getEditableElementFromPoint(Parent, p);
+ if (MouseOverElement == Parent)
+ {
+ MouseOverElement = 0;
+ }
+
+ if (CurrentMode == EGUIEDM_SELECT)
+ {
+ MouseOverMode = getModeFromPos(p);
+ if (MouseOverMode > EGUIEDM_MOVE)
+ {
+ MouseOverElement = SelectedElement;
+ }
+ }
+ }
+ else if (CurrentMode == EGUIEDM_MOVE)
+ {
+ // get difference
+ core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
+ p -= DragStart;
+
+ // apply to top corner
+ p = StartMovePos + p;
+ if (UseGrid)
+ {
+ p.X = (p.X/GridSize.Width)*GridSize.Width;
+ p.Y = (p.Y/GridSize.Height)*GridSize.Height;
+ }
+
+ SelectedArea += p - SelectedArea.UpperLeftCorner;
+ }
+ else if (CurrentMode > EGUIEDM_MOVE)
+ {
+ // get difference from start position
+ core::position2di p = core::position2di(e.MouseInput.X,e.MouseInput.Y);
+ if (UseGrid)
+ {
+ p.X = (p.X/GridSize.Width)*GridSize.Width;
+ p.Y = (p.Y/GridSize.Height)*GridSize.Height;
+ }
+
+ switch(CurrentMode)
+ {
+ case EGUIEDM_RESIZE_T:
+ SelectedArea.UpperLeftCorner.Y = p.Y;
+ break;
+ case EGUIEDM_RESIZE_B:
+ SelectedArea.LowerRightCorner.Y = p.Y;
+ break;
+ case EGUIEDM_RESIZE_L:
+ SelectedArea.UpperLeftCorner.X = p.X;
+ break;
+ case EGUIEDM_RESIZE_R:
+ SelectedArea.LowerRightCorner.X = p.X;
+ break;
+ case EGUIEDM_RESIZE_TL:
+ SelectedArea.UpperLeftCorner = p;
+ break;
+ case EGUIEDM_RESIZE_TR:
+ SelectedArea.UpperLeftCorner.Y = p.Y;
+ SelectedArea.LowerRightCorner.X = p.X;
+ break;
+ case EGUIEDM_RESIZE_BL:
+ SelectedArea.UpperLeftCorner.X = p.X;
+ SelectedArea.LowerRightCorner.Y = p.Y;
+ break;
+ case EGUIEDM_RESIZE_BR:
+ SelectedArea.LowerRightCorner = p;
+ break;
+ default:
+ break;
+ }
+ }
+
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case EET_GUI_EVENT:
+ switch(e.GUIEvent.EventType)
+ {
+ case EGET_TREEVIEW_NODE_SELECT:
+ {
+ IGUITreeViewNode* eventnode = ((IGUITreeView*)e.GUIEvent.Caller)->getLastEventNode();
+ if(!eventnode->isRoot())
+ setSelectedElement((IGUIElement*)(eventnode->getData()));
+ break;
+ }
+ // load a gui file
+ case EGET_FILE_SELECTED:
+ dialog = (IGUIFileOpenDialog*)e.GUIEvent.Caller;
+ Environment->loadGUI(core::stringc(dialog->getFileName()).c_str());
+ break;
+
+ case EGET_MENU_ITEM_SELECTED:
+ {
+ IGUIContextMenu *menu = (IGUIContextMenu*)e.GUIEvent.Caller;
+ s32 cmdID = menu->getItemCommandId(menu->getSelectedItem()) - MenuCommandStart;
+
+ IGUIElement* el;
+
+ switch(cmdID)
+ {
+
+ //! file commands
+ case EGUIEDMC_FILE_NEW:
+ // clear all elements belonging to our parent
+ setSelectedElement(0);
+ MouseOverElement = 0;
+ el = Parent;
+ grab();
+ // remove all children
+ while(Children.end() != el->getChildren().begin())
+ el->removeChild(*(el->getChildren().begin()));
+ // attach to parent again
+ el->addChild(this);
+ drop();
+
+ break;
+ case EGUIEDMC_FILE_LOAD:
+ Environment->addFileOpenDialog(L"Please select a GUI file to open", false, this);
+ break;
+ case EGUIEDMC_FILE_SAVE:
+ Environment->saveGUI("guiTest.xml");
+ break;
+
+ //! edit menu
+ case EGUIEDMC_CUT_ELEMENT:
+ {
+ CopySelectedElementXML();
+ // delete element
+ el = SelectedElement;
+ setSelectedElement(0);
+ MouseOverElement = 0;
+ el->remove();
+ break;
+ }
+ case EGUIEDMC_COPY_ELEMENT:
+ CopySelectedElementXML();
+ break;
+ case EGUIEDMC_PASTE_ELEMENT:
+ PasteXMLToSelectedElement();
+ break;
+ case EGUIEDMC_DELETE_ELEMENT:
+ el = SelectedElement;
+ setSelectedElement(0);
+ MouseOverElement = 0;
+ el->remove();
+ break;
+ case EGUIEDMC_SET_PARENT:
+ CurrentMode = EGUIEDM_SELECT_NEW_PARENT;
+ break;
+ case EGUIEDMC_BRING_TO_FRONT:
+ if (SelectedElement->getParent())
+ SelectedElement->getParent()->bringToFront(SelectedElement);
+ break;
+
+ case EGUIEDMC_SAVE_ELEMENT:
+ //TODO: add 'save' dialog.
+ Environment->saveGUI("guiTest.xml", SelectedElement ? SelectedElement : Environment->getRootGUIElement() );
+ break;
+
+ //! toggle edit window
+ case EGUIEDMC_TOGGLE_EDITOR:
+ break;
+
+ case EGUIEDMC_INSERT_XML:
+ Environment->loadGUI("guiTest.xml", SelectedElement ? SelectedElement : Environment->getRootGUIElement() );
+ break;
+
+ default:
+ // create element from factory?
+ if (cmdID >= EGUIEDMC_COUNT)
+ {
+
+ s32 num = cmdID - EGUIEDMC_COUNT; // get index
+ // loop through all factories
+ s32 i, c=Environment->getRegisteredGUIElementFactoryCount();
+ for (i=0; i Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount(); ++i)
+ {
+ num -= Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount();
+ }
+ if (num < Environment->getGUIElementFactory(i)->getCreatableGUIElementTypeCount() )
+ {
+ core::stringc name = Environment->getGUIElementFactory(i)->getCreateableGUIElementTypeName(num);
+ IGUIElement *parentElement = SelectedElement ? SelectedElement : Environment->getRootGUIElement();
+ // add it
+ IGUIElement *newElement = Environment->getGUIElementFactory(i)->addGUIElement(name.c_str(),parentElement);
+ if (newElement)
+ {
+ core::position2di p = DragStart - parentElement->getAbsolutePosition().UpperLeftCorner;
+ newElement->setRelativePosition(core::rect(p,p+core::position2di(100,100)));
+ //Environment->removeFocus(newElement);
+ }
+ }
+ }
+ break;
+ }
+ EditorWindow->updateTree();
+ }
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // even if we didn't absorb the event,
+ // we never pass events back to the GUI we're editing!
+ return false;
+}
+
+
+//! draws the element and its children
+void CGUIEditWorkspace::draw()
+{
+ video::IVideoDriver *driver = Environment->getVideoDriver();
+
+ if (DrawGrid)
+ {
+ // draw the grid
+
+ core::rect r = getAbsolutePosition();
+
+ s32 cy = r.UpperLeftCorner.Y;
+ while (cy < r.LowerRightCorner.Y)
+ {
+ s32 cx = r.UpperLeftCorner.X;
+ while (cx < r.LowerRightCorner.X)
+ {
+ driver->draw2DRectangle(video::SColor(40,0,0,90),core::rect(cx+1,cy+1,GridSize.Width+cx,GridSize.Height+cy));
+ cx += GridSize.Width;
+ }
+ cy += GridSize.Height;
+ }
+ }
+ if (MouseOverElement &&
+ MouseOverElement != SelectedElement &&
+ MouseOverElement != Parent)
+ {
+ core::rect r = MouseOverElement->getAbsolutePosition();
+ driver->draw2DRectangle(video::SColor(100,0,0,255), r);
+ }
+ if (SelectedElement && CurrentMode == EGUIEDM_SELECT)
+ {
+ driver->draw2DRectangle(video::SColor(100,0,255,0),SelectedElement->getAbsolutePosition());
+ }
+ if (CurrentMode >= EGUIEDM_MOVE)
+ {
+ driver->draw2DRectangle(video::SColor(100,255,0,0),SelectedArea);
+ }
+
+ if ( (SelectedElement && CurrentMode >= EGUIEDM_MOVE) ||
+ (SelectedElement && MouseOverElement == SelectedElement && MouseOverMode >= EGUIEDM_MOVE) )
+ {
+ // draw handles for moving
+ EGUIEDIT_MODE m = CurrentMode;
+ core::rect r = SelectedArea;
+ if (m < EGUIEDM_MOVE)
+ {
+ m = MouseOverMode;
+ r = SelectedElement->getAbsolutePosition();
+ }
+
+ core::position2di d = core::position2di(4,4);
+
+ TLRect = core::rect(r.UpperLeftCorner, r.UpperLeftCorner + d );
+ TRRect = core::rect(r.LowerRightCorner.X-4, r.UpperLeftCorner.Y, r.LowerRightCorner.X, r.UpperLeftCorner.Y+4);
+ TopRect = core::rect(r.getCenter().X-2, r.UpperLeftCorner.Y,r.getCenter().X+2, r.UpperLeftCorner.Y+4 );
+ BLRect = core::rect(r.UpperLeftCorner.X, r.LowerRightCorner.Y-4, r.UpperLeftCorner.X+4, r.LowerRightCorner.Y);
+ LRect = core::rect(r.UpperLeftCorner.X,r.getCenter().Y-2, r.UpperLeftCorner.X+4, r.getCenter().Y+2 );
+ RRect = core::rect(r.LowerRightCorner.X-4,r.getCenter().Y-2, r.LowerRightCorner.X, r.getCenter().Y+2 );
+ BRRect = core::rect(r.LowerRightCorner-d, r.LowerRightCorner);
+ BRect = core::rect(r.getCenter().X-2, r.LowerRightCorner.Y-4,r.getCenter().X+2, r.LowerRightCorner.Y );
+
+ // top left
+ if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_RESIZE_L || m == EGUIEDM_RESIZE_TL || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), TLRect);
+
+ if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_RESIZE_R || m == EGUIEDM_RESIZE_TR || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), TRRect);
+
+ if (m == EGUIEDM_RESIZE_T || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), TopRect);
+
+ if (m == EGUIEDM_RESIZE_L || m == EGUIEDM_RESIZE_BL || m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), BLRect);
+
+ if (m == EGUIEDM_RESIZE_L || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), LRect);
+
+ if (m == EGUIEDM_RESIZE_R || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), RRect);
+
+ if (m == EGUIEDM_RESIZE_R || m == EGUIEDM_RESIZE_BR || m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), BRRect );
+
+ if (m == EGUIEDM_RESIZE_B || m == EGUIEDM_MOVE )
+ driver->draw2DRectangle(video::SColor(100,255,255,255), BRect);
+
+
+ }
+
+ IGUIElement::draw();
+}
+
+
+void CGUIEditWorkspace::setDrawGrid(bool drawGrid)
+{
+ DrawGrid = drawGrid;
+}
+
+void CGUIEditWorkspace::setGridSize(const core::dimension2di& gridSize)
+{
+ GridSize = gridSize;
+ if (GridSize.Width < 2)
+ GridSize.Width = 2;
+ if (GridSize.Height < 2)
+ GridSize.Height = 2;
+}
+
+void CGUIEditWorkspace::setUseGrid(bool useGrid)
+{
+ UseGrid = useGrid;
+}
+
+
+//! Removes a child.
+void CGUIEditWorkspace::removeChild(IGUIElement* child)
+{
+ IGUIElement::removeChild(child);
+
+ if (Children.empty())
+ remove();
+}
+
+
+void CGUIEditWorkspace::updateAbsolutePosition()
+{
+ core::rect parentRect(0,0,0,0);
+
+ if (Parent)
+ {
+ parentRect = Parent->getAbsolutePosition();
+ RelativeRect.UpperLeftCorner.X = 0;
+ RelativeRect.UpperLeftCorner.Y = 0;
+ RelativeRect.LowerRightCorner.X = parentRect.getWidth();
+ RelativeRect.LowerRightCorner.Y = parentRect.getHeight();
+ }
+
+ IGUIElement::updateAbsolutePosition();
+}
+
+void CGUIEditWorkspace::CopySelectedElementXML()
+{
+ core::stringc XMLText;
+ core::stringw wXMLText;
+ // create memory write file
+ io::CMemoryReadWriteFile* memWrite = new io::CMemoryReadWriteFile("#Clipboard#");
+ // save gui to mem file
+ io::IXMLWriter* xml = Environment->getFileSystem()->createXMLWriter(memWrite);
+ Environment->writeGUIElement(xml, SelectedElement);
+
+ // copy to clipboard- wide chars not supported yet :(
+ wXMLText = (wchar_t*)&memWrite->getData()[0];
+ u32 i = memWrite->getData().size()/sizeof(wchar_t);
+ if (wXMLText.size() > i)
+ wXMLText[i] = L'\0';
+ XMLText = wXMLText.c_str();
+ memWrite->drop();
+ xml->drop();
+ Environment->getOSOperator()->copyToClipboard(XMLText.c_str());
+}
+
+void CGUIEditWorkspace::PasteXMLToSelectedElement()
+{
+ // get clipboard data
+ core::stringc XMLText = Environment->getOSOperator()->getTextFromClipboard();
+ // convert to stringw
+ core::stringw wXMLText = XMLText.c_str();
+
+ io::CMemoryReadWriteFile* memWrite = new io::CMemoryReadWriteFile("#Clipboard#");
+
+ io::IXMLWriter* xmlw = Environment->getFileSystem()->createXMLWriter(memWrite);
+ xmlw->writeXMLHeader(); // it needs one of those
+ xmlw->drop();
+
+ // write clipboard data
+ memWrite->write((void*)&wXMLText[0], wXMLText.size() * sizeof(wchar_t));
+
+ // rewind file
+ memWrite->seek(0, false);
+
+ // read xml
+ Environment->loadGUI(memWrite, SelectedElement);
+
+ // reset focus
+ Environment->setFocus(this);
+
+ // drop the read file
+ memWrite->drop();
+}
+
+void CGUIEditWorkspace::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options)
+{
+ out->addBool("DrawGrid", DrawGrid);
+ out->addBool("UseGrid", UseGrid);
+ out->addPosition2d("GridSize", core::position2di(GridSize.Width, GridSize.Height));
+ out->addInt("MenuCommandStart", MenuCommandStart);
+}
+
+void CGUIEditWorkspace::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options)
+{
+ setDrawGrid(in->getAttributeAsBool("DrawGrid"));
+ setUseGrid(in->getAttributeAsBool("UseGrid"));
+
+ core::position2di tmpp = in->getAttributeAsPosition2d("GridSize");
+ core::dimension2di tmpd(tmpp.X, tmpp.Y);
+ setGridSize(tmpd);
+ setMenuCommandIDStart(in->getAttributeAsInt("MenuCommandStart"));
+}
+
+
+} // end namespace gui
+} // end namespace irr
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.h
new file mode 100644
index 0000000..3f21258
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEditWorkspace.h
@@ -0,0 +1,168 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt / Gaz Davidson
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __C_GUIEDIT_WORKSPACE_H_INCLUDED__
+#define __C_GUIEDIT_WORKSPACE_H_INCLUDED__
+
+#include "IGUIElement.h"
+#include "CGUIEditWindow.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ //! Adding the GUI Editor Workspace to an element allows you
+ /** to create, edit, load and save any elements supported
+ by any loaded factories.
+ When you add it without a parent (to the root element)
+ it will also allow you to edit, load and save settings in
+ the current skin.
+ */
+
+ // custom events
+ enum EGUIEDIT_CUSTOM_EVENTS
+ {
+ EGUIEDCE_ATTRIB_EDITOR = MAKE_IRR_ID('g','A','t','t'),
+ EGUIEDCE_OPTION_EDITOR = MAKE_IRR_ID('g','O','p','t'),
+ EGUIEDCE_ENV_EDITOR = MAKE_IRR_ID('g','E','n','v')
+ };
+
+ class CGUIEditWorkspace : public IGUIElement
+ {
+ public:
+
+ //! constructor
+ CGUIEditWorkspace(IGUIEnvironment* environment, s32 id=-1, IGUIElement *parent=0);
+
+ //! destructor
+ ~CGUIEditWorkspace();
+
+ //! called if an event happened.
+ virtual bool OnEvent(const SEvent &event);
+
+ //! Removes a child.
+ virtual void removeChild(IGUIElement* child);
+
+ //! draws the element and its children
+ virtual void draw();
+
+ //! Updates the absolute position.
+ virtual void updateAbsolutePosition();
+
+ //! Sets the menu command id's
+ /** The GUI editor defaults to command ID's from 0xED17 to 0xED17+EGUIEDMC_COUNT
+ In the rare case that these are already in use and you wish to use menus
+ while the editor is present you can set a new offset here.
+ */
+ virtual void setMenuCommandIDStart(s32 id);
+
+ //! grid drawing...
+ virtual void setDrawGrid(bool drawGrid);
+ virtual void setGridSize(const core::dimension2di& gridSize);
+ virtual void setUseGrid(bool useGrid);
+
+ //! returns the first editable element under the mouse
+ virtual IGUIElement* getEditableElementFromPoint(IGUIElement *start, const core::position2di &point, s32 index=0 );
+
+ //! selecting elements
+ virtual void setSelectedElement(IGUIElement *sel);
+ virtual void selectNextSibling();
+ virtual void selectPreviousSibling();
+
+ //! returns the selected element
+ virtual IGUIElement* getSelectedElement();
+
+ //! copies the xml of the selected element and all children to the clipboard
+ virtual void CopySelectedElementXML();
+
+ //! copies the xml of the selected element and all children to the clipboard
+ virtual void PasteXMLToSelectedElement();
+
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_GUIEDIT];
+ }
+
+ virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0);
+ virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0);
+
+ private:
+
+ enum EGUIEDIT_MODE
+ {
+ // when we are currently selecting an element
+ EGUIEDM_SELECT=0,
+ // selecting a new parent for the selected element
+ EGUIEDM_SELECT_NEW_PARENT,
+
+ // moving the selected element
+ EGUIEDM_MOVE,
+ // resizing the selected element
+ EGUIEDM_RESIZE_TL,
+ EGUIEDM_RESIZE_T,
+ EGUIEDM_RESIZE_TR,
+ EGUIEDM_RESIZE_R,
+ EGUIEDM_RESIZE_BR,
+ EGUIEDM_RESIZE_B,
+ EGUIEDM_RESIZE_BL,
+ EGUIEDM_RESIZE_L
+ };
+
+ enum EGUIEDIT_MENUCOMMANDS
+ {
+ //! file commands
+ EGUIEDMC_FILE_NEW,
+ EGUIEDMC_FILE_LOAD,
+ EGUIEDMC_FILE_SAVE,
+ //! edit menu
+ EGUIEDMC_CUT_ELEMENT,
+ EGUIEDMC_COPY_ELEMENT,
+ EGUIEDMC_PASTE_ELEMENT,
+ EGUIEDMC_DELETE_ELEMENT,
+ EGUIEDMC_SET_PARENT,
+ EGUIEDMC_BRING_TO_FRONT,
+ EGUIEDMC_SAVE_ELEMENT,
+ //! grid
+ EGUIEDMC_TOGGLE_EDITOR,
+
+ EGUIEDMC_INSERT_XML,
+
+ //! number of menu options
+ EGUIEDMC_COUNT
+ };
+
+ EGUIEDIT_MODE getModeFromPos(core::position2di p);
+
+ EGUIEDIT_MODE CurrentMode;
+ EGUIEDIT_MODE MouseOverMode;
+ core::position2di DragStart;
+ core::position2di StartMovePos;
+ core::rect SelectedArea;
+
+ core::dimension2di GridSize;
+ s32 MenuCommandStart;
+ bool DrawGrid, UseGrid;
+
+ IGUIElement *MouseOverElement,
+ *SelectedElement;
+ CGUIEditWindow *EditorWindow;
+
+ core::rect TLRect;
+ core::rect TRRect;
+ core::rect TopRect;
+ core::rect BLRect;
+ core::rect LRect;
+ core::rect RRect;
+ core::rect BRRect;
+ core::rect BRect;
+ };
+
+
+} // end namespace gui
+} // end namespace irr
+
+#endif
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEnumAttribute.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEnumAttribute.h
new file mode 100644
index 0000000..9e3958d
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIEnumAttribute.h
@@ -0,0 +1,114 @@
+#ifndef __C_GUI_ENUM_ATTRIBUTE_H_INCLUDED__
+#define __C_GUI_ENUM_ATTRIBUTE_H_INCLUDED__
+
+#include "CGUIAttribute.h"
+#include "IGUIComboBox.h"
+#include "IGUIEditBox.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ class CGUIEnumAttribute : public CGUIAttribute
+ {
+ public:
+ //
+ CGUIEnumAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) :
+ CGUIAttribute(environment, parent, myParentID),
+ AttribComboBox(0), AttribEditBox(0)
+ {
+
+ }
+
+ virtual ~CGUIEnumAttribute()
+ {
+ if (AttribComboBox)
+ AttribComboBox->drop();
+ if (AttribEditBox)
+ AttribEditBox->drop();
+ }
+
+ // save the attribute and possibly post the event to its parent
+ virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex)
+ {
+
+ if (AttribComboBox)
+ {
+ AttribComboBox->remove();
+ AttribComboBox->drop();
+ AttribComboBox = 0;
+ }
+
+ if (AttribEditBox)
+ {
+ AttribEditBox->remove();
+ AttribEditBox->drop();
+ AttribEditBox = 0;
+ }
+
+ core::array outLiterals;
+ attribs->getAttributeEnumerationLiteralsOfEnumeration(attribIndex, outLiterals);
+
+ core::rect r = getAbsolutePosition();
+ core::rect r2(0, Environment->getSkin()->getFont()->getDimension(L"A").Height + 10,
+ r.getWidth() - 5,
+ Environment->getSkin()->getFont()->getDimension(L"A").Height*2 + 20 );
+
+ if (outLiterals.size() > 0)
+ {
+ AttribComboBox = Environment->addComboBox(r2, this, -1);
+ for (u32 i=0; iaddItem( core::stringw(outLiterals[i].c_str()).c_str());
+
+ AttribComboBox->setSelected( attribs->getAttributeAsInt(attribIndex) );
+
+ AttribComboBox->grab();
+ AttribComboBox->setSubElement(true);
+ AttribComboBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ }
+ else
+ {
+
+ AttribEditBox = Environment->addEditBox(
+ attribs->getAttributeAsStringW(attribIndex).c_str(),
+ r2, true, this, -1);
+ AttribEditBox->grab();
+ AttribEditBox->setSubElement(true);
+ AttribEditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ }
+
+ CGUIAttribute::setAttrib(attribs, attribIndex);
+ }
+
+ //! save the attribute and possibly post the event to its parent
+ virtual bool updateAttrib(bool sendEvent=true)
+ {
+ if (!Attribs)
+ return true;
+
+ if (AttribComboBox)
+ Attribs->setAttribute(Index, AttribComboBox->getText());
+ else if (AttribEditBox)
+ Attribs->setAttribute(Index, AttribEditBox->getText());
+
+ return CGUIAttribute::updateAttrib(sendEvent);
+ }
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_ENUMATTRIBUTE];
+ }
+
+ private:
+ IGUIComboBox* AttribComboBox;
+ IGUIEditBox* AttribEditBox;
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.cpp
new file mode 100644
index 0000000..4135b7a
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.cpp
@@ -0,0 +1,340 @@
+// Copyright 2006-2012 Asger Feldthaus
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+/*
+ Originally Klasker's but I've messed around with it lots - Gaz
+*/
+
+#include "CGUIPanel.h"
+#include "IGUIEnvironment.h"
+#include "IGUIScrollBar.h"
+#include "IGUITabControl.h"
+#include "IVideoDriver.h"
+
+const int SCROLL_BAR_SIZE = 16; // Scroll bars are 16 pixels wide
+const int BORDER_WIDTH = 2;
+
+namespace irr
+{
+namespace gui
+{
+
+CGUIPanel::CGUIPanel(IGUIEnvironment* environment, IGUIElement* parent, s32 id, const core::rect& rectangle,
+ bool border, E_SCROLL_BAR_MODE vMode, E_SCROLL_BAR_MODE hMode)
+ : IGUIElement(EGUIET_ELEMENT, environment, parent, id, rectangle),
+ VScrollBar(0), HScrollBar(0), ClipPane(0), InnerPane(0),
+ VScrollBarMode(vMode), HScrollBarMode(hMode), NeedsUpdate(true), Border(border)
+{
+ #ifdef _DEBUG
+ setDebugName("CGUIPanel");
+ #endif
+
+ s32 width = rectangle.getWidth();
+ s32 height = rectangle.getHeight();
+
+ core::rect rct = core::rect(width - SCROLL_BAR_SIZE,0, width, height);
+
+ VScrollBar = environment->addScrollBar(false, rct, 0, id);
+ VScrollBar->setSubElement(true);
+ VScrollBar->setTabStop(false);
+ VScrollBar->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+ VScrollBar->grab();
+ IGUIElement::addChild(VScrollBar);
+
+ rct = core::rect(0, height - SCROLL_BAR_SIZE, width - SCROLL_BAR_SIZE,height );
+
+ HScrollBar = environment->addScrollBar(true, rct, 0, id);
+ HScrollBar->setSubElement(true);
+ HScrollBar->setTabStop(false);
+ HScrollBar->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT);
+ HScrollBar->grab();
+ IGUIElement::addChild(HScrollBar);
+
+ rct = core::rect(0,0, width - SCROLL_BAR_SIZE, height - SCROLL_BAR_SIZE);
+
+ ClipPane = environment->addTab( rct, 0, -1);
+ ClipPane->setSubElement(true);
+ ClipPane->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+ ClipPane->grab();
+ IGUIElement::addChild(ClipPane);
+
+ InnerPane = environment->addTab(rct, ClipPane, -1);
+ InnerPane->setSubElement(true);
+ InnerPane->grab();
+
+ calculateClientArea();
+ resizeInnerPane();
+}
+
+CGUIPanel::~CGUIPanel()
+{
+ // because the inner pane has the list of children, we need to remove the outer ones manually
+ IGUIElement::removeChild(VScrollBar);
+ IGUIElement::removeChild(HScrollBar);
+ IGUIElement::removeChild(ClipPane);
+
+ // now we can drop the others
+ VScrollBar->drop();
+ HScrollBar->drop();
+ ClipPane->drop();
+ InnerPane->drop();
+}
+
+
+void CGUIPanel::draw()
+{
+ if (NeedsUpdate)
+ {
+ calculateClientArea();
+ resizeInnerPane();
+ NeedsUpdate = false;
+ }
+
+ IGUISkin* skin = Environment->getSkin();
+ if (Border && skin)
+ {
+ skin->draw3DSunkenPane( this, skin->getColor( EGDC_APP_WORKSPACE), false, true, AbsoluteRect, &AbsoluteClippingRect );
+ }
+
+ IGUIElement::draw();
+}
+
+void CGUIPanel::addChild(IGUIElement *child)
+{
+ // add the child to the inner pane
+ InnerPane->addChild(child);
+
+ NeedsUpdate = true;
+}
+
+void CGUIPanel::removeChild(IGUIElement *child)
+{
+ InnerPane->removeChild(child);
+
+ NeedsUpdate = true;
+}
+
+//! returns children of the inner pane
+const core::list& CGUIPanel::getChildren()
+{
+ return InnerPane->getChildren();
+}
+
+bool CGUIPanel::hasBorder() const
+{
+ return Border;
+}
+
+void CGUIPanel::setBorder( bool enabled )
+{
+ Border = enabled;
+}
+
+IGUIScrollBar* CGUIPanel::getVScrollBar() const
+{
+ return VScrollBar;
+}
+
+IGUIScrollBar* CGUIPanel::getHScrollBar() const
+{
+ return HScrollBar;
+}
+
+E_SCROLL_BAR_MODE CGUIPanel::getVScrollBarMode() const
+{
+ return VScrollBarMode;
+}
+
+void CGUIPanel::setVScrollBarMode( E_SCROLL_BAR_MODE mode )
+{
+ VScrollBarMode = mode;
+ NeedsUpdate = true;
+}
+
+E_SCROLL_BAR_MODE CGUIPanel::getHScrollBarMode() const
+{
+ return HScrollBarMode;
+}
+
+void CGUIPanel::setHScrollBarMode(E_SCROLL_BAR_MODE mode)
+{
+ HScrollBarMode = mode;
+ NeedsUpdate = true;
+}
+
+bool CGUIPanel::OnEvent(const SEvent &event)
+{
+ // Redirect mouse wheel to scrollbar
+ if (event.EventType == EET_MOUSE_INPUT_EVENT && event.MouseInput.Event == EMIE_MOUSE_WHEEL)
+ {
+ if (VScrollBar->isVisible())
+ {
+ Environment->setFocus(VScrollBar);
+ VScrollBar->OnEvent(event);
+ return true;
+ }
+ else if (VScrollBar->isVisible())
+ {
+ Environment->setFocus(HScrollBar);
+ HScrollBar->OnEvent(event);
+ return true;
+ }
+ }
+ else
+ {
+ if (event.EventType == EET_GUI_EVENT && event.GUIEvent.EventType == EGET_SCROLL_BAR_CHANGED &&
+ (event.GUIEvent.Caller == HScrollBar || event.GUIEvent.Caller == VScrollBar) )
+ {
+ moveInnerPane();
+
+ return true;
+ }
+ }
+
+ return IGUIElement::OnEvent(event);
+}
+
+void CGUIPanel::moveInnerPane()
+{
+ core::dimension2d dim = InnerPane->getAbsolutePosition().getSize();
+ core::position2d newpos(HScrollBar->isVisible() ? -HScrollBar->getPos() : 0 , VScrollBar->isVisible() ? -VScrollBar->getPos() : 0);
+ core::rect r(newpos, newpos + dim);
+ InnerPane->setRelativePosition(r);
+}
+
+
+void CGUIPanel::updateAbsolutePosition()
+{
+ IGUIElement::updateAbsolutePosition();
+ calculateClientArea();
+ resizeInnerPane();
+}
+
+
+void CGUIPanel::resizeInnerPane()
+{
+ if (!HScrollBar || !VScrollBar || !InnerPane || !ClipPane)
+ return;
+
+ // get outer pane size
+ core::rect outerRect = ClipPane->getRelativePosition();
+
+ // resize flexible children depending on outer pane
+ InnerPane->setRelativePosition(outerRect);
+
+ // get desired size (total size of all children)
+ core::rect totalRect(0, 0, 0, 0);
+
+ core::list::ConstIterator it;
+
+ for (it = InnerPane->getChildren().begin();
+ it != InnerPane->getChildren().end(); ++it)
+ {
+ core::rect rct = (*it)->getRelativePosition();
+ totalRect.addInternalPoint(rct.UpperLeftCorner);
+ totalRect.addInternalPoint(rct.LowerRightCorner);
+ }
+
+ // move children if pane needs to grow
+ core::position2di adjustedMovement(0,0);
+
+ if (totalRect.UpperLeftCorner.X < 0)
+ adjustedMovement.X = -totalRect.UpperLeftCorner.X;
+ if (totalRect.UpperLeftCorner.Y < 0)
+ adjustedMovement.Y = -totalRect.UpperLeftCorner.Y;
+
+ if (adjustedMovement.X > 0 || adjustedMovement.Y > 0)
+ {
+ totalRect += adjustedMovement;
+
+ for (it = InnerPane->getChildren().begin();
+ it != InnerPane->getChildren().end(); ++it )
+ {
+ (*it)->move(adjustedMovement);
+ }
+ }
+
+ // make sure the inner pane is at least as big as the outer
+ if (totalRect.getWidth() < outerRect.getWidth())
+ {
+ totalRect.UpperLeftCorner.X = 0;
+ totalRect.LowerRightCorner.X = outerRect.getWidth();
+ }
+ if (totalRect.getHeight() < outerRect.getHeight())
+ {
+ totalRect.UpperLeftCorner.Y = 0;
+ totalRect.LowerRightCorner.Y = outerRect.getHeight();
+ }
+
+ InnerPane->setRelativePosition(totalRect);
+
+ // scrollbars
+ if ( HScrollBarMode != ESBM_ALWAYS_INVISIBLE &&
+ (totalRect.getWidth() > outerRect.getWidth() || HScrollBarMode == ESBM_ALWAYS_VISIBLE) )
+ {
+ HScrollBar->setVisible(true);
+ HScrollBar->setMax(totalRect.getWidth() - outerRect.getWidth());
+ bringToFront(HScrollBar);
+ }
+ else
+ HScrollBar->setVisible(false);
+
+ if ( VScrollBarMode != ESBM_ALWAYS_INVISIBLE &&
+ (totalRect.getHeight() > outerRect.getHeight() || VScrollBarMode == ESBM_ALWAYS_VISIBLE) )
+ {
+ VScrollBar->setVisible(true);
+ VScrollBar->setMax(totalRect.getHeight() - outerRect.getHeight());
+ bringToFront(VScrollBar);
+ }
+ else
+ VScrollBar->setVisible(false);
+
+ // move to adjust for scrollbar pos
+ moveInnerPane();
+}
+
+void CGUIPanel::calculateClientArea()
+{
+ core::rect ClientArea(0,0, AbsoluteRect.getWidth(),AbsoluteRect.getHeight());
+
+ if (VScrollBar->isVisible())
+ ClientArea.LowerRightCorner.X -= VScrollBar->getRelativePosition().getWidth();
+
+ if (HScrollBar->isVisible())
+ ClientArea.LowerRightCorner.Y -= HScrollBar->getRelativePosition().getHeight();
+
+ if (Border)
+ {
+ ClientArea.UpperLeftCorner += core::position2d( BORDER_WIDTH, BORDER_WIDTH );
+ ClientArea.LowerRightCorner -= core::position2d( BORDER_WIDTH, BORDER_WIDTH );
+ }
+
+ ClipPane->setRelativePosition(ClientArea);
+}
+
+core::rect CGUIPanel::getClientArea() const
+{
+ return ClipPane->getRelativePosition();
+}
+
+void CGUIPanel::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options)
+{
+ IGUIElement::serializeAttributes(out, options);
+
+ out->addBool("border", Border);
+ out->addEnum("horizontalScrollBar", HScrollBarMode, GUIScrollBarModeNames );
+ out->addEnum("verticalScrollBar", VScrollBarMode, GUIScrollBarModeNames );
+}
+
+void CGUIPanel::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options)
+{
+ IGUIElement::deserializeAttributes(in, options);
+
+ setBorder(in->getAttributeAsBool("border"));
+ setHScrollBarMode((E_SCROLL_BAR_MODE)in->getAttributeAsEnumeration("horizontalScrollBar", GUIScrollBarModeNames));
+ setVScrollBarMode((E_SCROLL_BAR_MODE)in->getAttributeAsEnumeration("verticalScrollBar", GUIScrollBarModeNames));
+}
+
+} // namespace gui
+} // namespace irr
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.h
new file mode 100644
index 0000000..cb6f79a
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIPanel.h
@@ -0,0 +1,128 @@
+// Copyright 2006-2012 Asger Feldthaus
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef _C_GUI_PANEL_H_
+#define _C_GUI_PANEL_H_
+
+#include "IGUIElement.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+class IGUIScrollBar;
+class IGUITab;
+
+enum E_SCROLL_BAR_MODE
+{
+ //! The scrollbar will only show up when needed.
+ ESBM_AUTOMATIC = 0,
+
+ //! The scrollbar will never be visible.
+ ESBM_ALWAYS_INVISIBLE,
+
+ //! The scrollbar will always the visible.
+ ESBM_ALWAYS_VISIBLE,
+
+ //! just a count of how many are in this enum
+ ESBM_COUNT
+};
+
+const c8* const GUIScrollBarModeNames[] =
+{
+ "automatic",
+ "alwaysInvisible",
+ "alwaysVisible",
+ 0
+};
+
+class CGUIPanel : public IGUIElement
+{
+public:
+ CGUIPanel( IGUIEnvironment* environment, IGUIElement* parent, s32 id=-1,
+ const core::rect& rectangle = core::rect(0,0,100,100),
+ bool border=false,
+ E_SCROLL_BAR_MODE vMode=ESBM_AUTOMATIC,
+ E_SCROLL_BAR_MODE hMode=ESBM_ALWAYS_INVISIBLE );
+
+ virtual ~CGUIPanel();
+
+ //! draws the panel and its children
+ virtual void draw();
+
+ //! returns true if it has a border, false if not
+ bool hasBorder() const;
+
+ //! sets whether the element draws a border
+ void setBorder(bool enabled);
+
+ //! returns a pointer to the vertical scrollbar
+ IGUIScrollBar* getVScrollBar() const;
+
+ //! returns a pointer to the horizontal scrollbar
+ IGUIScrollBar* getHScrollBar() const;
+
+ //! returns the vertical scrollbar visibility rule
+ E_SCROLL_BAR_MODE getVScrollBarMode() const;
+
+ //! sets the vertical scrollbar visibility rule
+ void setVScrollBarMode(E_SCROLL_BAR_MODE mode);
+
+ //! returns the horizontal scrollbar visibility rule
+ E_SCROLL_BAR_MODE getHScrollBarMode() const;
+
+ //! sets the horizontal scrollbar visibility rule
+ void setHScrollBarMode(E_SCROLL_BAR_MODE mode);
+
+ //! returns the visible area inside the panel, excluding scrollbar and border
+ core::rect getClientArea() const;
+
+ virtual bool OnEvent(const SEvent &event);
+
+ //! adds a child to the panel
+ virtual void addChild(IGUIElement* child);
+
+ //! removes a child from the panel
+ virtual void removeChild(IGUIElement* child);
+
+ //! updates the absolute position
+ virtual void updateAbsolutePosition();
+
+ //! returns children of the inner pane
+ virtual const core::list& getChildren();
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_GUIPANEL];
+ }
+
+ virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0);
+ virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0);
+
+protected:
+ void moveInnerPane();
+ void resizeInnerPane();
+ void calculateClientArea();
+
+private:
+
+ IGUIScrollBar* VScrollBar;
+ IGUIScrollBar* HScrollBar;
+ IGUITab* ClipPane;
+ IGUITab* InnerPane;
+
+ E_SCROLL_BAR_MODE VScrollBarMode;
+ E_SCROLL_BAR_MODE HScrollBarMode;
+
+ bool NeedsUpdate;
+ bool Border;
+};
+
+} // namespace gui
+} // namespace irr
+
+#endif
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIStringAttribute.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIStringAttribute.h
new file mode 100644
index 0000000..af9ac03
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUIStringAttribute.h
@@ -0,0 +1,70 @@
+#ifndef __C_GUI_STRING_ATTRIBUTE_H_INCLUDED__
+#define __C_GUI_STRING_ATTRIBUTE_H_INCLUDED__
+
+#include "CGUIAttribute.h"
+#include "IGUIEditBox.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ class CGUIStringAttribute : public CGUIAttribute
+ {
+ public:
+ //
+ CGUIStringAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) :
+ CGUIAttribute(environment, parent, myParentID),
+ AttribEditBox(0)
+ {
+ core::rect r = getAbsolutePosition();
+ core::rect r2(0, Environment->getSkin()->getFont()->getDimension(L"A").Height + 10,
+ r.getWidth() - 5,
+ Environment->getSkin()->getFont()->getDimension(L"A").Height*2 + 15 );
+
+ AttribEditBox = environment->addEditBox(0, r2, true, this, -1);
+ AttribEditBox->grab();
+ AttribEditBox->setSubElement(true);
+ AttribEditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+
+ }
+
+ virtual ~CGUIStringAttribute()
+ {
+ if (AttribEditBox)
+ AttribEditBox->drop();
+ }
+
+ virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex)
+ {
+ AttribEditBox->setText(attribs->getAttributeAsStringW(attribIndex).c_str());
+ CGUIAttribute::setAttrib(attribs, attribIndex);
+ }
+
+ //! save the attribute and possibly post the event to its parent
+ virtual bool updateAttrib(bool sendEvent=true)
+ {
+ if (!Attribs)
+ return true;
+
+ Attribs->setAttribute(Index, AttribEditBox->getText());
+ AttribEditBox->setText(Attribs->getAttributeAsStringW(Index).c_str());
+
+ return CGUIAttribute::updateAttrib(sendEvent);
+ }
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_STRINGATTRIBUTE];
+ }
+
+ private:
+ IGUIEditBox* AttribEditBox;
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureAttribute.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureAttribute.h
new file mode 100644
index 0000000..6a4fef2
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureAttribute.h
@@ -0,0 +1,140 @@
+#ifndef __C_GUI_TEXTURE_ATTRIBUTE_H_INCLUDED__
+#define __C_GUI_TEXTURE_ATTRIBUTE_H_INCLUDED__
+
+#include "CGUIAttribute.h"
+#include "IGUIEditBox.h"
+#include "IGUIImage.h"
+#include "IGUIButton.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ class CGUITextureAttribute : public CGUIAttribute
+ {
+ public:
+ //
+ CGUITextureAttribute(IGUIEnvironment* environment, IGUIElement *parent, s32 myParentID) :
+ CGUIAttribute(environment, parent, myParentID),
+ AttribEditBox(0), AttribImage(0), AttribButton(0)
+ {
+ IGUISkin* skin = Environment->getSkin();
+
+ core::rect r = getAbsolutePosition();
+ s32 topy = skin->getFont()->getDimension(L"A").Height + 10;
+ s32 h = skin->getFont()->getDimension(L"A").Height + 5;
+
+ AttribImage = environment->addImage(0, core::position2di(0, topy), false, this);
+ AttribImage->setRelativePosition( core::rect(0,topy, r.getWidth() - 5, 100+topy));
+ AttribImage->grab();
+ AttribImage->setSubElement(true);
+ AttribImage->setScaleImage(true);
+ AttribImage->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+
+ topy += 105;
+
+ core::rect r2(0, topy, r.getWidth() - 15 - skin->getSize(EGDS_CHECK_BOX_WIDTH), topy + h);
+ core::rect br(r.getWidth() - 10 - skin->getSize(EGDS_CHECK_BOX_WIDTH), topy, r.getWidth(), topy + h);
+
+ AttribEditBox = environment->addEditBox(0, r2, true, this, -1);
+ AttribEditBox->grab();
+ AttribEditBox->setSubElement(true);
+ AttribEditBox->setAlignment(EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+
+ AttribButton = environment->addButton(br, this, -1, L"...");
+ AttribButton->grab();
+ AttribButton->setSubElement(true);
+ AttribButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ //AttribButton->setSpriteBank(skin->getSpriteBank());
+ //AttribButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_FILE), skin->getColor(EGDC_WINDOW_SYMBOL));
+ //AttribButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_FILE), skin->getColor(EGDC_WINDOW_SYMBOL), true);
+ }
+
+ virtual ~CGUITextureAttribute()
+ {
+ if (AttribEditBox)
+ AttribEditBox->drop();
+ if (AttribImage)
+ AttribImage->drop();
+ if (AttribButton)
+ AttribButton->drop();
+ }
+
+ virtual bool OnEvent(const SEvent &e)
+ {
+
+ if (IsEnabled)
+ {
+ switch (e.EventType)
+ {
+ case EET_GUI_EVENT:
+ switch (e.GUIEvent.EventType)
+ {
+ case EGET_BUTTON_CLICKED:
+ // button click: open file dialog
+ if (e.GUIEvent.Caller == AttribButton)
+ {
+ //Environment->addGUIElement("textureBrowser", Environment->getRootGUIElement());
+ return true;
+ }
+ break;
+ case EGET_FILE_SELECTED:
+ // file selected: change editbox value and set event
+
+ return true;
+ case EGET_FILE_CHOOSE_DIALOG_CANCELLED:
+
+ return true;
+ default:
+ break;
+ }
+ break;
+ case EET_KEY_INPUT_EVENT:
+ return true;
+ default:
+ break;
+ }
+ }
+ return CGUIAttribute::OnEvent(e);
+ }
+
+ virtual void setAttrib(io::IAttributes *attribs, u32 attribIndex)
+ {
+ AttribEditBox->setText(attribs->getAttributeAsStringW(attribIndex).c_str());
+ AttribImage->setImage(attribs->getAttributeAsTexture(Index));
+
+ CGUIAttribute::setAttrib(attribs, attribIndex);
+ }
+
+ //! save the attribute and possibly post the event to its parent
+ virtual bool updateAttrib(bool sendEvent=true)
+ {
+ if (!Attribs)
+ return true;
+
+ Attribs->setAttribute(Index, AttribEditBox->getText());
+ core::stringw tmp = Attribs->getAttributeAsStringW(Index);
+ AttribEditBox->setText(Attribs->getAttributeAsStringW(Index).c_str());
+ AttribImage->setImage(Attribs->getAttributeAsTexture(Index));
+
+ return CGUIAttribute::updateAttrib(sendEvent);
+ }
+
+ //! Returns the type name of the gui element.
+ virtual const c8* getTypeName() const
+ {
+ return GUIEditElementTypeNames[EGUIEDIT_TEXTUREATTRIBUTE];
+ }
+
+ private:
+ IGUIEditBox* AttribEditBox;
+ IGUIImage* AttribImage;
+ IGUIButton* AttribButton;
+ };
+
+} // namespace gui
+} // namespace irr
+
+#endif
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.cpp
new file mode 100644
index 0000000..bac5233
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.cpp
@@ -0,0 +1,336 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt / Gaz Davidson
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#include "CGUITextureCacheBrowser.h"
+#include "IGUIEnvironment.h"
+#include "IGUIButton.h"
+#include "IGUISkin.h"
+#include "IGUIFont.h"
+#include "IVideoDriver.h"
+
+namespace irr
+{
+namespace gui
+{
+
+CGUITextureCacheBrowser::CGUITextureCacheBrowser(IGUIEnvironment* environment, s32 id, IGUIElement *parent)
+: IGUIWindow(environment, parent, id, core::rect(0,0,300,200)),
+ CloseButton(0), Panel(0), SelectedTexture(-1), Dragging(false), IsDraggable(true)
+{
+ #ifdef _DEBUG
+ setDebugName("CGUITextureCacheBrowser");
+ #endif
+
+ IGUISkin* skin = 0;
+ IGUISpriteBank* sprites = 0;
+ video::SColor color(255,255,255,255);
+
+ if (environment)
+ skin = environment->getSkin();
+
+ s32 buttonw = 15;
+ if (skin)
+ {
+ buttonw = skin->getSize(EGDS_WINDOW_BUTTON_WIDTH);
+ sprites = skin->getSpriteBank();
+ color = skin->getColor(EGDC_WINDOW_SYMBOL);
+ }
+ s32 posx = RelativeRect.getWidth() - buttonw - 4;
+
+ CloseButton = Environment->addButton(core::rect(posx, 3, posx + buttonw, 3 + buttonw), this, -1,
+ L"", skin ? skin->getDefaultText(EGDT_WINDOW_CLOSE) : L"Close" );
+ CloseButton->setSubElement(true);
+ CloseButton->setAlignment(EGUIA_LOWERRIGHT, EGUIA_LOWERRIGHT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT);
+ if (sprites)
+ {
+ CloseButton->setSpriteBank(sprites);
+ CloseButton->setSprite(EGBS_BUTTON_UP, skin->getIcon(EGDI_WINDOW_CLOSE), color);
+ CloseButton->setSprite(EGBS_BUTTON_DOWN, skin->getIcon(EGDI_WINDOW_CLOSE), color);
+ }
+
+ CloseButton->grab();
+
+ // window title
+ Text = L"Texture Browser";
+
+ // panel element
+ Panel = new CGUIPanel(environment, this);
+ Panel->setRelativePosition( core::rect(1, buttonw + 5, 151, RelativeRect.getHeight() - 1));
+ Panel->setAlignment(EGUIA_UPPERLEFT, EGUIA_UPPERLEFT, EGUIA_UPPERLEFT, EGUIA_LOWERRIGHT);
+ Panel->setBorder(true);
+ Panel->setSubElement(true);
+
+ // some buttons
+
+
+ // add images from texture cache
+ updateImageList();
+
+}
+
+CGUITextureCacheBrowser::~CGUITextureCacheBrowser()
+{
+ if (CloseButton)
+ CloseButton->drop();
+ if (Panel)
+ Panel->drop();
+
+ // drop images
+ u32 i;
+ for (i=0; idrop();
+ Images[i]->remove();
+ }
+ Images.clear();
+}
+void CGUITextureCacheBrowser::updateImageList()
+{
+ if (!Panel)
+ return;
+
+ video::IVideoDriver* Driver = Environment->getVideoDriver();
+
+ // clear images
+ u32 i;
+ for (i=0; idrop();
+ Images[i]->remove();
+ }
+ Images.clear();
+
+ u32 count = (u32)Driver->getTextureCount();
+
+ s32 h = Panel->getClientArea().getWidth()-10;
+ s32 hw = h/2;
+ core::rect pos(Panel->getClientArea().getCenter().X - Panel->getAbsolutePosition().UpperLeftCorner.X - hw, 5,
+ Panel->getClientArea().getCenter().X - Panel->getAbsolutePosition().UpperLeftCorner.X + hw, h+5);
+
+ core::position2di moveDist(0, h+5);
+
+ for (u32 i=0; igetTextureByIndex(i);
+ details = L"File name: ";
+ details += tex->getName();
+ details += L"\nFormat: ";
+ video::ECOLOR_FORMAT cf = tex->getColorFormat();
+
+ bool alpha = false;
+
+ switch (cf)
+ {
+ case video::ECF_A1R5G5B5:
+ details += L"A1R5G5B5 (16-bit with 1-bit alpha channel)\n";
+ alpha = true;
+ break;
+ case video::ECF_R5G6B5:
+ details += L"R5G6B5 (16-bit, no alpha channel)\n";
+ break;
+ case video::ECF_R8G8B8:
+ details += L"R8G8B8 (16-bit, no alpha channel)\n";
+ break;
+ case video::ECF_A8R8G8B8:
+ details += L"R8G8B8 (32-bit with 8-bit alpha channel)\n";
+ alpha = true;
+ break;
+ default:
+ details += L"Unknown\n";
+ }
+
+ core::dimension2du osize = tex->getOriginalSize();
+ core::dimension2du size = tex->getOriginalSize();
+
+ details += "Size: ";
+ details += size.Width;
+ details += "x";
+ details += size.Height;
+
+ if (osize != size)
+ {
+ details += "\nOriginal Size: ";
+ details += osize.Width;
+ details += "x";
+ details += osize.Height;
+ }
+
+ details += L"\nMip-maps: ";
+
+ if (tex->hasMipMaps())
+ details += L"Yes\n";
+ else
+ details += L"No\n";
+
+ IGUIImage* img = Environment->addImage(tex, core::position2di(1,1), alpha, Panel, i);
+ img->grab();
+ Images.push_back(img);
+ img->setRelativePosition(pos);
+ img->setToolTipText(details.c_str());
+ img->setScaleImage(true);
+ img->setColor( SelectedTexture == (s32)i ? video::SColor(255,255,255,255) : video::SColor(128,128,128,128) );
+
+ pos = pos + moveDist;
+ }
+}
+
+void CGUITextureCacheBrowser::updateAbsolutePosition()
+{
+ IGUIWindow::updateAbsolutePosition();
+ updateImageList();
+}
+
+//! called if an event happened.
+bool CGUITextureCacheBrowser::OnEvent(const SEvent &event)
+{
+ switch(event.EventType)
+ {
+ case EET_GUI_EVENT:
+ if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST)
+ {
+ if (event.GUIEvent.Caller == (IGUIElement*)this)
+ Dragging = false;
+ return true;
+ }
+ else
+ if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED)
+ {
+ if (event.GUIEvent.Caller == CloseButton)
+ {
+ remove();
+ return true;
+ }
+ }
+ break;
+ case EET_MOUSE_INPUT_EVENT:
+ switch(event.MouseInput.Event)
+ {
+ case EMIE_LMOUSE_PRESSED_DOWN:
+ DragStart.X = event.MouseInput.X;
+ DragStart.Y = event.MouseInput.Y;
+
+ if (getElementFromPoint(DragStart) == this)
+ {
+ if (!Environment->hasFocus(this))
+ {
+ Dragging = IsDraggable;
+ //Environment->setFocus(this);
+ if (Parent)
+ Parent->bringToFront(this);
+ }
+ return true;
+ }
+ else
+ {
+ if (Panel->getAbsolutePosition().isPointInside(DragStart))
+ {
+ // select an image
+ IGUIElement* el = Panel->getElementFromPoint(DragStart);
+ if (el && el != Panel)
+ {
+ if (el->getType() == EGUIET_IMAGE)
+ {
+ setSelected(el->getID());
+ }
+ }
+ else
+ {
+ setSelected();
+ }
+ }
+ }
+ break;
+ case EMIE_LMOUSE_LEFT_UP:
+ Dragging = false;
+ //Environment->removeFocus(this);
+ return true;
+ case EMIE_MOUSE_MOVED:
+ if (Dragging)
+ {
+ // gui window should not be dragged outside its parent
+ if (Parent)
+ if (event.MouseInput.X < Parent->getAbsolutePosition().UpperLeftCorner.X +1 ||
+ event.MouseInput.Y < Parent->getAbsolutePosition().UpperLeftCorner.Y +1 ||
+ event.MouseInput.X > Parent->getAbsolutePosition().LowerRightCorner.X -1 ||
+ event.MouseInput.Y > Parent->getAbsolutePosition().LowerRightCorner.Y -1)
+
+ return true;
+
+
+ move(core::position2d(event.MouseInput.X - DragStart.X, event.MouseInput.Y - DragStart.Y));
+ DragStart.X = event.MouseInput.X;
+ DragStart.Y = event.MouseInput.Y;
+ return true;
+ }
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+
+ return Parent ? Parent->OnEvent(event) : false;
+}
+
+void CGUITextureCacheBrowser::setSelected(s32 index)
+{
+ SelectedTexture = index;
+ updateImageList();
+ printf("Texture %d selected\n", index);
+}
+
+void CGUITextureCacheBrowser::draw()
+{
+ if (!IsVisible)
+ return;
+
+ IGUISkin* skin = Environment->getSkin();
+
+ core::rect rect = AbsoluteRect;
+ core::rect *cl = &AbsoluteClippingRect;
+
+ // draw body fast
+ rect = skin->draw3DWindowBackground(this, true, skin->getColor(EGDC_ACTIVE_BORDER),
+ AbsoluteRect, &AbsoluteClippingRect);
+
+ // draw window text
+ if (Text.size())
+ {
+ rect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
+ rect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y);
+ rect.LowerRightCorner.X -= skin->getSize(EGDS_WINDOW_BUTTON_WIDTH) + 5;
+
+ IGUIFont* font = skin->getFont();
+ if (font)
+ font->draw(Text.c_str(), rect, skin->getColor(EGDC_ACTIVE_CAPTION), false, true, cl);
+ }
+
+ IGUIElement::draw();
+}
+
+
+bool CGUITextureCacheBrowser::isDraggable() const
+{
+ return IsDraggable;
+}
+
+void CGUITextureCacheBrowser::setDraggable(bool draggable)
+{
+ IsDraggable = draggable;
+
+ if (Dragging && !IsDraggable)
+ Dragging = false;
+}
+
+
+//! Returns the rectangle of the drawable area (without border, without titlebar and without scrollbars)
+core::rect CGUITextureCacheBrowser::getClientRect() const
+{
+ return core::recti();
+}
+
+} // namespace gui
+} // namespace irr
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.h
new file mode 100644
index 0000000..108d4d6
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CGUITextureCacheBrowser.h
@@ -0,0 +1,88 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt / Gaz Davidson
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __C_GUI_TEXTURE_CACHE_BROWSER_H_INCLUDED__
+#define __C_GUI_TEXTURE_CACHE_BROWSER_H_INCLUDED__
+
+#include "IGUIWindow.h"
+#include "CGUIPanel.h"
+#include "IGUIImage.h"
+#include "EGUIEditTypes.h"
+
+namespace irr
+{
+namespace gui
+{
+
+ //! Texture cache browser
+
+ const u32 TEXTURE_BROWSER_TEXTURE_SELECTED = 0x5E1EC7ED; // custom event number for texture selected
+
+ class CGUITextureCacheBrowser : public IGUIWindow
+ {
+ public:
+
+ //! constructor
+ CGUITextureCacheBrowser(IGUIEnvironment* environment, s32 id=-1, IGUIElement *parent=0);
+
+ //! destructor
+ ~CGUITextureCacheBrowser();
+
+ //! event handler
+ virtual bool OnEvent(const SEvent &event);
+
+ //! draws the element
+ virtual void draw();
+
+ //! update absolute position
+ virtual void updateAbsolutePosition();
+
+ //! this shoudln't be serialized, but this is included as it's an example
+ virtual const c8* getTypeName() const { return "textureCacheBrowser"; }
+
+ //! Returns pointer to the close button
+ virtual IGUIButton* getCloseButton() const { return CloseButton; }
+
+ //! Returns pointer to the minimize button
+ virtual IGUIButton* getMinimizeButton() const { return 0;}
+
+ //! Returns pointer to the maximize button
+ virtual IGUIButton* getMaximizeButton() const { return 0;}
+
+ //! get draggable
+ virtual bool isDraggable() const;
+
+ //! get draggable
+ virtual void setDraggable(bool draggable);
+
+ //! not used
+ virtual core::rect getClientRect() const;
+ virtual void setDrawBackground(bool draw) { }
+ virtual bool getDrawBackground() const { return true; }
+ virtual void setDrawTitlebar(bool draw) { }
+ virtual bool getDrawTitlebar() const { return true; }
+
+
+ void setSelected(s32 index=-1);
+
+ private:
+
+ void updateImageList();
+
+ core::array Images;
+ core::position2d DragStart;
+
+ IGUIButton* CloseButton;
+ CGUIPanel* Panel;
+ s32 SelectedTexture;
+ bool Dragging;
+ bool IsDraggable;
+ };
+
+
+} // end namespace gui
+} // end namespace irr
+
+#endif
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.cpp
new file mode 100644
index 0000000..0a69587
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.cpp
@@ -0,0 +1,95 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#include "CMemoryReadWriteFile.h"
+
+using namespace irr;
+using namespace io;
+
+CMemoryReadWriteFile::CMemoryReadWriteFile(const c8* filename)
+: Data(), FileName(filename), Pos(0)
+{
+}
+
+
+s32 CMemoryReadWriteFile::write(const void* buffer, u32 sizeToWrite)
+{
+ // no point in writing 0 bytes
+ if (sizeToWrite < 1)
+ return 0;
+
+ // expand size
+ if (Pos + sizeToWrite > Data.size())
+ Data.set_used(Pos+sizeToWrite);
+
+ // copy data
+ memcpy( (void*) &Data[Pos], buffer, (size_t) sizeToWrite);
+
+ Pos += sizeToWrite;
+
+ return sizeToWrite;
+
+}
+
+bool CMemoryReadWriteFile::seek(long finalPos, bool relativeMovement)
+{
+ if (relativeMovement)
+ {
+ if (finalPos + Pos < 0)
+ return 0;
+ else
+ Pos += finalPos;
+ }
+ else
+ {
+ Pos = finalPos;
+ }
+
+ if (Pos > (s32)Data.size())
+ Data.set_used(Pos+1);
+
+ return true;
+
+}
+
+const io::path& CMemoryReadWriteFile::getFileName() const
+{
+ return FileName;
+}
+
+long CMemoryReadWriteFile::getPos() const
+{
+ return Pos;
+}
+
+core::array& CMemoryReadWriteFile::getData()
+{
+ return Data;
+}
+
+
+long CMemoryReadWriteFile::getSize() const
+{
+ return Data.size();
+}
+
+
+s32 CMemoryReadWriteFile::read(void* buffer, u32 sizeToRead)
+{
+ // cant read past the end
+ if (Pos + sizeToRead >= Data.size())
+ sizeToRead = Data.size() - Pos;
+
+ // cant read 0 bytes
+ if (!sizeToRead)
+ return 0;
+
+ // copy data
+ memcpy( buffer, (void*) &Data[Pos], (size_t) sizeToRead);
+
+ Pos += sizeToRead;
+
+ return sizeToRead;
+}
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.h
new file mode 100644
index 0000000..de20ae7
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/CMemoryReadWriteFile.h
@@ -0,0 +1,73 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __C_MEMORY_READ_WRITE_FILE_H_INCLUDED__
+#define __C_MEMORY_READ_WRITE_FILE_H_INCLUDED__
+
+#include "IWriteFile.h"
+#include "IReadFile.h"
+#include "irrArray.h"
+#include "irrString.h"
+#include "memory.h"
+
+namespace irr
+{
+namespace io
+{
+
+ //! Provides write acess to an array as if it is a file.
+ class CMemoryReadWriteFile : public virtual IWriteFile, public virtual IReadFile
+ {
+ public:
+
+ CMemoryReadWriteFile(const c8* filename=0);
+
+ //! Reads an amount of bytes from the file.
+ //! \param buffer: Pointer to buffer of bytes to write.
+ //! \param sizeToWrite: Amount of bytes to wrtie to the file.
+ //! \return Returns how much bytes were written.
+ virtual s32 write(const void* buffer, u32 sizeToWrite);
+
+ //! Changes position in file, returns true if successful.
+ //! \param finalPos: Destination position in the file.
+ //! \param relativeMovement: If set to true, the position in the file is
+ //! changed relative to current position. Otherwise the position is changed
+ //! from begin of file.
+ //! \return Returns true if successful, otherwise false.
+ virtual bool seek(long finalPos, bool relativeMovement = false);
+
+ //! Returns size of file.
+ //! \return Returns the size of the file in bytes.
+ virtual long getSize() const;
+
+ //! Reads an amount of bytes from the file.
+ //! \param buffer: Pointer to buffer where to read bytes will be written to.
+ //! \param sizeToRead: Amount of bytes to read from the file.
+ //! \return Returns how much bytes were read.
+ virtual s32 read(void* buffer, u32 sizeToRead);
+
+ //! Returns the current position in the file.
+ //! \return Returns the current position in the file in bytes.
+ virtual long getPos() const;
+
+ //! Returns name of file.
+ //! \return Returns the file name as zero terminated character string.
+ virtual const io::path& getFileName() const;
+
+ //! Returns file data as an array
+ core::array& getData();
+
+ private:
+
+ core::array Data;
+ io::path FileName;
+ long Pos;
+ };
+
+
+
+} // end namespace io
+} // end namespace irr
+
+#endif // __C_MEMORY_READ_WRITE_FILE_H_INCLUDED__
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/EGUIEditTypes.h b/libraries/irrlicht-1.8.1/tools/GUIEditor/EGUIEditTypes.h
new file mode 100644
index 0000000..88d119e
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/EGUIEditTypes.h
@@ -0,0 +1,61 @@
+#ifndef __C_GUIEDIT_TYPES_H_INCLUDED__
+#define __C_GUIEDIT_TYPES_H_INCLUDED__
+
+#include "irrTypes.h"
+
+namespace irr {
+namespace gui {
+
+enum EGUIEDIT_ELEMENT_TYPES
+{
+ // GUI Editor
+ EGUIEDIT_GUIEDIT=0,
+ EGUIEDIT_GUIEDITWINDOW,
+ // Generic
+ EGUIEDIT_GUIPANEL,
+ EGUIEDIT_TEXTUREBROWSER,
+ // Attribute editors
+ EGUIEDIT_ATTRIBUTEEDITOR,
+ EGUIEDIT_STRINGATTRIBUTE,
+ EGUIEDIT_BOOLATTRIBUTE,
+ EGUIEDIT_ENUMATTRIBUTE,
+ EGUIEDIT_COLORATTRIBUTE,
+ EGUIEDIT_COLORFATTRIBUTE,
+ EGUIEDIT_TEXTUREATTRIBUTE,
+ // Dummy editor stubs
+ EGUIEDIT_CONTEXTMENUEDITOR,
+ EGUIEDIT_MENUEDITOR,
+ EGUIEDIT_FILEDIALOGEDITOR,
+ EGUIEDIT_COLORDIALOGEDITOR,
+ EGUIEDIT_MODALSCREENEDITOR,
+ // Count
+ EGUIEDIT_COUNT
+};
+
+const c8* const GUIEditElementTypeNames[] =
+{
+ "GUIEditor",
+ "GUIEditWindow",
+ "panel",
+ "textureCacheBrowser",
+ "attributeEditor",
+ "string_attribute",
+ "bool_attribute",
+ "enum_attribute",
+ "color_attribute",
+ "colorf_attribute",
+ "texture_attribute",
+ // dummy editors
+ "contextMenu_editor",
+ "menu_editor",
+ "fileOpenDialog_editor",
+ "colorSelectDialog_editor",
+ "modalScreen_editor",
+ 0
+};
+
+} // gui
+} // irr
+
+#endif
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.sln b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.sln
new file mode 100644
index 0000000..6f76269
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUI Editor", "GUI Editor.vcproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.vcproj b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.vcproj
new file mode 100644
index 0000000..81c6fa9
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v8.vcproj
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.sln b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.sln
new file mode 100644
index 0000000..0acf300
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUI Editor_v9", "GUI Editor_v9.vcproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.vcproj b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.vcproj
new file mode 100644
index 0000000..6d73d03
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_v9.vcproj
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj
new file mode 100644
index 0000000..7022876
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj
@@ -0,0 +1,213 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {853A396E-C031-4C26-A716-5B4E176BE11D}
+ GUI Editor
+ Win32Proj
+ GUIEditor
+
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ false
+ false
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ Full
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ ../../bin/Win32-visualstudio/GUIEditor.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+ Full
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ ../../bin/Win32-visualstudio/GUIEditor.exe
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {e08e042a-6c45-411b-92be-3cc31331019f}
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters
new file mode 100644
index 0000000..1d06fa4
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters
@@ -0,0 +1,88 @@
+
+
+
+
+ {f6ad9df9-ebaa-4c0f-997b-c8101c1fc669}
+
+
+ {7fd14cb1-d2e7-4fd0-85c1-68fc9d1249f7}
+
+
+ {ab2c3f3a-1d99-4619-b5df-47fdd9449f3f}
+
+
+ {740a4255-37cc-4ac4-94e9-f2f0970491a8}
+
+
+ {a28a0b21-3336-432f-9759-ff2dc064874a}
+
+
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui\GUIAttributes
+
+
+ gui\Useful GUI Elements
+
+
+ io
+
+
+
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\Useful GUI Elements
+
+
+ gui\Element Editors
+
+
+ io
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj
new file mode 100644
index 0000000..6c6f28b
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj
@@ -0,0 +1,217 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {853A396E-C031-4C26-A716-5B4E176BE11D}
+ GUI Editor
+ Win32Proj
+ GUIEditor
+
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ false
+ false
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ Full
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ ../../bin/Win32-visualstudio/GUIEditor.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+ Full
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ ../../bin/Win32-visualstudio/GUIEditor.exe
+ ..\..\lib\Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {e08e042a-6c45-411b-92be-3cc31331019f}
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters
new file mode 100644
index 0000000..1d06fa4
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters
@@ -0,0 +1,88 @@
+
+
+
+
+ {f6ad9df9-ebaa-4c0f-997b-c8101c1fc669}
+
+
+ {7fd14cb1-d2e7-4fd0-85c1-68fc9d1249f7}
+
+
+ {ab2c3f3a-1d99-4619-b5df-47fdd9449f3f}
+
+
+ {740a4255-37cc-4ac4-94e9-f2f0970491a8}
+
+
+ {a28a0b21-3336-432f-9759-ff2dc064874a}
+
+
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui\GUIAttributes
+
+
+ gui\Useful GUI Elements
+
+
+ io
+
+
+
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\GUIAttributes
+
+
+ gui\Useful GUI Elements
+
+
+ gui\Element Editors
+
+
+ io
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/GUIEditor_gcc.cbp b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUIEditor_gcc.cbp
new file mode 100644
index 0000000..2b57608
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/GUIEditor_gcc.cbp
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/Makefile b/libraries/irrlicht-1.8.1/tools/GUIEditor/Makefile
new file mode 100644
index 0000000..02f8189
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/Makefile
@@ -0,0 +1,43 @@
+# Irrlicht Engine GUIEditor Makefile
+Target = GUIEditor
+Sources = CGUIAttributeEditor.cpp CGUIEditFactory.cpp CGUIEditWindow.cpp CGUIEditWorkspace.cpp CGUIPanel.cpp CGUITextureCacheBrowser.cpp CMemoryReadWriteFile.cpp main.cpp
+
+CPPFLAGS = -I../../include -I/usr/X11R6/include
+CXXFLAGS = -Wall -O3 -ffast-math
+
+ifeq ($(HOSTTYPE), x86_64)
+LIBSELECT=64
+endif
+
+all: all_linux
+
+# target specific settings
+all_linux: SYSTEM=Linux
+all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/$(SYSTEM) -lIrrlicht -lGL -lXxf86vm -lXext -lX11
+
+all_win32 clean_win32: SYSTEM=Win32-gcc
+all_win32: LDFLAGS = -L../../lib/$(SYSTEM) -lIrrlicht -lopengl32 -lm
+
+# if you enable sound add the proper library for linking
+#LDFLAGS += -lIrrKlang
+#LDFLAGS += -laudiere
+#LDFLAGS += -lSDL_mixer -lSDL
+
+all_win32 clean_win32: SUF=.exe
+# name of the binary - only valid for targets which set SYSTEM
+DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF)
+
+OBJ = $(Sources:.cpp=.o)
+
+all_linux all_win32: $(OBJ)
+ $(warning Building...)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $(DESTPATH) $(LDFLAGS)
+
+clean: clean_linux clean_win32
+ $(warning Cleaning...)
+ @$(RM) $(OBJ)
+
+clean_linux clean_win32:
+ @$(RM) $(DESTPATH)
+
+.PHONY: all all_win32 clean clean_linux clean_win32
diff --git a/libraries/irrlicht-1.8.1/tools/GUIEditor/main.cpp b/libraries/irrlicht-1.8.1/tools/GUIEditor/main.cpp
new file mode 100644
index 0000000..e8434b2
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/GUIEditor/main.cpp
@@ -0,0 +1,76 @@
+#include
+#include "driverChoice.h"
+
+// include the gui creator element factory
+#include "CGUIEditFactory.h"
+
+using namespace irr;
+using namespace gui;
+
+#ifdef _MSC_VER
+#pragma comment(lib, "Irrlicht.lib")
+#endif
+
+int main()
+{
+ // ask user for driver
+ video::E_DRIVER_TYPE driverType=driverChoiceConsole();
+ if (driverType==video::EDT_COUNT)
+ return 1;
+
+ IrrlichtDevice *device = createDevice(driverType, core::dimension2du(800, 600));
+ video::IVideoDriver* driver = device->getVideoDriver();
+ scene::ISceneManager* smgr = device->getSceneManager();
+ gui::IGUIEnvironment *env = device->getGUIEnvironment();
+
+ device->setResizable(true);
+
+ /*
+ first we create the factory which can make new GUI elements
+ and register it with the gui environment.
+ */
+
+ IGUIElementFactory* factory = new CGUIEditFactory(env);
+ env->registerGUIElementFactory(factory);
+ // remember to drop since we created with a create call
+ factory->drop();
+
+ IGUISkin *skin = env->createSkin(EGST_WINDOWS_METALLIC);
+ env->setSkin(skin);
+
+ IGUIFont *font = env->getFont("../../media/lucida.xml");
+ if (font)
+ skin->setFont(font);
+ skin->drop();
+
+ // change transparency of skin
+ for (s32 i=0; igetSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);
+ col.setAlpha(250);
+ env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col);
+ }
+
+ /*
+ now we add the GUI Editor Workspace
+ */
+
+ env->addGUIElement("GUIEditor");
+
+ while(device->run())
+ {
+ device->sleep(10);
+
+ if (device->isWindowActive())
+ {
+ driver->beginScene(true, true, video::SColor(0,200,200,200));
+ smgr->drawAll();
+ env->drawAll();
+ driver->endScene();
+ }
+ }
+
+ device->drop();
+
+ return 0;
+}
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.cpp b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.cpp
new file mode 100644
index 0000000..780e9b0
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.cpp
@@ -0,0 +1,801 @@
+#include "CFontTool.h"
+#include "IXMLWriter.h"
+
+using namespace irr;
+
+const int fontsizes[] = {4,6,8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,56,68,72,0};
+
+inline u32 getTextureSizeFromSurfaceSize(u32 size)
+{
+ u32 ts = 0x01;
+ while(ts < size)
+ ts <<= 1;
+
+ return ts;
+}
+
+// windows specific
+#ifdef _IRR_WINDOWS_
+
+ const DWORD charsets[] = { ANSI_CHARSET, DEFAULT_CHARSET, OEM_CHARSET, BALTIC_CHARSET, GB2312_CHARSET, CHINESEBIG5_CHARSET,
+ EASTEUROPE_CHARSET, GREEK_CHARSET, HANGUL_CHARSET, MAC_CHARSET, RUSSIAN_CHARSET,
+ SHIFTJIS_CHARSET, SYMBOL_CHARSET, TURKISH_CHARSET, VIETNAMESE_CHARSET, JOHAB_CHARSET,
+ ARABIC_CHARSET, HEBREW_CHARSET, THAI_CHARSET, 0};
+
+ const wchar_t *setnames[] = {L"ANSI", L"All Available", L"OEM", L"Baltic", L"Chinese Simplified", L"Chinese Traditional",
+ L"Eastern European", L"Greek", L"Hangul", L"Macintosh", L"Russian",
+ L"Japanese", L"Symbol", L"Turkish", L"Vietnamese", L"Johab",
+ L"Arabic", L"Hebrew", L"Thai", 0};
+
+ // callback for adding font names
+ int CALLBACK EnumFontFamExProc( ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme,
+ DWORD FontType, LPARAM lParam)
+ {
+ CFontTool* t = (CFontTool*) lParam;
+ t->FontNames.push_back( core::stringw(lpelfe->elfFullName));
+ return 1;
+ }
+
+ //
+ // Constructor
+ //
+
+ CFontTool::CFontTool(IrrlichtDevice* device) : FontSizes(fontsizes),
+ Device(device), UseAlphaChannel(false),
+ // win specific
+ dc(0)
+ {
+ // init display context
+ dc = CreateDC(L"DISPLAY", L"DISPLAY", 0 ,0 );
+
+ // populate list of available character set names
+ for (int i=0; setnames[i] != 0; ++i)
+ CharSets.push_back( core::stringw(setnames[i]));
+
+ selectCharSet(0);
+ }
+
+ void CFontTool::selectCharSet(u32 currentCharSet)
+ {
+ if ( currentCharSet >= CharSets.size() )
+ return;
+
+ LOGFONTW lf;
+ lf.lfFaceName[0] = L'\0';
+ lf.lfCharSet = (BYTE) charsets[currentCharSet];
+ // HRESULT hr; // no error checking(!)
+
+ // clear font list
+ FontNames.clear();
+
+ // create list of available fonts
+ EnumFontFamiliesExW( dc, (LPLOGFONTW) &lf, (FONTENUMPROCW) EnumFontFamExProc, (LPARAM) this, 0);
+ }
+
+ bool CFontTool::makeBitmapFont(u32 fontIndex, u32 charsetIndex, s32 fontSize, u32 textureWidth, u32 textureHeight, bool bold, bool italic, bool aa, bool alpha)
+ {
+ if (fontIndex >= FontNames.size() || charsetIndex >= CharSets.size() )
+ return false;
+
+ UseAlphaChannel = alpha;
+ u32 currentImage = 0;
+
+ // create the font
+ HFONT font = CreateFontW(
+ -MulDiv(fontSize, GetDeviceCaps(dc, LOGPIXELSY), 72), 0,
+ 0,0,
+ bold ? FW_BOLD : 0,
+ italic, 0,0, charsets[charsetIndex], 0,0,
+ aa ? ANTIALIASED_QUALITY : 0,
+ 0, FontNames[fontIndex].c_str() );
+
+ if (!font)
+ return false;
+
+ SelectObject(dc, font);
+ SetTextAlign (dc,TA_LEFT | TA_TOP | TA_NOUPDATECP);
+
+ // get rid of the current textures/images
+ for (u32 i=0; idrop();
+ currentTextures.clear();
+
+ for (u32 i=0; idrop();
+ currentImages.clear();
+
+ // clear current image mappings
+ CharMap.clear();
+ // clear array
+ Areas.clear();
+
+ // get information about this font's unicode ranges.
+ s32 size = GetFontUnicodeRanges( dc, 0);
+ c8 *buf = new c8[size];
+ LPGLYPHSET glyphs = (LPGLYPHSET)buf;
+
+ GetFontUnicodeRanges( dc, glyphs);
+
+ // s32 TotalCharCount = glyphs->cGlyphsSupported;
+
+ s32 currentx=0, currenty=0, maxy=0;
+
+ for (u32 range=0; range < glyphs->cRanges; range++)
+ {
+ WCRANGE* current = &glyphs->ranges[range];
+
+ //maxy=0;
+
+ // loop through each glyph and write its size and position
+ for (s32 ch=current->wcLow; ch< current->wcLow + current->cGlyphs; ch++)
+ {
+ wchar_t currentchar = ch;
+
+ if ( IsDBCSLeadByte((BYTE) ch))
+ continue; // surragate pairs unsupported
+
+ // get the dimensions
+ SIZE size;
+ ABC abc;
+ GetTextExtentPoint32W(dc, ¤tchar, 1, &size);
+ SFontArea fa;
+ fa.underhang = 0;
+ fa.overhang = 0;
+
+ if (GetCharABCWidthsW(dc, currentchar, currentchar, &abc)) // for unicode fonts, get overhang, underhang, width
+ {
+ size.cx = abc.abcB;
+ fa.underhang = abc.abcA;
+ fa.overhang = abc.abcC;
+
+ if (abc.abcB-abc.abcA+abc.abcC<1)
+ continue; // nothing of width 0
+ }
+ if (size.cy < 1)
+ continue;
+
+ //GetGlyphOutline(dc, currentchar, GGO_METRICS, &gm, 0, 0, 0);
+
+ //size.cx++; size.cy++;
+
+ // wrap around?
+ if (currentx + size.cx > (s32) textureWidth)
+ {
+ currenty += maxy;
+ currentx = 0;
+ if ((u32)(currenty + maxy) > textureHeight)
+ {
+ currentImage++; // increase Image count
+ currenty=0;
+ }
+ maxy = 0;
+ }
+ // add this char dimension to the current map
+
+ fa.rectangle = core::rect(currentx, currenty, currentx + size.cx, currenty + size.cy);
+ fa.sourceimage = currentImage;
+
+ CharMap.insert(currentchar, Areas.size());
+ Areas.push_back( fa );
+
+ currentx += size.cx +1;
+
+ if (size.cy+1 > maxy)
+ maxy = size.cy+1;
+ }
+ }
+ currenty += maxy;
+
+ u32 lastTextureHeight = getTextureSizeFromSurfaceSize(currenty);
+
+ // delete the glyph set
+ delete [] buf;
+
+ currentImages.set_used(currentImage+1);
+ currentTextures.set_used(currentImage+1);
+
+ for (currentImage=0; currentImage < currentImages.size(); ++currentImage)
+ {
+ core::stringc logmsg = "Creating image ";
+ logmsg += (s32) (currentImage+1);
+ logmsg += " of ";
+ logmsg += (s32) currentImages.size();
+ Device->getLogger()->log(logmsg.c_str());
+ // no need for a huge final texture
+ u32 texHeight = textureHeight;
+ if (currentImage == currentImages.size()-1 )
+ texHeight = lastTextureHeight;
+
+ // make a new bitmap
+ HBITMAP bmp = CreateCompatibleBitmap(dc, textureWidth, texHeight);
+ HDC bmpdc = CreateCompatibleDC(dc);
+
+ LOGBRUSH lbrush;
+ lbrush.lbColor = RGB(0,0,0);
+ lbrush.lbHatch = 0;
+ lbrush.lbStyle = BS_SOLID;
+
+ HBRUSH brush = CreateBrushIndirect(&lbrush);
+ HPEN pen = CreatePen(PS_NULL, 0, 0);
+
+ HGDIOBJ oldbmp = SelectObject(bmpdc, bmp);
+ HGDIOBJ oldbmppen = SelectObject(bmpdc, pen);
+ HGDIOBJ oldbmpbrush = SelectObject(bmpdc, brush);
+ HGDIOBJ oldbmpfont = SelectObject(bmpdc, font);
+
+ SetTextColor(bmpdc, RGB(255,255,255));
+
+ Rectangle(bmpdc, 0,0,textureWidth,texHeight);
+ SetBkMode(bmpdc, TRANSPARENT);
+
+ // draw the letters...
+
+ // iterate through the tree
+ core::map::Iterator it = CharMap.getIterator();
+ while (!it.atEnd())
+ {
+ s32 currentArea = (*it).getValue();
+ wchar_t wch = (*it).getKey();
+ // sloppy but I couldnt be bothered rewriting it
+ if (Areas[currentArea].sourceimage == currentImage)
+ {
+ // draw letter
+ s32 sx = Areas[currentArea].rectangle.UpperLeftCorner.X - Areas[currentArea].underhang;
+ TextOutW(bmpdc, sx, Areas[currentArea].rectangle.UpperLeftCorner.Y, &wch, 1);
+
+ // if ascii font...
+ //SetPixel(bmpdc, Areas[currentArea].rectangle.UpperLeftCorner.X, Areas[currentArea].rectangle.UpperLeftCorner.Y, RGB(255,255,0));// left upper corner mark
+ }
+ it++;
+ }
+
+ // copy the font bitmap into a new irrlicht image
+ BITMAP b;
+ PBITMAPINFO pbmi;
+ WORD cClrBits;
+ u32 cformat;
+
+ // Retrieve the bitmap color format, width, and height.
+ GetObject(bmp, sizeof(BITMAP), (LPSTR)&b);
+
+ // Convert the color format to a count of bits.
+ cClrBits = (WORD)(b.bmPlanes * b.bmBitsPixel);
+
+ if (cClrBits <= 8) // we're not supporting these
+ cformat = -1;
+ else if (cClrBits <= 16)
+ cformat = video::ECF_A1R5G5B5;
+ else if (cClrBits <= 24)
+ cformat = video::ECF_R8G8B8;
+ else
+ cformat = video::ECF_A8R8G8B8;
+
+ pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
+ sizeof(BITMAPINFOHEADER));
+
+ // Initialize the fields in the BITMAPINFO structure.
+
+ pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbmi->bmiHeader.biWidth = b.bmWidth;
+ pbmi->bmiHeader.biHeight = b.bmHeight;
+ pbmi->bmiHeader.biPlanes = b.bmPlanes;
+ pbmi->bmiHeader.biBitCount = b.bmBitsPixel;
+
+ // If the bitmap is not compressed, set the BI_RGB flag.
+ pbmi->bmiHeader.biCompression = BI_RGB;
+
+ // Compute the number of bytes in the array of color
+ // indices and store the result in biSizeImage.
+ // For Windows NT, the width must be DWORD aligned unless
+ // the bitmap is RLE compressed. This example shows this.
+ // For Windows 95/98/Me, the width must be WORD aligned unless the
+ // bitmap is RLE compressed.
+ pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
+ * pbmi->bmiHeader.biHeight;
+ // Set biClrImportant to 0, indicating that all of the
+ // device colors are important.
+ pbmi->bmiHeader.biClrImportant = 0;
+
+ LPBYTE lpBits; // memory pointer
+
+ PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER) pbmi;
+ lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
+
+ GetDIBits(dc, bmp, 0, (WORD) pbih->biHeight, lpBits, pbmi, DIB_RGB_COLORS);
+
+ // DEBUG- copy to clipboard
+ //OpenClipboard(hWnd);
+ //EmptyClipboard();
+ //SetClipboardData(CF_BITMAP, bmp);
+ //CloseClipboard();
+
+ // flip bitmap
+ s32 rowsize = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8;
+ c8 *row = new c8[rowsize];
+ for (s32 i=0; i < (pbih->biHeight/2); ++i)
+ {
+ // grab a row
+ memcpy(row, lpBits + (rowsize * i), rowsize);
+ // swap row
+ memcpy(lpBits + (rowsize * i), lpBits + ((pbih->biHeight-1 -i) * rowsize ) , rowsize);
+ memcpy(lpBits + ((pbih->biHeight-1 -i) * rowsize ), row , rowsize);
+ }
+
+ bool ret = false;
+
+ if (cformat == video::ECF_A8R8G8B8)
+ {
+ // in this case the font should have an alpha channel, but since windows doesn't draw one
+ // we have to set one manually by going through all the pixels.. *sigh*
+
+ u8* m;
+ for (m = lpBits; m < lpBits + pbih->biSizeImage; m+=4)
+ {
+ if (UseAlphaChannel)
+ {
+ if (m[0] > 0) // pixel has colour
+ {
+ m[3]=m[0]; // set alpha
+ m[0]=m[1]=m[2] = 255; // everything else is full
+ }
+ }
+ else
+ m[3]=255; // all pixels are full alpha
+ }
+
+ }
+ else if (cformat == video::ECF_A1R5G5B5)
+ {
+ u8* m;
+ for (m = lpBits; m < lpBits + pbih->biSizeImage; m+=2)
+ {
+ WORD *p = (WORD*)m;
+ if (m[0] > 0 || !UseAlphaChannel) // alpha should be set
+ *p |= 0x8000; // set alpha bit
+ }
+ }
+ else
+ {
+ cformat = -1;
+ }
+
+ // make a texture from the image
+ if (cformat != -1)
+ {
+ // turn mip-mapping off
+ bool b = Device->getVideoDriver()->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS);
+ currentImages[currentImage] = Device->getVideoDriver()->createImageFromData((video::ECOLOR_FORMAT)cformat, core::dimension2d(textureWidth,texHeight), (void*)lpBits);
+ Device->getVideoDriver()->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS,b);
+ }
+ else
+ {
+ Device->getLogger()->log("Couldn't create font, your pixel format is unsupported.");
+ }
+
+ // free memory and windows resources
+ // sloppy I know, but I only intended to create one image at first.
+ delete [] row;
+ LocalFree(pbmi);
+ GlobalFree(lpBits);
+ DeleteDC(bmpdc);
+ DeleteObject(brush);
+ DeleteObject(pen);
+ DeleteObject(bmp);
+
+ if (currentImages[currentImage])
+ {
+ // add texture
+ currentTextures[currentImage] = Device->getVideoDriver()->addTexture("GUIFontImage",currentImages[currentImage]);
+ currentTextures[currentImage]->grab();
+ }
+ else
+ {
+ Device->getLogger()->log("Something went wrong, aborting.");
+ // drop all images
+ DeleteObject(font);
+ return false;
+ }
+ } // looping through each texture
+ DeleteObject(font);
+ return true;
+ }
+
+#else
+
+ CFontTool::CFontTool(IrrlichtDevice *device) : FontSizes(fontsizes), Device(device), UseAlphaChannel(false)
+ {
+ if (!XftInitFtLibrary())
+ {
+ core::stringc logmsg = "XFT not found\n";
+ Device->getLogger()->log(logmsg.c_str());
+ exit(EXIT_FAILURE);
+ }
+
+ /* Get a list of the font foundries, storing them in a set to sort */
+ std::set foundries;
+ Display* display = (Display*)Device->getVideoDriver()->getExposedVideoData().OpenGLLinux.X11Display;
+ XftFontSet* fonts = XftListFonts(display, DefaultScreen(display), 0, XFT_FOUNDRY, 0);
+ for (int i = 0; i < fonts->nfont; i++)
+ {
+ char *foundry;
+ XftPatternGetString(fonts->fonts[i], XFT_FOUNDRY, 0, &foundry);
+ core::stringw tmp(foundry);
+ foundries.insert(tmp);
+ }
+ XftFontSetDestroy(fonts);
+
+ /* Copy the sorted list into the array */
+ CharSets.clear();
+ for (std::set::iterator i = foundries.begin(); i != foundries.end(); i++)
+ CharSets.push_back((*i).c_str());
+ selectCharSet(0);
+ }
+
+ /* Note: There must be some trick for using strings as pattern parameters to XftListFonts because
+ no matter how I specify a string, I end up with an intermittent segfault. Since XftFontList is
+ just calling FcFontList, that's what I'll do too since that works OK */
+ void CFontTool::selectCharSet(u32 currentCharSet)
+ {
+ /* Get a list of the font families, storing them in a set to sort */
+ char foundry[256];
+ sprintf(&foundry[0],"%ls",CharSets[currentCharSet].c_str());
+ std::set families;
+ XftPattern *pattern = FcPatternCreate();
+ XftPatternAddString(pattern, FC_FOUNDRY, &foundry[0]);
+ XftObjectSet *objectset = FcObjectSetCreate();
+ XftObjectSetAdd(objectset, XFT_FOUNDRY);
+ XftObjectSetAdd(objectset, XFT_FAMILY);
+ FcFontSet *fonts = FcFontList(NULL, pattern, objectset);
+
+ for (int i = 0; i < fonts->nfont; i++)
+ {
+ char* ptr;
+ XftPatternGetString(fonts->fonts[i], XFT_FAMILY, 0, &ptr);
+ core::stringw family(ptr);
+ families.insert(family);
+ }
+ XftPatternDestroy(pattern);
+ FcObjectSetDestroy(objectset);
+
+ /* Copy the sorted list into the array */
+ FontNames.clear();
+ for (std::set::iterator i = families.begin(); i != families.end(); i++)
+ FontNames.push_back((*i).c_str());
+ }
+
+ bool CFontTool::makeBitmapFont(u32 fontIndex, u32 charsetIndex, s32 fontSize, u32 textureWidth, u32 textureHeight, bool bold, bool italic, bool aa, bool alpha)
+ {
+ if (fontIndex >= FontNames.size() || charsetIndex >= CharSets.size() )
+ return false;
+
+ Display *display = (Display*) Device->getVideoDriver()->getExposedVideoData().OpenGLLinux.X11Display;
+ u32 screen = DefaultScreen(display);
+ Window win = RootWindow(display, screen);
+ Visual *visual = DefaultVisual(display, screen);
+ UseAlphaChannel = alpha;
+ u32 currentImage = 0;
+
+ XftResult result;
+ XftPattern *request = XftPatternCreate();
+ char foundry[256], family[256];
+ sprintf(&foundry[0],"%ls",CharSets[charsetIndex].c_str());
+ sprintf(&family[0],"%ls",FontNames[fontIndex].c_str());
+ XftPatternAddString(request, XFT_FOUNDRY, &foundry[0]);
+ XftPatternAddString(request, XFT_FAMILY, &family[0]);
+ XftPatternAddInteger(request, XFT_PIXEL_SIZE, fontSize);
+ XftPatternAddInteger(request, XFT_WEIGHT, bold ? XFT_WEIGHT_BLACK : XFT_WEIGHT_LIGHT);
+ XftPatternAddInteger(request, XFT_SLANT, italic ? XFT_SLANT_ITALIC : XFT_SLANT_ROMAN);
+ XftPatternAddBool(request, XFT_ANTIALIAS, aa);
+
+ /* Find the closest font that matches the user choices and open it and check if the returned
+ font has anti aliasing enabled by default, even if it wasn't requested */
+ FcBool aaEnabled;
+ XftPattern *found = XftFontMatch(display, DefaultScreen(display), request, &result);
+ XftPatternGetBool(found, XFT_ANTIALIAS, 0, &aaEnabled);
+ aa = aaEnabled;
+ XftFont *font = XftFontOpenPattern(display, found);
+
+ // get rid of the current textures/images
+ for (u32 i=0; idrop();
+ currentTextures.clear();
+ for (u32 i=0; idrop();
+ currentImages.clear();
+ CharMap.clear();
+ Areas.clear();
+
+ /* Calculate the max height of the font. Annoyingly, it seems that the height property of the font
+ is the maximum height of any single character, but a string of characters, aligned along their
+ baselines, can exceed this figure. Because I don't know any better way of doing it, I'm going to
+ have to use the brute force method.
+
+ Note: There will be a certain number of charters in a font, however they may not be grouped
+ consecutively, and could in fact be spread out with many gaps */
+ u32 maxY = 0;
+ u32 charsFound = 0;
+ for (FT_UInt charCode = 0; charsFound < FcCharSetCount(font->charset); charCode++)
+ {
+ if (!XftCharExists(display, font, charCode))
+ continue;
+
+ charsFound++;
+
+ XGlyphInfo extents;
+ XftTextExtents32(display, font, &charCode, 1, &extents);
+ if ((extents.xOff <= 0) && (extents.height <= 0))
+ continue;
+
+ /* Calculate the width and height, adding 1 extra pixel if anti aliasing is enabled */
+ u32 chWidth = extents.xOff + (aa ? 1 : 0);
+ u32 chHeight = (font->ascent - extents.y + extents.height) + (aa ? 1 : 0);
+ if (chHeight > maxY)
+ maxY = chHeight;
+
+ /* Store the character details here */
+ SFontArea fontArea;
+ fontArea.rectangle = core::rect(0, 0, chWidth, chHeight);
+ CharMap.insert(charCode, Areas.size());
+ Areas.push_back(fontArea);
+ }
+ core::stringc logmsg = "Found ";
+ logmsg += (s32) (CharMap.size() + 1);
+ logmsg += " characters";
+ Device->getLogger()->log(logmsg.c_str());
+
+ /* Get the size of the chars and allocate them a position on a texture. If the next character that
+ is added would be outside the width or height of the texture, then a new texture is added */
+ u32 currentX = 0, currentY = 0, rowY = 0;
+ for (core::map::Iterator it = CharMap.getIterator(); !it.atEnd(); it++)
+ {
+ s32 currentArea = (*it).getValue();
+ SFontArea *fontArea = &Areas[currentArea];
+ u32 chWidth = fontArea->rectangle.LowerRightCorner.X;
+ u32 chHeight = fontArea->rectangle.LowerRightCorner.Y;
+
+ /* If the width of this char will exceed the textureWidth then start a new row */
+ if ((currentX + chWidth) > textureWidth)
+ {
+ currentY += rowY;
+ currentX = 0;
+
+ /* If the new row added to the texture exceeds the textureHeight then start a new texture */
+ if ((currentY + rowY) > textureHeight)
+ {
+ currentImage++;
+ currentY = 0;
+ }
+ rowY = 0;
+ }
+
+ /* Update the area with the current x and y and texture */
+ fontArea->rectangle = core::rect(currentX, currentY, currentX + chWidth, currentY + chHeight);
+ fontArea->sourceimage = currentImage;
+ currentX += chWidth + 1;
+ if (chHeight + 1 > rowY)
+ rowY = chHeight + 1;
+ }
+
+ /* The last row of chars and the last texture weren't accounted for in the loop, so add them here */
+ currentY += rowY;
+ u32 lastTextureHeight = getTextureSizeFromSurfaceSize(currentY);
+ currentImages.set_used(currentImage + 1);
+ currentTextures.set_used(currentImage + 1);
+
+ /* Initialise colours */
+ XftColor colFore, colBack;
+ XRenderColor xFore = {0xffff, 0xffff, 0xffff, 0xffff};
+ XRenderColor xBack = {0x0000, 0x0000, 0x0000, 0xffff};
+ XftColorAllocValue(display, DefaultVisual(display, screen), DefaultColormap(display, screen), &xFore, &colFore);
+ XftColorAllocValue(display, DefaultVisual(display, screen), DefaultColormap(display, screen), &xBack, &colBack);
+
+ /* Create a pixmap that is large enough to hold any character in the font */
+ Pixmap pixmap = XCreatePixmap(display, win, textureWidth, maxY, DefaultDepth(display, screen));
+ XftDraw *draw = XftDrawCreate(display, pixmap, visual, DefaultColormap(display, screen));
+
+ /* Render the chars */
+ for (currentImage = 0; currentImage < currentImages.size(); ++currentImage)
+ {
+ core::stringc logmsg = "Creating image ";
+ logmsg += (s32) (currentImage+1);
+ logmsg += " of ";
+ logmsg += (s32) currentImages.size();
+ Device->getLogger()->log(logmsg.c_str());
+
+ /* The last texture that is saved is vertically shrunk to fit the characters drawn on it */
+ u32 texHeight = textureHeight;
+ if (currentImage == currentImages.size() - 1)
+ texHeight = lastTextureHeight;
+
+ /* The texture that holds this "page" of characters */
+ currentImages[currentImage] = Device->getVideoDriver()->createImage(video::ECF_A8R8G8B8, core::dimension2du(textureWidth, texHeight));
+ currentImages[currentImage]->fill(video::SColor(alpha ? 0 : 255,0,0,0));
+
+ for (core::map::Iterator it = CharMap.getIterator(); !it.atEnd(); it++)
+ {
+ FcChar32 wch = (*it).getKey();
+ s32 currentArea = (*it).getValue();
+ if (Areas[currentArea].sourceimage == currentImage)
+ {
+ SFontArea *fontArea = &Areas[currentArea];
+ u32 chWidth = fontArea->rectangle.LowerRightCorner.X - fontArea->rectangle.UpperLeftCorner.X;
+ u32 chHeight = fontArea->rectangle.LowerRightCorner.Y - fontArea->rectangle.UpperLeftCorner.Y;
+
+ /* Draw the glyph onto the pixmap */
+ XGlyphInfo extents;
+ XftDrawRect(draw, &colBack, 0, 0, chWidth, chHeight);
+ XftTextExtents32(display, font, &wch, 1, &extents);
+ XftDrawString32(draw, &colFore, font, extents.x, extents.y, &wch, 1);
+
+ /* Convert the pixmap into an image, then copy it onto the Irrlicht texture, pixel by pixel.
+ There's bound to be a faster way, but this is adequate */
+ u32 xDest = fontArea->rectangle.UpperLeftCorner.X;
+ u32 yDest = fontArea->rectangle.UpperLeftCorner.Y + font->ascent - extents.y;
+ XImage *image = XGetImage(display, pixmap, 0, 0, chWidth, chHeight, 0xffffff, XYPixmap);
+ if (image)
+ {
+ for (u32 ySrc = 0; ySrc < chHeight; ySrc++)
+ for (u32 xSrc = 0; xSrc < chWidth; xSrc++)
+ {
+ /* Get the pixel colour and break it down into rgb components */
+ u32 col = XGetPixel(image, xSrc, ySrc);
+ u32 a = 255;
+ u32 r = col & visual->red_mask;
+ u32 g = col & visual->green_mask;
+ u32 b = col & visual->blue_mask;
+ while (r > 0xff) r >>= 8;
+ while (g > 0xff) g >>= 8;
+ while (b > 0xff) b >>= 8;
+
+ /* To make the background transparent, set the colour to 100% white and the alpha to
+ the average of the three rgb colour components to maintain the anti-aliasing */
+ if (alpha)
+ {
+ a = (r + g + b) / 3;
+ r = 255;
+ g = 255;
+ b = 255;
+ }
+ currentImages[currentImage]->setPixel(xDest + xSrc,yDest + ySrc,video::SColor(a,r,g,b));
+ }
+ image->f.destroy_image(image);
+ }
+ }
+ }
+
+ /* Add the texture to the list */
+ currentTextures[currentImage] = Device->getVideoDriver()->addTexture("GUIFontImage",currentImages[currentImage]);
+ currentTextures[currentImage]->grab();
+ }
+
+ XftColorFree (display, visual, DefaultColormap(display, screen), &colFore);
+ XftColorFree (display, visual, DefaultColormap(display, screen), &colBack);
+ XftFontClose(display,font);
+ XftPatternDestroy(request);
+ XftDrawDestroy(draw);
+ XFreePixmap(display, pixmap);
+ return true;
+ }
+#endif
+
+ CFontTool::~CFontTool()
+ {
+#ifdef _IRR_WINDOWS_
+ // destroy display context
+ if (dc)
+ DeleteDC(dc);
+#endif
+
+ // drop textures+images
+ for (u32 i=0; idrop();
+ currentTextures.clear();
+
+ for (u32 i=0; idrop();
+ currentImages.clear();
+ }
+
+bool CFontTool::saveBitmapFont(const c8 *filename, const c8* format)
+{
+ if (currentImages.size() == 0)
+ {
+ Device->getLogger()->log("No image data to write, aborting.");
+ return false;
+ }
+
+ core::stringc fn = filename;
+ core::stringc imagename = filename;
+ fn += ".xml";
+
+ io::IXMLWriter *writer = Device->getFileSystem()->createXMLWriter(fn.c_str());
+
+ // header and line breaks
+ writer->writeXMLHeader();
+ writer->writeLineBreak();
+
+ // write information
+ writer->writeElement(L"font", false, L"type", L"bitmap");
+ writer->writeLineBreak();
+ writer->writeLineBreak();
+
+ // write images and link to them
+ for (u32 i=0; igetVideoDriver()->writeImageToFile(currentImages[i],imagename.c_str());
+
+ writer->writeElement(L"Texture", true,
+ L"index", core::stringw(i).c_str(),
+ L"filename", core::stringw(imagename.c_str()).c_str(),
+ L"hasAlpha", UseAlphaChannel ? L"true" : L"false");
+ writer->writeLineBreak();
+ }
+
+ writer->writeLineBreak();
+
+ // write each character
+ core::map::Iterator it = CharMap.getIterator();
+ while (!it.atEnd())
+ {
+ SFontArea &fa = Areas[(*it).getValue()];
+
+ wchar_t c[2];
+ c[0] = (*it).getKey();
+ c[1] = L'\0';
+ core::stringw area, under, over, image;
+ area = core::stringw(fa.rectangle.UpperLeftCorner.X);
+ area += L", ";
+ area += fa.rectangle.UpperLeftCorner.Y;
+ area += L", ";
+ area += fa.rectangle.LowerRightCorner.X;
+ area += L", ";
+ area += fa.rectangle.LowerRightCorner.Y;
+
+ core::array names;
+ core::array values;
+ names.clear();
+ values.clear();
+ // char
+ names.push_back(core::stringw(L"c"));
+ values.push_back(core::stringw(c));
+ // image number
+ if (fa.sourceimage != 0)
+ {
+ image = core::stringw(fa.sourceimage);
+ names.push_back(core::stringw(L"i"));
+ values.push_back(image);
+ }
+ // rectangle
+ names.push_back(core::stringw(L"r"));
+ values.push_back(area);
+
+ if (fa.underhang != 0)
+ {
+ under = core::stringw(fa.underhang);
+ names.push_back(core::stringw(L"u"));
+ values.push_back(under);
+ }
+ if (fa.overhang != 0)
+ {
+ over = core::stringw(fa.overhang);
+ names.push_back(core::stringw(L"o"));
+ values.push_back(over);
+ }
+ writer->writeElement(L"c", true, names, values);
+
+ writer->writeLineBreak();
+ it++;
+ }
+
+ writer->writeClosingTag(L"font");
+
+ writer->drop();
+
+ Device->getLogger()->log("Bitmap font saved.");
+
+ return true;
+}
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.h b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.h
new file mode 100644
index 0000000..5a35938
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CFontTool.h
@@ -0,0 +1,78 @@
+#ifndef __IRR_FONT_TOOL_INCLUDED__
+#define __IRR_FONT_TOOL_INCLUDED__
+
+
+#include "irrlicht.h"
+
+#if defined(_IRR_WINDOWS_)
+ #ifdef _MBCS
+ #undef _MBCS
+ #endif
+
+ #define UNICODE
+ #define _WIN32_WINNT 0x0500
+ #include "windows.h"
+#else
+ #ifdef _IRR_COMPILE_WITH_X11_
+ #include
+ #endif
+ #include
+ #include
+#endif
+
+
+namespace irr {
+ class CFontTool : public irr::IReferenceCounted
+ {
+ public:
+ CFontTool(irr::IrrlichtDevice* device);
+ ~CFontTool();
+
+ virtual bool makeBitmapFont(u32 fontIndex, u32 charsetIndex,
+ s32 fontSize, u32 texturewidth, u32 textureHeight,
+ bool bold, bool italic, bool aa, bool alpha);
+
+ virtual bool saveBitmapFont(const c8* filename, const c8* format);
+
+ virtual void selectCharSet(u32 currentCharSet);
+
+ struct SFontArea
+ {
+ SFontArea() : rectangle(), underhang(0), overhang(0), sourceimage(0) {}
+ core::rect rectangle;
+ s32 underhang;
+ s32 overhang;
+ u32 sourceimage;
+ };
+
+ /* struct SFontMap
+ {
+ SFontMap() : areas(), start(0), count(0) {}
+ core::array< SFontArea > areas;
+ s32 start;
+ s32 count;
+ };*/
+
+
+
+ core::array FontNames;
+ core::array CharSets;
+ //core::array Mappings;
+ core::array Areas;
+ core::map CharMap;
+
+ core::array currentTextures;
+ core::array currentImages;
+ const int *FontSizes;
+ IrrlichtDevice *Device;
+
+ bool UseAlphaChannel;
+
+ // windows
+ #ifdef _IRR_WINDOWS_
+ HDC dc;
+ #endif
+
+ };
+}
+#endif // __IRR_FONT_TOOL_INCLUDED__
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CVectorFontTool.h b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CVectorFontTool.h
new file mode 100644
index 0000000..05a9c79
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/CVectorFontTool.h
@@ -0,0 +1,1199 @@
+/*
+ Vector font tool - Gaz Davidson December 2006-2012
+
+ I noticed bitmap fonts were taking massive amounts of video memory at reasonable sizes,
+ so I decided to make a vector font. I always wanted to try converting pixels to triangles...
+
+ And I failed! This is a collection of the ugliest, bloated, most inneficient algorithms
+ i've ever written, but its kinda working so I'm not changing it.
+*/
+
+#ifndef __VECTOR_FONT_TOOL_INCLUDED__
+#define __VECTOR_FONT_TOOL_INCLUDED__
+
+#include "irrlicht.h"
+#include "CFontTool.h"
+#include
+
+using namespace irr;
+using namespace video;
+
+struct STriangleList
+{
+ core::array positions;
+ core::array indexes;
+
+ // for adding one triangle list to another,
+ // these triangles share positions, but dont share triangles
+ STriangleList& operator+=(STriangleList &other)
+ {
+ core::matrix4 m;
+ core::array map;
+ map.set_used(other.positions.size());
+
+ for (u32 i=0; i positions;
+
+ bool isMember(s32 x, s32 y)
+ {
+ for (u32 i=0; i h1((f32)(positions[i-1].X - positions[i].X),(f32)(positions[i-1].Y - positions[i].Y)),
+ h2((f32)(positions[i].X - positions[i+1].X),(f32)(positions[i].Y - positions[i+1].Y));
+ h1.normalize();
+ h2.normalize();
+
+ if (h1==h2) // erase the current point
+ positions.erase(i--);
+ }
+
+ // level 1- if point1 points at point3, we can skip point2
+ // level 2+ allow a deviation of level-1
+
+ }
+
+ };
+
+ // contains an array of lines for triangulation
+ struct SLineList
+ {
+ core::array lines;
+ SLineList() : lines() { }
+ void addEdge(const SEdge &edge)
+ {
+ // adds lines to the buffer
+ for (u32 i=1; i 0 &&
+ lb.getPointOrientation(l2.start) > 0 &&
+ lc.getPointOrientation(l2.start) > 0)
+ return true;
+ //if (la.getPointOrientation(l2.start) < 0 &&
+ // lb.getPointOrientation(l2.start) < 0 &&
+ // lc.getPointOrientation(l2.start) < 0)
+ // return true;
+
+ core::vector2df out;
+ //if (la.intersectWith(l2,out))
+ // if (out != la.start && out != la.end &&
+ // out != l2.start && out != l2.end)
+ // return true;
+ if (lb.intersectWith(l2,out))
+ if (!out.equals(lb.start) && !out.equals(lb.end) &&
+ !out.equals(l2.start) && !out.equals(l2.end))
+ return true;
+ if (lc.intersectWith(l2,out))
+ if (!out.equals(lc.start) && !out.equals(lc.end) &&
+ !out.equals(l2.start) && !out.equals(l2.end))
+ return true;
+
+ // my shit intersection code only works with lines in certain directions :(
+ if (l2.intersectWith(lb,out))
+ if (!out.equals(lb.start) && !out.equals(lb.end) &&
+ !out.equals(l2.start) && !out.equals(l2.end))
+ return true;
+ if (l2.intersectWith(lc,out))
+ if (!out.equals(lc.start) && !out.equals(lc.end) &&
+ !out.equals(l2.start) && !out.equals(l2.end))
+ return true;
+
+
+ if (lb.isPointOnLine(l2.start) && l2.start != lb.start && l2.start != lb.end)
+ return true;
+ if (lc.isPointOnLine(l2.start) && l2.start != lc.start && l2.start != lc.end)
+ return true;
+
+ }
+ return false;
+ }
+ };
+
+ // an area of adjacent pixels
+ struct SPixelGroup
+ {
+ SPixelGroup(IrrlichtDevice *device) : triangles(), pixelWidth(0), pixelHeight(0),
+ Device(device) {}
+
+ core::array pixels;
+ core::array edges;
+ STriangleList triangles;
+ core::array ll;
+ core::array isMemberCache;
+ s32 pixelWidth;
+ s32 pixelHeight;
+ IrrlichtDevice *Device;
+
+ void triangulate()
+ {
+
+ // find edges in this group
+ makeEdges();
+
+ // triangulate the group
+ makeTriangles();
+
+ }
+
+ void drawTriangle( core::line2df line, core::vector2df point)
+ {
+ //const u32 endt = Device->getTimer()->getTime() + t;
+ f32 scale = 5;
+
+
+ //while(Device->getTimer()->getTime() < endt )
+ //{
+ Device->run();
+ Device->getVideoDriver()->beginScene(true,true,video::SColor(0,0,0,0));
+ for (u32 v=0;vgetVideoDriver()->draw2DLine(st,en, SColor(255,255,255,255));
+ }
+ // draw this triangle
+ const core::position2di st((s32)(line.start.X*scale)+50, (s32)(line.start.Y*scale)+50);
+ const core::position2di en((s32)(line.end.X*scale)+50, (s32)(line.end.Y*scale)+50);
+ const core::position2di p((s32)(point.X*scale)+50, (s32)(point.Y*scale)+50);
+ Device->getVideoDriver()->draw2DLine(st,en, SColor(255,255,0,0));
+ Device->getVideoDriver()->draw2DLine(en,p, SColor(255,0,255,0));
+ Device->getVideoDriver()->draw2DLine(p,st, SColor(255,0,0,255));
+
+ Device->getVideoDriver()->endScene();
+ //}
+ }
+
+ void makeTriangles()
+ {
+ // make lines from edges, because they're easier to deal with
+ ll.clear();
+ for (u32 i=0; i < edges.size(); ++i)
+ {
+ SLineList l;
+ l.addEdge(edges[i]);
+ ll.push_back(l);
+ }
+ // add an extra one for inside edges
+ SLineList innerlines;
+ ll.push_back(innerlines);
+
+ // loop through each edge and make triangles
+ for (u32 i=0; ibestScore)
+ {
+ bestScore = score;
+ bestEdge = k;
+ bestPoint = j;
+ }
+ }
+ // hopefully we found one
+ if (bestEdge >= 0 && bestPoint >= 0 && bestScore >= 0.0f)
+ {
+ //assert(bestEdge >= 0 && bestPoint >= 0);
+ //assert(bestScore >= 0.0f);
+
+ core::vector2df point(ll[bestEdge].lines[bestPoint].start.X, ll[bestEdge].lines[bestPoint].start.Y);
+
+ // add it to the triangles list
+ triangles.add(currentLine.start, currentLine.end, point);
+
+ // add inner lines to the line buffer, but only if they arent in others
+
+ core::line2df la(point,currentLine.start);
+ core::line2df lb(currentLine.end,point);
+
+ bool found = false;
+ for (u32 lineno=0;lineno= 3);
+
+ // all edges should be closed
+ assert(edges[i].positions[0] == edges[i].positions[edges[i].positions.size()-1] );
+ }
+ }
+
+ // adds a line to the edges arrays
+ void addToEdges(s32 x1, s32 y1, s32 x2, s32 y2)
+ {
+ bool found=false;
+ // loop through each edge
+ for (u32 i=0; ipixelWidth || y>pixelHeight || x<0 || y<0)
+ return false;
+ else
+ return isMemberCache[pixelWidth*y + x];
+ }
+
+ void refreshIsMemberCache()
+ {
+ isMemberCache.clear();
+ pixelWidth=0; pixelHeight=0;
+ for (u32 i=0; ipixelWidth) pixelWidth=pixels[i].X;
+ if (pixels[i].Y>pixelHeight) pixelHeight=pixels[i].Y;
+ }
+ pixelWidth+=2; pixelHeight+=2;
+ isMemberCache.set_used(pixelWidth*pixelHeight+1);
+ for (u32 i=0; igetTimer()->getTime();
+ const u32 endt = stt + t;
+
+ while(device->getTimer()->getTime() < endt )
+ {
+ const f32 phase = f32((device->getTimer()->getTime()-stt) % 500) / 500.0f;
+
+ device->run();
+ device->getVideoDriver()->beginScene(true,true,video::SColor(0,0,0,0));
+ for (u32 g=0;ggetVideoDriver()->draw2DLine(st,en);
+ device->getVideoDriver()->draw2DLine(st,ep,video::SColor(255,255,0,0) );
+ }
+ device->getVideoDriver()->endScene();
+ }
+ }
+
+ void drawTriangles(IrrlichtDevice *device, u32 t, s32 scale)
+ {
+ const u32 stt = device->getTimer()->getTime();
+ const u32 endt = stt + t;
+
+ while(device->getTimer()->getTime() < endt )
+ {
+ const f32 phase = f32((device->getTimer()->getTime()-stt) % 500) / 500.0f;
+
+ device->run();
+ device->getVideoDriver()->beginScene(true,true,video::SColor(0,0,0,0));
+ for (u32 g=0;ggetVideoDriver()->draw2DLine(st,en, SColor(255,255,0,0));
+ st = core::position2di((s32)(t.positions[t.indexes[v+1]].X*scale)+50,(s32)(t.positions[t.indexes[v+1]].Y*scale)+50);
+ en = core::position2di((s32)(t.positions[t.indexes[v+2]].X*scale)+50,(s32)(t.positions[t.indexes[v+2]].Y*scale)+50);
+ device->getVideoDriver()->draw2DLine(st,en, SColor(255,0,255,0));
+ st = core::position2di((s32)(t.positions[t.indexes[v+2]].X*scale)+50,(s32)(t.positions[t.indexes[v+2]].Y*scale)+50);
+ en = core::position2di((s32)(t.positions[t.indexes[v+0]].X*scale)+50,(s32)(t.positions[t.indexes[v+0]].Y*scale)+50);
+ device->getVideoDriver()->draw2DLine(st,en, SColor(255,0,0,255));
+ }
+ device->getVideoDriver()->endScene();
+ }
+ }
+
+ void drawTriLines(IrrlichtDevice *device, u32 t, s32 scale)
+ {
+ const u32 endt = device->getTimer()->getTime() + t;
+
+ while(device->getTimer()->getTime() < endt )
+ {
+ device->run();
+ device->getVideoDriver()->beginScene(true,true,video::SColor(0,0,0,0));
+ for (u32 g=0;ggetVideoDriver()->draw2DLine(st,en, SColor(255,255,0,0));
+ }
+
+ device->getVideoDriver()->endScene();
+ }
+ }
+ void drawTri3D(IrrlichtDevice *device, u32 t)
+ {
+ for (u32 g=0;g verts;
+ verts.clear();
+ for(u32 v=0; v< t.positions.size(); ++v)
+ {
+ verts.push_back(S3DVertex(
+ -t.positions[v].X, -t.positions[v].Y, -100,
+ 0,0,1,SColor(255,255,255,255),0,0));
+ }
+
+ device->getVideoDriver()->drawIndexedTriangleList(verts.pointer(),verts.size(),t.indexes.pointer(), t.indexes.size()/3 );
+ }
+ }
+
+
+ // process all pixels
+ void findGroups()
+ {
+ for (int y=0; y0) // look one behind
+ {
+ grp = getRef(x-1,y);
+ if (grp) found=true;
+ }
+ if (y>0) // look above
+ {
+ if (x>0) // top left
+ {
+ g = getRef(x-1,y-1);
+
+ if (g)
+ {
+ if (found)
+ {
+ mergeGroups(grp, g);
+ }
+ else
+ {
+ grp = g;
+ found = true;
+ }
+ }
+ }
+
+ if (x groups;
+ core::array groupRefs;
+ core::array refbuffer;
+ bool *mem;
+ IrrlichtDevice *Device;
+};
+
+// creates a simple vector font from a bitmap from the font tool
+class CVectorFontTool
+{
+public:
+ CVectorFontTool(CFontTool *fonttool) :
+ triangulator(0), FontTool(fonttool),
+ letterHeight(0), letterWidth(0), triangles()
+ {
+ core::map::Iterator it = FontTool->CharMap.getIterator();
+
+ while(!it.atEnd())
+ {
+ CFontTool::SFontArea &fa = FontTool->Areas[(*it).getValue()];
+
+ if (fa.rectangle.getWidth() > letterWidth)
+ letterWidth = fa.rectangle.getWidth();
+ if (fa.rectangle.getHeight() > letterHeight)
+ letterHeight = fa.rectangle.getHeight();
+
+ it++;
+ }
+
+ // number of verts is one more than number of pixels because it's a grid of squares
+ letterWidth++;
+ letterHeight++;
+
+ // create image memory
+ imagedata.set_used(letterWidth*letterHeight);
+
+ // create vertex list, set position etc
+ verts.set_used(letterWidth*letterHeight);
+ for (s32 y=0; yCharMap.getIterator();
+ while(!it.atEnd())
+ {
+ addChar((*it).getKey());
+ it++;
+ }
+ }
+
+ ~CVectorFontTool()
+ {
+ if (triangulator)
+ delete triangulator;
+ }
+
+ void addChar(wchar_t thischar)
+ {
+ const s32 area = FontTool->CharMap[thischar];
+ const CFontTool::SFontArea &fa = FontTool->Areas[area];
+
+ const s32 img = fa.sourceimage;
+ const core::rect& r = fa.rectangle;
+
+ // init image memory
+ IImage *image = FontTool->currentImages[img];
+ for (u32 i=0; i < imagedata.size(); ++i)
+ imagedata[i] = false;
+ for (s32 y=r.UpperLeftCorner.Y; y < r.LowerRightCorner.Y; ++y)
+ {
+ for (s32 x=r.UpperLeftCorner.X; x < r.LowerRightCorner.X ; ++x)
+ if (image->getPixel(x,y).getBlue() > 0)
+ {
+ imagedata[letterWidth*(y-r.UpperLeftCorner.Y) +(x-r.UpperLeftCorner.X)] = true;
+ }
+ }
+
+ // get shape areas
+ triangulator = new CGroupFinder(imagedata.pointer(), letterWidth, letterHeight, FontTool->Device );
+
+ wprintf(L"Created character '%c' in texture %d\n", thischar, img );
+
+ //floodfill->drawEdges(FontTool->Device, 500, 3);
+ //floodfill->drawTriangles(FontTool->Device, 500,30);
+ //floodfill->drawTriLines(FontTool->Device, 200,3);
+
+ /*
+ if (area==32 && map == 0)
+ {
+ scene::ISceneManager *smgr = FontTool->Device->getSceneManager();
+ smgr->addCameraSceneNodeFPS();
+ while(FontTool->Device->run())
+ {
+ //floodfill->drawEdges(FontTool->Device, 100, 30);
+ FontTool->Device->getVideoDriver()->beginScene(true, true, video::SColor(0,200,200,200));
+ smgr->drawAll();
+ floodfill->drawTri3D(FontTool->Device, 100);
+ FontTool->Device->getVideoDriver()->endScene();
+ }
+ }*/
+
+ u32 lastind = triangles.indexes.size();
+
+ // loop through each shape and add it to the current character...
+ for (u32 i=0; i < triangulator->groups.size(); ++i)
+ triangles += triangulator->groups[i].triangles;
+
+ // add character details
+ charstarts.push_back(lastind);
+ charlengths.push_back(triangles.indexes.size() - lastind);
+ chars.push_back(thischar);
+ }
+
+ bool saveVectorFont(const c8 *filename, const c8 *formatname)
+ {
+ IrrlichtDevice *Device = FontTool->Device;
+
+ if (triangles.indexes.size() == 0)
+ {
+ Device->getLogger()->log("No vector data to write, aborting.");
+ return false;
+ }
+
+ core::stringc fn = filename;
+
+ if (core::stringc(formatname) == core::stringc("xml"))
+ {
+ fn += ".xml";
+ io::IXMLWriter *writer = FontTool->Device->getFileSystem()->createXMLWriter(fn.c_str());
+
+ // header and line breaks
+ writer->writeXMLHeader();
+ writer->writeLineBreak();
+
+ // write info header
+ writer->writeElement(L"font", false, L"type", L"vector");
+ writer->writeLineBreak();
+ writer->writeLineBreak();
+
+ // write each letter
+
+ for (u32 n=0; nCharMap[chars[n]];
+ CFontTool::SFontArea &fa = FontTool->Areas[i];
+ wchar_t c[2];
+ c[0] = chars[n];
+ c[1] = L'\0';
+ core::stringw area, under, over;
+ area = core::stringw(fa.rectangle.LowerRightCorner.X-
+ fa.rectangle.UpperLeftCorner.X);
+ area += L", ";
+ area += fa.rectangle.LowerRightCorner.Y-
+ fa.rectangle.UpperLeftCorner.Y;
+
+
+ core::array names;
+ core::array values;
+ names.clear();
+ values.clear();
+ // char
+ names.push_back(core::stringw(L"c"));
+ values.push_back(core::stringw(c));
+
+ // width+height
+ names.push_back(core::stringw(L"wh"));
+ values.push_back(area);
+
+ // start
+ names.push_back(core::stringw(L"st"));
+ values.push_back(core::stringw(charstarts[n]));
+ // length
+ names.push_back(core::stringw(L"len"));
+ values.push_back(core::stringw(charlengths[n]));
+
+ if (fa.underhang != 0)
+ {
+ under = core::stringw(fa.underhang);
+ names.push_back(core::stringw(L"u"));
+ values.push_back(under);
+ }
+ if (fa.overhang != 0)
+ {
+ over = core::stringw(fa.overhang);
+ names.push_back(core::stringw(L"o"));
+ values.push_back(over);
+ }
+ writer->writeElement(L"c", true, names, values);
+
+ writer->writeLineBreak();
+ }
+
+ // write vertex data
+ core::stringw data, count;
+ data = L"";
+ count = core::stringw(triangles.positions.size());
+ for (u32 i=0; iwriteElement(L"Vertices", true, L"count", count.c_str(), L"data", data.c_str());
+ writer->writeLineBreak();
+
+ // write index list
+ data = L"";
+ count = core::stringw(triangles.indexes.size());
+ for (u32 i=0; iwriteElement(L"Indices", true, L"count", count.c_str(), L"data", data.c_str());
+ writer->writeLineBreak();
+
+ writer->writeClosingTag(L"font");
+
+ writer->drop();
+
+ Device->getLogger()->log("Font saved.");
+ return true;
+
+ }
+ else if (core::stringc(formatname) == core::stringc("bin"))
+ {
+ FontTool->Device->getLogger()->log("binary fonts not supported yet, sorry");
+ return false;
+ }
+ else
+ {
+ FontTool->Device->getLogger()->log("unsupported file format, unable to save vector font");
+ return false;
+ }
+ }
+
+ S3DVertex& getVert(s32 x, s32 y) { return verts[letterWidth*y +x]; }
+
+ core::array verts;
+ core::array inds;
+ core::array imagedata;
+
+ core::array charstarts; // start position of each char
+ core::array charlengths; // index count
+ core::array chars; // letters
+
+ CGroupFinder* triangulator;
+ CFontTool* FontTool;
+
+ s32 letterHeight;
+ s32 letterWidth;
+
+ STriangleList triangles;
+};
+
+#endif // __VECTOR_FONT_TOOL_INCLUDED__
+
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/Makefile b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/Makefile
new file mode 100644
index 0000000..7444e44
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/Makefile
@@ -0,0 +1,38 @@
+# 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
+Target = FontTool
+Sources = CFontTool.cpp main.cpp
+
+# general compiler settings
+CPPFLAGS = -I../../../include -I/usr/X11R6/include -I/usr/include/freetype2/
+CXXFLAGS = -O3 -ffast-math
+#CXXFLAGS = -g -Wall
+
+#default target is Linux
+all: all_linux
+
+ifeq ($(HOSTTYPE), x86_64)
+LIBSELECT=64
+endif
+
+# target specific settings
+all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXft
+all_linux clean_linux: SYSTEM=Linux
+all_win32: LDFLAGS = -L../../../lib/Win32-gcc -lIrrlicht -lgdi32 -lopengl32 -lglu32 -lm
+all_win32 clean_win32: SYSTEM=Win32-gcc
+all_win32 clean_win32: SUF=.exe
+# name of the binary - only valid for targets which set SYSTEM
+DESTPATH = ../../../bin/$(SYSTEM)/$(Target)$(SUF)
+
+all_linux all_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 clean clean_linux clean_win32
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln
new file mode 100644
index 0000000..1e24460
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Font Tool", "irrFontTool_v8.vcproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj
new file mode 100644
index 0000000..fcb71a1
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln
new file mode 100644
index 0000000..be110b8
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Font Tool", "irrFontTool_v9.vcproj", "{853A396E-C031-4C26-A716-5B4E176BE11D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Debug|Win32.Build.0 = Debug|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.ActiveCfg = Release|Win32
+ {853A396E-C031-4C26-A716-5B4E176BE11D}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj
new file mode 100644
index 0000000..4fa1e4b
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln
new file mode 100644
index 0000000..48651a8
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Font Tool", "irrFontTool_vc10.vcxproj", "{4D53E40F-37E3-42B1-8848-F4C6F8313A17}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.Build.0 = Debug|Win32
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.ActiveCfg = Release|Win32
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj
new file mode 100644
index 0000000..e1ee889
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj
@@ -0,0 +1,203 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ FontTool
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}
+ Win32Proj
+
+
+
+ Application
+ MultiByte
+ true
+
+
+ Application
+ MultiByte
+ true
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\..\bin\Win32-VisualStudio\
+ ..\..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\..\bin\Win32-VisualStudio\
+ ..\..\..\bin\Win64-VisualStudio\
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win32-visualstudio/FontTool.exe
+ ../../../lib/Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ Disabled
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win64-visualstudio/FontTool.exe
+ ../../../lib/Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ MaxSpeed
+ false
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win32-visualstudio/FontTool.exe
+ ../../../lib/Win32-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+ MaxSpeed
+ false
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win64-visualstudio/FontTool.exe
+ ../../../lib/Win64-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {e08e042a-6c45-411b-92be-3cc31331019f}
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln
new file mode 100644
index 0000000..05b60ad
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Font Tool", "irrFontTool_vc11.vcxproj", "{4D53E40F-37E3-42B1-8848-F4C6F8313A17}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Debug|Win32.Build.0 = Debug|Win32
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.ActiveCfg = Release|Win32
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj
new file mode 100644
index 0000000..4513cfa
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj
@@ -0,0 +1,207 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ FontTool
+ {4D53E40F-37E3-42B1-8848-F4C6F8313A17}
+ Win32Proj
+
+
+
+ Application
+ MultiByte
+ true
+ v110
+
+
+ Application
+ MultiByte
+ true
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\..\bin\Win32-VisualStudio\
+ ..\..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\..\bin\Win32-VisualStudio\
+ ..\..\..\bin\Win64-VisualStudio\
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win32-visualstudio/FontTool.exe
+ ../../../lib/Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ Disabled
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win64-visualstudio/FontTool.exe
+ ../../../lib/Win64-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ Console
+
+
+
+
+
+
+ MaxSpeed
+ false
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win32-visualstudio/FontTool.exe
+ ../../../lib/Win32-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+ MaxSpeed
+ false
+ ../../../include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib gdi32.lib %(AdditionalOptions)
+ ../../../bin/Win64-visualstudio/FontTool.exe
+ ../../../lib/Win64-visualstudio;%(AdditionalLibraryDirectories)
+ false
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {e08e042a-6c45-411b-92be-3cc31331019f}
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/main.cpp b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/main.cpp
new file mode 100644
index 0000000..9e9e87f
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/newFontTool/main.cpp
@@ -0,0 +1,493 @@
+/*
+ Tool for creating Irrlicht bitmap+vector fonts,
+ started by Gaz Davidson in December 2006
+
+ Due to my laziness and Microsoft's unituitive API, surragate pairs and
+ nonspacing diacritical marks are not supported!
+
+ Linux bitmap font support added by Neil Burlock Oct 2008
+ Note: Xft/Freetype2 is used to render the fonts under X11. Anti-aliasing
+ is controlled by the system and cannot be overriden by an application,
+ so fonts that are rendered will be aliased or anti-aliased depending
+ on the system that they are created on.
+
+*/
+
+
+#include
+#include
+
+#include "CFontTool.h"
+#include "CVectorFontTool.h"
+#include "ITexture.h"
+
+using namespace irr;
+using namespace gui;
+
+#pragma comment(lib, "Irrlicht.lib")
+
+const s32 texturesizes[] = {128, 256, 512, 1024, 2048, 4096, 0};
+
+const wchar_t *fileformats[] = { L"bmp", L"ppm", 0 }; // bitmap font formats
+const wchar_t *alphafileformats[] = { L"png", L"tga", 0 }; // bitmap font formats which support alpha channels
+const wchar_t *vectorfileformats[] = { L"xml", L"bin", 0 }; // file formats for vector fonts
+
+const wchar_t *warntext = L"Legal Notice\n"
+ L"------------\n\n"
+ L"When making bitmap and vector fonts, you should consider the potential legal "
+ L"issues with redistributing the fonts with your software; this tool basically "
+ L"copies font data and some authors might not like this!\n"
+ L"If you purchased fonts or they came with an application or your OS, you'll have"
+ L"to check the license to see what restrictions are placed on making derivative works.\n\n"
+ L"PD and the OFL\n"
+ L"--------------\n\n"
+ L"You'll find lots of fonts on the web listed as Public Domain, you can do what you like "
+ L"with these.\n"
+ L"Many fonts are released under the Open Font License, which is a 'viral' open source "
+ L"license like the GPL. It's worth reading the license here: http://scripts.sil.org/OFL\n"
+ L"The most important restrictions are- you must include the original font's license, you "
+ L"can't stop your users from using or distributing the font, the font must have a "
+ L"different name the original.\n\n"
+ L"Some free fonts can be found here- www.openfontlibrary.org\n"
+ L"http://savannah.nongnu.org/projects/freefont/";
+
+const wchar_t *helptext = L"This tool creates bitmap fonts for the Irrlicht Engine\n\n"
+
+ L"First select a character encoding from the list, then choose the font, "
+ L"size, and whether you'd like bold, italic, antialiasing and an alpha channel. "
+ L"In Windows, antialiasing will be ignored for small fonts\n\n"
+
+ L"Then select a texture width and height. If the output exceeds this then more than "
+ L"one image will be created. You can use the scrollbar at the top of the screen to "
+ L"preview them. Most modern graphics cards will support up to 2048x2048, "
+ L"keep in mind that more images means worse performance when drawing text!\n\n"
+
+ L"If you want a vector font rather than a bitmap font, check the vector box. "
+ L"Vector fonts are stored in system memory while bitmap fonts are in video ram\n\n"
+
+ L"Click create to preview your font, this may take lots of time and memory "
+ L"when making a font with a lot of characters, please be patient!\n\n"
+
+ L"Now you're ready to give your font a name, select a format and click save.\n\n"
+ L"To load your font in Irrlicht, simply use env->getFont(\"Myfont.xml\");\n\n"
+
+ L"That's all, have fun :-)";
+
+#ifdef _IRR_WINDOWS_
+ const wchar_t *completeText = L"Font created";
+#else
+ const wchar_t *completeText = L"Font created\n\n"
+ L"Please note that anti-aliasing under X11 is controlled by the system "
+ L"configuration, so if your system is set to use anti-aliasing, then so "
+ L"will any fonts you create with FontTool";
+#endif
+
+enum MYGUI
+{
+ MYGUI_CHARSET = 100,
+ MYGUI_FONTNAME,
+ MYGUI_SIZE,
+ MYGUI_TEXWIDTH,
+ MYGUI_TEXHEIGHT,
+ MYGUI_BOLD,
+ MYGUI_ITALIC,
+ MYGUI_ANTIALIAS,
+ MYGUI_ALPHA,
+ MYGUI_VECTOR,
+ MYGUI_FILENAME,
+ MYGUI_FORMAT,
+ MYGUI_CREATE,
+ MYGUI_SAVE,
+ MYGUI_IMAGE,
+ MYGUI_CURRENTIMAGE,
+ MYGUI_HELPBUTTON
+};
+
+
+// event reciever
+class MyEventReceiver : public IEventReceiver
+{
+public:
+
+ MyEventReceiver(IrrlichtDevice* device, CFontTool*& fonttool, CVectorFontTool* &vectool) :
+ Device(device), FontTool(fonttool), VecTool(vectool)
+ {
+ device->setEventReceiver(this);
+ }
+
+ virtual bool OnEvent(const SEvent &event)
+ {
+ if (event.EventType == EET_GUI_EVENT)
+ {
+ s32 id = event.GUIEvent.Caller->getID();
+ IGUIEnvironment* env = Device->getGUIEnvironment();
+
+ switch(event.GUIEvent.EventType)
+ {
+ case EGET_SCROLL_BAR_CHANGED:
+ if (id == MYGUI_CURRENTIMAGE)
+ {
+ IGUIImage* img = (IGUIImage*)env->getRootGUIElement()->getElementFromId(MYGUI_IMAGE,true);
+ s32 i = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
+ img->setImage(FontTool->currentTextures[i]);
+
+ return true;
+ }
+ break;
+ case EGET_COMBO_BOX_CHANGED:
+ if (id == MYGUI_CHARSET)
+ {
+ IGUIComboBox* cbo = (IGUIComboBox*)event.GUIEvent.Caller;
+ FontTool->selectCharSet(cbo->getSelected());
+ // rebuild font list
+ cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_FONTNAME,true);
+ cbo->clear();
+ for (u32 i=0; i < FontTool->FontNames.size(); ++i)
+ cbo->addItem(FontTool->FontNames[i].c_str());
+ return true;
+ }
+ break;
+ case EGET_CHECKBOX_CHANGED:
+ if (id == MYGUI_VECTOR)
+ {
+ IGUICheckBox* chk = (IGUICheckBox*)event.GUIEvent.Caller;
+
+ IGUIComboBox *cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_FORMAT,true);
+ cbo->clear();
+
+ if (chk->isChecked() && VecTool)
+ {
+ // vector formats
+ for (s32 i=0; fileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(vectorfileformats[i]).c_str());
+
+ }
+ else
+ {
+
+ // bitmap formats
+ if (!FontTool->UseAlphaChannel)
+ {
+ // add non-alpha formats
+ for (s32 i=0; fileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(fileformats[i]).c_str());
+ }
+ // add formats which support alpha
+ for (s32 i=0; alphafileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(alphafileformats[i]).c_str());
+ }
+
+ }
+ break;
+
+ case EGET_BUTTON_CLICKED:
+
+ if (id == MYGUI_CREATE)
+ {
+ // create the font with the params
+ IGUIComboBox* cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_CHARSET, true);
+ int charset = cbo->getSelected();
+
+ cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_FONTNAME,true);
+ int fontname = cbo->getSelected();
+
+ cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_SIZE,true);
+ int fontsize = cbo->getSelected();
+
+ cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_TEXWIDTH,true);
+ int texwidth = cbo->getSelected();
+
+ cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_TEXHEIGHT,true);
+ int texheight = cbo->getSelected();
+
+ IGUICheckBox* chk = (IGUICheckBox*)env->getRootGUIElement()->getElementFromId(MYGUI_BOLD,true);
+ bool bold = chk->isChecked();
+ chk = (IGUICheckBox*)env->getRootGUIElement()->getElementFromId(MYGUI_ITALIC,true);
+ bool italic = chk->isChecked();
+
+ chk = (IGUICheckBox*)env->getRootGUIElement()->getElementFromId(MYGUI_ALPHA,true);
+ bool alpha = chk->isChecked();
+
+ chk = (IGUICheckBox*)env->getRootGUIElement()->getElementFromId(MYGUI_ANTIALIAS,true);
+ bool aa = chk->isChecked();
+
+ // vector fonts disabled
+ //chk = (IGUICheckBox*)env->getRootGUIElement()->getElementFromId(MYGUI_VECTOR,true);
+ bool vec = false;//chk->isChecked();
+
+ FontTool->makeBitmapFont(fontname, charset, FontTool->FontSizes[fontsize], texturesizes[texwidth], texturesizes[texheight], bold, italic, aa, alpha);
+
+ IGUIScrollBar* scrl = (IGUIScrollBar*)env->getRootGUIElement()->getElementFromId(MYGUI_CURRENTIMAGE,true);
+ scrl->setMax(FontTool->currentTextures.size() == 0 ? 0 : FontTool->currentTextures.size()-1);
+
+ if (FontTool->currentTextures.size() > 0)
+ {
+ IGUIImage* img = (IGUIImage*)env->getRootGUIElement()->getElementFromId(MYGUI_IMAGE,true);
+ img->setImage(FontTool->currentTextures[0]);
+ scrl->setPos(0);
+ }
+
+ // make sure users pick a file format that supports alpha channel
+ cbo = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_FORMAT,true);
+ cbo->clear();
+
+ if (vec)
+ {
+ // add vector formats
+ for (s32 i=0; fileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(vectorfileformats[i]).c_str());
+ }
+ else
+ {
+ if (!alpha)
+ {
+ // add non-alpha formats
+ for (s32 i=0; fileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(fileformats[i]).c_str());
+ }
+ // add formats which support alpha
+ for (s32 i=0; alphafileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(alphafileformats[i]).c_str());
+ }
+ if (VecTool)
+ {
+ delete VecTool;
+ VecTool = 0;
+ }
+ if (vec)
+ {
+ VecTool = new CVectorFontTool(FontTool);
+ }
+
+ /* Message box letting the user know the process is complete */
+ env->addMessageBox(L"Create", completeText);
+
+ return true;
+ }
+
+ if (id == MYGUI_SAVE)
+ {
+ IGUIEditBox *edt = (IGUIEditBox*)env->getRootGUIElement()->getElementFromId(MYGUI_FILENAME,true);
+ core::stringc name = edt->getText();
+
+ IGUIComboBox *fmt = (IGUIComboBox*)env->getRootGUIElement()->getElementFromId(MYGUI_FORMAT,true);
+ core::stringc format = fmt->getItem(fmt->getSelected());
+
+ // vector fonts disabled
+ IGUICheckBox *chk = (IGUICheckBox*)env->getRootGUIElement()->getElementFromId(MYGUI_VECTOR,true);
+ bool vec = false; // chk->isChecked();
+
+ if (vec && VecTool)
+ VecTool->saveVectorFont(name.c_str(), format.c_str());
+ else
+ FontTool->saveBitmapFont(name.c_str(), format.c_str());
+
+ return true;
+ }
+
+ if (id == MYGUI_HELPBUTTON)
+ {
+ env->addMessageBox(L"Irrlicht Unicode Font Tool", helptext);
+ return true;
+ }
+
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ IrrlichtDevice* Device;
+ CFontTool* FontTool;
+ CVectorFontTool* VecTool;
+
+};
+
+void createGUI(IrrlichtDevice* device, CFontTool* fc)
+{
+ gui::IGUIEnvironment *env = device->getGUIEnvironment();
+
+ // change transparency of skin
+ for (s32 i=0; igetSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i);
+ col.setAlpha(255);
+ env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col);
+ }
+
+ IGUIWindow *win = env->addWindow( core::rect(10,10,200,500), false, L"Font Creator");
+ win->getCloseButton()->setVisible(false);
+
+ s32 xs=10,xp=xs, yp=30, h=20;
+
+ env->addStaticText(L"Charset", core::rect(xp,yp,50,yp+h),false,false, win);
+
+ xp+=60;
+
+ // charset combo
+ gui::IGUIComboBox* cbo = env->addComboBox( core::rect(xp,yp,180,yp+h),win, MYGUI_CHARSET);
+ for (u32 i=0; i < fc->CharSets.size(); ++i)
+ cbo->addItem(fc->CharSets[i].c_str());
+
+ yp += (s32)(h*1.5f);
+ xp = xs;
+
+ env->addStaticText(L"Font", core::rect(xp,yp,50,yp+h),false,false, win);
+
+ xp+=60;
+
+ // font name combo
+ cbo = env->addComboBox( core::rect(xp,yp,180,yp+h),win, MYGUI_FONTNAME);
+ for (u32 i=0; i < fc->FontNames.size(); ++i)
+ cbo->addItem(fc->FontNames[i].c_str());
+
+ yp += (s32)(h*1.5f);
+ xp = xs;
+
+ env->addStaticText(L"Size", core::rect(xp,yp,50,yp+h),false,false, win);
+
+ xp += 60;
+
+ // font size combo
+ cbo = env->addComboBox( core::rect(xp,yp,xp+50,yp+h),win, MYGUI_SIZE);
+ for (s32 i=0; fc->FontSizes[i] != 0; ++i)
+ cbo->addItem( ((core::stringw(fc->FontSizes[i])) + L"px").c_str());
+
+ xp = xs;
+ yp += (s32)(h*1.5f);
+
+ // bold checkbox
+ env->addCheckBox(false, core::rect(xp,yp,xp+50,yp+h),win, MYGUI_BOLD, L"Bold");
+
+ xp += 45;
+
+ // italic checkbox
+ env->addCheckBox(false, core::rect(xp,yp,xp+50,yp+h),win, MYGUI_ITALIC, L"Italic");
+
+ xp += 45;
+
+ // AA checkbox
+ env->addCheckBox(false, core::rect(xp,yp,xp+50,yp+h),win, MYGUI_ANTIALIAS, L"AA");
+
+ xp +=40;
+
+ // Alpha checkbox
+ env->addCheckBox(false, core::rect(xp,yp,xp+50,yp+h),win, MYGUI_ALPHA, L"Alpha");
+
+ xp = xs;
+ yp += (s32)(h*1.5f);
+
+ /*
+ // vector fonts can't be loaded yet
+ env->addCheckBox(false, core::rect(xp,yp,xp+200,yp+h),win, MYGUI_VECTOR, L"Vector Font");
+ */
+
+ yp += (s32)(h*1.5f);
+
+ env->addStaticText(L"Max Width:", core::rect(xp,yp,50,yp+h),false,false, win);
+
+ xp += 60;
+
+ // texture widths
+ cbo = env->addComboBox( core::rect(xp,yp,xp+70,yp+h),win, MYGUI_TEXWIDTH);
+ for (s32 i=0; texturesizes[i] != 0; ++i)
+ cbo->addItem( ((core::stringw(texturesizes[i])) + L" wide").c_str());
+
+ xp=xs;
+ yp += (s32)(h*1.5f);
+
+ env->addStaticText(L"Max Height:", core::rect(xp,yp,60,yp+h),false,false, win);
+
+ xp += 60;
+
+ // texture height
+ cbo = env->addComboBox( core::rect(xp,yp,xp+70,yp+h),win, MYGUI_TEXHEIGHT);
+ for (s32 i=0; texturesizes[i] != 0; ++i)
+ cbo->addItem( ((core::stringw(texturesizes[i])) + L" tall").c_str());
+
+ // file name
+ xp = xs;
+ yp += (s32)(h*1.5f);
+ env->addStaticText(L"Filename", core::rect(xp,yp,60,yp+h),false,false, win);
+ xp += 60;
+ env->addEditBox(L"myfont",core::rect(xp,yp,xp+70,yp+h), true, win, MYGUI_FILENAME);
+
+ // file format
+ xp = xs;
+ yp += (s32)(h*1.5f);
+ env->addStaticText(L"File Format", core::rect(xp,yp,60,yp+h),false,false, win);
+ xp += 60;
+
+ cbo = env->addComboBox( core::rect(xp,yp,xp+70,yp+h),win, MYGUI_FORMAT);
+ for (s32 i=0; fileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(fileformats[i]).c_str());
+ for (s32 i=0; alphafileformats[i] != 0; ++i)
+ cbo->addItem( core::stringw(alphafileformats[i]).c_str());
+
+ xp = xs;
+ yp += h*2;
+
+ // create button
+ env->addButton( core::rect(xp,yp,xp+50,yp+h),win, MYGUI_CREATE, L"Create");
+
+ xp += 60;
+
+ // save button
+ env->addButton( core::rect(xp,yp,xp+50,yp+h),win, MYGUI_SAVE, L"Save");
+
+ xp += 60;
+
+ // help button
+ env->addButton( core::rect(xp,yp,xp+50,yp+h),win, MYGUI_HELPBUTTON, L"Help");
+
+ // font image
+ gui::IGUIImage *img = env->addImage(0, core::position2d(0,0), true,0, MYGUI_IMAGE);
+ img->setRelativePosition(core::rect(0,20,800,600));
+
+ // font scrollbar
+ IGUIScrollBar *scrl= env->addScrollBar(true,core::rect(0,0,800,20),0, MYGUI_CURRENTIMAGE);
+ scrl->setMax(0);
+ scrl->setSmallStep(1);
+
+ yp += h*3;
+
+ env->getRootGUIElement()->bringToFront(win);
+ win->setRelativePosition( core::rect(10,10,200,yp));
+}
+
+int main()
+{
+ IrrlichtDevice* device =createDevice(video::EDT_OPENGL, core::dimension2du(800, 600));
+ video::IVideoDriver* driver = device->getVideoDriver();
+ scene::ISceneManager* smgr = device->getSceneManager();
+ gui::IGUIEnvironment *env = device->getGUIEnvironment();
+
+ // create font tool
+ CFontTool *fc = new CFontTool(device);
+ CVectorFontTool *vc = 0;
+
+ IEventReceiver *events = new MyEventReceiver(device,fc,vc);
+
+ createGUI(device, fc);
+
+ while(device->run())
+ {
+ if (device->isWindowActive())
+ {
+
+ driver->beginScene(true, true, video::SColor(0,200,200,200));
+ smgr->drawAll();
+ env->drawAll();
+ driver->endScene();
+ }
+ }
+
+ // drop the font tool and resources
+ fc->drop();
+
+ device->drop();
+
+ return 0;
+}
+
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/oldFontTool/source.zip b/libraries/irrlicht-1.8.1/tools/IrrFontTool/oldFontTool/source.zip
new file mode 100644
index 0000000..9228ebb
Binary files /dev/null and b/libraries/irrlicht-1.8.1/tools/IrrFontTool/oldFontTool/source.zip differ
diff --git a/libraries/irrlicht-1.8.1/tools/IrrFontTool/readme.txt b/libraries/irrlicht-1.8.1/tools/IrrFontTool/readme.txt
new file mode 100644
index 0000000..fda16d5
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/IrrFontTool/readme.txt
@@ -0,0 +1,13 @@
+There are two tools available for creating fonts for irrlicht, both are supported.
+
+oldFontTool:
+ only works in Windows, creates a simple image file containing all data for displaying fonts.
+ Those file contain no alpha informations and are limited in their character set.
+ use the IrrFontTool.exe file in this directory.
+
+newFontTool:
+ a more sophisticated font tool supporting alpha channels, anti aliasing,
+ different character sets, vector fonts and other operating systems than
+ just windows. It will create multiple image files and an .xml file
+ containing meta information for the generated font.
+ You can find it as FontTool.exe in the /bin directory.
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/MeshConverter/Makefile b/libraries/irrlicht-1.8.1/tools/MeshConverter/Makefile
new file mode 100644
index 0000000..5328223
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/MeshConverter/Makefile
@@ -0,0 +1,38 @@
+# 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
+Target = MeshConverter
+Sources = main.cpp
+
+# general compiler settings
+CPPFLAGS = -I../../include -I/usr/X11R6/include
+CXXFLAGS = -O3 -ffast-math -Wall
+#CXXFLAGS = -g -Wall
+
+#default target is Linux
+all: all_linux
+
+ifeq ($(HOSTTYPE), x86_64)
+LIBSELECT=64
+endif
+
+# target specific settings
+all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11
+all_linux clean_linux: SYSTEM=Linux
+all_win32: LDFLAGS = -L../../lib/Win32-gcc -lIrrlicht -lopengl32 -lglu32 -lm
+all_win32 clean_win32: SYSTEM=Win32-gcc
+all_win32 clean_win32: SUF=.exe
+# name of the binary - only valid for targets which set SYSTEM
+DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF)
+
+all_linux all_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 clean clean_linux clean_win32
diff --git a/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter.cbp b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter.cbp
new file mode 100644
index 0000000..08ebbfb
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter.cbp
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_v9.vcproj b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_v9.vcproj
new file mode 100644
index 0000000..5747218
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_v9.vcproj
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc10.vcxproj b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc10.vcxproj
new file mode 100644
index 0000000..1f1ce49
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc10.vcxproj
@@ -0,0 +1,192 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ MeshConverter
+ {E72B637E-4AA6-46F3-885F-AC67B4B470ED}
+ GUI Editor
+ Win32Proj
+
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+ Application
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ false
+ false
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ../../bin/Win32-visualstudio/MeshConverter.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)TestProject.pdb
+ Console
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ../../bin/Win64-visualstudio/MeshConverter.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)TestProject.pdb
+ Console
+
+
+
+
+
+
+ Full
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+
+
+ ../../bin/Win32-visualstudio/MeshConverter.exe
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+ Full
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+
+
+ ../../bin/Win64-visualstudio/MeshConverter.exe
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+ {e08e042a-6c45-411b-92be-3cc31331019f}
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc11.vcxproj b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc11.vcxproj
new file mode 100644
index 0000000..6493206
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/MeshConverter/MeshConverter_vc11.vcxproj
@@ -0,0 +1,196 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ MeshConverter
+ {E72B637E-4AA6-46F3-885F-AC67B4B470ED}
+ GUI Editor
+ Win32Proj
+
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+ Application
+ MultiByte
+ v110
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ true
+ true
+ ..\..\bin\Win32-VisualStudio\
+ ..\..\bin\Win64-VisualStudio\
+ false
+ false
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+ AllRules.ruleset
+ AllRules.ruleset
+
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ EditAndContinue
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ../../bin/Win32-visualstudio/MeshConverter.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)TestProject.pdb
+ Console
+
+
+
+
+
+
+ Disabled
+ Neither
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ Level3
+ ProgramDatabase
+
+
+ kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib glu32.lib opengl32.lib %(AdditionalOptions)
+ ../../bin/Win64-visualstudio/MeshConverter.exe
+ ..\..\lib\Win32-visualstudio;%(AdditionalLibraryDirectories)
+ true
+ $(OutDir)TestProject.pdb
+ Console
+
+
+
+
+
+
+ Full
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+
+
+ ../../bin/Win32-visualstudio/MeshConverter.exe
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+ Full
+ false
+ ..\..\include;%(AdditionalIncludeDirectories)
+ WIN32;WIN64NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ MultiThreaded
+
+
+ Level3
+
+
+ ../../bin/Win64-visualstudio/MeshConverter.exe
+ true
+ Console
+ true
+ true
+
+
+
+
+
+
+
+
+
+ {e08e042a-6c45-411b-92be-3cc31331019f}
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libraries/irrlicht-1.8.1/tools/MeshConverter/main.cpp b/libraries/irrlicht-1.8.1/tools/MeshConverter/main.cpp
new file mode 100644
index 0000000..d6b878f
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/MeshConverter/main.cpp
@@ -0,0 +1,108 @@
+#include
+#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
+
+void usage(const char* name)
+{
+ std::cerr << "Usage: " << name << " [options] " << std::endl;
+ std::cerr << " where options are" << std::endl;
+ std::cerr << " --createTangents: convert to tangents mesh is possible." << std::endl;
+ std::cerr << " --format=[irrmesh|collada|stl|obj|ply]: Choose target format" << std::endl;
+}
+
+int main(int argc, char* argv[])
+{
+ if ((argc < 3) ||
+ ((argc==3) && (argv[1][0]=='-')))
+ {
+ usage(argv[0]);
+ return 1;
+ }
+
+ IrrlichtDevice *device = createDevice( video::EDT_NULL,
+ dimension2d(800, 600), 32, false, false, false, 0);
+
+ device->setWindowCaption(L"Mesh Converter");
+
+ scene::EMESH_WRITER_TYPE type = EMWT_IRR_MESH;
+ u32 i=1;
+ bool createTangents=false;
+ while (argv[i][0]=='-')
+ {
+ core::stringc format = argv[i];
+ if (format.size() > 3)
+ {
+ if (format.equalsn("--format=",9))
+ {
+ format = format.subString(9,format.size());
+ if (format=="collada")
+ type = EMWT_COLLADA;
+ else if (format=="stl")
+ type = EMWT_STL;
+ else if (format=="obj")
+ type = EMWT_OBJ;
+ else if (format=="ply")
+ type = EMWT_PLY;
+ else
+ type = EMWT_IRR_MESH;
+ }
+ else
+ if (format =="--createTangents")
+ createTangents=true;
+ }
+ else
+ if (format=="--")
+ {
+ ++i;
+ break;
+ }
+ ++i;
+ }
+
+ const s32 srcmesh = i;
+ const s32 destmesh = i+1;
+
+ --argc;
+ if ((argcgetSceneManager()->getMesh(argv[srcmesh])->getMesh(0);
+ if (!mesh)
+ {
+ std::cerr << "Could not load " << argv[srcmesh] << std::endl;
+ return 1;
+ }
+ if (createTangents)
+ {
+ IMesh* tmp = device->getSceneManager()->getMeshManipulator()->createMeshWithTangents(mesh);
+ mesh->drop();
+ mesh=tmp;
+ }
+ IMeshWriter* mw = device->getSceneManager()->createMeshWriter(type);
+ IWriteFile* file = device->getFileSystem()->createAndWriteFile(argv[destmesh]);
+ mw->writeMesh(file, mesh);
+
+ file->drop();
+ mw->drop();
+ device->drop();
+
+ return 0;
+}
+
diff --git a/libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.jpg b/libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.jpg
new file mode 100644
index 0000000..deafb3f
Binary files /dev/null and b/libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.jpg differ
diff --git a/libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.txt b/libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.txt
new file mode 100644
index 0000000..5e6fe60
--- /dev/null
+++ b/libraries/irrlicht-1.8.1/tools/irrEdit/irrEdit.txt
@@ -0,0 +1,7 @@
+irrEdit is a free scene graph editor for Irrlicht Engine .irr files and is capable as being used as world editor,
+particle system designer, meshviewer and more. It is a visual front end for the Irrlicht Engine, and thus has a lot
+of impressive features like importing meshes of every format Irrlicht supports, simple but powerful material
+system and lots of special effects.
+
+For package size reasons, irrEdit is not included in this SDK, but you can download it from
+http://www.ambiera.com/irredit
\ No newline at end of file
--
cgit v1.1