From c2dc7452996b0d21f4013e017d851615628900eb Mon Sep 17 00:00:00 2001 From: mathusummut Date: Sat, 29 Sep 2018 15:09:09 +0200 Subject: [PATCH] Removed gl2xml --- CMakeLists.txt | 1 - mk/windows/vs2015-32/ZetaGlest.sln | 8 - mk/windows/vs2015-32/g2xml.vcxproj | 115 ---- mk/windows/vs2015-64/ZetaGlest.sln | 10 - mk/windows/vs2015-64/g2xml.vcxproj | 113 ---- mk/windows/vs2017-32/ZetaGlest.sln | 8 - mk/windows/vs2017-32/g2xml.vcxproj | 115 ---- mk/windows/vs2017-64/ZetaGlest.sln | 6 - mk/windows/vs2017-64/g2xml.vcxproj | 113 ---- source/tools/{glexemel => }/g3d_support.py | 0 source/tools/glexemel/.gitignore | 4 - source/tools/glexemel/CMakeLists.txt | 23 - source/tools/glexemel/COPYING | 340 ----------- source/tools/glexemel/INSTALL | 11 - source/tools/glexemel/Makefile.linux | 30 - source/tools/glexemel/README | 13 - source/tools/glexemel/g2xml.c | 340 ----------- source/tools/glexemel/g3d.dtd | 66 -- source/tools/glexemel/g3d_logo.png | Bin 60581 -> 0 bytes source/tools/glexemel/g3dv4.h | 61 -- source/tools/glexemel/xml2g.c | 672 --------------------- 21 files changed, 2049 deletions(-) delete mode 100644 mk/windows/vs2015-32/g2xml.vcxproj delete mode 100644 mk/windows/vs2015-64/g2xml.vcxproj delete mode 100644 mk/windows/vs2017-32/g2xml.vcxproj delete mode 100644 mk/windows/vs2017-64/g2xml.vcxproj rename source/tools/{glexemel => }/g3d_support.py (100%) delete mode 100644 source/tools/glexemel/.gitignore delete mode 100644 source/tools/glexemel/CMakeLists.txt delete mode 100644 source/tools/glexemel/COPYING delete mode 100644 source/tools/glexemel/INSTALL delete mode 100644 source/tools/glexemel/Makefile.linux delete mode 100644 source/tools/glexemel/README delete mode 100644 source/tools/glexemel/g2xml.c delete mode 100644 source/tools/glexemel/g3d.dtd delete mode 100644 source/tools/glexemel/g3d_logo.png delete mode 100644 source/tools/glexemel/g3dv4.h delete mode 100644 source/tools/glexemel/xml2g.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a6a00c8a..438b3f0ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,7 +305,6 @@ IF(EXISTS "${PROJECT_SOURCE_DIR}/source/") # MESSAGE(STATUS "WARNING... the following game tools will NOT be built since we cannot find wxWidgets on this machine") # MESSAGE(STATUS "map editor, g3d viewer") #endif() - ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/source/tools/glexemel ) ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/source/tests ) ENDIF() diff --git a/mk/windows/vs2015-32/ZetaGlest.sln b/mk/windows/vs2015-32/ZetaGlest.sln index fdc429045..f2cdf1680 100644 --- a/mk/windows/vs2015-32/ZetaGlest.sln +++ b/mk/windows/vs2015-32/ZetaGlest.sln @@ -7,8 +7,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzetaglest", "libzetagles EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zetaglest", "zetaglest.vcxproj", "{6B0C65F1-D031-46AF-AC0D-7C38892D2952}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g2xml", "g2xml.vcxproj", "{407355A4-D12A-4E3B-A7EB-A835E573B376}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3d_viewer", "g3d_viewer.vcxproj", "{FE5C7C7C-F109-44F5-8329-25A4E24F162C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_editor", "map_editor.vcxproj", "{5D09BE33-81EC-450B-8A7B-2E7B941ADC56}" @@ -32,12 +30,6 @@ Global {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x64.Build.0 = Release|x64 {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x86.ActiveCfg = Release|Win32 {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x86.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.ActiveCfg = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.Build.0 = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x86.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x86.Build.0 = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|Win32.ActiveCfg = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|Win32.Build.0 = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|x64.ActiveCfg = Release|x64 diff --git a/mk/windows/vs2015-32/g2xml.vcxproj b/mk/windows/vs2015-32/g2xml.vcxproj deleted file mode 100644 index 814bab31a..000000000 --- a/mk/windows/vs2015-32/g2xml.vcxproj +++ /dev/null @@ -1,115 +0,0 @@ - - - - - Release - Win32 - - - Release - x64 - - - - {407355A4-D12A-4E3B-A7EB-A835E573B376} - g2xml - Win32Proj - g2xml - 8.1 - - - - Application - Unicode - true - v140 - - - Application - Unicode - true - v140 - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - false - false - false - false - - - g2xml - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - - - g2xml - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - - - - Full - true - WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - StreamingSIMDExtensions2 - AnySuitable - Speed - - - true - Console - true - true - MachineX86 - - - - - Full - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - - - 4996 - AnySuitable - Speed - - - true - Console - true - true - - - - - - - - - \ No newline at end of file diff --git a/mk/windows/vs2015-64/ZetaGlest.sln b/mk/windows/vs2015-64/ZetaGlest.sln index 10fc8a0ac..0b1a2ff2b 100644 --- a/mk/windows/vs2015-64/ZetaGlest.sln +++ b/mk/windows/vs2015-64/ZetaGlest.sln @@ -11,8 +11,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3d_viewer", "g3d_viewer.vc EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_editor", "map_editor.vcxproj", "{5D09BE33-81EC-450B-8A7B-2E7B941ADC56}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g2xml", "g2xml.vcxproj", "{407355A4-D12A-4E3B-A7EB-A835E573B376}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -53,14 +51,6 @@ Global {5D09BE33-81EC-450B-8A7B-2E7B941ADC56}.Release|Win32.Build.0 = Release|Win32 {5D09BE33-81EC-450B-8A7B-2E7B941ADC56}.Release|x64.ActiveCfg = Release|x64 {5D09BE33-81EC-450B-8A7B-2E7B941ADC56}.Release|x64.Build.0 = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Debug|Win32.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Debug|Win32.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Debug|x64.ActiveCfg = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Debug|x64.Build.0 = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.ActiveCfg = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/mk/windows/vs2015-64/g2xml.vcxproj b/mk/windows/vs2015-64/g2xml.vcxproj deleted file mode 100644 index 14478eb4c..000000000 --- a/mk/windows/vs2015-64/g2xml.vcxproj +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Release - Win32 - - - Release - x64 - - - - {407355A4-D12A-4E3B-A7EB-A835E573B376} - g2xml - Win32Proj - g2xml - 8.1 - - - - Application - Unicode - true - v140 - - - Application - Unicode - true - v140 - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - false - false - false - false - - - g2xml - - - g2xml - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - - - - MaxSpeed - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - StreamingSIMDExtensions2 - - - true - Console - true - true - MachineX86 - - - - - Full - true - WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - NotSet - 4996 - AnySuitable - Speed - false - - - true - Console - true - true - - - - - - - - - \ No newline at end of file diff --git a/mk/windows/vs2017-32/ZetaGlest.sln b/mk/windows/vs2017-32/ZetaGlest.sln index b27774ac0..d95af4437 100644 --- a/mk/windows/vs2017-32/ZetaGlest.sln +++ b/mk/windows/vs2017-32/ZetaGlest.sln @@ -7,8 +7,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzetaglest", "libzetagles EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zetaglest", "zetaglest.vcxproj", "{6B0C65F1-D031-46AF-AC0D-7C38892D2952}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g2xml", "g2xml.vcxproj", "{407355A4-D12A-4E3B-A7EB-A835E573B376}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3d_viewer", "g3d_viewer.vcxproj", "{FE5C7C7C-F109-44F5-8329-25A4E24F162C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_editor", "map_editor.vcxproj", "{5D09BE33-81EC-450B-8A7B-2E7B941ADC56}" @@ -32,12 +30,6 @@ Global {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x64.Build.0 = Release|x64 {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x86.ActiveCfg = Release|Win32 {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x86.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.ActiveCfg = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.Build.0 = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x86.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x86.Build.0 = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|Win32.ActiveCfg = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|Win32.Build.0 = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|x64.ActiveCfg = Release|x64 diff --git a/mk/windows/vs2017-32/g2xml.vcxproj b/mk/windows/vs2017-32/g2xml.vcxproj deleted file mode 100644 index 142052261..000000000 --- a/mk/windows/vs2017-32/g2xml.vcxproj +++ /dev/null @@ -1,115 +0,0 @@ - - - - - Release - Win32 - - - Release - x64 - - - - {407355A4-D12A-4E3B-A7EB-A835E573B376} - g2xml - Win32Proj - g2xml - 8.1 - - - - Application - Unicode - true - v141 - - - Application - Unicode - true - v141 - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - false - false - false - false - - - g2xml - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - - - g2xml - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - - - - Full - true - WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - StreamingSIMDExtensions2 - AnySuitable - Speed - - - true - Console - true - true - MachineX86 - - - - - Full - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - - - 4996 - AnySuitable - Speed - - - true - Console - true - true - - - - - - - - - \ No newline at end of file diff --git a/mk/windows/vs2017-64/ZetaGlest.sln b/mk/windows/vs2017-64/ZetaGlest.sln index 367640a68..2ee31bb9a 100644 --- a/mk/windows/vs2017-64/ZetaGlest.sln +++ b/mk/windows/vs2017-64/ZetaGlest.sln @@ -7,8 +7,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzetaglest", "libzetagles EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zetaglest", "zetaglest.vcxproj", "{6B0C65F1-D031-46AF-AC0D-7C38892D2952}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g2xml", "g2xml.vcxproj", "{407355A4-D12A-4E3B-A7EB-A835E573B376}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3d_viewer", "g3d_viewer.vcxproj", "{FE5C7C7C-F109-44F5-8329-25A4E24F162C}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "map_editor", "map_editor.vcxproj", "{5D09BE33-81EC-450B-8A7B-2E7B941ADC56}" @@ -27,10 +25,6 @@ Global {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|Win32.Build.0 = Release|Win32 {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x64.ActiveCfg = Release|x64 {6B0C65F1-D031-46AF-AC0D-7C38892D2952}.Release|x64.Build.0 = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.ActiveCfg = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|Win32.Build.0 = Release|Win32 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.ActiveCfg = Release|x64 - {407355A4-D12A-4E3B-A7EB-A835E573B376}.Release|x64.Build.0 = Release|x64 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|Win32.ActiveCfg = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|Win32.Build.0 = Release|Win32 {FE5C7C7C-F109-44F5-8329-25A4E24F162C}.Release|x64.ActiveCfg = Release|x64 diff --git a/mk/windows/vs2017-64/g2xml.vcxproj b/mk/windows/vs2017-64/g2xml.vcxproj deleted file mode 100644 index 43acd9940..000000000 --- a/mk/windows/vs2017-64/g2xml.vcxproj +++ /dev/null @@ -1,113 +0,0 @@ - - - - - Release - Win32 - - - Release - x64 - - - - {407355A4-D12A-4E3B-A7EB-A835E573B376} - g2xml - Win32Proj - g2xml - 8.1 - - - - Application - Unicode - true - v141 - - - Application - Unicode - true - v141 - - - - - - - - - - - - - <_ProjectFileVersion>10.0.30319.1 - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - false - false - false - false - - - g2xml - - - g2xml - $(SolutionDir)\$(TargetName)$(Platform)_obj\$(Configuration)\ - $(SolutionDir)\$(TargetName)$(Platform)\$(Configuration)\ - - - - MaxSpeed - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - StreamingSIMDExtensions2 - - - true - Console - true - true - MachineX86 - - - - - Full - true - WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - - Level3 - ProgramDatabase - true - NotSet - 4996 - AnySuitable - Speed - false - - - true - Console - true - true - - - - - - - - - \ No newline at end of file diff --git a/source/tools/glexemel/g3d_support.py b/source/tools/g3d_support.py similarity index 100% rename from source/tools/glexemel/g3d_support.py rename to source/tools/g3d_support.py diff --git a/source/tools/glexemel/.gitignore b/source/tools/glexemel/.gitignore deleted file mode 100644 index c013e5dc4..000000000 --- a/source/tools/glexemel/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -g2xml -xml2g - -/*.dSYM/ diff --git a/source/tools/glexemel/CMakeLists.txt b/source/tools/glexemel/CMakeLists.txt deleted file mode 100644 index f30d0c29d..000000000 --- a/source/tools/glexemel/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -# glexemel - -OPTION(BUILD_MODEL_IMPORT_EXPORT_TOOLS "Build model import/export tools" OFF) -MESSAGE(STATUS "Build Model Import/Export Tools = ${BUILD_MODEL_IMPORT_EXPORT_TOOLS}") - -IF(BUILD_MODEL_IMPORT_EXPORT_TOOLS) - - add_executable(g2xml g2xml.c g3dv4.h) - - string (FIND ${CMAKE_SYSTEM_NAME} "BSD" found_BSD) - IF (found_BSD) - SET(CMAKE_INCLUDE_PATH /usr/local/include) - ENDIF() - - find_package(LibXml2) - IF(LIBXML2_FOUND) - include_directories(${CMAKE_INCLUDE_PATH} ${LIBXML2_INCLUDE_DIR}) - add_executable(xml2g xml2g.c g3dv4.h) - target_link_libraries(xml2g ${LIBXML2_LIBRARIES}) - ELSE() - MESSAGE(STATUS "WARNING... xml2g will NOT be built since we cannot find libXml2 on this machine") - ENDIF() -ENDIF() diff --git a/source/tools/glexemel/COPYING b/source/tools/glexemel/COPYING deleted file mode 100644 index 14db8fc79..000000000 --- a/source/tools/glexemel/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/source/tools/glexemel/INSTALL b/source/tools/glexemel/INSTALL deleted file mode 100644 index 9d705dde1..000000000 --- a/source/tools/glexemel/INSTALL +++ /dev/null @@ -1,11 +0,0 @@ -Sorry - no autotools support (yet!). - -You will need: - 1) GNU Make (or an equivalent). - 2) An ANSI C compiler (eg: gcc). - 3) libxml2 (http://xmlsoft.org) - the XML parser for GNOME. - -Just copy Makefile.linux to Makefile: - $ cp Makefile.linux Makefile -Then edit Makefile to suit your needs (it's *very* simple). - diff --git a/source/tools/glexemel/Makefile.linux b/source/tools/glexemel/Makefile.linux deleted file mode 100644 index 8de1f7d28..000000000 --- a/source/tools/glexemel/Makefile.linux +++ /dev/null @@ -1,30 +0,0 @@ -# You need to edit this Makefile for your specific platform - -# CC is the name of your C compiler -CC=gcc -# CFLAGS are the flags that you want to pass to the C compiler -CFLAGS=-Wall -ansi -pedantic -# IDIRS specify the include directories to use -IDIRS=-I/usr/include/libxml2 -# LIBS specify the libraries (libxml2) -LIBS=-lxml2 -# INSTALLDIR specifies the directory to which the binaries should be installed -INSTALLDIR=/usr/local/bin -# CP specifies the copy command for the system -CP=cp - -all: g2xml xml2g - -g2xml: - ${CC} ${CFLAGS} ${IDIRS} g2xml.c -o g2xml ${LIBS} - -xml2g: - ${CC} ${CFLAGS} ${IDIRS} xml2g.c -o xml2g ${LIBS} - -install: - ${CP} g2xml ${INSTALLDIR}/. - ${CP} xml2g ${INSTALLDIR}/. - ${CP} g3d.dtd ${INSTALLDIR}/. - -clean: - rm -f g2xml xml2g diff --git a/source/tools/glexemel/README b/source/tools/glexemel/README deleted file mode 100644 index ec077e910..000000000 --- a/source/tools/glexemel/README +++ /dev/null @@ -1,13 +0,0 @@ -=== GLEXEMEL === -An XML format for the G3D file format used by the game Glest: - http://www.glest.org - -This XML format allows for exporters to create XML file descriptions that -can then be converted to binary. - -Note: This package is not yet part of Glest, although it is offered for -inclusion should the developers wish. - -Copyright (C) Jonathan Merritt 2005. -This package may be distributed under the terms of the GNU General Public -License (see the file COPYING for more details). diff --git a/source/tools/glexemel/g2xml.c b/source/tools/glexemel/g2xml.c deleted file mode 100644 index 0150b92a5..000000000 --- a/source/tools/glexemel/g2xml.c +++ /dev/null @@ -1,340 +0,0 @@ -/** - * File: g2xml.c - * Written: Jonathan Merritt - * - * Description: - * Converts G3D format files into an XML representation. - * - * Copyright (C) Jonathan Merritt 2005. - * This file may be distributed under the terms of the GNU General Public - * License. - */ - -#include -#include -#include - -#include "g3dv4.h" - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - - - - /** - * Forward function declarations. - */ -int g3d2xml(FILE *infile, FILE *outfile); -void usage(char *execname); - - - -/** - * Program entry point. - * - * @param argc: Number of arguments passed to the program. - * @param argv: Array of string arguments. - * - * @returns: EXIT_SUCCESS or EXIT_FAILURE depending upon success or failure - * of the conversion to XML. - */ -int main(int argc, char **argv) { - char *infilename, *outfilename; - FILE *infile, *outfile; - int successFlag; - - /* parse command line arguments */ - if (argc != 3) { - usage(argv[0]); - return (EXIT_FAILURE); - } else { - infilename = argv[1]; - outfilename = argv[2]; - } - - /* attempt to open the input and output files */ -//#ifdef WIN32 -// infile = _wfopen(utf8_decode(infilename).c_str(), L"rb"); -//#else - infile = fopen(infilename, "rb"); - //#endif - if (infile == NULL) { - printf("Could not open file \"%s\" for binary reading.\n", - infilename); - return (EXIT_FAILURE); - } - //#ifdef WIN32 - // outfile = _wfopen(utf8_decode(outfilename).c_str(), L"w"); - //#else - outfile = fopen(outfilename, "w"); - //#endif - if (outfile == NULL) { - printf("Could not open file \"%s\" for writing.\n", - outfilename); - fclose(infile); - return (EXIT_FAILURE); - } - - /* perform the XML conversion */ - successFlag = g3d2xml(infile, outfile); - - /* close the two files */ - fclose(infile); - fclose(outfile); - - /* return a success or failure flag */ - if (successFlag) - return (EXIT_SUCCESS); - else - return (EXIT_FAILURE); -} - - - - -/** - * Prints a "Usage:" string for the program. - * - * @param execname: Executable name of the program. - */ -void usage(char *execname) { - printf("Usage:\n"); - printf(" %s infile.g3d outfile.xml\n", execname); - - return; -} - - - -/** - * Performs the conversion from the G3D file format to XML. - * - * @param infile: G3D binary file, opened as "rb", for input. - * @param outfile: Text file, opened as "w", for XML output. - * - * @returns: TRUE if conversion to XML was successful, and FALSE otherwise. - */ -int g3d2xml(FILE *infile, FILE *outfile) { - struct FileHeader fileHeader; - struct ModelHeader modelHeader; - struct MeshHeader meshHeader; - size_t nBytes; - uint8 textureName[NAMESIZE + 1]; - float32 *fdata; - uint32 *idata; - unsigned int ii, jj, kk; - - /* read in the FileHeader */ - nBytes = sizeof(struct FileHeader); - if (fread(&fileHeader, nBytes, 1, infile) != 1) { - printf("Could not read file header!\n"); - return FALSE; - } - if (strncmp((char*) fileHeader.id, "G3D", 3) != 0) { - printf("Expected \"G3D\" id was not found!\n"); - return FALSE; - } - if (fileHeader.version != 4) { - printf("Version 4 expected, but version %d found!\n", - fileHeader.version); - return FALSE; - } - fprintf(outfile, "\n"); - fprintf(outfile, "\n"); - fprintf(outfile, "\n"); - fprintf(outfile, "\n", fileHeader.version); - - /* read in the ModelHeader */ - nBytes = sizeof(struct ModelHeader); - if (fread(&modelHeader, nBytes, 1, infile) != 1) { - printf("Could not read model header!\n"); - return FALSE; - } - if (modelHeader.type != mtMorphMesh) { - printf("Unrecognized mesh type!\n"); - return FALSE; - } - - /* read in the meshes */ - for (ii = 0; ii < modelHeader.meshCount; ii++) { - /* read in the MeshHeader */ - nBytes = sizeof(struct MeshHeader); - if (fread(&meshHeader, nBytes, 1, infile) != 1) { - printf("Could not read mesh header!\n"); - return FALSE; - } - meshHeader.name[NAMESIZE - 1] = 0; - /* write out XML mesh header */ - fprintf(outfile, "\t\n"); - - /* write out diffuse and specular colors */ - fprintf(outfile, "\t\t\n"); - fprintf(outfile, "\t\t\t\n", - meshHeader.diffuseColor[0], - meshHeader.diffuseColor[1], - meshHeader.diffuseColor[2]); - fprintf(outfile, "\t\t\n"); - fprintf(outfile, "\t\t\n"); - fprintf(outfile, "\t\t\t\n", - meshHeader.specularColor[0], - meshHeader.specularColor[1], - meshHeader.specularColor[2]); - fprintf(outfile, "\t\t\n"); - - /* read / write the texture name if present */ - if (meshHeader.textures) { - memset(&textureName[0], 0, NAMESIZE + 1); - nBytes = NAMESIZE; - if (fread(&textureName, nBytes, 1, infile) != 1) { - printf("Could not read texture name!\n"); - return FALSE; - } - textureName[NAMESIZE] = 0; - fprintf(outfile, "\t\t\n", - textureName); - } - - /* read / write each set of vertex data */ - for (jj = 0; jj < meshHeader.frameCount; jj++) { - nBytes = sizeof(float32)*meshHeader.vertexCount * 3; - fdata = malloc(nBytes); - if (fdata == NULL) { - printf("Could not allocate buffer!\n"); - return FALSE; - } - if (fread(fdata, nBytes, 1, infile) != 1) { - printf("Could not read vertex data!\n"); - free(fdata); - return FALSE; - } - fprintf(outfile, "\t\t\n", - jj); - for (kk = 0; kk < meshHeader.vertexCount; kk++) { - fprintf(outfile, "\t\t\t\n", - fdata[3 * kk + 2]); - } - fprintf(outfile, "\t\t\n"); - free(fdata); - } - - /* read / write each set of normal data */ - for (jj = 0; jj < meshHeader.frameCount; jj++) { - nBytes = sizeof(float32)*meshHeader.vertexCount * 3; - fdata = malloc(nBytes); - if (fdata == NULL) { - printf("Could not allocate buffer!\n"); - return FALSE; - } - if (fread(fdata, nBytes, 1, infile) != 1) { - printf("Could not read normal data!\n"); - free(fdata); - return FALSE; - } - fprintf(outfile, "\t\t\n", - jj); - for (kk = 0; kk < meshHeader.vertexCount; kk++) { - fprintf(outfile, "\t\t\t\n", - fdata[3 * kk + 2]); - } - fprintf(outfile, "\t\t\n"); - free(fdata); - } - - /* read / write texture coordinates */ - if (meshHeader.textures) { - nBytes = sizeof(float32)*meshHeader.vertexCount * 2; - fdata = malloc(nBytes); - if (fdata == NULL) { - printf("Could not allocate buffer!\n"); - return FALSE; - } - if (fread(fdata, nBytes, 1, infile) != 1) { - printf("Could not read texture coords!\n"); - free(fdata); - return FALSE; - } - fprintf(outfile, "\t\t\n"); - for (kk = 0; kk < meshHeader.vertexCount; kk++) { - fprintf(outfile, "\t\t\t\n", - fdata[2 * kk + 1]); - } - fprintf(outfile, "\t\t\n"); - free(fdata); - } - - /* read / write face indices */ - nBytes = sizeof(uint32)*meshHeader.indexCount; - idata = malloc(nBytes); - if (idata == NULL) { - printf("Could not allocate buffer!\n"); - return FALSE; - } - if (fread(idata, nBytes, 1, infile) != 1) { - printf("Could not read indexes!\n"); - free(idata); - return FALSE; - } - fprintf(outfile, "\t\t\n"); - for (kk = 0; kk < meshHeader.indexCount; kk++) { - fprintf(outfile, "\t\t\t\n", - idata[kk]); - } - fprintf(outfile, "\t\t\n"); - free(idata); - - fprintf(outfile, "\t\n"); - } - - fprintf(outfile, "\n"); - - return TRUE; - -} - diff --git a/source/tools/glexemel/g3d.dtd b/source/tools/glexemel/g3d.dtd deleted file mode 100644 index f1822b6a4..000000000 --- a/source/tools/glexemel/g3d.dtd +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/tools/glexemel/g3d_logo.png b/source/tools/glexemel/g3d_logo.png deleted file mode 100644 index 70852fe846cc3c42fc44d420da070570a10c14d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60581 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 - * - * Description: - * Converts G3Dv4 XML files into the binary representation used in the game. - * Requirements: - * libxml2 - * - * Copyright (C) Jonathan Merritt 2005. - * This file may be distributed under the terms of the GNU General Public - * License. - */ - -#include -#include -#include -#include -#include -#include - -#include "g3dv4.h" - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - - -/** - * Forward function declarations. - */ -int xml2g3d(xmlDocPtr doc, FILE *outfile); -void usage(char *execname); -unsigned int countChildren(xmlNode *n, xmlChar *name); -int processMesh(xmlNode *n, FILE *outfile); -int readColorChild(xmlNode *n, char *childName, float32 *color); -int processVertices(xmlNode *n, FILE *outfile, uint32 vertexCount); -int processNormals(xmlNode *n, FILE *outfile, uint32 vertexCount); -int processTexcoords(xmlNode *n, FILE *outfile, uint32 vertexCount); -int processIndices(xmlNode *n, FILE *outfile, uint32 indexCount); - - -/** - * Program entry point. - * - * @param argc: Number of arguments passed to the program. - * @param argv: Array of string arguments. - * - * @returns: EXIT_SUCCESS or EXIT_FAILURE depending upon success or failure - * of the conversion to XML. - */ -int main(int argc, char **argv) -{ - char *infilename, *outfilename; - FILE *outfile; - int successFlag; - xmlParserCtxtPtr ctxt; - xmlDocPtr doc; - - /* parse command line arguments */ - if (argc != 3) - { - usage(argv[0]); - return (EXIT_FAILURE); - } - else - { - infilename = argv[1]; - outfilename = argv[2]; - } - - /* attempt to parse the XML file */ - LIBXML_TEST_VERSION - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL) - { - printf("Failed to allocate XML parser context!\n"); - return (EXIT_FAILURE); - } - doc = xmlCtxtReadFile(ctxt, infilename, NULL, XML_PARSE_DTDVALID); - if (doc == NULL) - { - printf("Could not parse XML file \"%s\"!\n", infilename); - xmlFreeParserCtxt(ctxt); - return (EXIT_FAILURE); - } - - /* attempt to open the output binary file */ -//#ifdef WIN32 -// outfile = _wfopen(utf8_decode(outfilename).c_str(), L"wb"); -//#else - outfile = fopen(outfilename, "wb"); -//#endif - if (outfile == NULL) { - printf("Could not open file \"%s\" for writing!\n", - outfilename); - xmlFreeDoc(doc); - xmlFreeParserCtxt(ctxt); - xmlCleanupParser(); - return (EXIT_FAILURE); - } - - /* perform the conversion: XML -> binary */ - successFlag = xml2g3d(doc, outfile); - - /* close the files */ - xmlFreeDoc(doc); - xmlFreeParserCtxt(ctxt); - xmlCleanupParser(); - fclose(outfile); - - /* return a success or failure flag */ - if (successFlag) - return (EXIT_SUCCESS); - else - return (EXIT_FAILURE); - -} - - - -/** - * Prints a "Usage:" string for the program. - * - * @param execname: Executable name of the program. - */ -void usage(char *execname) -{ - printf("Usage:\n"); - printf(" %s infile.xml outfile.g3d\n", execname); - - return; -} - - - -/** - * Performs the conversion from the XML file format to the G3D binary format. - * - * @param doc: XML DOM document for input. - * @param outfile: Binary file, opened as "wb", for output. - */ -int xml2g3d(xmlDocPtr doc, FILE *outfile) -{ - struct FileHeader fh; - struct ModelHeader mh; - xmlNode *root_element; - xmlNode *curNode; - xmlChar version[] = "version"; - - /* fetch the root element and check it */ - root_element = xmlDocGetRootElement(doc); - assert(root_element->type == XML_ELEMENT_NODE); - if (strcmp((char*)root_element->name, "G3D") != 0) - { - printf("G3D document not found!\n"); - return FALSE; - } - if (strcmp((char*)xmlGetProp(root_element, version), "4") != 0) - { - printf("Only version 4 G3D documents can be handled!\n"); - return FALSE; - } - - /* write out the file header */ - memset(&fh, 0, sizeof(struct FileHeader)); - fh.id[0] = 'G'; fh.id[1] = '3'; fh.id[2] = 'D'; fh.version=4; - fwrite(&fh, sizeof(struct FileHeader), 1, outfile); - - /* write out the model header */ - memset(&mh, 0, sizeof(struct ModelHeader)); - mh.meshCount = (uint16)countChildren(root_element, (xmlChar*)"Mesh"); - mh.type = 0; - fwrite(&mh, sizeof(struct ModelHeader), 1, outfile); - - /* process each mesh in the file */ - curNode = root_element->children; - for (; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, "Mesh") == 0) - { - if (processMesh(curNode, outfile) == FALSE) - return FALSE; - } - } - } - - return TRUE; -} - - - -/** - * Counts the number of child nodes with the specified name. - * - * @param n: Node to count the children from. - * @param name: Name of the child nodes to count. - * - * @return: The number of child nodes. - */ -unsigned int countChildren(xmlNode *n, xmlChar *name) -{ - unsigned int count = 0; - xmlNode *curNode = NULL; - - for (curNode = n->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, (char*)name) == 0) - count++; - } - } - - return count; -} - - - -/** - * Processes all elements from the XML file. - * - * @param n: element - * @param outfile: Binary file, opened as "wb", for output. - * - * @return: TRUE if successful, FALSE otherwise. - */ -int processMesh(xmlNode *n, FILE *outfile) -{ - xmlChar name[] = "name"; - xmlChar frameCount[] = "frameCount"; - xmlChar vertexCount[] = "vertexCount"; - xmlChar indexCount[] = "indexCount"; - xmlChar specularPower[] = "specularPower"; - xmlChar opacity[] = "opacity"; - xmlChar twoSided[] = "twoSided"; - xmlChar customColor[] = "customColor"; - xmlChar diffuseTexture[] = "diffuseTexture"; - - float32 color[3]; - - struct MeshHeader mh; - uint8 texname[NAMESIZE+1]; - - int foundFlag = FALSE; - xmlNode *texn = NULL; - xmlNode *curNode = NULL; - - /* make sure we're dealing with a element */ - assert(strcmp((char*)n->name, "Mesh") == 0); - - /* populate the MeshHeader structure appropriately */ - memset(&mh, 0, sizeof(struct MeshHeader)); - strncpy((char*)mh.name, (char*)xmlGetProp(n, name), NAMESIZE-1); - mh.frameCount = (uint32)atoi((char*)xmlGetProp(n, frameCount)); - mh.vertexCount = (uint32)atoi((char*)xmlGetProp(n, vertexCount)); - mh.indexCount = (uint32)atoi((char*)xmlGetProp(n, indexCount)); - if (readColorChild(n, "Diffuse", color) == FALSE) - return FALSE; - mh.diffuseColor[0] = color[0]; - mh.diffuseColor[1] = color[1]; - mh.diffuseColor[2] = color[2]; - if (readColorChild(n, "Specular", color) == FALSE) - return FALSE; - mh.specularColor[0] = color[0]; - mh.specularColor[1] = color[1]; - mh.specularColor[2] = color[2]; - mh.specularPower = (float32)atof((char*)xmlGetProp(n, specularPower)); - mh.opacity = (float32)atof((char*)xmlGetProp(n, opacity)); - mh.properties = 0; - if (strcmp((char*)xmlGetProp(n, twoSided), "true") == 0) - mh.properties += (0x1 << mpfTwoSided); - if (strcmp((char*)xmlGetProp(n, customColor), "true") == 0) - mh.properties += (0x1 << mpfCustomColor); - mh.textures = 0; - if (strcmp((char*)xmlGetProp(n, diffuseTexture), "true") == 0) - mh.textures = 1; - - /* write the MeshHeader */ - fwrite(&mh, sizeof(struct MeshHeader), 1, outfile); - - /* if we have a texture, then also write its name */ - foundFlag = FALSE; - if (mh.textures) - { - for (texn=n->children; texn; texn = texn->next) - { - if (texn->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)texn->name, "Texture") == 0) - { - foundFlag = TRUE; - break; - } - } - } - if (foundFlag == FALSE) - { - printf("Could not find element!\n"); - return FALSE; - } - memset(texname, 0, NAMESIZE+1); - strncpy((char*)texname, - (char*)xmlGetProp(texn, (xmlChar*)"name"), NAMESIZE); - fwrite(texname, NAMESIZE, 1, outfile); - } - - /* write out vertices */ - foundFlag = FALSE; - for (curNode=n->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, "Vertices") == 0) - { - foundFlag = TRUE; - if (processVertices(curNode, outfile, - mh.vertexCount) == FALSE) - { - return FALSE; - } - } - } - } - if (foundFlag == FALSE) - { - printf("No found!\n"); - return FALSE; - } - - /* write out normals */ - foundFlag = FALSE; - for (curNode=n->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, "Normals") == 0) - { - foundFlag = TRUE; - if (processNormals(curNode, outfile, - mh.vertexCount) == FALSE) - { - return FALSE; - } - } - } - } - if (foundFlag == FALSE) - { - printf("No found!\n"); - return FALSE; - } - - /* write out texture coordinates */ - if (mh.textures) - { - foundFlag = FALSE; - for (curNode=n->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, "TexCoords") - == 0) - { - foundFlag = TRUE; - if (processTexcoords(curNode, - outfile, mh.vertexCount) == - FALSE) - { - return FALSE; - } - } - } - } - if (foundFlag == FALSE) - { - printf("No found!\n"); - return FALSE; - } - } - - /* write out indices */ - foundFlag = FALSE; - for (curNode=n->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, "Indices") == 0) - { - foundFlag = TRUE; - if (processIndices(curNode, outfile, - mh.indexCount) == FALSE) - { - return FALSE; - } - } - } - } - if (foundFlag == FALSE) - { - printf("No found!\n"); - } - - return TRUE; -} - - - -/** - * Reads the child of a child of a node. - * - * For example: - * - * - * - * - * - * If is passed in as n and childNode is the string "Diffuse", then - * the method will read the element from within the element. - * - * @param n: Node from which the children should be read. - * @param childNode: Name of the child element that owns a element. - * @param color: float32[3] array to hold RGB color. - * - * @return TRUE if the method succeeds, FALSE otherwise. - */ -int readColorChild(xmlNode *n, char *childNode, float32 *color) -{ - int foundFlag = FALSE; - double r,g,b; - xmlNode *curNode = NULL; - - /* make sure that n is an element */ - assert(n->type == XML_ELEMENT_NODE); - - /* search for the first child node matching the given name */ - for (curNode=n->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, (char*)childNode) == 0) - { - foundFlag = TRUE; - break; - } - } - } - if (foundFlag == FALSE) - { - printf("Could not find child node \"%s\"!\n", childNode); - return FALSE; - } - - /* search for a node child */ - for (curNode=curNode->children; curNode; curNode = curNode->next) - { - if (curNode->type == XML_ELEMENT_NODE) - { - if (strcmp((char*)curNode->name, "Color") == 0) - { - r = atof((char*)xmlGetProp(curNode, - (xmlChar*)"r")); - g = atof((char*)xmlGetProp(curNode, - (xmlChar*)"g")); - b = atof((char*)xmlGetProp(curNode, - (xmlChar*)"b")); - color[0] = (float32)r; - color[1] = (float32)g; - color[2] = (float32)b; - return TRUE; - } - } - } - printf("Could not find child of \"%s\"!\n", childNode); - return FALSE; -} - - - -/** - * Writes vertices into the binary file. - * - * @param n: element. - * @param outfile: Binary file, opened as "wb", for output. - * @param vertexCount: Expected number of vertices to process. - * - * @return: TRUE if the method succeeds, FALSE otherwise. - */ -int processVertices(xmlNode *n, FILE *outfile, uint32 vertexCount) -{ - xmlNode *v; - uint32 counted_vertices = 0; - float32 p[3]; - - /* check we've been passed a element */ - assert(n->type == XML_ELEMENT_NODE); - assert(strcmp((char*)n->name, "Vertices") == 0); - - /* iterate over all children */ - for (v=n->children; v; v=v->next) - { - if ((v->type == XML_ELEMENT_NODE) && - (strcmp((char*)v->name, "Vertex") == 0)) - { - counted_vertices++; - p[0] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"x")); - p[1] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"y")); - p[2] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"z")); - fwrite(p, 3*sizeof(float32), 1, outfile); - } - } - - /* check that the correct number of vertices were processed */ - if (counted_vertices != vertexCount) - { - printf("Found %u vertices, expected %u!\n", - counted_vertices, vertexCount); - return FALSE; - } - - return TRUE; -} - - - -/** - * Writes normals into the binary file. - * - * @param n: element. - * @param outfile: Binary file, opened as "wb", for output. - * @param vertexCount: Expected number of normals to process. - * - * @return: TRUE if the method succeeds, FALSE otherwise. - */ -int processNormals(xmlNode *n, FILE *outfile, uint32 vertexCount) -{ - xmlNode *v; - uint32 counted_normals = 0; - float32 p[3]; - - /* check we've been passed a element */ - assert(n->type == XML_ELEMENT_NODE); - assert(strcmp((char*)n->name, "Normals") == 0); - - /* iterate over all elements */ - for (v=n->children; v; v=v->next) - { - if ((v->type == XML_ELEMENT_NODE) && - (strcmp((char*)v->name, "Normal") == 0)) - { - counted_normals++; - p[0] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"x")); - p[1] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"y")); - p[2] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"z")); - fwrite(p, 3*sizeof(float32), 1, outfile); - } - } - - /* check that the correct number of normals were processed */ - if (counted_normals != vertexCount) - { - printf("Found %u normals, expected %u!\n", - counted_normals, vertexCount); - return FALSE; - } - - return TRUE; -} - - - -/** - * Writes texture coordinates into the binary file. - * - * @param n: element. - * @param outfile: Binary file, opened as "wb", for output. - * @param vertexCount: Expected number of vertices to process. - * - * @return: TRUE if the method succeeds, FALSE otherwise. - */ -int processTexcoords(xmlNode *n, FILE *outfile, uint32 vertexCount) -{ - xmlNode *v; - uint32 counted_texco = 0; - float32 p[2]; - - /* check we've been passed a element */ - assert(n->type == XML_ELEMENT_NODE); - assert(strcmp((char*)n->name, "TexCoords") == 0); - - /* iterate over all children */ - for (v=n->children; v; v=v->next) - { - if ((v->type == XML_ELEMENT_NODE) && - (strcmp((char*)v->name, "ST") == 0)) - { - ++counted_texco; - p[0] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"s")); - p[1] = (float32)atof((char*)xmlGetProp(v, - (xmlChar*)"t")); - fwrite(p, 2*sizeof(float32), 1, outfile); - } - } - - /* check that the correct number of texco were processed */ - if (counted_texco != vertexCount) - { - printf("Found %u texture coordinates, expected %u!\n", - counted_texco, vertexCount); - return FALSE; - } - - return TRUE; -} - - - -/** - * Writes indices into the binary file. - * - * @param n: element. - * @param outfile: Binary file, opened as "wb", for output. - * @param indexCount: Expected number of indices to process. - * - * @return: TRUE if the method succeeds, FALSE otherwise. - */ -int processIndices(xmlNode *n, FILE *outfile, uint32 indexCount) -{ - xmlNode *v; - uint32 counted_indices = 0; - uint32 index; - - /* check we've been passed an element */ - assert(n->type == XML_ELEMENT_NODE); - assert(strcmp((char*)n->name, "Indices") == 0); - - /* iterate over all children */ - for (v=n->children; v; v=v->next) - { - if ((v->type == XML_ELEMENT_NODE) && - (strcmp((char*)v->name, "Ix") == 0)) - { - ++counted_indices; - index = (uint32)atoi((char*)xmlGetProp(v, - (xmlChar*)"i")); - fwrite(&index, 1*sizeof(uint32), 1, outfile); - } - } - - /* check that the correct number of indices were processed */ - if (counted_indices != indexCount) - { - printf("Found %u indices, expected %u!\n", - counted_indices, indexCount); - return FALSE; - } - - return TRUE; -} -