diff options
-rw-r--r-- | SConstruct | 1 | ||||
-rw-r--r-- | modules/assimp/SCsub | 170 | ||||
-rw-r--r-- | platform/server/detect.py | 4 | ||||
-rw-r--r-- | platform/x11/detect.py | 5 | ||||
-rw-r--r-- | thirdparty/README.md | 13 | ||||
-rw-r--r-- | thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes | 12 | ||||
-rw-r--r-- | thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html | 1789 | ||||
-rw-r--r-- | thirdparty/assimp/include/assimp/config.h (renamed from thirdparty/assimp/assimp/config.h) | 291 | ||||
-rw-r--r-- | thirdparty/assimp/revision.h (renamed from thirdparty/assimp/code/revision.h) | 0 |
9 files changed, 256 insertions, 2029 deletions
diff --git a/SConstruct b/SConstruct index 436dd48800..4ebc33f593 100644 --- a/SConstruct +++ b/SConstruct @@ -136,6 +136,7 @@ opts.Add(BoolVariable('no_editor_splash', "Don't use the custom splash screen fo opts.Add('system_certs_path', "Use this path as SSL certificates default for editor (for package maintainers)", '') # Thirdparty libraries +#opts.Add(BoolVariable('builtin_assimp', "Use the built-in Assimp library", True)) opts.Add(BoolVariable('builtin_bullet', "Use the built-in Bullet library", True)) opts.Add(BoolVariable('builtin_certs', "Bundle default SSL certificates to be used if you don't specify an override in the project settings", True)) opts.Add(BoolVariable('builtin_enet', "Use the built-in ENet library", True)) diff --git a/modules/assimp/SCsub b/modules/assimp/SCsub index 5e66b50de3..90cdd7f5fc 100644 --- a/modules/assimp/SCsub +++ b/modules/assimp/SCsub @@ -4,97 +4,91 @@ Import('env') Import('env_modules') env_assimp = env_modules.Clone() -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/include']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code/Importer/IFC']) -env_assimp.Prepend(CPPPATH=['#thirdparty/misc']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/common']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/irrXML/']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/unzip/']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code/Importer/STEPParser']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/']) -env_assimp.Prepend(CPPPATH=['#thirdparty/zlib/']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/openddlparser/include']) -env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/contrib/rapidjson/include']) -env_assimp.Prepend(CPPPATH=['.']) -#env_assimp.Append(CPPDEFINES=['ASSIMP_DOUBLE_PRECISION']) # TODO default to what godot is compiled with for future double support -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_BOOST_WORKAROUND']) -env_assimp.Append(CPPDEFINES=['OPENDDLPARSER_BUILD']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OWN_ZLIB']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_EXPORT']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_AMF_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3DS_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD3_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD5_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MDL_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD2_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_PLY_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_ASE_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OBJ_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_HMP_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_SMD_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MDC_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD5_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_STL_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_LWO_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_DXF_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_NFF_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_RAW_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_SIB_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OFF_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_AC_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_BVH_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IRRMESH_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IRR_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_Q3D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_B3D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_COLLADA_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_TERRAGEN_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_CSM_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_LWS_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OGRE_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OPENGEX_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MS3D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_COB_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_BLEND_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_Q3BSP_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_NDO_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_STEP_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IFC_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_XGL_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_ASSBIN_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_C4D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3MF_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X3D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF2_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_SINGLETHREADED']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_M3D_IMPORTER']) -env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MMD_IMPORTER']) +# Force bundled version for now, there's no released version of Assimp with +# support for ArmaturePopulate which we use from their master branch. +if True: # env['builtin_assimp']: + thirdparty_dir = "#thirdparty/assimp" -if(env['platform'] == 'windows'): - env_assimp.Append(CPPDEFINES=['PLATFORM_WINDOWS']) - env_assimp.Append(CPPDEFINES=[('PLATFORM', 'WINDOWS')]) -elif(env['platform'] == 'x11'): - env_assimp.Append(CPPDEFINES=['PLATFORM_LINUX']) - env_assimp.Append(CPPDEFINES=[('PLATFORM', 'LINUX')]) -elif(env['platform'] == 'osx'): - env_assimp.Append(CPPDEFINES=['PLATFORM_DARWIN']) - env_assimp.Append(CPPDEFINES=[('PLATFORM', 'DARWIN')]) + env_assimp.Prepend(CPPPATH=['#thirdparty/assimp']) + env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/code']) + env_assimp.Prepend(CPPPATH=['#thirdparty/assimp/include']) + + #env_assimp.Append(CPPDEFINES=['ASSIMP_DOUBLE_PRECISION']) # TODO default to what godot is compiled with for future double support + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_SINGLETHREADED']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_BOOST_WORKAROUND']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OWN_ZLIB']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_EXPORT']) + + # Importers we don't need + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3DS_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_3MF_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_AC_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_AMF_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_ASE_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_ASSBIN_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_B3D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_BLEND_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_BVH_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_C4D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_COB_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_COLLADA_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_CSM_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_DXF_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF2_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_HMP_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IFC_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IRR_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_IRRMESH_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_LWO_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_LWS_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_M3D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD2_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD3_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD5_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MD5_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MDC_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MDL_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MMD_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MS3D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_NDO_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_NFF_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OBJ_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OFF_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OGRE_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_OPENGEX_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_PLY_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_Q3BSP_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_Q3D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_RAW_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_SIB_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_SMD_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_STEP_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_STL_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_TERRAGEN_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X3D_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_XGL_IMPORTER']) + env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X_IMPORTER']) + + if(env['platform'] == 'windows'): + env_assimp.Append(CPPDEFINES=['PLATFORM_WINDOWS']) + env_assimp.Append(CPPDEFINES=[('PLATFORM', 'WINDOWS')]) + elif(env['platform'] == 'x11'): + env_assimp.Append(CPPDEFINES=['PLATFORM_LINUX']) + env_assimp.Append(CPPDEFINES=[('PLATFORM', 'LINUX')]) + elif(env['platform'] == 'osx'): + env_assimp.Append(CPPDEFINES=['PLATFORM_DARWIN']) + env_assimp.Append(CPPDEFINES=[('PLATFORM', 'DARWIN')]) -env_thirdparty = env_assimp.Clone() -env_thirdparty.disable_warnings() -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Common/*.cpp')) -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/PostProcessing/*.cpp')) -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Material/*.cpp')) -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/FBX/*.cpp')) -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/MMD/*.cpp')) -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/glTF/*.cpp')) -env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/glTF2/*.cpp')) + env_thirdparty = env_assimp.Clone() + env_thirdparty.disable_warnings() + env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/CApi/*.cpp')) + env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Common/*.cpp')) + env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/PostProcessing/*.cpp')) + env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/Material/*.cpp')) + env_thirdparty.add_source_files(env.modules_sources, Glob('#thirdparty/assimp/code/FBX/*.cpp')) # Godot's own source files env_assimp.add_source_files(env.modules_sources, "*.cpp") diff --git a/platform/server/detect.py b/platform/server/detect.py index ef94dc436c..db9ba8d036 100644 --- a/platform/server/detect.py +++ b/platform/server/detect.py @@ -163,6 +163,10 @@ def configure(env): sys.exit(255) env.ParseConfig('pkg-config bullet --cflags --libs') + if False: # not env['builtin_assimp']: + # FIXME: Add min version check + env.ParseConfig('pkg-config assimp --cflags --libs') + if not env['builtin_enet']: env.ParseConfig('pkg-config libenet --cflags --libs') diff --git a/platform/x11/detect.py b/platform/x11/detect.py index 8952aa5e82..9a9ab86068 100644 --- a/platform/x11/detect.py +++ b/platform/x11/detect.py @@ -1,7 +1,6 @@ import os import platform import sys -from methods import using_gcc, using_clang def is_active(): @@ -226,6 +225,10 @@ def configure(env): sys.exit(255) env.ParseConfig('pkg-config bullet --cflags --libs') + if False: # not env['builtin_assimp']: + # FIXME: Add min version check + env.ParseConfig('pkg-config assimp --cflags --libs') + if not env['builtin_enet']: env.ParseConfig('pkg-config libenet --cflags --libs') diff --git a/thirdparty/README.md b/thirdparty/README.md index 2099bd773f..8fc15692ef 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -9,9 +9,20 @@ Subcategories (`###` level) where needed are separated by a single empty line. ## assimp - Upstream: http://github.com/assimp/assimp -- Version: git (308db73d0b3c2d1870cd3e465eaa283692a4cf23) +- Version: git (308db73d0b3c2d1870cd3e465eaa283692a4cf23, 2019) - License: BSD-3-Clause +Files extracted from upstream source: + +- Run `cmake .` in root folder to generate files +- `code/{CApi,Common,FBX,Material,PostProcessing}/` +- `contrib/utf8cpp/source/` +- `include/` +- `revision.h` +- `CREDITS` and `LICENSE` files +- `rm -f code/Common/ZipArchiveIOSystem.cpp include/assimp/ZipArchiveIOSystem.h + include/assimp/irrXMLWrapper.h` + ## basis_universal diff --git a/thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes b/thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes deleted file mode 100644 index 364411a23d..0000000000 --- a/thirdparty/assimp/contrib/utf8cpp/doc/ReleaseNotes +++ /dev/null @@ -1,12 +0,0 @@ -utf8 cpp library -Release 2.3.4 - -A minor bug fix release. Thanks to all who reported bugs. - -Note: Version 2.3.3 contained a regression, and therefore was removed. - -Changes from version 2.3.2 -- Bug fix [39]: checked.h Line 273 and unchecked.h Line 182 have an extra ';' -- Bug fix [36]: replace_invalid() only works with back_inserter - -Files included in the release: utf8.h, core.h, checked.h, unchecked.h, utf8cpp.html, ReleaseNotes diff --git a/thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html b/thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html deleted file mode 100644 index 6f2aacbe7b..0000000000 --- a/thirdparty/assimp/contrib/utf8cpp/doc/utf8cpp.html +++ /dev/null @@ -1,1789 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> - <head> - <meta name="generator" content= - "HTML Tidy for Linux/x86 (vers 1st November 2002), see www.w3.org"> - <meta name="description" content= - "A simple, portable and lightweigt C++ library for easy handling of UTF-8 encoded strings"> - <meta name="keywords" content="UTF-8 C++ portable utf8 unicode generic templates"> - <meta name="author" content="Nemanja Trifunovic"> - <title> - UTF8-CPP: UTF-8 with C++ in a Portable Way - </title> - <style type="text/css"> - <!-- - span.return_value { - color: brown; - } - span.keyword { - color: blue; - } - span.preprocessor { - color: navy; - } - span.literal { - color: olive; - } - span.comment { - color: green; - } - code { - font-weight: bold; - } - ul.toc { - list-style-type: none; - } - p.version { - font-size: small; - font-style: italic; - } - --> - </style> - </head> - <body> - <h1> - UTF8-CPP: UTF-8 with C++ in a Portable Way - </h1> - <p> - <a href="https://sourceforge.net/projects/utfcpp">The Sourceforge project page</a> - </p> - <div id="toc"> - <h2> - Table of Contents - </h2> - <ul class="toc"> - <li> - <a href="#introduction">Introduction</a> - </li> - <li> - <a href="#examples">Examples of Use</a> - <ul class="toc"> - <li> - <a href=#introsample>Introductionary Sample </a> - </li> - <li> - <a href=#validfile>Checking if a file contains valid UTF-8 text</a> - </li> - <li> - <a href=#fixinvalid>Ensure that a string contains valid UTF-8 text</a> - </li> - </ul> - <li> - <a href="#reference">Reference</a> - <ul class="toc"> - <li> - <a href="#funutf8">Functions From utf8 Namespace </a> - </li> - <li> - <a href="#typesutf8">Types From utf8 Namespace </a> - </li> - <li> - <a href="#fununchecked">Functions From utf8::unchecked Namespace </a> - </li> - <li> - <a href="#typesunchecked">Types From utf8::unchecked Namespace </a> - </li> - </ul> - </li> - <li> - <a href="#points">Points of Interest</a> - </li> - <li> - <a href="#links">Links</a> - </li> - </ul> - </div> - <h2 id="introduction"> - Introduction - </h2> - <p> - Many C++ developers miss an easy and portable way of handling Unicode encoded - strings. The original C++ Standard (known as C++98 or C++03) is Unicode agnostic. - C++11 provides some support for Unicode on core language and library level: - u8, u, and U character and string literals, char16_t and char32_t character types, - u16string and u32string library classes, and codecvt support for conversions - between Unicode encoding forms. - In the meantime, developers use third party libraries like ICU, OS specific capabilities, or simply - roll out their own solutions. - </p> - <p> - In order to easily handle UTF-8 encoded Unicode strings, I came up with a small - generic library. For anybody used to work with STL algorithms and iterators, it should be - easy and natural to use. The code is freely available for any purpose - check out - the license at the beginning of the utf8.h file. If you run into - bugs or performance issues, please let me know and I'll do my best to address them. - </p> - <p> - The purpose of this article is not to offer an introduction to Unicode in general, - and UTF-8 in particular. If you are not familiar with Unicode, be sure to check out - <a href="http://www.unicode.org/">Unicode Home Page</a> or some other source of - information for Unicode. Also, it is not my aim to advocate the use of UTF-8 - encoded strings in C++ programs; if you want to handle UTF-8 encoded strings from - C++, I am sure you have good reasons for it. - </p> - <h2 id="examples"> - Examples of use - </h2> - <h3 id="introsample"> - Introductionary Sample - </h3> - <p> - To illustrate the use of the library, let's start with a small but complete program - that opens a file containing UTF-8 encoded text, reads it line by line, checks each line - for invalid UTF-8 byte sequences, and converts it to UTF-16 encoding and back to UTF-8: - </p> -<pre> -<span class="preprocessor">#include <fstream></span> -<span class="preprocessor">#include <iostream></span> -<span class="preprocessor">#include <string></span> -<span class="preprocessor">#include <vector></span> -<span class="preprocessor">#include "utf8.h"</span> -<span class="keyword">using namespace</span> std; -<span class="keyword">int</span> main(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv) -{ - <span class="keyword">if</span> (argc != <span class="literal">2</span>) { - cout << <span class="literal">"\nUsage: docsample filename\n"</span>; - <span class="keyword">return</span> <span class="literal">0</span>; - } - - <span class="keyword">const char</span>* test_file_path = argv[1]; - <span class="comment">// Open the test file (contains UTF-8 encoded text)</span> - ifstream fs8(test_file_path); - <span class="keyword">if</span> (!fs8.is_open()) { - cout << <span class= -"literal">"Could not open "</span> << test_file_path << endl; - <span class="keyword">return</span> <span class="literal">0</span>; - } - - <span class="keyword">unsigned</span> line_count = <span class="literal">1</span>; - string line; - <span class="comment">// Play with all the lines in the file</span> - <span class="keyword">while</span> (getline(fs8, line)) { - <span class="comment">// check for invalid utf-8 (for a simple yes/no check, there is also utf8::is_valid function)</span> - string::iterator end_it = utf8::find_invalid(line.begin(), line.end()); - <span class="keyword">if</span> (end_it != line.end()) { - cout << <span class= -"literal">"Invalid UTF-8 encoding detected at line "</span> << line_count << <span - class="literal">"\n"</span>; - cout << <span class= -"literal">"This part is fine: "</span> << string(line.begin(), end_it) << <span - class="literal">"\n"</span>; - } - - <span class="comment">// Get the line length (at least for the valid part)</span> - <span class="keyword">int</span> length = utf8::distance(line.begin(), end_it); - cout << <span class= -"literal">"Length of line "</span> << line_count << <span class= -"literal">" is "</span> << length << <span class="literal">"\n"</span>; - - <span class="comment">// Convert it to utf-16</span> - vector<unsigned short> utf16line; - utf8::utf8to16(line.begin(), end_it, back_inserter(utf16line)); - - <span class="comment">// And back to utf-8</span> - string utf8line; - utf8::utf16to8(utf16line.begin(), utf16line.end(), back_inserter(utf8line)); - - <span class="comment">// Confirm that the conversion went OK:</span> - <span class="keyword">if</span> (utf8line != string(line.begin(), end_it)) - cout << <span class= -"literal">"Error in UTF-16 conversion at line: "</span> << line_count << <span - class="literal">"\n"</span>; - - line_count++; - } - <span class="keyword">return</span> <span class="literal">0</span>; -} -</pre> - <p> - In the previous code sample, for each line we performed - a detection of invalid UTF-8 sequences with <code>find_invalid</code>; the number - of characters (more precisely - the number of Unicode code points, including the end - of line and even BOM if there is one) in each line was - determined with a use of <code>utf8::distance</code>; finally, we have converted - each line to UTF-16 encoding with <code>utf8to16</code> and back to UTF-8 with - <code>utf16to8</code>. - </p> - <h3 id="validfile">Checking if a file contains valid UTF-8 text</h3> -<p> -Here is a function that checks whether the content of a file is valid UTF-8 encoded text without -reading the content into the memory: -</p> -<pre> -<span class="keyword">bool</span> valid_utf8_file(i<span class="keyword">const char</span>* file_name) -{ - ifstream ifs(file_name); - <span class="keyword">if</span> (!ifs) - <span class="keyword">return false</span>; <span class="comment">// even better, throw here</span> - - istreambuf_iterator<<span class="keyword">char</span>> it(ifs.rdbuf()); - istreambuf_iterator<<span class="keyword">char</span>> eos; - - <span class="keyword">return</span> utf8::is_valid(it, eos); -} -</pre> -<p> -Because the function <code>utf8::is_valid()</code> works with input iterators, we were able -to pass an <code>istreambuf_iterator</code> to it and read the content of the file directly -without loading it to the memory first.</p> -<p> -Note that other functions that take input iterator arguments can be used in a similar way. For -instance, to read the content of a UTF-8 encoded text file and convert the text to UTF-16, just -do something like: -</p> -<pre> - utf8::utf8to16(it, eos, back_inserter(u16string)); -</pre> - <h3 id="fixinvalid">Ensure that a string contains valid UTF-8 text</h3> -<p> -If we have some text that "probably" contains UTF-8 encoded text and we want to -replace any invalid UTF-8 sequence with a replacement character, something like -the following function may be used: -</p> -<pre> -<span class="keyword">void</span> fix_utf8_string(std::string& str) -{ - std::string temp; - utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp)); - str = temp; -} -</pre> -<p>The function will replace any invalid UTF-8 sequence with a Unicode replacement character. -There is an overloaded function that enables the caller to supply their own replacement character. -</p> - <h2 id="reference"> - Reference - </h2> - <h3 id="funutf8"> - Functions From utf8 Namespace - </h3> - <h4> - utf8::append - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence - to a UTF-8 string. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -octet_iterator append(uint32_t cp, octet_iterator result); - -</pre> - <p> - <code>octet_iterator</code>: an output iterator.<br> - <code>cp</code>: a 32 bit integer representing a code point to append to the - sequence.<br> - <code>result</code>: an output iterator to the place in the sequence where to - append the code point.<br> - <span class="return_value">Return value</span>: an iterator pointing to the place - after the newly appended sequence. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">unsigned char</span> u[<span class="literal">5</span>] = {<span -class="literal">0</span>,<span class="literal">0</span>,<span class= -"literal">0</span>,<span class="literal">0</span>,<span class="literal">0</span>}; -<span class="keyword">unsigned char</span>* end = append(<span class= -"literal">0x0448</span>, u); -assert (u[<span class="literal">0</span>] == <span class= -"literal">0xd1</span> && u[<span class="literal">1</span>] == <span class= -"literal">0x88</span> && u[<span class="literal">2</span>] == <span class= -"literal">0</span> && u[<span class="literal">3</span>] == <span class= -"literal">0</span> && u[<span class="literal">4</span>] == <span class= -"literal">0</span>); -</pre> - <p> - Note that <code>append</code> does not allocate any memory - it is the burden of - the caller to make sure there is enough memory allocated for the operation. To make - things more interesting, <code>append</code> can add anywhere between 1 and 4 - octets to the sequence. In practice, you would most often want to use - <code>std::back_inserter</code> to ensure that the necessary memory is allocated. - </p> - <p> - In case of an invalid code point, a <code>utf8::invalid_code_point</code> exception - is thrown. - </p> - <h4> - utf8::next - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Given the iterator to the beginning of the UTF-8 sequence, it returns the code - point and moves the iterator to the next position. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t next(octet_iterator& it, octet_iterator end); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8 - encoded code point. After the function returns, it is incremented to point to the - beginning of the next code point.<br> - <code>end</code>: end of the UTF-8 sequence to be processed. If <code>it</code> - gets equal to <code>end</code> during the extraction of a code point, an - <code>utf8::not_enough_room</code> exception is thrown.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - processed UTF-8 code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars; -<span class="keyword">int</span> cp = next(w, twochars + <span class="literal">6</span>); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars + <span class="literal">3</span>); -</pre> - <p> - This function is typically used to iterate through a UTF-8 encoded string. - </p> - <p> - In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is - thrown. - </p> - <h4> - utf8::peek_next - </h4> - <p class="version"> - Available in version 2.1 and later. - </p> - <p> - Given the iterator to the beginning of the UTF-8 sequence, it returns the code - point for the following sequence without changing the value of the iterator. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t peek_next(octet_iterator it, octet_iterator end); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>it</code>: an iterator pointing to the beginning of an UTF-8 - encoded code point.<br> - <code>end</code>: end of the UTF-8 sequence to be processed. If <code>it</code> - gets equal to <code>end</code> during the extraction of a code point, an - <code>utf8::not_enough_room</code> exception is thrown.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - processed UTF-8 code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars; -<span class="keyword">int</span> cp = peek_next(w, twochars + <span class="literal">6</span>); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars); -</pre> - <p> - In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is - thrown. - </p> - <h4> - utf8::prior - </h4> - <p class="version"> - Available in version 1.02 and later. - </p> - <p> - Given a reference to an iterator pointing to an octet in a UTF-8 sequence, it - decreases the iterator until it hits the beginning of the previous UTF-8 encoded - code point and returns the 32 bits representation of the code point. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t prior(octet_iterator& it, octet_iterator start); - -</pre> - <p> - <code>octet_iterator</code>: a bidirectional iterator.<br> - <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string. - After the function returns, it is decremented to point to the beginning of the - previous code point.<br> - <code>start</code>: an iterator to the beginning of the sequence where the search - for the beginning of a code point is performed. It is a - safety measure to prevent passing the beginning of the string in the search for a - UTF-8 lead octet.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - previous code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">unsigned char</span>* w = twochars + <span class= -"literal">3</span>; -<span class="keyword">int</span> cp = prior (w, twochars); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars); -</pre> - <p> - This function has two purposes: one is two iterate backwards through a UTF-8 - encoded string. Note that it is usually a better idea to iterate forward instead, - since <code>utf8::next</code> is faster. The second purpose is to find a beginning - of a UTF-8 sequence if we have a random position within a string. Note that in that - case <code>utf8::prior</code> may not detect an invalid UTF-8 sequence in some scenarios: - for instance if there are superfluous trail octets, it will just skip them. - </p> - <p> - <code>it</code> will typically point to the beginning of - a code point, and <code>start</code> will point to the - beginning of the string to ensure we don't go backwards too far. <code>it</code> is - decreased until it points to a lead UTF-8 octet, and then the UTF-8 sequence - beginning with that octet is decoded to a 32 bit representation and returned. - </p> - <p> - In case <code>start</code> is reached before a UTF-8 lead octet is hit, or if an - invalid UTF-8 sequence is started by the lead octet, an <code>invalid_utf8</code> - exception is thrown. - </p> - <p>In case <code>start</code> equals <code>it</code>, a <code>not_enough_room</code> - exception is thrown. - <h4> - utf8::previous - </h4> - <p class="version"> - Deprecated in version 1.02 and later. - </p> - <p> - Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it - decreases the iterator until it hits the beginning of the previous UTF-8 encoded - code point and returns the 32 bits representation of the code point. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t previous(octet_iterator& it, octet_iterator pass_start); - -</pre> - <p> - <code>octet_iterator</code>: a random access iterator.<br> - <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string. - After the function returns, it is decremented to point to the beginning of the - previous code point.<br> - <code>pass_start</code>: an iterator to the point in the sequence where the search - for the beginning of a code point is aborted if no result was reached. It is a - safety measure to prevent passing the beginning of the string in the search for a - UTF-8 lead octet.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - previous code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">unsigned char</span>* w = twochars + <span class= -"literal">3</span>; -<span class="keyword">int</span> cp = previous (w, twochars - <span class= -"literal">1</span>); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars); -</pre> - <p> - <code>utf8::previous</code> is deprecated, and <code>utf8::prior</code> should - be used instead, although the existing code can continue using this function. - The problem is the parameter <code>pass_start</code> that points to the position - just before the beginning of the sequence. Standard containers don't have the - concept of "pass start" and the function can not be used with their iterators. - </p> - <p> - <code>it</code> will typically point to the beginning of - a code point, and <code>pass_start</code> will point to the octet just before the - beginning of the string to ensure we don't go backwards too far. <code>it</code> is - decreased until it points to a lead UTF-8 octet, and then the UTF-8 sequence - beginning with that octet is decoded to a 32 bit representation and returned. - </p> - <p> - In case <code>pass_start</code> is reached before a UTF-8 lead octet is hit, or if an - invalid UTF-8 sequence is started by the lead octet, an <code>invalid_utf8</code> - exception is thrown - </p> - <h4> - utf8::advance - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Advances an iterator by the specified number of code points within an UTF-8 - sequence. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, typename distance_type> -<span class= -"keyword">void</span> advance (octet_iterator& it, distance_type n, octet_iterator end); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>distance_type</code>: an integral type convertible to <code>octet_iterator</code>'s difference type.<br> - <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8 - encoded code point. After the function returns, it is incremented to point to the - nth following code point.<br> - <code>n</code>: a positive integer that shows how many code points we want to - advance.<br> - <code>end</code>: end of the UTF-8 sequence to be processed. If <code>it</code> - gets equal to <code>end</code> during the extraction of a code point, an - <code>utf8::not_enough_room</code> exception is thrown.<br> - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">unsigned char</span>* w = twochars; -advance (w, <span class="literal">2</span>, twochars + <span class="literal">6</span>); -assert (w == twochars + <span class="literal">5</span>); -</pre> - <p> - This function works only "forward". In case of a negative <code>n</code>, there is - no effect. - </p> - <p> - In case of an invalid code point, a <code>utf8::invalid_code_point</code> exception - is thrown. - </p> - <h4> - utf8::distance - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Given the iterators to two UTF-8 encoded code points in a seqence, returns the - number of code points between them. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -<span class= -"keyword">typename</span> std::iterator_traits<octet_iterator>::difference_type distance (octet_iterator first, octet_iterator last); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>first</code>: an iterator to a beginning of a UTF-8 encoded code point.<br> - <code>last</code>: an iterator to a "post-end" of the last UTF-8 encoded code - point in the sequence we are trying to determine the length. It can be the - beginning of a new code point, or not.<br> - <span class="return_value">Return value</span> the distance between the iterators, - in code points. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -size_t dist = utf8::distance(twochars, twochars + <span class="literal">5</span>); -assert (dist == <span class="literal">2</span>); -</pre> - <p> - This function is used to find the length (in code points) of a UTF-8 encoded - string. The reason it is called <em>distance</em>, rather than, say, - <em>length</em> is mainly because developers are used that <em>length</em> is an - O(1) function. Computing the length of an UTF-8 string is a linear operation, and - it looked better to model it after <code>std::distance</code> algorithm. - </p> - <p> - In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is - thrown. If <code>last</code> does not point to the past-of-end of a UTF-8 seqence, - a <code>utf8::not_enough_room</code> exception is thrown. - </p> - <h4> - utf8::utf16to8 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts a UTF-16 encoded string to UTF-8. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> u16bit_iterator, <span class= -"keyword">typename</span> octet_iterator> -octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); - -</pre> - <p> - <code>u16bit_iterator</code>: an input iterator.<br> - <code>octet_iterator</code>: an output iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-16 encoded - string to convert.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-16 encoded - string to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-8 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-8 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">unsigned short</span> utf16string[] = {<span class= -"literal">0x41</span>, <span class="literal">0x0448</span>, <span class= -"literal">0x65e5</span>, <span class="literal">0xd834</span>, <span class= -"literal">0xdd1e</span>}; -vector<<span class="keyword">unsigned char</span>> utf8result; -utf16to8(utf16string, utf16string + <span class= -"literal">5</span>, back_inserter(utf8result)); -assert (utf8result.size() == <span class="literal">10</span>); -</pre> - <p> - In case of invalid UTF-16 sequence, a <code>utf8::invalid_utf16</code> exception is - thrown. - </p> - <h4> - utf8::utf8to16 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts an UTF-8 encoded string to UTF-16 - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> u16bit_iterator, typename octet_iterator> -u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>u16bit_iterator</code>: an output iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded - string to convert. < br /> <code>end</code>: an iterator pointing to - pass-the-end of the UTF-8 encoded string to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-16 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-16 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span> utf8_with_surrogates[] = <span class= -"literal">"\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"</span>; -vector <<span class="keyword">unsigned short</span>> utf16result; -utf8to16(utf8_with_surrogates, utf8_with_surrogates + <span class= -"literal">9</span>, back_inserter(utf16result)); -assert (utf16result.size() == <span class="literal">4</span>); -assert (utf16result[<span class="literal">2</span>] == <span class= -"literal">0xd834</span>); -assert (utf16result[<span class="literal">3</span>] == <span class= -"literal">0xdd1e</span>); -</pre> - <p> - In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is - thrown. If <code>end</code> does not point to the past-of-end of a UTF-8 seqence, a - <code>utf8::not_enough_room</code> exception is thrown. - </p> - <h4> - utf8::utf32to8 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts a UTF-32 encoded string to UTF-8. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, typename u32bit_iterator> -octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result); - -</pre> - <p> - <code>octet_iterator</code>: an output iterator.<br> - <code>u32bit_iterator</code>: an input iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-32 encoded - string to convert.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-32 encoded - string to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-8 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-8 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">int</span> utf32string[] = {<span class= -"literal">0x448</span>, <span class="literal">0x65E5</span>, <span class= -"literal">0x10346</span>, <span class="literal">0</span>}; -vector<<span class="keyword">unsigned char</span>> utf8result; -utf32to8(utf32string, utf32string + <span class= -"literal">3</span>, back_inserter(utf8result)); -assert (utf8result.size() == <span class="literal">9</span>); -</pre> - <p> - In case of invalid UTF-32 string, a <code>utf8::invalid_code_point</code> exception - is thrown. - </p> - <h4> - utf8::utf8to32 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts a UTF-8 encoded string to UTF-32. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, <span class= -"keyword">typename</span> u32bit_iterator> -u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>u32bit_iterator</code>: an output iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded - string to convert.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 encoded string - to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-32 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-32 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -vector<<span class="keyword">int</span>> utf32result; -utf8to32(twochars, twochars + <span class= -"literal">5</span>, back_inserter(utf32result)); -assert (utf32result.size() == <span class="literal">2</span>); -</pre> - <p> - In case of an invalid UTF-8 seqence, a <code>utf8::invalid_utf8</code> exception is - thrown. If <code>end</code> does not point to the past-of-end of a UTF-8 seqence, a - <code>utf8::not_enough_room</code> exception is thrown. - </p> - <h4> - utf8::find_invalid - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Detects an invalid sequence within a UTF-8 string. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -octet_iterator find_invalid(octet_iterator start, octet_iterator end); -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 string to - test for validity.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 string to test - for validity.<br> - <span class="return_value">Return value</span>: an iterator pointing to the first - invalid octet in the UTF-8 string. In case none were found, equals - <code>end</code>. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span> utf_invalid[] = <span class= -"literal">"\xe6\x97\xa5\xd1\x88\xfa"</span>; -<span class= -"keyword">char</span>* invalid = find_invalid(utf_invalid, utf_invalid + <span class= -"literal">6</span>); -assert (invalid == utf_invalid + <span class="literal">5</span>); -</pre> - <p> - This function is typically used to make sure a UTF-8 string is valid before - processing it with other functions. It is especially important to call it if before - doing any of the <em>unchecked</em> operations on it. - </p> - <h4> - utf8::is_valid - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Checks whether a sequence of octets is a valid UTF-8 string. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -<span class="keyword">bool</span> is_valid(octet_iterator start, octet_iterator end); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 string to - test for validity.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 string to test - for validity.<br> - <span class="return_value">Return value</span>: <code>true</code> if the sequence - is a valid UTF-8 string; <code>false</code> if not. - </p> - Example of use: -<pre> -<span class="keyword">char</span> utf_invalid[] = <span class= -"literal">"\xe6\x97\xa5\xd1\x88\xfa"</span>; -<span class="keyword">bool</span> bvalid = is_valid(utf_invalid, utf_invalid + <span -class="literal">6</span>); -assert (bvalid == false); -</pre> - <p> - <code>is_valid</code> is a shorthand for <code>find_invalid(start, end) == - end;</code>. You may want to use it to make sure that a byte seqence is a valid - UTF-8 string without the need to know where it fails if it is not valid. - </p> - <h4> - utf8::replace_invalid - </h4> - <p class="version"> - Available in version 2.0 and later. - </p> - <p> - Replaces all invalid UTF-8 sequences within a string with a replacement marker. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, <span class= -"keyword">typename</span> output_iterator> -output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement); -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, <span class= -"keyword">typename</span> output_iterator> -output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out); - -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>output_iterator</code>: an output iterator.<br> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 string to - look for invalid UTF-8 sequences.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 string to look - for invalid UTF-8 sequences.<br> - <code>out</code>: An output iterator to the range where the result of replacement - is stored.<br> - <code>replacement</code>: A Unicode code point for the replacement marker. The - version without this parameter assumes the value <code>0xfffd</code><br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the UTF-8 string with replaced invalid sequences. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span> invalid_sequence[] = <span class= -"literal">"a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z"</span>; -vector<<span class="keyword">char</span>> replace_invalid_result; -replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), back_inserter(replace_invalid_result), <span - class="literal">'?'</span>); -bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end()); -assert (bvalid); -<span class="keyword">char</span>* fixed_invalid_sequence = <span class= -"literal">"a????z"</span>; -assert (std::equal(replace_invalid_result.begin(), replace_invalid_result.end(), fixed_invalid_sequence)); -</pre> - <p> - <code>replace_invalid</code> does not perform in-place replacement of invalid - sequences. Rather, it produces a copy of the original string with the invalid - sequences replaced with a replacement marker. Therefore, <code>out</code> must not - be in the <code>[start, end]</code> range. - </p> - <p> - If <code>end</code> does not point to the past-of-end of a UTF-8 sequence, a - <code>utf8::not_enough_room</code> exception is thrown. - </p> - <h4> - utf8::starts_with_bom - </h4> - <p class="version"> - Available in version 2.3 and later. Relaces deprecated <code>is_bom()</code> function. - </p> - <p> - Checks whether an octet sequence starts with a UTF-8 byte order mark (BOM) - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -<span class="keyword">bool</span> starts_with_bom (octet_iterator it, octet_iterator end); -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>it</code>: beginning of the octet sequence to check<br> - <code>end</code>: pass-end of the sequence to check<br> - <span class="return_value">Return value</span>: <code>true</code> if the sequence - starts with a UTF-8 byte order mark; <code>false</code> if not. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">unsigned char</span> byte_order_mark[] = {<span class= -"literal">0xef</span>, <span class="literal">0xbb</span>, <span class= -"literal">0xbf</span>}; -<span class="keyword">bool</span> bbom = starts_with_bom(byte_order_mark, byte_order_mark + <span class="keyword">sizeof</span>(byte_order_mark)); -assert (bbom == <span class="literal">true</span>); -</pre> - <p> - The typical use of this function is to check the first three bytes of a file. If - they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8 - encoded text. - </p> - <h4> - utf8::is_bom - </h4> - <p class="version"> - Available in version 1.0 and later. Deprecated in version 2.3. <code>starts_with_bom()</code> should be used - instead. - </p> - <p> - Checks whether a sequence of three octets is a UTF-8 byte order mark (BOM) - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -<span class="keyword">bool</span> is_bom (octet_iterator it); <span class="comment"> // Deprecated</span> -</pre> - <p> - <code>octet_iterator</code>: an input iterator.<br> - <code>it</code>: beginning of the 3-octet sequence to check<br> - <span class="return_value">Return value</span>: <code>true</code> if the sequence - is UTF-8 byte order mark; <code>false</code> if not. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">unsigned char</span> byte_order_mark[] = {<span class= -"literal">0xef</span>, <span class="literal">0xbb</span>, <span class= -"literal">0xbf</span>}; -<span class="keyword">bool</span> bbom = is_bom(byte_order_mark); -assert (bbom == <span class="literal">true</span>); -</pre> - <p> - The typical use of this function is to check the first three bytes of a file. If - they form the UTF-8 BOM, we want to skip them before processing the actual UTF-8 - encoded text. - </p> - <p> - If a sequence is - shorter than three bytes, an invalid iterator will be dereferenced. Therefore, this function is deprecated - in favor of <code>starts_with_bom()</code>that takes the end of sequence as an argument. - </p> - <h3 id="typesutf8"> - Types From utf8 Namespace - </h3> - <h4>utf8::exception - </h4> - <p class="version"> - Available in version 2.3 and later. - </p> - <p> - Base class for the exceptions thrown by UTF CPP library functions. - </p> -<pre> -<span class="keyword">class</span> exception : <span class="keyword">public</span> std::exception {}; -</pre> - <p> - Example of use: - </p> -<pre> -<span class="keyword">try</span> { - code_that_uses_utf_cpp_library(); -} -<span class="keyword">catch</span>(<span class="keyword">const</span> utf8::exception& utfcpp_ex) { - cerr << utfcpp_ex.what(); -} -</pre> - - <h4>utf8::invalid_code_point - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Thrown by UTF8 CPP functions such as <code>advance</code> and <code>next</code> if an UTF-8 sequence represents and invalid code point. - </p> - -<pre> -<span class="keyword">class</span> invalid_code_point : <span class="keyword">public</span> exception { -<span class="keyword">public</span>: - uint32_t code_point() <span class="keyword">const</span>; -}; - -</pre> - <p> - Member function <code>code_point()</code> can be used to determine the invalid code point that - caused the exception to be thrown. - </p> - <h4>utf8::invalid_utf8 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Thrown by UTF8 CPP functions such as <code>next</code> and <code>prior</code> if an invalid UTF-8 sequence - is detected during decoding. - </p> - -<pre> -<span class="keyword">class</span> invalid_utf8 : <span class="keyword">public</span> exception { -<span class="keyword">public</span>: - uint8_t utf8_octet() <span class="keyword">const</span>; -}; -</pre> - - <p> - Member function <code>utf8_octet()</code> can be used to determine the beginning of the byte - sequence that caused the exception to be thrown. - </p> -</pre> - <h4>utf8::invalid_utf16 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Thrown by UTF8 CPP function <code>utf16to8</code> if an invalid UTF-16 sequence - is detected during decoding. - </p> - -<pre> -<span class="keyword">class</span> invalid_utf16 : <span class="keyword">public</span> exception { -<span class="keyword">public</span>: - uint16_t utf16_word() <span class="keyword">const</span>; -}; -</pre> - - <p> - Member function <code>utf16_word()</code> can be used to determine the UTF-16 code unit - that caused the exception to be thrown. - </p> - <h4>utf8::not_enough_room - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Thrown by UTF8 CPP functions such as <code>next</code> if the end of the decoded UTF-8 sequence - was reached before the code point was decoded. - </p> - -<pre> -<span class="keyword">class</span> not_enough_room : <span class="keyword">public</span> exception {}; -</pre> - <h4> - utf8::iterator - </h4> - <p class="version"> - Available in version 2.0 and later. - </p> - <p> - Adapts the underlying octet iterator to iterate over the sequence of code points, - rather than raw octets. - </p> -<pre> -<span class="keyword">template</span> <<span class="keyword">typename</span> octet_iterator> -<span class="keyword">class</span> iterator; -</pre> - - <h5>Member functions</h5> - <dl> - <dt><code>iterator();</code> <dd> the deafult constructor; the underlying <code>octet_iterator</code> is - constructed with its default constructor. - <dt><code><span class="keyword">explicit</span> iterator (const octet_iterator& octet_it, - const octet_iterator& range_start, - const octet_iterator& range_end);</code> <dd> a constructor - that initializes the underlying <code>octet_iterator</code> with <code>octet_it</code> - and sets the range in which the iterator is considered valid. - <dt><code>octet_iterator base () <span class="keyword">const</span>;</code> <dd> returns the - underlying <code>octet_iterator</code>. - <dt><code>uint32_t operator * () <span class="keyword">const</span>;</code> <dd> decodes the utf-8 sequence - the underlying <code>octet_iterator</code> is pointing to and returns the code point. - <dt><code><span class="keyword">bool operator</span> == (const iterator& rhs) - <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span> - if the two underlaying iterators are equal. - <dt><code><span class="keyword">bool operator</span> != (const iterator& rhs) - <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span> - if the two underlaying iterators are not equal. - <dt><code>iterator& <span class="keyword">operator</span> ++ (); </code> <dd> the prefix increment - moves - the iterator to the next UTF-8 encoded code point. - <dt><code>iterator <span class="keyword">operator</span> ++ (<span class="keyword">int</span>); </code> <dd> - the postfix increment - moves the iterator to the next UTF-8 encoded code point and returns the current one. - <dt><code>iterator& <span class="keyword">operator</span> -- (); </code> <dd> the prefix decrement - moves - the iterator to the previous UTF-8 encoded code point. - <dt><code>iterator <span class="keyword">operator</span> -- (<span class="keyword">int</span>); </code> <dd> - the postfix decrement - moves the iterator to the previous UTF-8 encoded code point and returns the current one. - </dl> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* threechars = <span class="literal">"\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"</span>; -utf8::iterator<<span class="keyword">char</span>*> it(threechars, threechars, threechars + <span class="literal">9</span>); -utf8::iterator<<span class="keyword">char</span>*> it2 = it; -assert (it2 == it); -assert (*it == <span class="literal">0x10346</span>); -assert (*(++it) == <span class="literal">0x65e5</span>); -assert ((*it++) == <span class="literal">0x65e5</span>); -assert (*it == <span class="literal">0x0448</span>); -assert (it != it2); -utf8::iterator<<span class="keyword">char</span>*> endit (threechars + <span class="literal">9</span>, threechars, threechars + <span class="literal">9</span>); -assert (++it == endit); -assert (*(--it) == <span class="literal">0x0448</span>); -assert ((*it--) == <span class="literal">0x0448</span>); -assert (*it == <span class="literal">0x65e5</span>); -assert (--it == utf8::iterator<<span class="keyword">char</span>*>(threechars, threechars, threechars + <span class="literal">9</span>)); -assert (*it == <span class="literal">0x10346</span>); -</pre> - <p> - The purpose of <code>utf8::iterator</code> adapter is to enable easy iteration as well as the use of STL - algorithms with UTF-8 encoded strings. Increment and decrement operators are implemented in terms of - <code>utf8::next()</code> and <code>utf8::prior()</code> functions. - </p> - <p> - Note that <code>utf8::iterator</code> adapter is a checked iterator. It operates on the range specified in - the constructor; any attempt to go out of that range will result in an exception. Even the comparison operators - require both iterator object to be constructed against the same range - otherwise an exception is thrown. Typically, - the range will be determined by sequence container functions <code>begin</code> and <code>end</code>, i.e.: - </p> -<pre> -std::string s = <span class="literal">"example"</span>; -utf8::iterator i (s.begin(), s.begin(), s.end()); -</pre> - <h3 id="fununchecked"> - Functions From utf8::unchecked Namespace - </h3> - <h4> - utf8::unchecked::append - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Encodes a 32 bit code point as a UTF-8 sequence of octets and appends the sequence - to a UTF-8 string. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -octet_iterator append(uint32_t cp, octet_iterator result); - -</pre> - <p> - <code>cp</code>: A 32 bit integer representing a code point to append to the - sequence.<br> - <code>result</code>: An output iterator to the place in the sequence where to - append the code point.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the newly appended sequence. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">unsigned char</span> u[<span class="literal">5</span>] = {<span -class="literal">0</span>,<span class="literal">0</span>,<span class= -"literal">0</span>,<span class="literal">0</span>,<span class="literal">0</span>}; -<span class="keyword">unsigned char</span>* end = unchecked::append(<span class= -"literal">0x0448</span>, u); -assert (u[<span class="literal">0</span>] == <span class= -"literal">0xd1</span> && u[<span class="literal">1</span>] == <span class= -"literal">0x88</span> && u[<span class="literal">2</span>] == <span class= -"literal">0</span> && u[<span class="literal">3</span>] == <span class= -"literal">0</span> && u[<span class="literal">4</span>] == <span class= -"literal">0</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::append</code>. It does not - check for validity of the supplied code point, and may produce an invalid UTF-8 - sequence. - </p> - <h4> - utf8::unchecked::next - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Given the iterator to the beginning of a UTF-8 sequence, it returns the code point - and moves the iterator to the next position. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t next(octet_iterator& it); - -</pre> - <p> - <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8 - encoded code point. After the function returns, it is incremented to point to the - beginning of the next code point.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - processed UTF-8 code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars; -<span class="keyword">int</span> cp = unchecked::next(w); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars + <span class="literal">3</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::next</code>. It does not - check for validity of the supplied UTF-8 sequence. - </p> - <h4> - utf8::unchecked::peek_next - </h4> - <p class="version"> - Available in version 2.1 and later. - </p> - <p> - Given the iterator to the beginning of a UTF-8 sequence, it returns the code point. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t peek_next(octet_iterator it); - -</pre> - <p> - <code>it</code>: an iterator pointing to the beginning of an UTF-8 - encoded code point.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - processed UTF-8 code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars; -<span class="keyword">int</span> cp = unchecked::peek_next(w); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars); -</pre> - <p> - This is a faster but less safe version of <code>utf8::peek_next</code>. It does not - check for validity of the supplied UTF-8 sequence. - </p> - <h4> - utf8::unchecked::prior - </h4> - <p class="version"> - Available in version 1.02 and later. - </p> - <p> - Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it - decreases the iterator until it hits the beginning of the previous UTF-8 encoded - code point and returns the 32 bits representation of the code point. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t prior(octet_iterator& it); - -</pre> - <p> - <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string. - After the function returns, it is decremented to point to the beginning of the - previous code point.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - previous code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars + <span class="literal">3</span>; -<span class="keyword">int</span> cp = unchecked::prior (w); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars); -</pre> - <p> - This is a faster but less safe version of <code>utf8::prior</code>. It does not - check for validity of the supplied UTF-8 sequence and offers no boundary checking. - </p> - <h4> - utf8::unchecked::previous (deprecated, see utf8::unchecked::prior) - </h4> - <p class="version"> - Deprecated in version 1.02 and later. - </p> - <p> - Given a reference to an iterator pointing to an octet in a UTF-8 seqence, it - decreases the iterator until it hits the beginning of the previous UTF-8 encoded - code point and returns the 32 bits representation of the code point. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -uint32_t previous(octet_iterator& it); - -</pre> - <p> - <code>it</code>: a reference pointing to an octet within a UTF-8 encoded string. - After the function returns, it is decremented to point to the beginning of the - previous code point.<br> - <span class="return_value">Return value</span>: the 32 bit representation of the - previous code point. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars + <span class="literal">3</span>; -<span class="keyword">int</span> cp = unchecked::previous (w); -assert (cp == <span class="literal">0x65e5</span>); -assert (w == twochars); -</pre> - <p> - The reason this function is deprecated is just the consistency with the "checked" - versions, where <code>prior</code> should be used instead of <code>previous</code>. - In fact, <code>unchecked::previous</code> behaves exactly the same as <code> - unchecked::prior</code> - </p> - <p> - This is a faster but less safe version of <code>utf8::previous</code>. It does not - check for validity of the supplied UTF-8 sequence and offers no boundary checking. - </p> - <h4> - utf8::unchecked::advance - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Advances an iterator by the specified number of code points within an UTF-8 - sequence. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, typename distance_type> -<span class="keyword">void</span> advance (octet_iterator& it, distance_type n); - -</pre> - <p> - <code>it</code>: a reference to an iterator pointing to the beginning of an UTF-8 - encoded code point. After the function returns, it is incremented to point to the - nth following code point.<br> - <code>n</code>: a positive integer that shows how many code points we want to - advance.<br> - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -<span class="keyword">char</span>* w = twochars; -unchecked::advance (w, <span class="literal">2</span>); -assert (w == twochars + <span class="literal">5</span>); -</pre> - <p> - This function works only "forward". In case of a negative <code>n</code>, there is - no effect. - </p> - <p> - This is a faster but less safe version of <code>utf8::advance</code>. It does not - check for validity of the supplied UTF-8 sequence and offers no boundary checking. - </p> - <h4> - utf8::unchecked::distance - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Given the iterators to two UTF-8 encoded code points in a seqence, returns the - number of code points between them. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator> -<span class= -"keyword">typename</span> std::iterator_traits<octet_iterator>::difference_type distance (octet_iterator first, octet_iterator last); -</pre> - <p> - <code>first</code>: an iterator to a beginning of a UTF-8 encoded code point.<br> - <code>last</code>: an iterator to a "post-end" of the last UTF-8 encoded code - point in the sequence we are trying to determine the length. It can be the - beginning of a new code point, or not.<br> - <span class="return_value">Return value</span> the distance between the iterators, - in code points. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -size_t dist = utf8::unchecked::distance(twochars, twochars + <span class= -"literal">5</span>); -assert (dist == <span class="literal">2</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::distance</code>. It does not - check for validity of the supplied UTF-8 sequence. - </p> - <h4> - utf8::unchecked::utf16to8 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts a UTF-16 encoded string to UTF-8. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> u16bit_iterator, <span class= -"keyword">typename</span> octet_iterator> -octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result); - -</pre> - <p> - <code>start</code>: an iterator pointing to the beginning of the UTF-16 encoded - string to convert.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-16 encoded - string to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-8 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-8 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">unsigned short</span> utf16string[] = {<span class= -"literal">0x41</span>, <span class="literal">0x0448</span>, <span class= -"literal">0x65e5</span>, <span class="literal">0xd834</span>, <span class= -"literal">0xdd1e</span>}; -vector<<span class="keyword">unsigned char</span>> utf8result; -unchecked::utf16to8(utf16string, utf16string + <span class= -"literal">5</span>, back_inserter(utf8result)); -assert (utf8result.size() == <span class="literal">10</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::utf16to8</code>. It does not - check for validity of the supplied UTF-16 sequence. - </p> - <h4> - utf8::unchecked::utf8to16 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts an UTF-8 encoded string to UTF-16 - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> u16bit_iterator, typename octet_iterator> -u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result); - -</pre> - <p> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded - string to convert. < br /> <code>end</code>: an iterator pointing to - pass-the-end of the UTF-8 encoded string to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-16 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-16 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span> utf8_with_surrogates[] = <span class= -"literal">"\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e"</span>; -vector <<span class="keyword">unsigned short</span>> utf16result; -unchecked::utf8to16(utf8_with_surrogates, utf8_with_surrogates + <span class= -"literal">9</span>, back_inserter(utf16result)); -assert (utf16result.size() == <span class="literal">4</span>); -assert (utf16result[<span class="literal">2</span>] == <span class= -"literal">0xd834</span>); -assert (utf16result[<span class="literal">3</span>] == <span class= -"literal">0xdd1e</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::utf8to16</code>. It does not - check for validity of the supplied UTF-8 sequence. - </p> - <h4> - utf8::unchecked::utf32to8 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts a UTF-32 encoded string to UTF-8. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, <span class= -"keyword">typename</span> u32bit_iterator> -octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result); - -</pre> - <p> - <code>start</code>: an iterator pointing to the beginning of the UTF-32 encoded - string to convert.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-32 encoded - string to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-8 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-8 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">int</span> utf32string[] = {<span class= -"literal">0x448</span>, <span class="literal">0x65e5</span>, <span class= -"literal">0x10346</span>, <span class="literal">0</span>}; -vector<<span class="keyword">unsigned char</span>> utf8result; -utf32to8(utf32string, utf32string + <span class= -"literal">3</span>, back_inserter(utf8result)); -assert (utf8result.size() == <span class="literal">9</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::utf32to8</code>. It does not - check for validity of the supplied UTF-32 sequence. - </p> - <h4> - utf8::unchecked::utf8to32 - </h4> - <p class="version"> - Available in version 1.0 and later. - </p> - <p> - Converts a UTF-8 encoded string to UTF-32. - </p> -<pre> -<span class="keyword">template</span> <<span class= -"keyword">typename</span> octet_iterator, typename u32bit_iterator> -u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result); - -</pre> - <p> - <code>start</code>: an iterator pointing to the beginning of the UTF-8 encoded - string to convert.<br> - <code>end</code>: an iterator pointing to pass-the-end of the UTF-8 encoded string - to convert.<br> - <code>result</code>: an output iterator to the place in the UTF-32 string where to - append the result of conversion.<br> - <span class="return_value">Return value</span>: An iterator pointing to the place - after the appended UTF-32 string. - </p> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* twochars = <span class= -"literal">"\xe6\x97\xa5\xd1\x88"</span>; -vector<<span class="keyword">int</span>> utf32result; -unchecked::utf8to32(twochars, twochars + <span class= -"literal">5</span>, back_inserter(utf32result)); -assert (utf32result.size() == <span class="literal">2</span>); -</pre> - <p> - This is a faster but less safe version of <code>utf8::utf8to32</code>. It does not - check for validity of the supplied UTF-8 sequence. - </p> - <h3 id="typesunchecked"> - Types From utf8::unchecked Namespace - </h3> - <h4> - utf8::iterator - </h4> - <p class="version"> - Available in version 2.0 and later. - </p> - <p> - Adapts the underlying octet iterator to iterate over the sequence of code points, - rather than raw octets. - </p> -<pre> -<span class="keyword">template</span> <<span class="keyword">typename</span> octet_iterator> -<span class="keyword">class</span> iterator; -</pre> - - <h5>Member functions</h5> - <dl> - <dt><code>iterator();</code> <dd> the deafult constructor; the underlying <code>octet_iterator</code> is - constructed with its default constructor. - <dt><code><span class="keyword">explicit</span> iterator (const octet_iterator& octet_it); - </code> <dd> a constructor - that initializes the underlying <code>octet_iterator</code> with <code>octet_it</code> - <dt><code>octet_iterator base () <span class="keyword">const</span>;</code> <dd> returns the - underlying <code>octet_iterator</code>. - <dt><code>uint32_t operator * () <span class="keyword">const</span>;</code> <dd> decodes the utf-8 sequence - the underlying <code>octet_iterator</code> is pointing to and returns the code point. - <dt><code><span class="keyword">bool operator</span> == (const iterator& rhs) - <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span> - if the two underlaying iterators are equal. - <dt><code><span class="keyword">bool operator</span> != (const iterator& rhs) - <span class="keyword">const</span>;</code> <dd> returns <span class="keyword">true</span> - if the two underlaying iterators are not equal. - <dt><code>iterator& <span class="keyword">operator</span> ++ (); </code> <dd> the prefix increment - moves - the iterator to the next UTF-8 encoded code point. - <dt><code>iterator <span class="keyword">operator</span> ++ (<span class="keyword">int</span>); </code> <dd> - the postfix increment - moves the iterator to the next UTF-8 encoded code point and returns the current one. - <dt><code>iterator& <span class="keyword">operator</span> -- (); </code> <dd> the prefix decrement - moves - the iterator to the previous UTF-8 encoded code point. - <dt><code>iterator <span class="keyword">operator</span> -- (<span class="keyword">int</span>); </code> <dd> - the postfix decrement - moves the iterator to the previous UTF-8 encoded code point and returns the current one. - </dl> - <p> - Example of use: - </p> -<pre> -<span class="keyword">char</span>* threechars = <span class="literal">"\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88"</span>; -utf8::unchecked::iterator<<span class="keyword">char</span>*> un_it(threechars); -utf8::unchecked::iterator<<span class="keyword">char</span>*> un_it2 = un_it; -assert (un_it2 == un_it); -assert (*un_it == <span class="literal">0x10346</span>); -assert (*(++un_it) == <span class="literal">0x65e5</span>); -assert ((*un_it++) == <span class="literal">0x65e5</span>); -assert (*un_it == <span class="literal">0x0448</span>); -assert (un_it != un_it2); -utf8::::unchecked::iterator<<span class="keyword">char</span>*> un_endit (threechars + <span class="literal">9</span>); -assert (++un_it == un_endit); -assert (*(--un_it) == <span class="literal">0x0448</span>); -assert ((*un_it--) == <span class="literal">0x0448</span>); -assert (*un_it == <span class="literal">0x65e5</span>); -assert (--un_it == utf8::unchecked::iterator<<span class="keyword">char</span>*>(threechars)); -assert (*un_it == <span class="literal">0x10346</span>); -</pre> - <p> - This is an unchecked version of <code>utf8::iterator</code>. It is faster in many cases, but offers - no validity or range checks. - </p> - <h2 id="points"> - Points of interest - </h2> - <h4> - Design goals and decisions - </h4> - <p> - The library was designed to be: - </p> - <ol> - <li> - Generic: for better or worse, there are many C++ string classes out there, and - the library should work with as many of them as possible. - </li> - <li> - Portable: the library should be portable both accross different platforms and - compilers. The only non-portable code is a small section that declares unsigned - integers of different sizes: three typedefs. They can be changed by the users of - the library if they don't match their platform. The default setting should work - for Windows (both 32 and 64 bit), and most 32 bit and 64 bit Unix derivatives. - </li> - <li> - Lightweight: follow the "pay only for what you use" guideline. - </li> - <li> - Unintrusive: avoid forcing any particular design or even programming style on the - user. This is a library, not a framework. - </li> - </ol> - <h4> - Alternatives - </h4> - <p> - In case you want to look into other means of working with UTF-8 strings from C++, - here is the list of solutions I am aware of: - </p> - <ol> - <li> - <a href="http://icu.sourceforge.net/">ICU Library</a>. It is very powerful, - complete, feature-rich, mature, and widely used. Also big, intrusive, - non-generic, and doesn't play well with the Standard Library. I definitelly - recommend looking at ICU even if you don't plan to use it. - </li> - <li> - C++11 language and library features. Still far from complete, and not widely - supported by compiler vendors. - </li> - <li> - <a href= - "http://www.gtkmm.org/gtkmm2/docs/tutorial/html/ch03s04.html">Glib::ustring</a>. - A class specifically made to work with UTF-8 strings, and also feel like - <code>std::string</code>. If you prefer to have yet another string class in your - code, it may be worth a look. Be aware of the licensing issues, though. - </li> - <li> - Platform dependent solutions: Windows and POSIX have functions to convert strings - from one encoding to another. That is only a subset of what my library offers, - but if that is all you need it may be good enough. - </li> - </ol> - <h2 id="links"> - Links - </h2> - <ol> - <li> - <a href="http://www.unicode.org/">The Unicode Consortium</a>. - </li> - <li> - <a href="http://icu.sourceforge.net/">ICU Library</a>. - </li> - <li> - <a href="http://en.wikipedia.org/wiki/UTF-8">UTF-8 at Wikipedia</a> - </li> - <li> - <a href="http://www.cl.cam.ac.uk/~mgk25/unicode.html">UTF-8 and Unicode FAQ for - Unix/Linux</a> - </li> - </ol> - </body> -</html> diff --git a/thirdparty/assimp/assimp/config.h b/thirdparty/assimp/include/assimp/config.h index d0e4817349..48d61941ad 100644 --- a/thirdparty/assimp/assimp/config.h +++ b/thirdparty/assimp/include/assimp/config.h @@ -60,6 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_CONFIG_H_INC #define AI_CONFIG_H_INC + // ########################################################################### // LIBRARY SETTINGS // General, global settings @@ -75,8 +76,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Property type: bool. Default value: false. */ -#define AI_CONFIG_GLOB_MEASURE_TIME \ - "GLOB_MEASURE_TIME" +#define AI_CONFIG_GLOB_MEASURE_TIME \ + "GLOB_MEASURE_TIME" + // --------------------------------------------------------------------------- /** @brief Global setting to disable generation of skeleton dummy meshes @@ -87,9 +89,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // --------------------------------------------------------------------------- #define AI_CONFIG_IMPORT_NO_SKELETON_MESHES \ - "IMPORT_NO_SKELETON_MESHES" + "IMPORT_NO_SKELETON_MESHES" + -#if 0 // not implemented yet + +# if 0 // not implemented yet // --------------------------------------------------------------------------- /** @brief Set Assimp's multithreading policy. * @@ -105,8 +109,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * For more information, see the @link threading Threading page@endlink. * Property type: int, default value: -1. */ -#define AI_CONFIG_GLOB_MULTITHREADING \ - "GLOB_MULTITHREADING" +#define AI_CONFIG_GLOB_MULTITHREADING \ + "GLOB_MULTITHREADING" #endif // ########################################################################### @@ -114,6 +118,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Various stuff to fine-tune the behavior of a specific post processing step. // ########################################################################### + // --------------------------------------------------------------------------- /** @brief Maximum bone count per mesh for the SplitbyBoneCount step. * @@ -124,13 +129,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // --------------------------------------------------------------------------- #define AI_CONFIG_PP_SBBC_MAX_BONES \ - "PP_SBBC_MAX_BONES" + "PP_SBBC_MAX_BONES" + // default limit for bone count #if (!defined AI_SBBC_DEFAULT_MAX_BONES) -#define AI_SBBC_DEFAULT_MAX_BONES 60 +# define AI_SBBC_DEFAULT_MAX_BONES 60 #endif + // --------------------------------------------------------------------------- /** @brief Specifies the maximum angle that may be between two vertex tangents * that their tangents and bi-tangents are smoothed. @@ -140,7 +147,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Property type: float. Default value: 45 degrees */ #define AI_CONFIG_PP_CT_MAX_SMOOTHING_ANGLE \ - "PP_CT_MAX_SMOOTHING_ANGLE" + "PP_CT_MAX_SMOOTHING_ANGLE" // --------------------------------------------------------------------------- /** @brief Source UV channel for tangent space computation. @@ -150,7 +157,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // --------------------------------------------------------------------------- #define AI_CONFIG_PP_CT_TEXTURE_CHANNEL_INDEX \ - "PP_CT_TEXTURE_CHANNEL_INDEX" + "PP_CT_TEXTURE_CHANNEL_INDEX" // --------------------------------------------------------------------------- /** @brief Specifies the maximum angle that may be between two face normals @@ -165,7 +172,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * the output quality may be reduced. */ #define AI_CONFIG_PP_GSN_MAX_SMOOTHING_ANGLE \ - "PP_GSN_MAX_SMOOTHING_ANGLE" + "PP_GSN_MAX_SMOOTHING_ANGLE" + // --------------------------------------------------------------------------- /** @brief Sets the colormap (= palette) to be used to decode embedded @@ -177,8 +185,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * a default palette (from Quake 1) is used. * Property type: string. */ -#define AI_CONFIG_IMPORT_MDL_COLORMAP \ - "IMPORT_MDL_COLORMAP" +#define AI_CONFIG_IMPORT_MDL_COLORMAP \ + "IMPORT_MDL_COLORMAP" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_RemoveRedundantMaterials step to @@ -199,8 +207,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @note Linefeeds, tabs or carriage returns are treated as whitespace. * Material names are case sensitive. */ -#define AI_CONFIG_PP_RRM_EXCLUDE_LIST \ - "PP_RRM_EXCLUDE_LIST" +#define AI_CONFIG_PP_RRM_EXCLUDE_LIST \ + "PP_RRM_EXCLUDE_LIST" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_PreTransformVertices step to @@ -214,8 +222,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * any transformations. * Property type: bool. Default value: false. */ -#define AI_CONFIG_PP_PTV_KEEP_HIERARCHY \ - "PP_PTV_KEEP_HIERARCHY" +#define AI_CONFIG_PP_PTV_KEEP_HIERARCHY \ + "PP_PTV_KEEP_HIERARCHY" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_PreTransformVertices step to normalize @@ -224,8 +232,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * meshes are scaled appropriately (uniformly of course!). * This might be useful if you don't know the spatial dimension of the input * data*/ -#define AI_CONFIG_PP_PTV_NORMALIZE \ - "PP_PTV_NORMALIZE" +#define AI_CONFIG_PP_PTV_NORMALIZE \ + "PP_PTV_NORMALIZE" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_PreTransformVertices step to use @@ -233,8 +241,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * transforming vertices. * Property type: bool. Default value: false. */ -#define AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION \ - "PP_PTV_ADD_ROOT_TRANSFORMATION" +#define AI_CONFIG_PP_PTV_ADD_ROOT_TRANSFORMATION \ + "PP_PTV_ADD_ROOT_TRANSFORMATION" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_PreTransformVertices step to use @@ -243,8 +251,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * of the transformation matrix. * Property type: aiMatrix4x4. */ -#define AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION \ - "PP_PTV_ROOT_TRANSFORMATION" +#define AI_CONFIG_PP_PTV_ROOT_TRANSFORMATION \ + "PP_PTV_ROOT_TRANSFORMATION" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_FindDegenerates step to @@ -257,7 +265,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Property type: bool. Default value: false. */ #define AI_CONFIG_PP_FD_REMOVE \ - "PP_FD_REMOVE" + "PP_FD_REMOVE" // --------------------------------------------------------------------------- /** @@ -266,7 +274,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * be removed if #AI_CONFIG_PP_FD_REMOVE is set to true. */ #define AI_CONFIG_PP_FD_CHECKAREA \ - "PP_FD_CHECKAREA" + "PP_FD_CHECKAREA" // --------------------------------------------------------------------------- /** @brief Configures the #aiProcess_OptimizeGraph step to preserve nodes @@ -286,8 +294,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @note Linefeeds, tabs or carriage returns are treated as whitespace. * Node names are case sensitive. */ -#define AI_CONFIG_PP_OG_EXCLUDE_LIST \ - "PP_OG_EXCLUDE_LIST" +#define AI_CONFIG_PP_OG_EXCLUDE_LIST \ + "PP_OG_EXCLUDE_LIST" // --------------------------------------------------------------------------- /** @brief Set the maximum number of triangles in a mesh. @@ -298,11 +306,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Property type: integer. */ #define AI_CONFIG_PP_SLM_TRIANGLE_LIMIT \ - "PP_SLM_TRIANGLE_LIMIT" + "PP_SLM_TRIANGLE_LIMIT" // default value for AI_CONFIG_PP_SLM_TRIANGLE_LIMIT #if (!defined AI_SLM_DEFAULT_MAX_TRIANGLES) -#define AI_SLM_DEFAULT_MAX_TRIANGLES 1000000 +# define AI_SLM_DEFAULT_MAX_TRIANGLES 1000000 #endif // --------------------------------------------------------------------------- @@ -314,11 +322,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Property type: integer. */ #define AI_CONFIG_PP_SLM_VERTEX_LIMIT \ - "PP_SLM_VERTEX_LIMIT" + "PP_SLM_VERTEX_LIMIT" // default value for AI_CONFIG_PP_SLM_VERTEX_LIMIT #if (!defined AI_SLM_DEFAULT_MAX_VERTICES) -#define AI_SLM_DEFAULT_MAX_VERTICES 1000000 +# define AI_SLM_DEFAULT_MAX_VERTICES 1000000 #endif // --------------------------------------------------------------------------- @@ -327,12 +335,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * This is used by the #aiProcess_LimitBoneWeights PostProcess-Step. * @note The default value is AI_LMW_MAX_WEIGHTS * Property type: integer.*/ -#define AI_CONFIG_PP_LBW_MAX_WEIGHTS \ - "PP_LBW_MAX_WEIGHTS" +#define AI_CONFIG_PP_LBW_MAX_WEIGHTS \ + "PP_LBW_MAX_WEIGHTS" // default value for AI_CONFIG_PP_LBW_MAX_WEIGHTS #if (!defined AI_LMW_MAX_WEIGHTS) -#define AI_LMW_MAX_WEIGHTS 0x4 +# define AI_LMW_MAX_WEIGHTS 0x4 #endif // !! AI_LMW_MAX_WEIGHTS // --------------------------------------------------------------------------- @@ -342,11 +350,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @note The default value is AI_DEBONE_THRESHOLD * Property type: float.*/ #define AI_CONFIG_PP_DB_THRESHOLD \ - "PP_DB_THRESHOLD" + "PP_DB_THRESHOLD" // default value for AI_CONFIG_PP_LBW_MAX_WEIGHTS #if (!defined AI_DEBONE_THRESHOLD) -#define AI_DEBONE_THRESHOLD 1.0f +# define AI_DEBONE_THRESHOLD 1.0f #endif // !! AI_DEBONE_THRESHOLD // --------------------------------------------------------------------------- @@ -356,12 +364,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * @note The default value is 0 * Property type: bool.*/ #define AI_CONFIG_PP_DB_ALL_OR_NONE \ - "PP_DB_ALL_OR_NONE" + "PP_DB_ALL_OR_NONE" /** @brief Default value for the #AI_CONFIG_PP_ICL_PTCACHE_SIZE property */ #ifndef PP_ICL_PTCACHE_SIZE -#define PP_ICL_PTCACHE_SIZE 12 +# define PP_ICL_PTCACHE_SIZE 12 #endif // --------------------------------------------------------------------------- @@ -375,7 +383,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * performance improvements for most nVidia/AMD cards since 2002. * Property type: integer. */ -#define AI_CONFIG_PP_ICL_PTCACHE_SIZE "PP_ICL_PTCACHE_SIZE" +#define AI_CONFIG_PP_ICL_PTCACHE_SIZE "PP_ICL_PTCACHE_SIZE" // --------------------------------------------------------------------------- /** @brief Enumerates components of the aiScene and aiMesh data structures @@ -383,71 +391,73 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * See the documentation to #aiProcess_RemoveComponent for more details. */ -enum aiComponent { -/** Normal vectors */ +enum aiComponent +{ + /** Normal vectors */ #ifdef SWIG aiComponent_NORMALS = 0x2, #else - aiComponent_NORMALS = 0x2u, + aiComponent_NORMALS = 0x2u, #endif -/** Tangents and bitangents go always together ... */ + /** Tangents and bitangents go always together ... */ #ifdef SWIG aiComponent_TANGENTS_AND_BITANGENTS = 0x4, #else - aiComponent_TANGENTS_AND_BITANGENTS = 0x4u, + aiComponent_TANGENTS_AND_BITANGENTS = 0x4u, #endif - /** ALL color sets + /** ALL color sets * Use aiComponent_COLORn(N) to specify the N'th set */ - aiComponent_COLORS = 0x8, + aiComponent_COLORS = 0x8, - /** ALL texture UV sets + /** ALL texture UV sets * aiComponent_TEXCOORDn(N) to specify the N'th set */ - aiComponent_TEXCOORDS = 0x10, + aiComponent_TEXCOORDS = 0x10, - /** Removes all bone weights from all meshes. + /** Removes all bone weights from all meshes. * The scenegraph nodes corresponding to the bones are NOT removed. * use the #aiProcess_OptimizeGraph step to do this */ - aiComponent_BONEWEIGHTS = 0x20, + aiComponent_BONEWEIGHTS = 0x20, - /** Removes all node animations (aiScene::mAnimations). + /** Removes all node animations (aiScene::mAnimations). * The corresponding scenegraph nodes are NOT removed. * use the #aiProcess_OptimizeGraph step to do this */ - aiComponent_ANIMATIONS = 0x40, + aiComponent_ANIMATIONS = 0x40, - /** Removes all embedded textures (aiScene::mTextures) */ - aiComponent_TEXTURES = 0x80, + /** Removes all embedded textures (aiScene::mTextures) */ + aiComponent_TEXTURES = 0x80, - /** Removes all light sources (aiScene::mLights). + /** Removes all light sources (aiScene::mLights). * The corresponding scenegraph nodes are NOT removed. * use the #aiProcess_OptimizeGraph step to do this */ - aiComponent_LIGHTS = 0x100, + aiComponent_LIGHTS = 0x100, - /** Removes all cameras (aiScene::mCameras). + /** Removes all cameras (aiScene::mCameras). * The corresponding scenegraph nodes are NOT removed. * use the #aiProcess_OptimizeGraph step to do this */ - aiComponent_CAMERAS = 0x200, + aiComponent_CAMERAS = 0x200, - /** Removes all meshes (aiScene::mMeshes). */ - aiComponent_MESHES = 0x400, + /** Removes all meshes (aiScene::mMeshes). */ + aiComponent_MESHES = 0x400, - /** Removes all materials. One default material will + /** Removes all materials. One default material will * be generated, so aiScene::mNumMaterials will be 1. */ - aiComponent_MATERIALS = 0x800, + aiComponent_MATERIALS = 0x800, + -/** This value is not used. It is just there to force the + /** This value is not used. It is just there to force the * compiler to map this enum to a 32 Bit integer. */ #ifndef SWIG - _aiComponent_Force32Bit = 0x9fffffff + _aiComponent_Force32Bit = 0x9fffffff #endif }; // Remove a specific color channel 'n' -#define aiComponent_COLORSn(n) (1u << (n + 20u)) +#define aiComponent_COLORSn(n) (1u << (n+20u)) // Remove a specific UV channel 'n' -#define aiComponent_TEXCOORDSn(n) (1u << (n + 25u)) +#define aiComponent_TEXCOORDSn(n) (1u << (n+25u)) // --------------------------------------------------------------------------- /** @brief Input parameter to the #aiProcess_RemoveComponent step: @@ -461,8 +471,8 @@ enum aiComponent { * of the flags defined above) the import FAILS. Mainly because there is * no data to work on anymore ... */ -#define AI_CONFIG_PP_RVC_FLAGS \ - "PP_RVC_FLAGS" +#define AI_CONFIG_PP_RVC_FLAGS \ + "PP_RVC_FLAGS" // --------------------------------------------------------------------------- /** @brief Input parameter to the #aiProcess_SortByPType step: @@ -473,8 +483,8 @@ enum aiComponent { * be to exclude all line and point meshes from the import. This * is an integer property, its default value is 0. */ -#define AI_CONFIG_PP_SBP_REMOVE \ - "PP_SBP_REMOVE" +#define AI_CONFIG_PP_SBP_REMOVE \ + "PP_SBP_REMOVE" // --------------------------------------------------------------------------- /** @brief Input parameter to the #aiProcess_FindInvalidData step: @@ -485,8 +495,16 @@ enum aiComponent { * abs(n0-n1)>epsilon holds true for all vector respectively quaternion * components. The default value is 0.f - comparisons are exact then. */ -#define AI_CONFIG_PP_FID_ANIM_ACCURACY \ - "PP_FID_ANIM_ACCURACY" +#define AI_CONFIG_PP_FID_ANIM_ACCURACY \ + "PP_FID_ANIM_ACCURACY" + +// --------------------------------------------------------------------------- +/** @brief Input parameter to the #aiProcess_FindInvalidData step: + * Set to true to ignore texture coordinates. This may be useful if you have + * to assign different kind of textures like one for the summer or one for the winter. + */ +#define AI_CONFIG_PP_FID_IGNORE_TEXTURECOORDS \ + "PP_FID_IGNORE_TEXTURECOORDS" // TransformUVCoords evaluates UV scalings #define AI_UVTRAFO_SCALING 0x1 @@ -501,14 +519,6 @@ enum aiComponent { #define AI_UVTRAFO_ALL (AI_UVTRAFO_SCALING | AI_UVTRAFO_ROTATION | AI_UVTRAFO_TRANSLATION) // --------------------------------------------------------------------------- -/** @brief Input parameter to the #aiProcess_FindInvalidData step: - * Set to true to ignore texture coordinates. This may be useful if you have - * to assign different kind of textures like one for the summer or one for the winter. - */ -#define AI_CONFIG_PP_FID_IGNORE_TEXTURECOORDS \ - "PP_FID_IGNORE_TEXTURECOORDS" - -// --------------------------------------------------------------------------- /** @brief Input parameter to the #aiProcess_TransformUVCoords step: * Specifies which UV transformations are evaluated. * @@ -516,8 +526,8 @@ enum aiComponent { * property, of course). By default all transformations are enabled * (AI_UVTRAFO_ALL). */ -#define AI_CONFIG_PP_TUV_EVALUATE \ - "PP_TUV_EVALUATE" +#define AI_CONFIG_PP_TUV_EVALUATE \ + "PP_TUV_EVALUATE" // --------------------------------------------------------------------------- /** @brief A hint to assimp to favour speed against import quality. @@ -528,14 +538,16 @@ enum aiComponent { * This property is expected to be an integer, != 0 stands for true. * The default value is 0. */ -#define AI_CONFIG_FAVOUR_SPEED \ - "FAVOUR_SPEED" +#define AI_CONFIG_FAVOUR_SPEED \ + "FAVOUR_SPEED" + // ########################################################################### // IMPORTER SETTINGS // Various stuff to fine-tune the behaviour of specific importer plugins. // ########################################################################### + // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will merge all geometry layers present * in the source file or take only the first. @@ -544,7 +556,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_ALL_GEOMETRY_LAYERS \ - "IMPORT_FBX_READ_ALL_GEOMETRY_LAYERS" + "IMPORT_FBX_READ_ALL_GEOMETRY_LAYERS" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will read all materials present in the @@ -556,7 +568,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_ALL_MATERIALS \ - "IMPORT_FBX_READ_ALL_MATERIALS" + "IMPORT_FBX_READ_ALL_MATERIALS" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will read materials. @@ -565,7 +577,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_MATERIALS \ - "IMPORT_FBX_READ_MATERIALS" + "IMPORT_FBX_READ_MATERIALS" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will read embedded textures. @@ -574,7 +586,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_TEXTURES \ - "IMPORT_FBX_READ_TEXTURES" + "IMPORT_FBX_READ_TEXTURES" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will read cameras. @@ -583,7 +595,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_CAMERAS \ - "IMPORT_FBX_READ_CAMERAS" + "IMPORT_FBX_READ_CAMERAS" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will read light sources. @@ -592,7 +604,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_LIGHTS \ - "IMPORT_FBX_READ_LIGHTS" + "IMPORT_FBX_READ_LIGHTS" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will read animations. @@ -601,7 +613,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_READ_ANIMATIONS \ - "IMPORT_FBX_READ_ANIMATIONS" + "IMPORT_FBX_READ_ANIMATIONS" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will act in strict mode in which only @@ -613,7 +625,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_STRICT_MODE \ - "IMPORT_FBX_STRICT_MODE" + "IMPORT_FBX_STRICT_MODE" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will preserve pivot points for @@ -624,7 +636,7 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS \ - "IMPORT_FBX_PRESERVE_PIVOTS" + "IMPORT_FBX_PRESERVE_PIVOTS" // --------------------------------------------------------------------------- /** @brief Specifies whether the importer will drop empty animation curves or @@ -635,26 +647,26 @@ enum aiComponent { * Property type: bool */ #define AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES \ - "IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES" + "IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES" // --------------------------------------------------------------------------- /** @brief Set whether the fbx importer will use the legacy embedded texture naming. -* -* The default value is false (0) -* Property type: bool -*/ + * + * The default value is false (0) + * Property type: bool + */ #define AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING \ "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" // --------------------------------------------------------------------------- -/** @brief Set wether the FBX importer shall not remove empty bones. - * +/** @brief Set wether the importer shall not remove empty bones. * * Empty bone are often used to define connections for other models. */ #define AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES \ "AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES" + // --------------------------------------------------------------------------- /** @brief Set wether the FBX importer shall convert the unit from cm to m. */ @@ -674,14 +686,14 @@ enum aiComponent { * want to override the global setting). * Property type: integer. */ -#define AI_CONFIG_IMPORT_GLOBAL_KEYFRAME "IMPORT_GLOBAL_KEYFRAME" +#define AI_CONFIG_IMPORT_GLOBAL_KEYFRAME "IMPORT_GLOBAL_KEYFRAME" -#define AI_CONFIG_IMPORT_MD3_KEYFRAME "IMPORT_MD3_KEYFRAME" -#define AI_CONFIG_IMPORT_MD2_KEYFRAME "IMPORT_MD2_KEYFRAME" -#define AI_CONFIG_IMPORT_MDL_KEYFRAME "IMPORT_MDL_KEYFRAME" -#define AI_CONFIG_IMPORT_MDC_KEYFRAME "IMPORT_MDC_KEYFRAME" -#define AI_CONFIG_IMPORT_SMD_KEYFRAME "IMPORT_SMD_KEYFRAME" -#define AI_CONFIG_IMPORT_UNREAL_KEYFRAME "IMPORT_UNREAL_KEYFRAME" +#define AI_CONFIG_IMPORT_MD3_KEYFRAME "IMPORT_MD3_KEYFRAME" +#define AI_CONFIG_IMPORT_MD2_KEYFRAME "IMPORT_MD2_KEYFRAME" +#define AI_CONFIG_IMPORT_MDL_KEYFRAME "IMPORT_MDL_KEYFRAME" +#define AI_CONFIG_IMPORT_MDC_KEYFRAME "IMPORT_MDC_KEYFRAME" +#define AI_CONFIG_IMPORT_SMD_KEYFRAME "IMPORT_SMD_KEYFRAME" +#define AI_CONFIG_IMPORT_UNREAL_KEYFRAME "IMPORT_UNREAL_KEYFRAME" // --------------------------------------------------------------------------- /** Smd load multiple animations @@ -697,7 +709,7 @@ enum aiComponent { * Property type: bool. Default value: true. */ #define AI_CONFIG_IMPORT_AC_SEPARATE_BFCULL \ - "IMPORT_AC_SEPARATE_BFCULL" + "IMPORT_AC_SEPARATE_BFCULL" // --------------------------------------------------------------------------- /** @brief Configures whether the AC loader evaluates subdivision surfaces ( @@ -707,8 +719,8 @@ enum aiComponent { * * * Property type: bool. Default value: true. */ -#define AI_CONFIG_IMPORT_AC_EVAL_SUBDIVISION \ - "IMPORT_AC_EVAL_SUBDIVISION" +#define AI_CONFIG_IMPORT_AC_EVAL_SUBDIVISION \ + "IMPORT_AC_EVAL_SUBDIVISION" // --------------------------------------------------------------------------- /** @brief Configures the UNREAL 3D loader to separate faces with different @@ -717,7 +729,7 @@ enum aiComponent { * * Property type: bool. Default value: true. */ #define AI_CONFIG_IMPORT_UNREAL_HANDLE_FLAGS \ - "UNREAL_HANDLE_FLAGS" + "UNREAL_HANDLE_FLAGS" // --------------------------------------------------------------------------- /** @brief Configures the terragen import plugin to compute uv's for @@ -730,7 +742,7 @@ enum aiComponent { * * Property type: bool. Default value: false. */ #define AI_CONFIG_IMPORT_TER_MAKE_UVS \ - "IMPORT_TER_MAKE_UVS" + "IMPORT_TER_MAKE_UVS" // --------------------------------------------------------------------------- /** @brief Configures the ASE loader to always reconstruct normal vectors @@ -739,8 +751,8 @@ enum aiComponent { * Some ASE files have carry invalid normals, other don't. * * Property type: bool. Default value: true. */ -#define AI_CONFIG_IMPORT_ASE_RECONSTRUCT_NORMALS \ - "IMPORT_ASE_RECONSTRUCT_NORMALS" +#define AI_CONFIG_IMPORT_ASE_RECONSTRUCT_NORMALS \ + "IMPORT_ASE_RECONSTRUCT_NORMALS" // --------------------------------------------------------------------------- /** @brief Configures the M3D loader to detect and process multi-part @@ -752,7 +764,7 @@ enum aiComponent { * Property type: bool. Default value: true. */ #define AI_CONFIG_IMPORT_MD3_HANDLE_MULTIPART \ - "IMPORT_MD3_HANDLE_MULTIPART" + "IMPORT_MD3_HANDLE_MULTIPART" // --------------------------------------------------------------------------- /** @brief Tells the MD3 loader which skin files to load. @@ -764,7 +776,7 @@ enum aiComponent { * Property type: String. Default value: "default". */ #define AI_CONFIG_IMPORT_MD3_SKIN_NAME \ - "IMPORT_MD3_SKIN_NAME" + "IMPORT_MD3_SKIN_NAME" // --------------------------------------------------------------------------- /** @brief Specify the Quake 3 shader file to be used for a particular @@ -782,7 +794,7 @@ enum aiComponent { * Property type: String. Default value: n/a. */ #define AI_CONFIG_IMPORT_MD3_SHADER_SRC \ - "IMPORT_MD3_SHADER_SRC" + "IMPORT_MD3_SHADER_SRC" // --------------------------------------------------------------------------- /** @brief Configures the LWO loader to load just one layer from the model. @@ -795,8 +807,8 @@ enum aiComponent { * layer name may not be empty.<br> * Property type: Integer. Default value: all layers are loaded. */ -#define AI_CONFIG_IMPORT_LWO_ONE_LAYER_ONLY \ - "IMPORT_LWO_ONE_LAYER_ONLY" +#define AI_CONFIG_IMPORT_LWO_ONE_LAYER_ONLY \ + "IMPORT_LWO_ONE_LAYER_ONLY" // --------------------------------------------------------------------------- /** @brief Configures the MD5 loader to not load the MD5ANIM file for @@ -809,8 +821,8 @@ enum aiComponent { * * * Property type: bool. Default value: false. */ -#define AI_CONFIG_IMPORT_MD5_NO_ANIM_AUTOLOAD \ - "IMPORT_MD5_NO_ANIM_AUTOLOAD" +#define AI_CONFIG_IMPORT_MD5_NO_ANIM_AUTOLOAD \ + "IMPORT_MD5_NO_ANIM_AUTOLOAD" // --------------------------------------------------------------------------- /** @brief Defines the begin of the time range for which the LWS loader @@ -828,10 +840,10 @@ enum aiComponent { * * @see AI_CONFIG_IMPORT_LWS_ANIM_END - end of the imported time range */ -#define AI_CONFIG_IMPORT_LWS_ANIM_START \ - "IMPORT_LWS_ANIM_START" -#define AI_CONFIG_IMPORT_LWS_ANIM_END \ - "IMPORT_LWS_ANIM_END" +#define AI_CONFIG_IMPORT_LWS_ANIM_START \ + "IMPORT_LWS_ANIM_START" +#define AI_CONFIG_IMPORT_LWS_ANIM_END \ + "IMPORT_LWS_ANIM_END" // --------------------------------------------------------------------------- /** @brief Defines the output frame rate of the IRR loader. @@ -841,8 +853,8 @@ enum aiComponent { * are returned by the converter.<br> * Property type: integer. Default value: 100 */ -#define AI_CONFIG_IMPORT_IRR_ANIM_FPS \ - "IMPORT_IRR_ANIM_FPS" +#define AI_CONFIG_IMPORT_IRR_ANIM_FPS \ + "IMPORT_IRR_ANIM_FPS" // --------------------------------------------------------------------------- /** @brief Ogre Importer will try to find referenced materials from this file. @@ -855,7 +867,7 @@ enum aiComponent { * Property type: String. Default value: Scene.material. */ #define AI_CONFIG_IMPORT_OGRE_MATERIAL_FILE \ - "IMPORT_OGRE_MATERIAL_FILE" + "IMPORT_OGRE_MATERIAL_FILE" // --------------------------------------------------------------------------- /** @brief Ogre Importer detect the texture usage from its filename. @@ -875,15 +887,15 @@ enum aiComponent { * Property type: Bool. Default value: false. */ #define AI_CONFIG_IMPORT_OGRE_TEXTURETYPE_FROM_FILENAME \ - "IMPORT_OGRE_TEXTURETYPE_FROM_FILENAME" + "IMPORT_OGRE_TEXTURETYPE_FROM_FILENAME" -/** @brief Specifies whether the Android JNI asset extraction is supported. + /** @brief Specifies whether the Android JNI asset extraction is supported. * * Turn on this option if you want to manage assets in native * Android application without having to keep the internal directory and asset * manager pointer. */ -#define AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT "AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT" + #define AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT "AI_CONFIG_ANDROID_JNI_ASSIMP_MANAGER_SUPPORT" // --------------------------------------------------------------------------- /** @brief Specifies whether the IFC loader skips over IfcSpace elements. @@ -922,7 +934,7 @@ enum aiComponent { // default value for AI_CONFIG_IMPORT_IFC_SMOOTHING_ANGLE #if (!defined AI_IMPORT_IFC_DEFAULT_SMOOTHING_ANGLE) -#define AI_IMPORT_IFC_DEFAULT_SMOOTHING_ANGLE 10.0f +# define AI_IMPORT_IFC_DEFAULT_SMOOTHING_ANGLE 10.0f #endif // --------------------------------------------------------------------------- @@ -938,7 +950,7 @@ enum aiComponent { // default value for AI_CONFIG_IMPORT_IFC_CYLINDRICAL_TESSELLATION #if (!defined AI_IMPORT_IFC_DEFAULT_CYLINDRICAL_TESSELLATION) -#define AI_IMPORT_IFC_DEFAULT_CYLINDRICAL_TESSELLATION 32 +# define AI_IMPORT_IFC_DEFAULT_CYLINDRICAL_TESSELLATION 32 #endif // --------------------------------------------------------------------------- @@ -969,8 +981,12 @@ enum aiComponent { #define AI_CONFIG_EXPORT_XFILE_64BIT "EXPORT_XFILE_64BIT" -/** - * +/** @brief Specifies whether the assimp export shall be able to export point clouds + * + * When this flag is not defined the render data has to contain valid faces. + * Point clouds are only a collection of vertices which have nor spatial organization + * by a face and the validation process will remove them. Enabling this feature will + * switch off the flag and enable the functionality to export pure point clouds. */ #define AI_CONFIG_EXPORT_POINT_CLOUDS "EXPORT_POINT_CLOUDS" @@ -980,7 +996,7 @@ enum aiComponent { #define AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY "GLOBAL_SCALE_FACTOR" #if (!defined AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT) -#define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT 1.0f +# define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT 1.0f #endif // !! AI_DEBONE_THRESHOLD #define AI_CONFIG_APP_SCALE_KEY "APP_SCALE_FACTOR" @@ -997,7 +1013,6 @@ enum aiComponent { * Property type: Bool. Default value: undefined. */ -/* #cmakedefine ASSIMP_DOUBLE_PRECISION 1 */ +/* #undef ASSIMP_DOUBLE_PRECISION */ #endif // !! AI_CONFIG_H_INC - diff --git a/thirdparty/assimp/code/revision.h b/thirdparty/assimp/revision.h index 66eb875303..66eb875303 100644 --- a/thirdparty/assimp/code/revision.h +++ b/thirdparty/assimp/revision.h |