From 959831f4ef5a3e797f576c3de08cd65032c997ad Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 13 Jan 2013 18:54:10 +1000 Subject: Remove damned ancient DOS line endings from Irrlicht. Hopefully I did not go overboard. --- libraries/irrlicht-1.8/tools/FileToHeader/Makefile | 70 +- libraries/irrlicht-1.8/tools/FileToHeader/main.cpp | 350 +-- .../irrlicht-1.8/tools/GUIEditor/CGUIAttribute.h | 338 +-- .../tools/GUIEditor/CGUIAttributeEditor.cpp | 240 +- .../tools/GUIEditor/CGUIAttributeEditor.h | 108 +- .../tools/GUIEditor/CGUIBoolAttribute.h | 136 +- .../tools/GUIEditor/CGUIColorAttribute.h | 358 +-- .../tools/GUIEditor/CGUIDummyEditorStub.h | 118 +- .../tools/GUIEditor/CGUIEditFactory.cpp | 240 +- .../irrlicht-1.8/tools/GUIEditor/CGUIEditFactory.h | 106 +- .../tools/GUIEditor/CGUIEditWindow.cpp | 712 +++--- .../irrlicht-1.8/tools/GUIEditor/CGUIEditWindow.h | 176 +- .../tools/GUIEditor/CGUIEditWorkspace.cpp | 1854 +++++++-------- .../tools/GUIEditor/CGUIEditWorkspace.h | 336 +-- .../tools/GUIEditor/CGUIEnumAttribute.h | 228 +- .../irrlicht-1.8/tools/GUIEditor/CGUIPanel.cpp | 680 +++--- libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.h | 256 +-- .../tools/GUIEditor/CGUIStringAttribute.h | 140 +- .../tools/GUIEditor/CGUITextureAttribute.h | 280 +-- .../tools/GUIEditor/CGUITextureCacheBrowser.cpp | 672 +++--- .../tools/GUIEditor/CGUITextureCacheBrowser.h | 176 +- .../tools/GUIEditor/CMemoryReadWriteFile.cpp | 190 +- .../tools/GUIEditor/CMemoryReadWriteFile.h | 146 +- .../irrlicht-1.8/tools/GUIEditor/EGUIEditTypes.h | 122 +- .../irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.sln | 40 +- .../tools/GUIEditor/GUI Editor_v8.vcproj | 590 ++--- .../irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.sln | 40 +- .../tools/GUIEditor/GUI Editor_v9.vcproj | 586 ++--- .../tools/GUIEditor/GUI Editor_vc10.vcxproj | 424 ++-- .../GUIEditor/GUI Editor_vc10.vcxproj.filters | 174 +- .../tools/GUIEditor/GUI Editor_vc11.vcxproj | 432 ++-- .../GUIEditor/GUI Editor_vc11.vcxproj.filters | 174 +- libraries/irrlicht-1.8/tools/GUIEditor/Makefile | 86 +- libraries/irrlicht-1.8/tools/GUIEditor/main.cpp | 152 +- .../tools/IrrFontTool/newFontTool/CFontTool.cpp | 1602 ++++++------- .../tools/IrrFontTool/newFontTool/CFontTool.h | 156 +- .../IrrFontTool/newFontTool/CVectorFontTool.h | 2398 ++++++++++---------- .../tools/IrrFontTool/newFontTool/Makefile | 76 +- .../IrrFontTool/newFontTool/irrFontTool_v8.sln | 40 +- .../IrrFontTool/newFontTool/irrFontTool_v8.vcproj | 402 ++-- .../IrrFontTool/newFontTool/irrFontTool_v9.sln | 40 +- .../IrrFontTool/newFontTool/irrFontTool_v9.vcproj | 404 ++-- .../IrrFontTool/newFontTool/irrFontTool_vc10.sln | 40 +- .../newFontTool/irrFontTool_vc10.vcxproj | 404 ++-- .../IrrFontTool/newFontTool/irrFontTool_vc11.sln | 40 +- .../newFontTool/irrFontTool_vc11.vcxproj | 412 ++-- .../tools/IrrFontTool/newFontTool/main.cpp | 986 ++++---- .../irrlicht-1.8/tools/IrrFontTool/readme.txt | 24 +- .../irrlicht-1.8/tools/MeshConverter/Makefile | 76 +- .../tools/MeshConverter/MeshConverter_v9.vcproj | 374 +-- .../tools/MeshConverter/MeshConverter_vc10.vcxproj | 382 ++-- .../tools/MeshConverter/MeshConverter_vc11.vcxproj | 390 ++-- .../irrlicht-1.8/tools/MeshConverter/main.cpp | 216 +- libraries/irrlicht-1.8/tools/irrEdit/irrEdit.txt | 12 +- 54 files changed, 9602 insertions(+), 9602 deletions(-) (limited to 'libraries/irrlicht-1.8/tools') diff --git a/libraries/irrlicht-1.8/tools/FileToHeader/Makefile b/libraries/irrlicht-1.8/tools/FileToHeader/Makefile index e9cd818..391a394 100644 --- a/libraries/irrlicht-1.8/tools/FileToHeader/Makefile +++ b/libraries/irrlicht-1.8/tools/FileToHeader/Makefile @@ -1,35 +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 +# 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/tools/FileToHeader/main.cpp b/libraries/irrlicht-1.8/tools/FileToHeader/main.cpp index b3cc7a7..492f19b 100644 --- a/libraries/irrlicht-1.8/tools/FileToHeader/main.cpp +++ b/libraries/irrlicht-1.8/tools/FileToHeader/main.cpp @@ -1,175 +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; -} - +// 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/tools/GUIEditor/CGUIAttribute.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttribute.h index 0585498..1f2b092 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttribute.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttribute.h @@ -1,169 +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 +/* + 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/tools/GUIEditor/CGUIAttributeEditor.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttributeEditor.cpp index 45913b6..6d61f17 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttributeEditor.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttributeEditor.cpp @@ -1,120 +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 - + +#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/tools/GUIEditor/CGUIAttributeEditor.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttributeEditor.h index 0bcdab5..551fdfd 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttributeEditor.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIAttributeEditor.h @@ -1,54 +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__ - +#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/tools/GUIEditor/CGUIBoolAttribute.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIBoolAttribute.h index b0521db..189bd2d 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIBoolAttribute.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIBoolAttribute.h @@ -1,68 +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 +#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/tools/GUIEditor/CGUIColorAttribute.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIColorAttribute.h index e0c5212..d14b7a1 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIColorAttribute.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIColorAttribute.h @@ -1,179 +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 - +#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/tools/GUIEditor/CGUIDummyEditorStub.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIDummyEditorStub.h index 635501a..b373b2d 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIDummyEditorStub.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIDummyEditorStub.h @@ -1,59 +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 +/* + 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/tools/GUIEditor/CGUIEditFactory.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditFactory.cpp index 9552745..0748360 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditFactory.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditFactory.cpp @@ -1,120 +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 && idxgetRootGUIElement(); + + // 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;} + +#include "CGUIEditWindow.h" +#include "IGUISkin.h" +#include "IGUIEnvironment.h" +#include "IGUIElementFactory.h" +#include "IAttributes.h" +#include "IGUIFont.h" +#include "IGUITabControl.h" +#include "IGUITreeView.h" +#include "CGUIEditWorkspace.h" + +using namespace irr; +using namespace gui; + +//! constructor +CGUIEditWindow::CGUIEditWindow(IGUIEnvironment* environment, core::rect 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/tools/GUIEditor/CGUIEditWindow.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWindow.h index 4b1d72f..07eb28b 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWindow.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWindow.h @@ -1,88 +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__ - +#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/tools/GUIEditor/CGUIEditWorkspace.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp index a45e5d3..7b09136 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.cpp @@ -1,927 +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 - - +// 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/tools/GUIEditor/CGUIEditWorkspace.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.h index 3f21258..c9ccd14 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEditWorkspace.h @@ -1,168 +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 - +// 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/tools/GUIEditor/CGUIEnumAttribute.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEnumAttribute.h index 9e3958d..31951e5 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEnumAttribute.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIEnumAttribute.h @@ -1,114 +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 - +#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/tools/GUIEditor/CGUIPanel.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.cpp index 4135b7a..0ef1f36 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.cpp @@ -1,340 +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 +// 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/tools/GUIEditor/CGUIPanel.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.h index cb6f79a..87609c9 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIPanel.h @@ -1,128 +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 +// 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/tools/GUIEditor/CGUIStringAttribute.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIStringAttribute.h index af9ac03..36cac56 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUIStringAttribute.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUIStringAttribute.h @@ -1,70 +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 +#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/tools/GUIEditor/CGUITextureAttribute.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureAttribute.h index 6a4fef2..bee43a9 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureAttribute.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureAttribute.h @@ -1,140 +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 +#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/tools/GUIEditor/CGUITextureCacheBrowser.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureCacheBrowser.cpp index bac5233..6c80626 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureCacheBrowser.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureCacheBrowser.cpp @@ -1,336 +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 +// 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/tools/GUIEditor/CGUITextureCacheBrowser.h b/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureCacheBrowser.h index 108d4d6..afe84f1 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureCacheBrowser.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CGUITextureCacheBrowser.h @@ -1,88 +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 - +// 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/tools/GUIEditor/CMemoryReadWriteFile.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/CMemoryReadWriteFile.cpp index 0a69587..af46b15 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CMemoryReadWriteFile.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CMemoryReadWriteFile.cpp @@ -1,95 +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; -} - +// 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/tools/GUIEditor/CMemoryReadWriteFile.h b/libraries/irrlicht-1.8/tools/GUIEditor/CMemoryReadWriteFile.h index de20ae7..e0fa06e 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/CMemoryReadWriteFile.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/CMemoryReadWriteFile.h @@ -1,73 +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__ +// 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/tools/GUIEditor/EGUIEditTypes.h b/libraries/irrlicht-1.8/tools/GUIEditor/EGUIEditTypes.h index 88d119e..fe56726 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/EGUIEditTypes.h +++ b/libraries/irrlicht-1.8/tools/GUIEditor/EGUIEditTypes.h @@ -1,61 +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 - +#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/tools/GUIEditor/GUI Editor_v8.sln b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.sln index 6f76269..659854d 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.sln +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.sln @@ -1,20 +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 + +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/tools/GUIEditor/GUI Editor_v8.vcproj b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.vcproj index 81c6fa9..e28c5fa 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.vcproj +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v8.vcproj @@ -1,295 +1,295 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.sln b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.sln index 0acf300..82a8b56 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.sln +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.sln @@ -1,20 +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 + +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/tools/GUIEditor/GUI Editor_v9.vcproj b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.vcproj index 6d73d03..79ba177 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.vcproj +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_v9.vcproj @@ -1,293 +1,293 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj index 7022876..5c85f4b 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj @@ -1,213 +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 - - - - - + + + + + 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/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters index 1d06fa4..3644f98 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc10.vcxproj.filters @@ -1,88 +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 - - + + + + + {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/tools/GUIEditor/GUI Editor_vc11.vcxproj b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc11.vcxproj index 6c6f28b..d2dc2e3 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc11.vcxproj +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc11.vcxproj @@ -1,217 +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 - - - - - + + + + + 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/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters index 1d06fa4..3644f98 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters +++ b/libraries/irrlicht-1.8/tools/GUIEditor/GUI Editor_vc11.vcxproj.filters @@ -1,88 +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 - - + + + + + {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/tools/GUIEditor/Makefile b/libraries/irrlicht-1.8/tools/GUIEditor/Makefile index 02f8189..6010a2d 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/Makefile +++ b/libraries/irrlicht-1.8/tools/GUIEditor/Makefile @@ -1,43 +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 +# 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/tools/GUIEditor/main.cpp b/libraries/irrlicht-1.8/tools/GUIEditor/main.cpp index e8434b2..1d917d3 100644 --- a/libraries/irrlicht-1.8/tools/GUIEditor/main.cpp +++ b/libraries/irrlicht-1.8/tools/GUIEditor/main.cpp @@ -1,76 +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; -} +#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/tools/IrrFontTool/newFontTool/CFontTool.cpp b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CFontTool.cpp index 780e9b0..7579d5d 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CFontTool.cpp +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CFontTool.cpp @@ -1,801 +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; -} +#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/tools/IrrFontTool/newFontTool/CFontTool.h b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CFontTool.h index 5a35938..ee0eefb 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CFontTool.h +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CFontTool.h @@ -1,78 +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__ +#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/tools/IrrFontTool/newFontTool/CVectorFontTool.h b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CVectorFontTool.h index 05a9c79..c139f3d 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CVectorFontTool.h +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/CVectorFontTool.h @@ -1,1199 +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__ - +/* + 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/tools/IrrFontTool/newFontTool/Makefile b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/Makefile index 7444e44..b3f2731 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/Makefile +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/Makefile @@ -1,38 +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 +# 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/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln index 1e24460..a5b9269 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v8.sln @@ -1,20 +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 + +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/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj index fcb71a1..56cc087 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v8.vcproj @@ -1,201 +1,201 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln index be110b8..7120ffb 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.sln @@ -1,20 +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 + +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/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj index 4fa1e4b..2c7f713 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_v9.vcproj @@ -1,202 +1,202 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln index 48651a8..55fc6c7 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.sln @@ -1,20 +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 + +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/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj index e1ee889..fc54796 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc10.vcxproj @@ -1,203 +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 - - - - - + + + + + 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/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln index 05b60ad..60f8d08 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc11.sln @@ -1,20 +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 + +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/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj index 4513cfa..ddae5b1 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/irrFontTool_vc11.vcxproj @@ -1,207 +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 - - - - - + + + + + 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/tools/IrrFontTool/newFontTool/main.cpp b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/main.cpp index 9e9e87f..1170bcc 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/main.cpp +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/newFontTool/main.cpp @@ -1,493 +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; -} - +/* + 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/tools/IrrFontTool/readme.txt b/libraries/irrlicht-1.8/tools/IrrFontTool/readme.txt index fda16d5..092deb1 100644 --- a/libraries/irrlicht-1.8/tools/IrrFontTool/readme.txt +++ b/libraries/irrlicht-1.8/tools/IrrFontTool/readme.txt @@ -1,13 +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. +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/tools/MeshConverter/Makefile b/libraries/irrlicht-1.8/tools/MeshConverter/Makefile index 5328223..ac4b78c 100644 --- a/libraries/irrlicht-1.8/tools/MeshConverter/Makefile +++ b/libraries/irrlicht-1.8/tools/MeshConverter/Makefile @@ -1,38 +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 +# 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/tools/MeshConverter/MeshConverter_v9.vcproj b/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_v9.vcproj index 5747218..09fef60 100644 --- a/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_v9.vcproj +++ b/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_v9.vcproj @@ -1,187 +1,187 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc10.vcxproj b/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc10.vcxproj index 1f1ce49..f994800 100644 --- a/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc10.vcxproj +++ b/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc10.vcxproj @@ -1,192 +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 - - - - - + + + + + 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/tools/MeshConverter/MeshConverter_vc11.vcxproj b/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc11.vcxproj index 6493206..ccd4271 100644 --- a/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc11.vcxproj +++ b/libraries/irrlicht-1.8/tools/MeshConverter/MeshConverter_vc11.vcxproj @@ -1,196 +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 - - - - - + + + + + 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/tools/MeshConverter/main.cpp b/libraries/irrlicht-1.8/tools/MeshConverter/main.cpp index d6b878f..f05d6fa 100644 --- a/libraries/irrlicht-1.8/tools/MeshConverter/main.cpp +++ b/libraries/irrlicht-1.8/tools/MeshConverter/main.cpp @@ -1,108 +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; -} - +#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/tools/irrEdit/irrEdit.txt b/libraries/irrlicht-1.8/tools/irrEdit/irrEdit.txt index 5e6fe60..48c5f2a 100644 --- a/libraries/irrlicht-1.8/tools/irrEdit/irrEdit.txt +++ b/libraries/irrlicht-1.8/tools/irrEdit/irrEdit.txt @@ -1,7 +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 +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