diff --git a/ACKNOWLEDGEMENTS.html b/ACKNOWLEDGEMENTS.html
index 7e36530a..0ab511c2 100644
--- a/ACKNOWLEDGEMENTS.html
+++ b/ACKNOWLEDGEMENTS.html
@@ -446,3 +446,55 @@ https://www.reddit.com/r/gamedev/comments/5iuf3h/i_am_writting_a_3d_monster_mode
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+
+
thekla_atlas
+
+ Copyright (c) 2013 Thekla, Inc
+
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+nvmesh
+
+ public domain -- Ignacio CastaƱo
+
+
+poshlib
+
+ Copyright (c) 2004, Brian Hook
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * The names of this package'ss contributors contributors may not
+ be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/docs/builds.rst b/docs/builds.rst
index 6ab763d0..34667ddd 100644
--- a/docs/builds.rst
+++ b/docs/builds.rst
@@ -7,7 +7,7 @@ The core mesh algorithms of Dust3D written in Rust language, located in meshlite
https://github.com/huxingyi/meshlite
-The UI of Dust3D built in Qt5, the only thirdparty dependency is CGAL library, however, CGAL will introduce some new dependencies, such as boost and gmp library.
+The UI of Dust3D built in Qt5, the only thirdparty dependency which should been compiled separately is the CGAL library, however, CGAL will introduce some new dependencies, such as boost and gmp library.
Prerequisites
===============
diff --git a/docs/interface/menubar.rst b/docs/interface/menubar.rst
index aa9a948d..ba1bf514 100644
--- a/docs/interface/menubar.rst
+++ b/docs/interface/menubar.rst
@@ -31,9 +31,8 @@ Save all openned window.
Export...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you want mesh only result, export as Wavefront (.obj) format.
-Choose GL Transmission Format (.gltf) to export all results in one gltf file, the results including autogenerated Meshes, Skeleton, and Materials.
-Because .gltf is a very new format, not every 3D software officially supports it, and there are some plugins for blender to support gltf export and import, but mostly are buggy at current stage.
-You can use Don McCurdy's online website, glTF Viewer https://gltf-viewer.donmccurdy.com/ to check your exported result.
+Choose GL Transmission Format (.gltf) to export all results in one gltf file, the results including autogenerated Meshes, Skeleton, and Texture.
+Because .gltf is a very new format, not every 3D software officially supports it, you can use Don McCurdy's online website, glTF Viewer https://gltf-viewer.donmccurdy.com/ to check your exported result, make sure you drag the folder which including the .gltf file and .png texture file into the website.
Change Turnaround...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -114,6 +113,11 @@ Toggle Bones
The skeleton would also been autogenerated after meshes got generated.
Toggle this item to show or hide the Rendered Skeleton from canvas.
+Show Texture
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The texture would also been autogenerated after meshes got generated.
+Click the recycle button in the up-left corner to regenerate if the texture is not good.
+
Show Parts List
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Parts List Panel is a tool window, if you closed it by accident, you can show it back here.
diff --git a/dust3d.pro b/dust3d.pro
index 86aa3a80..4d881958 100644
--- a/dust3d.pro
+++ b/dust3d.pro
@@ -59,8 +59,8 @@ HEADERS += src/aboutwidget.h
SOURCES += src/meshgenerator.cpp
HEADERS += src/meshgenerator.h
-SOURCES += src/util.cpp
-HEADERS += src/util.h
+SOURCES += src/dust3dutil.cpp
+HEADERS += src/dust3dutil.h
SOURCES += src/turnaroundloader.cpp
HEADERS += src/turnaroundloader.h
@@ -86,8 +86,8 @@ HEADERS += src/mesh.h
SOURCES += src/meshutil.cpp
HEADERS += src/meshutil.h
-SOURCES += src/uvunwrapper.cpp
-HEADERS += src/uvunwrapper.h
+SOURCES += src/texturegenerator.cpp
+HEADERS += src/texturegenerator.h
SOURCES += src/skeletongenerator.cpp
HEADERS += src/skeletongenerator.h
@@ -95,6 +95,9 @@ HEADERS += src/skeletongenerator.h
SOURCES += src/meshresultcontext.cpp
HEADERS += src/meshresultcontext.h
+SOURCES += src/meshresultpostprocessor.cpp
+HEADERS += src/meshresultpostprocessor.h
+
SOURCES += src/positionmap.cpp
HEADERS += src/positionmap.h
@@ -107,6 +110,9 @@ HEADERS += src/logbrowserdialog.h
SOURCES += src/floatnumberwidget.cpp
HEADERS += src/floatnumberwidget.h
+SOURCES += src/textureguidewidget.cpp
+HEADERS += src/textureguidewidget.h
+
SOURCES += src/main.cpp
HEADERS += src/version.h
@@ -181,6 +187,177 @@ unix:!macx {
INCLUDEPATH += thirdparty/json
+INCLUDEPATH += thirdparty/thekla_atlas/src
+INCLUDEPATH += thirdparty/thekla_atlas/extern/poshlib
+INCLUDEPATH += thirdparty/thekla_atlas/src/nvmesh
+INCLUDEPATH += thirdparty/thekla_atlas/src/nvmesh/param
+INCLUDEPATH += thirdparty/thekla_atlas/src/nvcore
+INCLUDEPATH += thirdparty/thekla_atlas/src/nvimage
+INCLUDEPATH += thirdparty/thekla_atlas/src/nvmath
+
+SOURCES += thirdparty/thekla_atlas/extern/poshlib/posh.c
+HEADERS += thirdparty/thekla_atlas/extern/poshlib/posh.h
+
+SOURCES += thirdparty/thekla_atlas/src/thekla/thekla_atlas.cpp
+HEADERS += thirdparty/thekla_atlas/src/thekla/thekla_atlas.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvcore/Stream.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvcore/Debug.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvcore/Debug.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvcore/StdStream.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvcore/StrLib.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvcore/StrLib.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvcore/Utils.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvcore/Array.inl
+HEADERS += thirdparty/thekla_atlas/src/nvcore/Array.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvcore/Memory.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvcore/Memory.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvcore/RadixSort.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvcore/RadixSort.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvcore/HashMap.inl
+HEADERS += thirdparty/thekla_atlas/src/nvcore/HashMap.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvcore/Hash.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvcore/ForEach.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/nvmesh.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/nvmesh.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/BaseMesh.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/BaseMesh.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/MeshBuilder.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/MeshBuilder.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/TriMesh.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/TriMesh.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/QuadTriMesh.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/QuadTriMesh.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/MeshTopology.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/MeshTopology.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/halfedge/Edge.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/halfedge/Edge.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/halfedge/Mesh.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/halfedge/Mesh.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/halfedge/Face.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/halfedge/Face.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/halfedge/Vertex.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/halfedge/Vertex.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/geometry/Bounds.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/geometry/Bounds.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/geometry/Measurements.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/geometry/Measurements.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/raster/Raster.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/raster/raster.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/raster/ClippedTriangle.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/Atlas.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/Atlas.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/AtlasBuilder.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/AtlasBuilder.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/AtlasPacker.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/AtlasPacker.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/ConformalMap.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/ConformalMap.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/LeastSquaresConformalMap.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/LeastSquaresConformalMap.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/OrthogonalProjectionMap.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/OrthogonalProjectionMap.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/ParameterizationQuality.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/ParameterizationQuality.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/SingleFaceMap.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/SingleFaceMap.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/param/Util.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/param/Util.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/weld/VertexWeld.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/weld/VertexWeld.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/weld/Weld.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmesh/weld/Snap.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmesh/weld/Snap.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvimage/Image.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvimage/Image.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvimage/BitMap.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvimage/BitMap.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvimage/nvimage.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Basis.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Basis.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Box.inl
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Box.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Box.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Color.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/ConvexHull.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/ConvexHull.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Fitting.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Fitting.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/KahanSum.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Matrix.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Plane.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Plane.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/ProximityGrid.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/ProximityGrid.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Quaternion.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Random.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Random.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Solver.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Solver.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Sparse.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Sparse.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/TypeSerialization.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/TypeSerialization.h
+
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Vector.inl
+SOURCES += thirdparty/thekla_atlas/src/nvmath/Vector.cpp
+HEADERS += thirdparty/thekla_atlas/src/nvmath/Vector.h
+
+HEADERS += thirdparty/thekla_atlas/src/nvmath/ftoi.h
+
INCLUDEPATH += $$MESHLITE_DIR
LIBS += -L$$MESHLITE_DIR -l$$MESHLITE_LIBNAME
diff --git a/src/util.cpp b/src/dust3dutil.cpp
similarity index 95%
rename from src/util.cpp
rename to src/dust3dutil.cpp
index f5a40108..70bd8347 100644
--- a/src/util.cpp
+++ b/src/dust3dutil.cpp
@@ -1,5 +1,5 @@
#include
-#include "util.h"
+#include "dust3dutil.h"
QString valueOfKeyInMapOrEmpty(const std::map &map, const QString &key)
{
diff --git a/src/util.h b/src/dust3dutil.h
similarity index 88%
rename from src/util.h
rename to src/dust3dutil.h
index 1c871ec9..208a6625 100644
--- a/src/util.h
+++ b/src/dust3dutil.h
@@ -1,5 +1,5 @@
-#ifndef UTIL_H
-#define UTIL_H
+#ifndef DUST3D_UTIL_H
+#define DUST3D_UTIL_H
#include
#include