Merge remote-tracking branch 'official/master' into contrib
commit
6d16a5a5b7
|
@ -1,3 +1,34 @@
|
|||
build
|
||||
.project
|
||||
*.kdev4*
|
||||
|
||||
# Visual Studio
|
||||
*.sln
|
||||
*.ncb
|
||||
*.vcproj
|
||||
|
||||
# Output
|
||||
bin/
|
||||
lib/
|
||||
contrib/
|
||||
|
||||
# Generated
|
||||
assimp.pc
|
||||
revision.h
|
||||
contrib/zlib/zconf.h
|
||||
contrib/zlib/zlib.pc
|
||||
|
||||
# CMake
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
cmake_install.cmake
|
||||
cmake_uninstall.cmake
|
||||
*.dir/
|
||||
assimp-config.cmake
|
||||
assimp-config-version.cmake
|
||||
|
||||
# Tests
|
||||
test/results
|
||||
|
||||
# Python
|
||||
__pycache__
|
||||
|
|
23
CHANGES
23
CHANGES
|
@ -2,6 +2,29 @@
|
|||
CHANGELOG
|
||||
----------------------------------------------------------------------
|
||||
|
||||
3.1.1 (2014-06-15)
|
||||
|
||||
FEATURES:
|
||||
- Support for FBX 2013 and newer, binary and ASCII (this is partly
|
||||
work from Google Summer of Code 2012)
|
||||
- Support for OGRE binary mesh and skeleton format
|
||||
- Updated BLEND support for newer Blender versions
|
||||
- Support for arbitrary meta data, used to hold FBX and DAE metadata
|
||||
- OBJ Export now produces smaller files
|
||||
- Meshes can now have names, this is supported by the major importers
|
||||
- Improved IFC geometry generation
|
||||
- M3 support has been removed
|
||||
|
||||
FIXES/HOUSEKEEPING:
|
||||
- Hundreds of bugfixes in all parts of the library
|
||||
- CMake is now the primary build system
|
||||
|
||||
API COMPATIBILITY:
|
||||
- 3.1.1 is not binary compatible to 3.0 due to aiNode::mMetaData
|
||||
and aiMesh::mName
|
||||
- Export interface has been cleaned up and unified
|
||||
- Other than that no relevant changes
|
||||
|
||||
|
||||
3.0 (2012-07-07)
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ PROJECT( Assimp )
|
|||
|
||||
# Define here the needed parameters
|
||||
set (ASSIMP_VERSION_MAJOR 3)
|
||||
set (ASSIMP_VERSION_MINOR 0)
|
||||
set (ASSIMP_VERSION_MINOR 1)
|
||||
set (ASSIMP_VERSION_PATCH 1) # subversion revision?
|
||||
set (ASSIMP_VERSION ${ASSIMP_VERSION_MAJOR}.${ASSIMP_VERSION_MINOR}.${ASSIMP_VERSION_PATCH})
|
||||
set (ASSIMP_SOVERSION 3)
|
||||
|
@ -32,11 +32,11 @@ if(NOT GIT_COMMIT_HASH)
|
|||
endif(NOT GIT_COMMIT_HASH)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/revision.h.in
|
||||
${CMAKE_BINARY_DIR}/revision.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/revision.h.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/revision.h
|
||||
)
|
||||
|
||||
include_directories(${CMAKE_BINARY_DIR})
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
option(ASSIMP_OPT_BUILD_PACKAGES "Set to ON to generate CPack configuration files and packaging targets" OFF)
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules" )
|
||||
|
@ -76,11 +76,18 @@ SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE PATH
|
|||
"Path the header files are installed to." )
|
||||
SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE PATH
|
||||
"Path the tool executables are installed to." )
|
||||
SET ( ASSIMP_BUILD_STATIC_LIB OFF CACHE BOOL
|
||||
"Build a static (.a) version of the library" )
|
||||
|
||||
SET(ASSIMP_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfitx for lib, samples and tools")
|
||||
|
||||
# Allow the user to build a static library
|
||||
option ( BUILD_SHARED_LIBS "Build a shared version of the library" ON )
|
||||
IF ( ASSIMP_BUILD_STATIC_LIB )
|
||||
option ( BUILD_SHARED_LIBS "Build a shared version of the library" OFF )
|
||||
ELSE ( ASSIMP_BUILD_STATIC_LIB )
|
||||
option ( BUILD_SHARED_LIBS "Build a shared version of the library" ON )
|
||||
ENDIF ( ASSIMP_BUILD_STATIC_LIB )
|
||||
|
||||
# Generate a pkg-config .pc for the Assimp library.
|
||||
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/assimp.pc.in" "${PROJECT_BINARY_DIR}/assimp.pc" @ONLY )
|
||||
|
@ -104,7 +111,7 @@ IF ( ASSIMP_ENABLE_BOOST_WORKAROUND )
|
|||
MESSAGE( STATUS "Building a non-boost version of Assimp." )
|
||||
ELSE ( ASSIMP_ENABLE_BOOST_WORKAROUND )
|
||||
SET( Boost_DETAILED_FAILURE_MSG ON )
|
||||
SET( Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0" "1.48.0" "1.48" "1.49" "1.49.0" "1.50" "1.50.0" "1.51" "1.51.0" "1.52.0" "1.53.0" "1.54.0")
|
||||
SET( Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0" "1.48.0" "1.48" "1.49" "1.49.0" "1.50" "1.50.0" "1.51" "1.51.0" "1.52.0" "1.53.0" "1.54.0" "1.55" )
|
||||
FIND_PACKAGE( Boost )
|
||||
IF ( NOT Boost_FOUND )
|
||||
MESSAGE( FATAL_ERROR
|
||||
|
|
13
CREDITS
13
CREDITS
|
@ -3,8 +3,8 @@ Open Asset Import Library (Assimp)
|
|||
Developers and Contributors
|
||||
===============================================================
|
||||
|
||||
The following is the list of all constributors.
|
||||
Thanks for your help!
|
||||
The following is a non-exhaustive list of all constributors over the years.
|
||||
If you think your name should be listed here, drop us a line and we'll add you.
|
||||
|
||||
- Alexander Gessler,
|
||||
3DS-, BLEND-, ASE-, DXF-, HMP-, MDL-, MD2-, MD3-, MD5-, MDC-, NFF-, PLY-, STL-, RAW-, OFF-, MS3D-, Q3D- and LWO-Loader, Assimp-Viewer, assimp-cmd, -noboost, Website (Admin and Design).
|
||||
|
@ -41,7 +41,7 @@ Submitted patches to make Assimp compile with GCC-4, a makefile and the xcode3 w
|
|||
- Andreas Nagel
|
||||
First Assimp testing & verification under Windows Vista 64 Bit.
|
||||
|
||||
- Marius Schröder
|
||||
- Marius Schr<EFBFBD>der
|
||||
Allowed us to use many of his models for screenshots and testing.
|
||||
|
||||
- Christian Schubert
|
||||
|
@ -92,7 +92,7 @@ Contributed the 'SimpleTexturedOpenGl' sample.
|
|||
- Matthias Fauconneau
|
||||
Contributed a fix for the Q3-BSP loader.
|
||||
|
||||
- Jørgen P. Tjernø
|
||||
- J<EFBFBD>rgen P. Tjern<72>
|
||||
Contributed updated and improved xcode workspaces
|
||||
|
||||
- drparallax
|
||||
|
@ -137,7 +137,7 @@ GCC/Linux fixes for the SimpleOpenGL sample.
|
|||
- Brian Miller
|
||||
Bugfix for a compiler fix for iOS on arm.
|
||||
|
||||
- Séverin Lemaignan
|
||||
- S<EFBFBD>verin Lemaignan
|
||||
Rewrite of PyAssimp, distutils and Python3 support
|
||||
|
||||
- albert-wang
|
||||
|
@ -145,3 +145,6 @@ Bugfixes for the collada parser
|
|||
|
||||
- Ya ping Jin
|
||||
Bugfixes for uv-tanget calculation.
|
||||
|
||||
- Jonne Nauha
|
||||
Ogre Binary format support
|
||||
|
|
10
Readme.md
10
Readme.md
|
@ -1,12 +1,12 @@
|
|||
Open Asset Import Library (assimp)
|
||||
========
|
||||
|
||||
Open Asset Import Library is a Open Source library designed to load various __3d file formats and convert them into a single, in-memory format__. It supports more than __30 file formats__ for import and a growing selection of file formats for export. Additionally, assimp features various __post processing tools__ to refine the imported data: _normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials_ and many more.
|
||||
|
||||
Its short name under which it is commonly known is __assimp__.
|
||||
Open Asset Import Library is a Open Source library designed to load various __3d file formats and convert them into a shared, in-memory format__. It supports more than __30 file formats__ for import and a growing selection of file formats for export. Additionally, assimp features various __post processing tools__ to refine the imported data: _normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials_ and many more.
|
||||
|
||||
This is the development trunk of assimp containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [assimp.sf.net](http://assimp.sf.net) or from *nix package repositories. According to [Travis-CI] (https://travis-ci.org/), the current build status of the trunk is [![Build Status](https://travis-ci.org/assimp/assimp.png)](https://travis-ci.org/assimp/assimp)
|
||||
|
||||
[open3mod](https://github.com/acgessler/open3mod) is an Open Source 3D model viewer based off Assimp's import and export abilities.
|
||||
|
||||
#### Supported file formats ####
|
||||
|
||||
The library provides importers for a lot of file formats, including:
|
||||
|
@ -43,6 +43,7 @@ The library provides importers for a lot of file formats, including:
|
|||
- BVH
|
||||
- B3D
|
||||
- NDO
|
||||
- Ogre Binary
|
||||
- Ogre XML
|
||||
- Q3D
|
||||
|
||||
|
@ -56,6 +57,7 @@ Exporters include:
|
|||
- STL
|
||||
- OBJ
|
||||
- PLY
|
||||
- JSON (for WebGl, via https://github.com/acgessler/assimp2json)
|
||||
|
||||
See [the full list here](http://assimp.sourceforge.net/main_features_formats.html).
|
||||
|
||||
|
@ -77,7 +79,7 @@ C++ish interface). The directory structure is:
|
|||
/scripts Scripts used to generate the loading code for some formats
|
||||
/port Ports to other languages and scripts to maintain those.
|
||||
/test Unit- and regression tests, test suite of models
|
||||
/tools Tools (viewer, command line `assimp`)
|
||||
/tools Tools (old assimp viewer, command line `assimp`)
|
||||
/samples A small number of samples to illustrate possible
|
||||
use cases for Assimp
|
||||
/workspaces Build enviroments for vc,xcode,... (deprecated,
|
||||
|
|
|
@ -44,20 +44,20 @@ if (CMAKE_BUILD_TYPE EQUAL "DEBUG")
|
|||
set( ASSIMP_LIBRARIES ${ASSIMP_LIBRARIES}D)
|
||||
endif (CMAKE_BUILD_TYPE EQUAL "DEBUG")
|
||||
|
||||
# search for the boost version assimp was compiled with
|
||||
#set(Boost_USE_MULTITHREAD ON)
|
||||
#set(Boost_USE_STATIC_LIBS OFF)
|
||||
#set(Boost_USE_STATIC_RUNTIME OFF)
|
||||
#find_package(Boost ${ASSIMP_Boost_VERSION} EXACT COMPONENTS thread date_time)
|
||||
#if(Boost_VERSION AND NOT "${Boost_VERSION}" STREQUAL "0")
|
||||
# set( ASSIMP_INCLUDE_DIRS "${ASSIMP_INCLUDE_DIRS}" ${Boost_INCLUDE_DIRS})
|
||||
#else(Boost_VERSION AND NOT "${Boost_VERSION}" STREQUAL "0")
|
||||
# message(WARNING "Failed to find Boost ${ASSIMP_Boost_VERSION} necessary for assimp")
|
||||
#endif(Boost_VERSION AND NOT "${Boost_VERSION}" STREQUAL "0")
|
||||
|
||||
# the boost version assimp was compiled with
|
||||
set( ASSIMP_Boost_VERSION "@Boost_MAJOR_VERSION@.@Boost_MINOR_VERSION@")
|
||||
|
||||
# search for the boost version assimp was compiled with
|
||||
set(Boost_USE_MULTITHREAD ON)
|
||||
set(Boost_USE_STATIC_LIBS OFF)
|
||||
set(Boost_USE_STATIC_RUNTIME OFF)
|
||||
find_package(Boost ${ASSIMP_Boost_VERSION} EXACT COMPONENTS thread date_time)
|
||||
if(Boost_VERSION AND NOT "${Boost_VERSION}" STREQUAL "0")
|
||||
set( ASSIMP_INCLUDE_DIRS "${ASSIMP_INCLUDE_DIRS}" ${Boost_INCLUDE_DIRS})
|
||||
else(Boost_VERSION AND NOT "${Boost_VERSION}" STREQUAL "0")
|
||||
message(WARNING "Failed to find Boost ${ASSIMP_Boost_VERSION} necessary for assimp")
|
||||
endif(Boost_VERSION AND NOT "${Boost_VERSION}" STREQUAL "0")
|
||||
|
||||
# for compatibility wiht pkg-config
|
||||
set(ASSIMP_CFLAGS_OTHER "${ASSIMP_CXX_FLAGS}")
|
||||
set(ASSIMP_LDFLAGS_OTHER "${ASSIMP_LINK_FLAGS}")
|
||||
|
|
|
@ -61,6 +61,8 @@ ASSIMP_API size_t aiGetExportFormatCount(void)
|
|||
// ------------------------------------------------------------------------------------------------
|
||||
ASSIMP_API const aiExportFormatDesc* aiGetExportFormatDescription( size_t pIndex)
|
||||
{
|
||||
// Note: this is valid as the index always pertains to a builtin exporter,
|
||||
// for which the returned structure is guaranteed to be of static storage duration.
|
||||
return Exporter().GetExportFormatDescription(pIndex);
|
||||
}
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
// Include our stdint.h replacement header for MSVC, take the global header for gcc/mingw
|
||||
#if defined( _MSC_VER) && (_MSC_VER < 1600)
|
||||
# include "pstdint.h"
|
||||
# include "../include/assimp/Compiler/pstdint.h"
|
||||
#else
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
|
|
@ -248,6 +248,15 @@ void BlenderModifier_Mirror :: DoIt(aiNode& out, ConversionData& conv_data, co
|
|||
}
|
||||
}
|
||||
|
||||
// Only reverse the winding order if an odd number of axes were mirrored.
|
||||
if (xs * ys * zs < 0) {
|
||||
for( unsigned int i = 0; i < mesh->mNumFaces; i++) {
|
||||
aiFace& face = mesh->mFaces[i];
|
||||
for( unsigned int fi = 0; fi < face.mNumIndices / 2; ++fi)
|
||||
std::swap( face.mIndices[fi], face.mIndices[face.mNumIndices - 1 - fi]);
|
||||
}
|
||||
}
|
||||
|
||||
conv_data.meshes->push_back(mesh);
|
||||
}
|
||||
unsigned int* nind = new unsigned int[out.mNumMeshes*2];
|
||||
|
|
|
@ -10,7 +10,7 @@ SET( HEADER_PATH ../include/assimp )
|
|||
SET( COMPILER_HEADERS
|
||||
${HEADER_PATH}/Compiler/pushpack1.h
|
||||
${HEADER_PATH}/Compiler/poppack1.h
|
||||
pstdint.h
|
||||
${HEADER_PATH}/Compiler/pstdint.h
|
||||
)
|
||||
SOURCE_GROUP( Compiler FILES ${COMPILER_HEADERS})
|
||||
|
||||
|
@ -322,11 +322,15 @@ SOURCE_GROUP( Obj FILES ${Obj_SRCS})
|
|||
|
||||
SET( Ogre_SRCS
|
||||
OgreImporter.h
|
||||
OgreStructs.h
|
||||
OgreParsingUtils.h
|
||||
OgreBinarySerializer.h
|
||||
OgreXmlSerializer.h
|
||||
OgreImporter.cpp
|
||||
OgreStructs.cpp
|
||||
OgreBinarySerializer.cpp
|
||||
OgreXmlSerializer.cpp
|
||||
OgreMaterial.cpp
|
||||
OgreMesh.cpp
|
||||
OgreSkeleton.cpp
|
||||
)
|
||||
SOURCE_GROUP( Ogre FILES ${Ogre_SRCS})
|
||||
|
||||
|
@ -539,6 +543,8 @@ SET( XFile_SRCS
|
|||
XFileImporter.h
|
||||
XFileParser.cpp
|
||||
XFileParser.h
|
||||
XFileExporter.h
|
||||
XFileExporter.cpp
|
||||
)
|
||||
SOURCE_GROUP( XFile FILES ${XFile_SRCS})
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ ColladaExporter::~ColladaExporter()
|
|||
void ColladaExporter::WriteFile()
|
||||
{
|
||||
// write the DTD
|
||||
mOutput << "<?xml version=\"1.0\"?>" << endstr;
|
||||
mOutput << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>" << endstr;
|
||||
// COLLADA element start
|
||||
mOutput << "<COLLADA xmlns=\"http://www.collada.org/2005/11/COLLADASchema\" version=\"1.4.1\">" << endstr;
|
||||
PushTag();
|
||||
|
@ -151,7 +151,7 @@ void ColladaExporter::WriteFile()
|
|||
// Writes the asset header
|
||||
void ColladaExporter::WriteHeader()
|
||||
{
|
||||
static const float epsilon = 0.000001f;
|
||||
static const float epsilon = 0.00001f;
|
||||
static const aiQuaternion x_rot(aiMatrix3x3(
|
||||
0, -1, 0,
|
||||
1, 0, 0,
|
||||
|
@ -176,6 +176,7 @@ void ColladaExporter::WriteHeader()
|
|||
aiQuaternion rotation;
|
||||
aiVector3D position;
|
||||
mScene->mRootNode->mTransformation.Decompose(scaling, rotation, position);
|
||||
rotation.Normalize();
|
||||
|
||||
bool add_root_node = false;
|
||||
|
||||
|
@ -229,8 +230,22 @@ void ColladaExporter::WriteHeader()
|
|||
PushTag();
|
||||
mOutput << startstr << "<contributor>" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<author>Assimp</author>" << endstr;
|
||||
mOutput << startstr << "<authoring_tool>Assimp Collada Exporter</authoring_tool>" << endstr;
|
||||
|
||||
aiMetadata* meta = mScene->mRootNode->mMetaData;
|
||||
aiString value;
|
||||
if (!meta || !meta->Get("Author", value))
|
||||
mOutput << startstr << "<author>" << "Assimp" << "</author>" << endstr;
|
||||
else
|
||||
mOutput << startstr << "<author>" << value.C_Str() << "</author>" << endstr;
|
||||
|
||||
if (!meta || !meta->Get("AuthoringTool", value))
|
||||
mOutput << startstr << "<authoring_tool>" << "Assimp Exporter" << "</authoring_tool>" << endstr;
|
||||
else
|
||||
mOutput << startstr << "<authoring_tool>" << value.C_Str() << "</authoring_tool>" << endstr;
|
||||
|
||||
//mOutput << startstr << "<author>" << mScene->author.C_Str() << "</author>" << endstr;
|
||||
//mOutput << startstr << "<authoring_tool>" << mScene->authoringTool.C_Str() << "</authoring_tool>" << endstr;
|
||||
|
||||
PopTag();
|
||||
mOutput << startstr << "</contributor>" << endstr;
|
||||
mOutput << startstr << "<created>" << date_str << "</created>" << endstr;
|
||||
|
@ -353,7 +368,8 @@ void ColladaExporter::WriteTextureColorEntry( const Surface& pSurface, const std
|
|||
if( pSurface.texture.empty() )
|
||||
{
|
||||
mOutput << startstr << "<color sid=\"" << pTypeName << "\">" << pSurface.color.r << " " << pSurface.color.g << " " << pSurface.color.b << " " << pSurface.color.a << "</color>" << endstr;
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
mOutput << startstr << "<texture texture=\"" << pImageName << "\" texcoord=\"CHANNEL" << pSurface.channel << "\" />" << endstr;
|
||||
}
|
||||
|
@ -630,26 +646,63 @@ void ColladaExporter::WriteGeometry( size_t pIndex)
|
|||
PopTag();
|
||||
mOutput << startstr << "</vertices>" << endstr;
|
||||
|
||||
// write face setup
|
||||
mOutput << startstr << "<polylist count=\"" << mesh->mNumFaces << "\" material=\"theresonlyone\">" << endstr;
|
||||
// count the number of lines, triangles and polygon meshes
|
||||
int countLines = 0;
|
||||
int countPoly = 0;
|
||||
for( size_t a = 0; a < mesh->mNumFaces; ++a )
|
||||
{
|
||||
if (mesh->mFaces[a].mNumIndices == 2) countLines++;
|
||||
else if (mesh->mFaces[a].mNumIndices >= 3) countPoly++;
|
||||
}
|
||||
|
||||
// lines
|
||||
if (countLines)
|
||||
{
|
||||
mOutput << startstr << "<lines count=\"" << countLines << "\" material=\"defaultMaterial\">" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<input offset=\"0\" semantic=\"VERTEX\" source=\"#" << idstr << "-vertices\" />" << endstr;
|
||||
mOutput << startstr << "<p>";
|
||||
for( size_t a = 0; a < mesh->mNumFaces; ++a )
|
||||
{
|
||||
const aiFace& face = mesh->mFaces[a];
|
||||
if (face.mNumIndices != 2) continue;
|
||||
for( size_t b = 0; b < face.mNumIndices; ++b )
|
||||
mOutput << face.mIndices[b] << " ";
|
||||
}
|
||||
mOutput << "</p>" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "</lines>" << endstr;
|
||||
}
|
||||
|
||||
// triangle - dont use it, because compatibility problems
|
||||
|
||||
// polygons
|
||||
if (countPoly)
|
||||
{
|
||||
mOutput << startstr << "<polylist count=\"" << countPoly << "\" material=\"defaultMaterial\">" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<input offset=\"0\" semantic=\"VERTEX\" source=\"#" << idstr << "-vertices\" />" << endstr;
|
||||
|
||||
mOutput << startstr << "<vcount>";
|
||||
for( size_t a = 0; a < mesh->mNumFaces; ++a )
|
||||
{
|
||||
if (mesh->mFaces[a].mNumIndices < 3) continue;
|
||||
mOutput << mesh->mFaces[a].mNumIndices << " ";
|
||||
}
|
||||
mOutput << "</vcount>" << endstr;
|
||||
|
||||
mOutput << startstr << "<p>";
|
||||
for( size_t a = 0; a < mesh->mNumFaces; ++a )
|
||||
{
|
||||
const aiFace& face = mesh->mFaces[a];
|
||||
if (face.mNumIndices < 3) continue;
|
||||
for( size_t b = 0; b < face.mNumIndices; ++b )
|
||||
mOutput << face.mIndices[b] << " ";
|
||||
}
|
||||
mOutput << "</p>" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "</polylist>" << endstr;
|
||||
}
|
||||
|
||||
// closing tags
|
||||
PopTag();
|
||||
|
@ -770,8 +823,16 @@ void ColladaExporter::WriteSceneLibrary()
|
|||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Recursively writes the given node
|
||||
void ColladaExporter::WriteNode( const aiNode* pNode)
|
||||
void ColladaExporter::WriteNode(aiNode* pNode)
|
||||
{
|
||||
// the must have a name
|
||||
if (pNode->mName.length == 0)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << "Node_" << pNode;
|
||||
pNode->mName.Set(ss.str());
|
||||
}
|
||||
|
||||
mOutput << startstr << "<node id=\"" << pNode->mName.data << "\" name=\"" << pNode->mName.data << "\">" << endstr;
|
||||
PushTag();
|
||||
|
||||
|
@ -799,7 +860,7 @@ void ColladaExporter::WriteNode( const aiNode* pNode)
|
|||
PushTag();
|
||||
mOutput << startstr << "<technique_common>" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<instance_material symbol=\"theresonlyone\" target=\"#" << materials[mesh->mMaterialIndex].name << "\" />" << endstr;
|
||||
mOutput << startstr << "<instance_material symbol=\"defaultMaterial\" target=\"#" << materials[mesh->mMaterialIndex].name << "\" />" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "</technique_common>" << endstr;
|
||||
PopTag();
|
||||
|
|
|
@ -92,7 +92,7 @@ protected:
|
|||
void WriteSceneLibrary();
|
||||
|
||||
/// Recursively writes the given node
|
||||
void WriteNode( const aiNode* pNode);
|
||||
void WriteNode( aiNode* pNode);
|
||||
|
||||
/// Enters a new xml element, which increases the indentation
|
||||
void PushTag() { startstr.append( " "); }
|
||||
|
|
|
@ -133,6 +133,7 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I
|
|||
mLights.clear();
|
||||
mCameras.clear();
|
||||
mTextures.clear();
|
||||
mAnims.clear();
|
||||
|
||||
// parse the input file
|
||||
ColladaParser parser( pIOHandler, pFile);
|
||||
|
@ -904,6 +905,8 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars
|
|||
pScene->mAnimations = new aiAnimation*[mAnims.size()];
|
||||
std::copy( mAnims.begin(), mAnims.end(), pScene->mAnimations);
|
||||
}
|
||||
|
||||
mAnims.clear();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -71,7 +71,9 @@ void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out);
|
|||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Exporter worker function prototypes. Should not be necessary to #ifndef them, it's just a prototype
|
||||
// do not use const, because some exporter need to convert the scene temporary
|
||||
void ExportSceneCollada(const char*,IOSystem*, const aiScene*);
|
||||
void ExportSceneXFile(const char*,IOSystem*, const aiScene*);
|
||||
void ExportSceneObj(const char*,IOSystem*, const aiScene*);
|
||||
void ExportSceneSTL(const char*,IOSystem*, const aiScene*);
|
||||
void ExportSceneSTLBinary(const char*,IOSystem*, const aiScene*);
|
||||
|
@ -86,6 +88,11 @@ Exporter::ExportFormatEntry gExporters[] =
|
|||
Exporter::ExportFormatEntry( "collada", "COLLADA - Digital Asset Exchange Schema", "dae", &ExportSceneCollada),
|
||||
#endif
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_FXILE_EXPORTER
|
||||
Exporter::ExportFormatEntry( "x", "X Files", "x", &ExportSceneXFile,
|
||||
aiProcess_MakeLeftHanded | aiProcess_FlipWindingOrder | aiProcess_FlipUVs),
|
||||
#endif
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OBJ_EXPORTER
|
||||
Exporter::ExportFormatEntry( "obj", "Wavefront OBJ format", "obj", &ExportSceneObj,
|
||||
aiProcess_GenSmoothNormals /*| aiProcess_PreTransformVertices */),
|
||||
|
@ -437,6 +444,11 @@ const aiExportFormatDesc* Exporter :: GetExportFormatDescription( size_t pIndex
|
|||
return NULL;
|
||||
}
|
||||
|
||||
// Return from static storage if the requested index is built-in.
|
||||
if (pIndex < sizeof(gExporters) / sizeof(gExporters[0])) {
|
||||
return &gExporters[pIndex].mDescription;
|
||||
}
|
||||
|
||||
return &pimpl->mExporters[pIndex].mDescription;
|
||||
}
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ public:
|
|||
if(mat) {
|
||||
|
||||
if (materials_converted.find(mat) == materials_converted.end()) {
|
||||
ConvertMaterial(*mat);
|
||||
ConvertMaterial(*mat, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -767,7 +767,6 @@ private:
|
|||
|
||||
// find user defined properties (3ds Max)
|
||||
data->Set(index++, "UserProperties", aiString(PropertyGet<std::string>(props, "UDP3DSMAX", "")));
|
||||
unparsedProperties.erase("UDP3DSMAX");
|
||||
// preserve the info that a node was marked as Null node in the original file.
|
||||
data->Set(index++, "IsNull", model.IsNull() ? true : false);
|
||||
|
||||
|
@ -783,8 +782,8 @@ private:
|
|||
data->Set(index++, prop.first, interpreted->Value());
|
||||
else if (const TypedProperty<float>* interpreted = prop.second->As<TypedProperty<float> >())
|
||||
data->Set(index++, prop.first, interpreted->Value());
|
||||
else if (const TypedProperty<aiString>* interpreted = prop.second->As<TypedProperty<aiString> >())
|
||||
data->Set(index++, prop.first, interpreted->Value());
|
||||
else if (const TypedProperty<std::string>* interpreted = prop.second->As<TypedProperty<std::string> >())
|
||||
data->Set(index++, prop.first, aiString(interpreted->Value()));
|
||||
else if (const TypedProperty<aiVector3D>* interpreted = prop.second->As<TypedProperty<aiVector3D> >())
|
||||
data->Set(index++, prop.first, interpreted->Value());
|
||||
else
|
||||
|
@ -1381,7 +1380,7 @@ private:
|
|||
return;
|
||||
}
|
||||
|
||||
out->mMaterialIndex = ConvertMaterial(*mat);
|
||||
out->mMaterialIndex = ConvertMaterial(*mat, &geo);
|
||||
materials_converted[mat] = out->mMaterialIndex;
|
||||
}
|
||||
|
||||
|
@ -1411,7 +1410,7 @@ private:
|
|||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Material -> aiMaterial
|
||||
unsigned int ConvertMaterial(const Material& material)
|
||||
unsigned int ConvertMaterial(const Material& material, const MeshGeometry* const mesh)
|
||||
{
|
||||
const PropertyTable& props = material.Props();
|
||||
|
||||
|
@ -1440,8 +1439,8 @@ private:
|
|||
SetShadingPropertiesCommon(out_mat,props);
|
||||
|
||||
// texture assignments
|
||||
SetTextureProperties(out_mat,material.Textures());
|
||||
SetTextureProperties(out_mat,material.LayeredTextures());
|
||||
SetTextureProperties(out_mat,material.Textures(), mesh);
|
||||
SetTextureProperties(out_mat,material.LayeredTextures(), mesh);
|
||||
|
||||
return static_cast<unsigned int>(materials.size() - 1);
|
||||
}
|
||||
|
@ -1450,7 +1449,7 @@ private:
|
|||
// ------------------------------------------------------------------------------------------------
|
||||
void TrySetTextureProperties(aiMaterial* out_mat, const TextureMap& textures,
|
||||
const std::string& propName,
|
||||
aiTextureType target)
|
||||
aiTextureType target, const MeshGeometry* const mesh)
|
||||
{
|
||||
TextureMap::const_iterator it = textures.find(propName);
|
||||
if(it == textures.end()) {
|
||||
|
@ -1495,7 +1494,10 @@ private:
|
|||
std::find(materials.begin(),materials.end(),out_mat)
|
||||
));
|
||||
|
||||
|
||||
uvIndex = -1;
|
||||
if (!mesh)
|
||||
{
|
||||
BOOST_FOREACH(const MeshMap::value_type& v,meshes_converted) {
|
||||
const MeshGeometry* const mesh = dynamic_cast<const MeshGeometry*> (v.first);
|
||||
if(!mesh) {
|
||||
|
@ -1531,6 +1533,28 @@ private:
|
|||
" appears at different positions in meshes, results will be wrong");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int index = -1;
|
||||
for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {
|
||||
if(mesh->GetTextureCoords(i).empty()) {
|
||||
break;
|
||||
}
|
||||
const std::string& name = mesh->GetTextureCoordChannelName(i);
|
||||
if(name == uvSet) {
|
||||
index = static_cast<int>(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(index == -1) {
|
||||
FBXImporter::LogWarn("did not find UV channel named " + uvSet + " in a mesh using this material");
|
||||
}
|
||||
|
||||
if(uvIndex == -1) {
|
||||
uvIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
if(uvIndex == -1) {
|
||||
FBXImporter::LogWarn("failed to resolve UV channel " + uvSet + ", using first UV channel");
|
||||
|
@ -1546,7 +1570,7 @@ private:
|
|||
// ------------------------------------------------------------------------------------------------
|
||||
void TrySetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures,
|
||||
const std::string& propName,
|
||||
aiTextureType target)
|
||||
aiTextureType target, const MeshGeometry* const mesh)
|
||||
{
|
||||
LayeredTextureMap::const_iterator it = layeredTextures.find(propName);
|
||||
if(it == layeredTextures.end()) {
|
||||
|
@ -1591,6 +1615,8 @@ private:
|
|||
));
|
||||
|
||||
uvIndex = -1;
|
||||
if (!mesh)
|
||||
{
|
||||
BOOST_FOREACH(const MeshMap::value_type& v,meshes_converted) {
|
||||
const MeshGeometry* const mesh = dynamic_cast<const MeshGeometry*> (v.first);
|
||||
if(!mesh) {
|
||||
|
@ -1626,6 +1652,28 @@ private:
|
|||
" appears at different positions in meshes, results will be wrong");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int index = -1;
|
||||
for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {
|
||||
if(mesh->GetTextureCoords(i).empty()) {
|
||||
break;
|
||||
}
|
||||
const std::string& name = mesh->GetTextureCoordChannelName(i);
|
||||
if(name == uvSet) {
|
||||
index = static_cast<int>(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(index == -1) {
|
||||
FBXImporter::LogWarn("did not find UV channel named " + uvSet + " in a mesh using this material");
|
||||
}
|
||||
|
||||
if(uvIndex == -1) {
|
||||
uvIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
if(uvIndex == -1) {
|
||||
FBXImporter::LogWarn("failed to resolve UV channel " + uvSet + ", using first UV channel");
|
||||
|
@ -1638,33 +1686,33 @@ private:
|
|||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void SetTextureProperties(aiMaterial* out_mat, const TextureMap& textures)
|
||||
void SetTextureProperties(aiMaterial* out_mat, const TextureMap& textures, const MeshGeometry* const mesh)
|
||||
{
|
||||
TrySetTextureProperties(out_mat, textures, "DiffuseColor", aiTextureType_DIFFUSE);
|
||||
TrySetTextureProperties(out_mat, textures, "AmbientColor", aiTextureType_AMBIENT);
|
||||
TrySetTextureProperties(out_mat, textures, "EmissiveColor", aiTextureType_EMISSIVE);
|
||||
TrySetTextureProperties(out_mat, textures, "SpecularColor", aiTextureType_SPECULAR);
|
||||
TrySetTextureProperties(out_mat, textures, "TransparentColor", aiTextureType_OPACITY);
|
||||
TrySetTextureProperties(out_mat, textures, "ReflectionColor", aiTextureType_REFLECTION);
|
||||
TrySetTextureProperties(out_mat, textures, "DisplacementColor", aiTextureType_DISPLACEMENT);
|
||||
TrySetTextureProperties(out_mat, textures, "NormalMap", aiTextureType_NORMALS);
|
||||
TrySetTextureProperties(out_mat, textures, "Bump", aiTextureType_HEIGHT);
|
||||
TrySetTextureProperties(out_mat, textures, "ShininessExponent", aiTextureType_SHININESS);
|
||||
TrySetTextureProperties(out_mat, textures, "DiffuseColor", aiTextureType_DIFFUSE, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "AmbientColor", aiTextureType_AMBIENT, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "EmissiveColor", aiTextureType_EMISSIVE, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "SpecularColor", aiTextureType_SPECULAR, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "TransparentColor", aiTextureType_OPACITY, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "ReflectionColor", aiTextureType_REFLECTION, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "DisplacementColor", aiTextureType_DISPLACEMENT, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "NormalMap", aiTextureType_NORMALS, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "Bump", aiTextureType_HEIGHT, mesh);
|
||||
TrySetTextureProperties(out_mat, textures, "ShininessExponent", aiTextureType_SHININESS, mesh);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void SetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures)
|
||||
void SetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, const MeshGeometry* const mesh)
|
||||
{
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "DiffuseColor", aiTextureType_DIFFUSE);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "AmbientColor", aiTextureType_AMBIENT);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "EmissiveColor", aiTextureType_EMISSIVE);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "SpecularColor", aiTextureType_SPECULAR);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "TransparentColor", aiTextureType_OPACITY);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "ReflectionColor", aiTextureType_REFLECTION);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "DisplacementColor", aiTextureType_DISPLACEMENT);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "NormalMap", aiTextureType_NORMALS);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "Bump", aiTextureType_HEIGHT);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "ShininessExponent", aiTextureType_SHININESS);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "DiffuseColor", aiTextureType_DIFFUSE, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "AmbientColor", aiTextureType_AMBIENT, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "EmissiveColor", aiTextureType_EMISSIVE, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "SpecularColor", aiTextureType_SPECULAR, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "TransparentColor", aiTextureType_OPACITY, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "ReflectionColor", aiTextureType_REFLECTION, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "DisplacementColor", aiTextureType_DISPLACEMENT, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "NormalMap", aiTextureType_NORMALS, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "Bump", aiTextureType_HEIGHT, mesh);
|
||||
TrySetTextureProperties(out_mat, layeredTextures, "ShininessExponent", aiTextureType_SHININESS, mesh);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ struct ImportSettings
|
|||
ImportSettings()
|
||||
: strictMode(true)
|
||||
, readAllLayers(true)
|
||||
, readAllMaterials()
|
||||
, readAllMaterials(false)
|
||||
, readMaterials(true)
|
||||
, readCameras(true)
|
||||
, readLights(true)
|
||||
|
|
|
@ -364,14 +364,24 @@ float ParseTokenAsFloat(const Token& t, const char*& err_out)
|
|||
}
|
||||
|
||||
if (data[0] == 'F') {
|
||||
ai_assert(t.end() - data == 5);
|
||||
// no byte swapping needed for ieee floats
|
||||
return *reinterpret_cast<const float*>(data+1);
|
||||
// Actual size validation happens during Tokenization so
|
||||
// this is valid as an assertion.
|
||||
ai_assert(t.end() - data == sizeof(float) + 1);
|
||||
// Initially, we did reinterpret_cast, breaking strict aliasing rules.
|
||||
// This actually caused trouble on Android, so let's be safe this time.
|
||||
// https://github.com/assimp/assimp/issues/24
|
||||
|
||||
float out_float;
|
||||
::memcpy(&out_float, data+1, sizeof(float));
|
||||
return out_float;
|
||||
}
|
||||
else {
|
||||
ai_assert(t.end() - data == 9);
|
||||
// no byte swapping needed for ieee floats
|
||||
return static_cast<float>(*reinterpret_cast<const double*>(data+1));
|
||||
ai_assert(t.end() - data == sizeof(double) + 1);
|
||||
|
||||
// Same
|
||||
double out_double;
|
||||
::memcpy(&out_double, data+1, sizeof(double));
|
||||
return static_cast<float>(out_double);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -228,7 +228,9 @@ void ObjExporter :: WriteGeometryFile()
|
|||
// now write all mesh instances
|
||||
BOOST_FOREACH(const MeshInstance& m, meshes) {
|
||||
mOutput << "# Mesh \'" << m.name << "\' with " << m.faces.size() << " faces" << endl;
|
||||
if (!m.name.empty()) {
|
||||
mOutput << "g " << m.name << endl;
|
||||
}
|
||||
mOutput << "usemtl " << m.matname << endl;
|
||||
|
||||
BOOST_FOREACH(const Face& f, m.faces) {
|
||||
|
@ -243,11 +245,8 @@ void ObjExporter :: WriteGeometryFile()
|
|||
if (fv.vt) {
|
||||
mOutput << fv.vt;
|
||||
}
|
||||
if (f.kind == 'f') {
|
||||
mOutput << '/';
|
||||
if (fv.vn) {
|
||||
mOutput << fv.vn;
|
||||
}
|
||||
if (f.kind == 'f' && fv.vn) {
|
||||
mOutput << '/' << fv.vn;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -258,14 +257,12 @@ void ObjExporter :: WriteGeometryFile()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
int ObjExporter::vecIndexMap::getIndex(const aiVector3D& vec)
|
||||
{
|
||||
vecIndexMap::dataType::iterator vertIt = vecMap.find(vec);
|
||||
if(vertIt != vecMap.end()){// vertex already exists, so reference it
|
||||
// vertex already exists, so reference it
|
||||
if(vertIt != vecMap.end()){
|
||||
return vertIt->second;
|
||||
}
|
||||
vecMap[vec] = mNextIndex;
|
||||
|
@ -274,6 +271,7 @@ int ObjExporter::vecIndexMap::getIndex(const aiVector3D& vec)
|
|||
return ret;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void ObjExporter::vecIndexMap::getVectors( std::vector<aiVector3D>& vecs )
|
||||
{
|
||||
vecs.resize(vecMap.size());
|
||||
|
@ -282,7 +280,6 @@ void ObjExporter::vecIndexMap::getVectors( std::vector<aiVector3D>& vecs )
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void ObjExporter :: AddMesh(const aiString& name, const aiMesh* m, const aiMatrix4x4& mat)
|
||||
{
|
||||
|
@ -317,7 +314,8 @@ void ObjExporter :: AddMesh(const aiString& name, const aiMesh* m, const aiMatri
|
|||
face.indices[a].vp = vpMap.getIndex(vert);
|
||||
|
||||
if (m->mNormals) {
|
||||
face.indices[a].vn = vnMap.getIndex(m->mNormals[idx]);
|
||||
aiVector3D norm = aiMatrix3x3(mat) * m->mNormals[idx];
|
||||
face.indices[a].vn = vnMap.getIndex(norm);
|
||||
}
|
||||
else{
|
||||
face.indices[a].vn = 0;
|
||||
|
|
|
@ -38,7 +38,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** @file ColladaExporter.h
|
||||
/** @file ObjExporter.h
|
||||
* Declares the exporter class to write a scene to a Collada file
|
||||
*/
|
||||
#ifndef AI_OBJEXPORTER_H_INC
|
||||
|
|
|
@ -140,6 +140,22 @@ void ObjFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene,
|
|||
strModelName = pFile;
|
||||
}
|
||||
|
||||
// process all '\'
|
||||
std::vector<char> ::iterator iter = m_Buffer.begin();
|
||||
while (iter != m_Buffer.end())
|
||||
{
|
||||
if (*iter == '\\')
|
||||
{
|
||||
// remove '\'
|
||||
iter = m_Buffer.erase(iter);
|
||||
// remove next character
|
||||
while (*iter == '\r' || *iter == '\n')
|
||||
iter = m_Buffer.erase(iter);
|
||||
}
|
||||
else
|
||||
++iter;
|
||||
}
|
||||
|
||||
// parse the file into a temporary representation
|
||||
ObjFileParser parser(m_Buffer, strModelName, pIOHandler);
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,416 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef AI_OGREBINARYSERIALIZER_H_INC
|
||||
#define AI_OGREBINARYSERIALIZER_H_INC
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "OgreStructs.h"
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
{
|
||||
|
||||
typedef Assimp::StreamReaderLE MemoryStreamReader;
|
||||
typedef boost::shared_ptr<MemoryStreamReader> MemoryStreamReaderPtr;
|
||||
|
||||
class OgreBinarySerializer
|
||||
{
|
||||
public:
|
||||
/// Imports mesh and returns the result.
|
||||
/** @note Fatal unrecoverable errors will throw a DeadlyImportError. */
|
||||
static Mesh *ImportMesh(MemoryStreamReader *reader);
|
||||
|
||||
/// Imports skeleton to @c mesh into Mesh::skeleton.
|
||||
/** If mesh does not have a skeleton reference or the skeleton file
|
||||
cannot be found it is not a fatal DeadlyImportError.
|
||||
@return If skeleton import was successful. */
|
||||
static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, Mesh *mesh);
|
||||
static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *mesh);
|
||||
|
||||
private:
|
||||
enum AssetMode
|
||||
{
|
||||
AM_Mesh,
|
||||
AM_Skeleton
|
||||
};
|
||||
|
||||
OgreBinarySerializer(MemoryStreamReader *reader, AssetMode mode) :
|
||||
m_reader(reader),
|
||||
m_currentLen(0),
|
||||
assetMode(mode)
|
||||
{
|
||||
}
|
||||
|
||||
static MemoryStreamReaderPtr OpenReader(Assimp::IOSystem *pIOHandler, const std::string &filename);
|
||||
|
||||
// Header
|
||||
|
||||
uint16_t ReadHeader(bool readLen = true);
|
||||
void RollbackHeader();
|
||||
|
||||
// Mesh
|
||||
|
||||
void ReadMesh(Mesh *mesh);
|
||||
void ReadMeshLodInfo(Mesh *mesh);
|
||||
void ReadMeshSkeletonLink(Mesh *mesh);
|
||||
void ReadMeshBounds(Mesh *mesh);
|
||||
void ReadMeshExtremes(Mesh *mesh);
|
||||
|
||||
void ReadSubMesh(Mesh *mesh);
|
||||
void ReadSubMeshNames(Mesh *mesh);
|
||||
void ReadSubMeshOperation(SubMesh *submesh);
|
||||
void ReadSubMeshTextureAlias(SubMesh *submesh);
|
||||
|
||||
void ReadBoneAssignment(VertexData *dest);
|
||||
|
||||
void ReadGeometry(VertexData *dest);
|
||||
void ReadGeometryVertexDeclaration(VertexData *dest);
|
||||
void ReadGeometryVertexElement(VertexData *dest);
|
||||
void ReadGeometryVertexBuffer(VertexData *dest);
|
||||
|
||||
void ReadEdgeList(Mesh *mesh);
|
||||
void ReadPoses(Mesh *mesh);
|
||||
void ReadPoseVertices(Pose *pose);
|
||||
|
||||
void ReadAnimations(Mesh *mesh);
|
||||
void ReadAnimation(Animation *anim);
|
||||
void ReadAnimationKeyFrames(Animation *anim, VertexAnimationTrack *track);
|
||||
|
||||
void NormalizeBoneWeights(VertexData *vertexData) const;
|
||||
|
||||
// Skeleton
|
||||
|
||||
void ReadSkeleton(Skeleton *skeleton);
|
||||
|
||||
void ReadBone(Skeleton *skeleton);
|
||||
void ReadBoneParent(Skeleton *skeleton);
|
||||
|
||||
void ReadSkeletonAnimation(Skeleton *skeleton);
|
||||
void ReadSkeletonAnimationTrack(Skeleton *skeleton, Animation *dest);
|
||||
void ReadSkeletonAnimationKeyFrame(VertexAnimationTrack *dest);
|
||||
void ReadSkeletonAnimationLink(Skeleton *skeleton);
|
||||
|
||||
// Reader utils
|
||||
bool AtEnd() const;
|
||||
|
||||
template<typename T>
|
||||
inline T Read();
|
||||
|
||||
void ReadBytes(char *dest, size_t numBytes);
|
||||
void ReadBytes(uint8_t *dest, size_t numBytes);
|
||||
void ReadBytes(void *dest, size_t numBytes);
|
||||
uint8_t *ReadBytes(size_t numBytes);
|
||||
|
||||
void ReadVector(aiVector3D &vec);
|
||||
void ReadQuaternion(aiQuaternion &quat);
|
||||
|
||||
std::string ReadString(size_t len);
|
||||
std::string ReadLine();
|
||||
|
||||
void SkipBytes(size_t numBytes);
|
||||
|
||||
uint32_t m_currentLen;
|
||||
MemoryStreamReader *m_reader;
|
||||
|
||||
AssetMode assetMode;
|
||||
};
|
||||
|
||||
enum MeshChunkId
|
||||
{
|
||||
M_HEADER = 0x1000,
|
||||
// char* version : Version number check
|
||||
M_MESH = 0x3000,
|
||||
// bool skeletallyAnimated // important flag which affects h/w buffer policies
|
||||
// Optional M_GEOMETRY chunk
|
||||
M_SUBMESH = 0x4000,
|
||||
// char* materialName
|
||||
// bool useSharedVertices
|
||||
// unsigned int indexCount
|
||||
// bool indexes32Bit
|
||||
// unsigned int* faceVertexIndices (indexCount)
|
||||
// OR
|
||||
// unsigned short* faceVertexIndices (indexCount)
|
||||
// M_GEOMETRY chunk (Optional: present only if useSharedVertices = false)
|
||||
M_SUBMESH_OPERATION = 0x4010, // optional, trilist assumed if missing
|
||||
// unsigned short operationType
|
||||
M_SUBMESH_BONE_ASSIGNMENT = 0x4100,
|
||||
// Optional bone weights (repeating section)
|
||||
// unsigned int vertexIndex;
|
||||
// unsigned short boneIndex;
|
||||
// float weight;
|
||||
// Optional chunk that matches a texture name to an alias
|
||||
// a texture alias is sent to the submesh material to use this texture name
|
||||
// instead of the one in the texture unit with a matching alias name
|
||||
M_SUBMESH_TEXTURE_ALIAS = 0x4200, // Repeating section
|
||||
// char* aliasName;
|
||||
// char* textureName;
|
||||
|
||||
M_GEOMETRY = 0x5000, // NB this chunk is embedded within M_MESH and M_SUBMESH
|
||||
// unsigned int vertexCount
|
||||
M_GEOMETRY_VERTEX_DECLARATION = 0x5100,
|
||||
M_GEOMETRY_VERTEX_ELEMENT = 0x5110, // Repeating section
|
||||
// unsigned short source; // buffer bind source
|
||||
// unsigned short type; // VertexElementType
|
||||
// unsigned short semantic; // VertexElementSemantic
|
||||
// unsigned short offset; // start offset in buffer in bytes
|
||||
// unsigned short index; // index of the semantic (for colours and texture coords)
|
||||
M_GEOMETRY_VERTEX_BUFFER = 0x5200, // Repeating section
|
||||
// unsigned short bindIndex; // Index to bind this buffer to
|
||||
// unsigned short vertexSize; // Per-vertex size, must agree with declaration at this index
|
||||
M_GEOMETRY_VERTEX_BUFFER_DATA = 0x5210,
|
||||
// raw buffer data
|
||||
M_MESH_SKELETON_LINK = 0x6000,
|
||||
// Optional link to skeleton
|
||||
// char* skeletonName : name of .skeleton to use
|
||||
M_MESH_BONE_ASSIGNMENT = 0x7000,
|
||||
// Optional bone weights (repeating section)
|
||||
// unsigned int vertexIndex;
|
||||
// unsigned short boneIndex;
|
||||
// float weight;
|
||||
M_MESH_LOD = 0x8000,
|
||||
// Optional LOD information
|
||||
// string strategyName;
|
||||
// unsigned short numLevels;
|
||||
// bool manual; (true for manual alternate meshes, false for generated)
|
||||
M_MESH_LOD_USAGE = 0x8100,
|
||||
// Repeating section, ordered in increasing depth
|
||||
// NB LOD 0 (full detail from 0 depth) is omitted
|
||||
// LOD value - this is a distance, a pixel count etc, based on strategy
|
||||
// float lodValue;
|
||||
M_MESH_LOD_MANUAL = 0x8110,
|
||||
// Required if M_MESH_LOD section manual = true
|
||||
// String manualMeshName;
|
||||
M_MESH_LOD_GENERATED = 0x8120,
|
||||
// Required if M_MESH_LOD section manual = false
|
||||
// Repeating section (1 per submesh)
|
||||
// unsigned int indexCount;
|
||||
// bool indexes32Bit
|
||||
// unsigned short* faceIndexes; (indexCount)
|
||||
// OR
|
||||
// unsigned int* faceIndexes; (indexCount)
|
||||
M_MESH_BOUNDS = 0x9000,
|
||||
// float minx, miny, minz
|
||||
// float maxx, maxy, maxz
|
||||
// float radius
|
||||
|
||||
// Added By DrEvil
|
||||
// optional chunk that contains a table of submesh indexes and the names of
|
||||
// the sub-meshes.
|
||||
M_SUBMESH_NAME_TABLE = 0xA000,
|
||||
// Subchunks of the name table. Each chunk contains an index & string
|
||||
M_SUBMESH_NAME_TABLE_ELEMENT = 0xA100,
|
||||
// short index
|
||||
// char* name
|
||||
// Optional chunk which stores precomputed edge data
|
||||
M_EDGE_LISTS = 0xB000,
|
||||
// Each LOD has a separate edge list
|
||||
M_EDGE_LIST_LOD = 0xB100,
|
||||
// unsigned short lodIndex
|
||||
// bool isManual // If manual, no edge data here, loaded from manual mesh
|
||||
// bool isClosed
|
||||
// unsigned long numTriangles
|
||||
// unsigned long numEdgeGroups
|
||||
// Triangle* triangleList
|
||||
// unsigned long indexSet
|
||||
// unsigned long vertexSet
|
||||
// unsigned long vertIndex[3]
|
||||
// unsigned long sharedVertIndex[3]
|
||||
// float normal[4]
|
||||
|
||||
M_EDGE_GROUP = 0xB110,
|
||||
// unsigned long vertexSet
|
||||
// unsigned long triStart
|
||||
// unsigned long triCount
|
||||
// unsigned long numEdges
|
||||
// Edge* edgeList
|
||||
// unsigned long triIndex[2]
|
||||
// unsigned long vertIndex[2]
|
||||
// unsigned long sharedVertIndex[2]
|
||||
// bool degenerate
|
||||
// Optional poses section, referred to by pose keyframes
|
||||
M_POSES = 0xC000,
|
||||
M_POSE = 0xC100,
|
||||
// char* name (may be blank)
|
||||
// unsigned short target // 0 for shared geometry,
|
||||
// 1+ for submesh index + 1
|
||||
// bool includesNormals [1.8+]
|
||||
M_POSE_VERTEX = 0xC111,
|
||||
// unsigned long vertexIndex
|
||||
// float xoffset, yoffset, zoffset
|
||||
// float xnormal, ynormal, znormal (optional, 1.8+)
|
||||
// Optional vertex animation chunk
|
||||
M_ANIMATIONS = 0xD000,
|
||||
M_ANIMATION = 0xD100,
|
||||
// char* name
|
||||
// float length
|
||||
M_ANIMATION_BASEINFO = 0xD105,
|
||||
// [Optional] base keyframe information (pose animation only)
|
||||
// char* baseAnimationName (blank for self)
|
||||
// float baseKeyFrameTime
|
||||
M_ANIMATION_TRACK = 0xD110,
|
||||
// unsigned short type // 1 == morph, 2 == pose
|
||||
// unsigned short target // 0 for shared geometry,
|
||||
// 1+ for submesh index + 1
|
||||
M_ANIMATION_MORPH_KEYFRAME = 0xD111,
|
||||
// float time
|
||||
// bool includesNormals [1.8+]
|
||||
// float x,y,z // repeat by number of vertices in original geometry
|
||||
M_ANIMATION_POSE_KEYFRAME = 0xD112,
|
||||
// float time
|
||||
M_ANIMATION_POSE_REF = 0xD113, // repeat for number of referenced poses
|
||||
// unsigned short poseIndex
|
||||
// float influence
|
||||
// Optional submesh extreme vertex list chink
|
||||
M_TABLE_EXTREMES = 0xE000,
|
||||
// unsigned short submesh_index;
|
||||
// float extremes [n_extremes][3];
|
||||
};
|
||||
|
||||
static std::string MeshHeaderToString(MeshChunkId id)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case M_HEADER: return "HEADER";
|
||||
case M_MESH: return "MESH";
|
||||
case M_SUBMESH: return "SUBMESH";
|
||||
case M_SUBMESH_OPERATION: return "SUBMESH_OPERATION";
|
||||
case M_SUBMESH_BONE_ASSIGNMENT: return "SUBMESH_BONE_ASSIGNMENT";
|
||||
case M_SUBMESH_TEXTURE_ALIAS: return "SUBMESH_TEXTURE_ALIAS";
|
||||
case M_GEOMETRY: return "GEOMETRY";
|
||||
case M_GEOMETRY_VERTEX_DECLARATION: return "GEOMETRY_VERTEX_DECLARATION";
|
||||
case M_GEOMETRY_VERTEX_ELEMENT: return "GEOMETRY_VERTEX_ELEMENT";
|
||||
case M_GEOMETRY_VERTEX_BUFFER: return "GEOMETRY_VERTEX_BUFFER";
|
||||
case M_GEOMETRY_VERTEX_BUFFER_DATA: return "GEOMETRY_VERTEX_BUFFER_DATA";
|
||||
case M_MESH_SKELETON_LINK: return "MESH_SKELETON_LINK";
|
||||
case M_MESH_BONE_ASSIGNMENT: return "MESH_BONE_ASSIGNMENT";
|
||||
case M_MESH_LOD: return "MESH_LOD";
|
||||
case M_MESH_LOD_USAGE: return "MESH_LOD_USAGE";
|
||||
case M_MESH_LOD_MANUAL: return "MESH_LOD_MANUAL";
|
||||
case M_MESH_LOD_GENERATED: return "MESH_LOD_GENERATED";
|
||||
case M_MESH_BOUNDS: return "MESH_BOUNDS";
|
||||
case M_SUBMESH_NAME_TABLE: return "SUBMESH_NAME_TABLE";
|
||||
case M_SUBMESH_NAME_TABLE_ELEMENT: return "SUBMESH_NAME_TABLE_ELEMENT";
|
||||
case M_EDGE_LISTS: return "EDGE_LISTS";
|
||||
case M_EDGE_LIST_LOD: return "EDGE_LIST_LOD";
|
||||
case M_EDGE_GROUP: return "EDGE_GROUP";
|
||||
case M_POSES: return "POSES";
|
||||
case M_POSE: return "POSE";
|
||||
case M_POSE_VERTEX: return "POSE_VERTEX";
|
||||
case M_ANIMATIONS: return "ANIMATIONS";
|
||||
case M_ANIMATION: return "ANIMATION";
|
||||
case M_ANIMATION_BASEINFO: return "ANIMATION_BASEINFO";
|
||||
case M_ANIMATION_TRACK: return "ANIMATION_TRACK";
|
||||
case M_ANIMATION_MORPH_KEYFRAME: return "ANIMATION_MORPH_KEYFRAME";
|
||||
case M_ANIMATION_POSE_KEYFRAME: return "ANIMATION_POSE_KEYFRAME";
|
||||
case M_ANIMATION_POSE_REF: return "ANIMATION_POSE_REF";
|
||||
case M_TABLE_EXTREMES: return "TABLE_EXTREMES";
|
||||
}
|
||||
return "Unknown_MeshChunkId";
|
||||
}
|
||||
|
||||
enum SkeletonChunkId
|
||||
{
|
||||
SKELETON_HEADER = 0x1000,
|
||||
// char* version : Version number check
|
||||
SKELETON_BLENDMODE = 0x1010, // optional
|
||||
// unsigned short blendmode : SkeletonAnimationBlendMode
|
||||
SKELETON_BONE = 0x2000,
|
||||
// Repeating section defining each bone in the system.
|
||||
// Bones are assigned indexes automatically based on their order of declaration
|
||||
// starting with 0.
|
||||
// char* name : name of the bone
|
||||
// unsigned short handle : handle of the bone, should be contiguous & start at 0
|
||||
// Vector3 position : position of this bone relative to parent
|
||||
// Quaternion orientation : orientation of this bone relative to parent
|
||||
// Vector3 scale : scale of this bone relative to parent
|
||||
SKELETON_BONE_PARENT = 0x3000,
|
||||
// Record of the parent of a single bone, used to build the node tree
|
||||
// Repeating section, listed in Bone Index order, one per Bone
|
||||
// unsigned short handle : child bone
|
||||
// unsigned short parentHandle : parent bone
|
||||
SKELETON_ANIMATION = 0x4000,
|
||||
// A single animation for this skeleton
|
||||
// char* name : Name of the animation
|
||||
// float length : Length of the animation in seconds
|
||||
SKELETON_ANIMATION_BASEINFO = 0x4010,
|
||||
// [Optional] base keyframe information
|
||||
// char* baseAnimationName (blank for self)
|
||||
// float baseKeyFrameTime
|
||||
SKELETON_ANIMATION_TRACK = 0x4100,
|
||||
// A single animation track (relates to a single bone)
|
||||
// Repeating section (within SKELETON_ANIMATION)
|
||||
// unsigned short boneIndex : Index of bone to apply to
|
||||
SKELETON_ANIMATION_TRACK_KEYFRAME = 0x4110,
|
||||
// A single keyframe within the track
|
||||
// Repeating section
|
||||
// float time : The time position (seconds)
|
||||
// Quaternion rotate : Rotation to apply at this keyframe
|
||||
// Vector3 translate : Translation to apply at this keyframe
|
||||
// Vector3 scale : Scale to apply at this keyframe
|
||||
SKELETON_ANIMATION_LINK = 0x5000
|
||||
// Link to another skeleton, to re-use its animations
|
||||
// char* skeletonName : name of skeleton to get animations from
|
||||
// float scale : scale to apply to trans/scale keys
|
||||
};
|
||||
|
||||
static std::string SkeletonHeaderToString(SkeletonChunkId id)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case SKELETON_HEADER: return "HEADER";
|
||||
case SKELETON_BLENDMODE: return "BLENDMODE";
|
||||
case SKELETON_BONE: return "BONE";
|
||||
case SKELETON_BONE_PARENT: return "BONE_PARENT";
|
||||
case SKELETON_ANIMATION: return "ANIMATION";
|
||||
case SKELETON_ANIMATION_BASEINFO: return "ANIMATION_BASEINFO";
|
||||
case SKELETON_ANIMATION_TRACK: return "ANIMATION_TRACK";
|
||||
case SKELETON_ANIMATION_TRACK_KEYFRAME: return "ANIMATION_TRACK_KEYFRAME";
|
||||
case SKELETON_ANIMATION_LINK: return "ANIMATION_LINK";
|
||||
}
|
||||
return "Unknown_SkeletonChunkId";
|
||||
}
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
#endif // AI_OGREBINARYSERIALIZER_H_INC
|
|
@ -38,32 +38,27 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "AssimpPCH.h"
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
#include "AssimpPCH.h"
|
||||
|
||||
#include "OgreImporter.h"
|
||||
#include "TinyFormatter.h"
|
||||
#include "irrXMLWrapper.h"
|
||||
#include "OgreBinarySerializer.h"
|
||||
#include "OgreXmlSerializer.h"
|
||||
|
||||
static const aiImporterDesc desc = {
|
||||
"Ogre XML Mesh Importer",
|
||||
"Ogre3D Mesh Importer",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
aiImporterFlags_SupportTextFlavour,
|
||||
aiImporterFlags_SupportTextFlavour | aiImporterFlags_SupportBinaryFlavour,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
"mesh.xml"
|
||||
"mesh mesh.xml"
|
||||
};
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
|
@ -83,174 +78,67 @@ void OgreImporter::SetupProperties(const Importer* pImp)
|
|||
bool OgreImporter::CanRead(const std::string &pFile, Assimp::IOSystem *pIOHandler, bool checkSig) const
|
||||
{
|
||||
if (!checkSig) {
|
||||
return EndsWith(pFile, ".mesh.xml", false);
|
||||
return EndsWith(pFile, ".mesh.xml", false) || EndsWith(pFile, ".mesh", false);
|
||||
}
|
||||
|
||||
if (EndsWith(pFile, ".mesh.xml", false))
|
||||
{
|
||||
const char* tokens[] = { "<mesh>" };
|
||||
return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/// @todo Read and validate first header chunk?
|
||||
return EndsWith(pFile, ".mesh", false);
|
||||
}
|
||||
}
|
||||
|
||||
void OgreImporter::InternReadFile(const std::string &pFile, aiScene *pScene, Assimp::IOSystem *pIOHandler)
|
||||
{
|
||||
// -------------------- Initial file and XML operations --------------------
|
||||
|
||||
// Open
|
||||
boost::scoped_ptr<IOStream> file(pIOHandler->Open(pFile));
|
||||
if (!file.get()) {
|
||||
// Open source file
|
||||
IOStream *f = pIOHandler->Open(pFile, "rb");
|
||||
if (!f) {
|
||||
throw DeadlyImportError("Failed to open file " + pFile);
|
||||
}
|
||||
|
||||
// Read
|
||||
boost::scoped_ptr<CIrrXML_IOStreamReader> xmlStream(new CIrrXML_IOStreamReader(file.get()));
|
||||
// Binary .mesh import
|
||||
if (EndsWith(pFile, ".mesh", false))
|
||||
{
|
||||
/// @note MemoryStreamReader takes ownership of f.
|
||||
MemoryStreamReader reader(f);
|
||||
|
||||
// Import mesh
|
||||
boost::scoped_ptr<Mesh> mesh(OgreBinarySerializer::ImportMesh(&reader));
|
||||
|
||||
// Import skeleton
|
||||
OgreBinarySerializer::ImportSkeleton(pIOHandler, mesh.get());
|
||||
|
||||
// Import mesh referenced materials
|
||||
ReadMaterials(pFile, pIOHandler, pScene, mesh.get());
|
||||
|
||||
// Convert to Assimp
|
||||
mesh->ConvertToAssimpScene(pScene);
|
||||
}
|
||||
// XML .mesh.xml import
|
||||
else
|
||||
{
|
||||
/// @note XmlReader does not take ownership of f, hence the scoped ptr.
|
||||
boost::scoped_ptr<IOStream> scopedFile(f);
|
||||
boost::scoped_ptr<CIrrXML_IOStreamReader> xmlStream(new CIrrXML_IOStreamReader(scopedFile.get()));
|
||||
boost::scoped_ptr<XmlReader> reader(irr::io::createIrrXMLReader(xmlStream.get()));
|
||||
if (!reader) {
|
||||
throw DeadlyImportError("Failed to create XML Reader for " + pFile);
|
||||
|
||||
// Import mesh
|
||||
boost::scoped_ptr<MeshXml> mesh(OgreXmlSerializer::ImportMesh(reader.get()));
|
||||
|
||||
// Import skeleton
|
||||
OgreXmlSerializer::ImportSkeleton(pIOHandler, mesh.get());
|
||||
|
||||
// Import mesh referenced materials
|
||||
ReadMaterials(pFile, pIOHandler, pScene, mesh.get());
|
||||
|
||||
// Convert to Assimp
|
||||
mesh->ConvertToAssimpScene(pScene);
|
||||
}
|
||||
|
||||
DefaultLogger::get()->debug("Opened a XML reader for " + pFile);
|
||||
|
||||
// Read root node
|
||||
NextNode(reader.get());
|
||||
if (!CurrentNodeNameEquals(reader.get(), "mesh")) {
|
||||
throw DeadlyImportError("Root node is not <mesh> but <" + string(reader->getNodeName()) + "> in " + pFile);
|
||||
}
|
||||
|
||||
// Node names
|
||||
const string nnSharedGeometry = "sharedgeometry";
|
||||
const string nnVertexBuffer = "vertexbuffer";
|
||||
const string nnSubMeshes = "submeshes";
|
||||
const string nnSubMesh = "submesh";
|
||||
const string nnSubMeshNames = "submeshnames";
|
||||
const string nnSkeletonLink = "skeletonlink";
|
||||
|
||||
// -------------------- Shared Geometry --------------------
|
||||
// This can be used to share geometry between submeshes
|
||||
|
||||
NextNode(reader.get());
|
||||
if (CurrentNodeNameEquals(reader.get(), nnSharedGeometry))
|
||||
{
|
||||
DefaultLogger::get()->debug("Reading shared geometry");
|
||||
unsigned int NumVertices = GetAttribute<unsigned int>(reader.get(), "vertexcount");
|
||||
|
||||
NextNode(reader.get());
|
||||
while(CurrentNodeNameEquals(reader.get(), nnVertexBuffer)) {
|
||||
ReadVertexBuffer(m_SharedGeometry, reader.get(), NumVertices);
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------- Sub Meshes --------------------
|
||||
|
||||
if (!CurrentNodeNameEquals(reader.get(), nnSubMeshes)) {
|
||||
throw DeadlyImportError("Could not find <submeshes> node inside root <mesh> node");
|
||||
}
|
||||
|
||||
vector<boost::shared_ptr<SubMesh> > subMeshes;
|
||||
vector<aiMaterial*> materials;
|
||||
|
||||
NextNode(reader.get());
|
||||
while(CurrentNodeNameEquals(reader.get(), nnSubMesh))
|
||||
{
|
||||
SubMesh* submesh = new SubMesh();
|
||||
ReadSubMesh(subMeshes.size(), *submesh, reader.get());
|
||||
|
||||
// Just a index in a array, we add a mesh in each loop cycle, so we get indicies like 0, 1, 2 ... n;
|
||||
// so it is important to do this before pushing the mesh in the vector!
|
||||
/// @todo Not sure if this really is needed, refactor out if possible.
|
||||
submesh->MaterialIndex = subMeshes.size();
|
||||
|
||||
subMeshes.push_back(boost::shared_ptr<SubMesh>(submesh));
|
||||
|
||||
/** @todo What is the correct way of handling empty ref here.
|
||||
Does Assimp require there to be a valid material index for each mesh,
|
||||
even if its a dummy material. */
|
||||
aiMaterial* material = ReadMaterial(pFile, pIOHandler, submesh->MaterialName);
|
||||
materials.push_back(material);
|
||||
}
|
||||
|
||||
if (subMeshes.empty()) {
|
||||
throw DeadlyImportError("Could not find <submeshes> node inside root <mesh> node");
|
||||
}
|
||||
|
||||
// This is really a internal error if we failed to create dummy materials.
|
||||
if (subMeshes.size() != materials.size()) {
|
||||
throw DeadlyImportError("Internal Error: Material count does not match the submesh count");
|
||||
}
|
||||
|
||||
// Skip submesh names.
|
||||
/// @todo Should these be read to scene etc. metadata?
|
||||
if (CurrentNodeNameEquals(reader.get(), nnSubMeshNames))
|
||||
{
|
||||
NextNode(reader.get());
|
||||
while(CurrentNodeNameEquals(reader.get(), nnSubMesh)) {
|
||||
NextNode(reader.get());
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------- Skeleton --------------------
|
||||
|
||||
vector<Bone> Bones;
|
||||
vector<Animation> Animations;
|
||||
|
||||
if (CurrentNodeNameEquals(reader.get(), nnSkeletonLink))
|
||||
{
|
||||
string skeletonFile = GetAttribute<string>(reader.get(), "name");
|
||||
if (!skeletonFile.empty())
|
||||
{
|
||||
ReadSkeleton(pFile, pIOHandler, pScene, skeletonFile, Bones, Animations);
|
||||
}
|
||||
else
|
||||
{
|
||||
DefaultLogger::get()->debug("Found a unusual <" + nnSkeletonLink + "> with a empty file reference");
|
||||
}
|
||||
NextNode(reader.get());
|
||||
}
|
||||
else
|
||||
{
|
||||
DefaultLogger::get()->debug("Mesh has no assigned skeleton with <" + nnSkeletonLink + ">");
|
||||
}
|
||||
|
||||
// Now there might be <boneassignments> for the shared geometry
|
||||
if (CurrentNodeNameEquals(reader.get(), "boneassignments")) {
|
||||
ReadBoneWeights(m_SharedGeometry, reader.get());
|
||||
}
|
||||
|
||||
// -------------------- Process Results --------------------
|
||||
BOOST_FOREACH(boost::shared_ptr<SubMesh> submesh, subMeshes)
|
||||
{
|
||||
ProcessSubMesh(*submesh.get(), m_SharedGeometry);
|
||||
}
|
||||
|
||||
// -------------------- Apply to aiScene --------------------
|
||||
|
||||
// Materials
|
||||
pScene->mMaterials = new aiMaterial*[materials.size()];
|
||||
pScene->mNumMaterials = materials.size();
|
||||
|
||||
for(size_t i=0, len=materials.size(); i<len; ++i) {
|
||||
pScene->mMaterials[i] = materials[i];
|
||||
}
|
||||
|
||||
// Meshes
|
||||
pScene->mMeshes = new aiMesh*[subMeshes.size()];
|
||||
pScene->mNumMeshes = subMeshes.size();
|
||||
|
||||
for(size_t i=0, len=subMeshes.size(); i<len; ++i)
|
||||
{
|
||||
boost::shared_ptr<SubMesh> submesh = subMeshes[i];
|
||||
pScene->mMeshes[i] = CreateAssimpSubMesh(pScene, *(submesh.get()), Bones);
|
||||
}
|
||||
|
||||
// Create the root node
|
||||
pScene->mRootNode = new aiNode();
|
||||
pScene->mRootNode->mMeshes = new unsigned int[subMeshes.size()];
|
||||
pScene->mRootNode->mNumMeshes = subMeshes.size();
|
||||
|
||||
for(size_t i=0, len=subMeshes.size(); i<len; ++i) {
|
||||
pScene->mRootNode->mMeshes[i] = static_cast<unsigned int>(i);
|
||||
}
|
||||
|
||||
// Skeleton and animations
|
||||
CreateAssimpSkeleton(pScene, Bones, Animations);
|
||||
}
|
||||
|
||||
} // Ogre
|
||||
|
|
|
@ -1,3 +1,42 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef AI_OGREIMPORTER_H_INC
|
||||
#define AI_OGREIMPORTER_H_INC
|
||||
|
@ -5,6 +44,8 @@
|
|||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "BaseImporter.h"
|
||||
|
||||
#include "OgreStructs.h"
|
||||
#include "OgreParsingUtils.h"
|
||||
|
||||
namespace Assimp
|
||||
|
@ -12,58 +53,10 @@ namespace Assimp
|
|||
namespace Ogre
|
||||
{
|
||||
|
||||
struct Face;
|
||||
struct BoneWeight;
|
||||
struct Bone;
|
||||
struct Animation;
|
||||
|
||||
/// Ogre SubMesh
|
||||
struct SubMesh
|
||||
{
|
||||
bool UseSharedGeometry;
|
||||
bool Use32bitIndexes;
|
||||
|
||||
std::string Name;
|
||||
std::string MaterialName;
|
||||
|
||||
bool HasGeometry;
|
||||
bool HasPositions;
|
||||
bool HasNormals;
|
||||
bool HasTangents;
|
||||
|
||||
std::vector<Face> Faces;
|
||||
std::vector<aiVector3D> Positions;
|
||||
std::vector<aiVector3D> Normals;
|
||||
std::vector<aiVector3D> Tangents;
|
||||
|
||||
/// Arbitrary number of texcoords, they are nearly always 2d, but Assimp has always 3d texcoords, n vectors(outer) with texcoords for each vertex(inner).
|
||||
std::vector<std::vector<aiVector3D> > Uvs;
|
||||
|
||||
/// A list(inner) of bones for each vertex(outer).
|
||||
std::vector<std::vector<BoneWeight> > Weights;
|
||||
|
||||
/// The Index in the Assimp material array from the material witch is attached to this submesh.
|
||||
int MaterialIndex;
|
||||
|
||||
// The highest index of a bone from a bone weight, this is needed to create the Assimp bone struct. Converting from vertex-bones to bone-vertices.
|
||||
unsigned int BonesUsed;
|
||||
|
||||
SubMesh() :
|
||||
UseSharedGeometry(false),
|
||||
Use32bitIndexes(false),
|
||||
HasGeometry(false),
|
||||
HasPositions(false),
|
||||
HasNormals(false),
|
||||
HasTangents(false),
|
||||
MaterialIndex(-1),
|
||||
BonesUsed(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/** Importer for Ogre mesh, skeleton and material formats.
|
||||
@todo Support vertex colors
|
||||
@todo Support multiple TexCoords (this is already done??) */
|
||||
@todo Support vertex colors.
|
||||
@todo Support poses/animations from the mesh file.
|
||||
Currently only skeleton file animations are supported. */
|
||||
class OgreImporter : public BaseImporter
|
||||
{
|
||||
public:
|
||||
|
@ -80,39 +73,10 @@ public:
|
|||
virtual void SetupProperties(const Importer *pImp);
|
||||
|
||||
private:
|
||||
//-------------------------------- OgreMesh.cpp -------------------------------
|
||||
|
||||
/// Helper Functions to read parts of the XML File.
|
||||
void ReadSubMesh(const unsigned int submeshIndex, SubMesh &submesh, XmlReader *reader);
|
||||
|
||||
/// Reads a single Vertexbuffer and writes its data in the Submesh.
|
||||
static void ReadVertexBuffer(SubMesh &submesh, XmlReader *reader, const unsigned int numVertices);
|
||||
|
||||
/// Reads bone weights are stores them into the given submesh.
|
||||
static void ReadBoneWeights(SubMesh &submesh, XmlReader *reader);
|
||||
|
||||
/// After Loading a SubMehs some work needs to be done (make all Vertexes unique, normalize weights).
|
||||
static void ProcessSubMesh(SubMesh &submesh, SubMesh &sharedGeometry);
|
||||
|
||||
/// Uses the bone data to convert a SubMesh into a aiMesh which will be created and returned.
|
||||
aiMesh *CreateAssimpSubMesh(aiScene *pScene, const SubMesh &submesh, const std::vector<Bone> &bones) const;
|
||||
|
||||
//-------------------------------- OgreSkeleton.cpp -------------------------------
|
||||
|
||||
/// Writes the results in Bones and Animations, Filename is not const, because its call-by-value and the function will change it!
|
||||
void ReadSkeleton(const std::string &pFile, Assimp::IOSystem *pIOHandler, const aiScene *pScene,
|
||||
const std::string &skeletonFile, std::vector<Bone> &Bones, std::vector<Animation> &Animations) const;
|
||||
|
||||
/// Converts the animations in aiAnimations and puts them into the scene.
|
||||
void PutAnimationsInScene(aiScene *pScene, const std::vector<Bone> &Bones, const std::vector<Animation> &Animations);
|
||||
|
||||
/// Creates the aiSkeleton in current scene.
|
||||
void CreateAssimpSkeleton(aiScene *pScene, const std::vector<Bone> &bones, const std::vector<Animation> &animations);
|
||||
|
||||
/// Recursively creates a filled aiNode from a given root bone.
|
||||
static aiNode* CreateNodeFromBone(int boneId, const std::vector<Bone> &bones, aiNode *parent);
|
||||
|
||||
//-------------------------------- OgreMaterial.cpp -------------------------------
|
||||
/// Read materials referenced by the @c mesh to @c pScene.
|
||||
void ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, Mesh *mesh);
|
||||
void ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, MeshXml *mesh);
|
||||
void AssignMaterials(aiScene *pScene, std::vector<aiMaterial*> &materials);
|
||||
|
||||
/// Reads material
|
||||
aiMaterial* ReadMaterial(const std::string &pFile, Assimp::IOSystem *pIOHandler, const std::string MaterialName);
|
||||
|
@ -125,104 +89,8 @@ private:
|
|||
std::string m_userDefinedMaterialLibFile;
|
||||
bool m_detectTextureTypeFromFilename;
|
||||
|
||||
/// VertexBuffer for the sub meshes that use shader geometry.
|
||||
SubMesh m_SharedGeometry;
|
||||
|
||||
std::map<aiTextureType, unsigned int> m_textures;
|
||||
};
|
||||
|
||||
/// Simplified face.
|
||||
/** @todo Support other polygon types than just just triangles. Move to using aiFace. */
|
||||
struct Face
|
||||
{
|
||||
unsigned int VertexIndices[3];
|
||||
};
|
||||
|
||||
/// Ogre Bone assignment
|
||||
struct BoneAssignment
|
||||
{
|
||||
/// Bone ID from Ogre.
|
||||
unsigned int BoneId;
|
||||
// Bone name for Assimp.
|
||||
std::string BoneName;
|
||||
};
|
||||
|
||||
/// Ogre Bone weight
|
||||
struct BoneWeight
|
||||
{
|
||||
/// Bone Id
|
||||
unsigned int Id;
|
||||
/// BoneWeight
|
||||
float Value;
|
||||
};
|
||||
|
||||
|
||||
/// Ogre Bone
|
||||
struct Bone
|
||||
{
|
||||
std::string Name;
|
||||
|
||||
int Id;
|
||||
int ParentId;
|
||||
|
||||
aiVector3D Position;
|
||||
aiVector3D RotationAxis;
|
||||
float RotationAngle;
|
||||
|
||||
aiMatrix4x4 BoneToWorldSpace;
|
||||
|
||||
std::vector<int> Children;
|
||||
|
||||
Bone() :
|
||||
Id(-1),
|
||||
ParentId(-1),
|
||||
RotationAngle(0.0f)
|
||||
{
|
||||
}
|
||||
|
||||
/// Returns if this bone is parented.
|
||||
bool IsParented() const { return (ParentId != -1); }
|
||||
|
||||
/// This operator is needed to sort the bones by Id in a vector<Bone>.
|
||||
bool operator<(const Bone &other) const { return (Id < other.Id); }
|
||||
|
||||
/// This operator is needed to find a bone by its name in a vector<Bone>
|
||||
bool operator==(const std::string& other) const { return Name == other; }
|
||||
bool operator==(const aiString& other) const { return Name == std::string(other.data); }
|
||||
|
||||
/// @note Implemented in OgreSkeleton.cpp
|
||||
void CalculateBoneToWorldSpaceMatrix(std::vector<Bone>& Bones);
|
||||
};
|
||||
|
||||
/// Ogre animation key frame
|
||||
/** Transformations for a frame. */
|
||||
struct KeyFrame
|
||||
{
|
||||
float Time;
|
||||
aiVector3D Position;
|
||||
aiQuaternion Rotation;
|
||||
aiVector3D Scaling;
|
||||
};
|
||||
|
||||
/// Ogre animation track
|
||||
/** Keyframes for one bone. */
|
||||
struct Track
|
||||
{
|
||||
std::string BoneName;
|
||||
std::vector<KeyFrame> Keyframes;
|
||||
};
|
||||
|
||||
/// Ogre animation
|
||||
struct Animation
|
||||
{
|
||||
/// Name
|
||||
std::string Name;
|
||||
/// Length
|
||||
float Length;
|
||||
/// Tracks
|
||||
std::vector<Track> Tracks;
|
||||
};
|
||||
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
|
|
|
@ -42,12 +42,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
|
||||
#include "OgreImporter.h"
|
||||
#include "TinyFormatter.h"
|
||||
|
||||
#include "fast_atof.h"
|
||||
|
||||
#include <vector>
|
||||
#include <sstream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace Assimp
|
||||
|
@ -59,11 +61,66 @@ static const string partComment = "//";
|
|||
static const string partBlockStart = "{";
|
||||
static const string partBlockEnd = "}";
|
||||
|
||||
void OgreImporter::ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, Mesh *mesh)
|
||||
{
|
||||
std::vector<aiMaterial*> materials;
|
||||
|
||||
// Create materials that can be found and parsed via the IOSystem.
|
||||
for (size_t i=0, len=mesh->NumSubMeshes(); i<len; ++i)
|
||||
{
|
||||
SubMesh *submesh = mesh->GetSubMesh(i);
|
||||
if (submesh && !submesh->materialRef.empty())
|
||||
{
|
||||
aiMaterial *material = ReadMaterial(pFile, pIOHandler, submesh->materialRef);
|
||||
if (material)
|
||||
{
|
||||
submesh->materialIndex = materials.size();
|
||||
materials.push_back(material);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AssignMaterials(pScene, materials);
|
||||
}
|
||||
|
||||
void OgreImporter::ReadMaterials(const std::string &pFile, Assimp::IOSystem *pIOHandler, aiScene *pScene, MeshXml *mesh)
|
||||
{
|
||||
std::vector<aiMaterial*> materials;
|
||||
|
||||
// Create materials that can be found and parsed via the IOSystem.
|
||||
for (size_t i=0, len=mesh->NumSubMeshes(); i<len; ++i)
|
||||
{
|
||||
SubMeshXml *submesh = mesh->GetSubMesh(i);
|
||||
if (submesh && !submesh->materialRef.empty())
|
||||
{
|
||||
aiMaterial *material = ReadMaterial(pFile, pIOHandler, submesh->materialRef);
|
||||
if (material)
|
||||
{
|
||||
submesh->materialIndex = materials.size();
|
||||
materials.push_back(material);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AssignMaterials(pScene, materials);
|
||||
}
|
||||
|
||||
void OgreImporter::AssignMaterials(aiScene *pScene, std::vector<aiMaterial*> &materials)
|
||||
{
|
||||
pScene->mNumMaterials = materials.size();
|
||||
if (pScene->mNumMaterials > 0)
|
||||
{
|
||||
pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials];
|
||||
for(size_t i=0;i<pScene->mNumMaterials; ++i) {
|
||||
pScene->mMaterials[i] = materials[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aiMaterial* OgreImporter::ReadMaterial(const std::string &pFile, Assimp::IOSystem *pIOHandler, const std::string materialName)
|
||||
{
|
||||
/// @todo Should we return null ptr here or a empty material?
|
||||
if (materialName.empty()) {
|
||||
return new aiMaterial();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Full reference and examples of Ogre Material Script
|
||||
|
@ -117,17 +174,15 @@ aiMaterial* OgreImporter::ReadMaterial(const std::string &pFile, Assimp::IOSyste
|
|||
}
|
||||
if (!materialFile)
|
||||
{
|
||||
/// @todo Should we return null ptr here or a empty material?
|
||||
DefaultLogger::get()->error(Formatter::format() << "Failed to find source file for material '" << materialName << "'");
|
||||
return new aiMaterial();
|
||||
return 0;
|
||||
}
|
||||
|
||||
boost::scoped_ptr<IOStream> stream(materialFile);
|
||||
if (stream->FileSize() == 0)
|
||||
{
|
||||
/// @todo Should we return null ptr here or a empty material?
|
||||
DefaultLogger::get()->warn(Formatter::format() << "Source file for material '" << materialName << "' is empty (size is 0 bytes)");
|
||||
return new aiMaterial();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read bytes
|
||||
|
@ -162,8 +217,7 @@ aiMaterial* OgreImporter::ReadMaterial(const std::string &pFile, Assimp::IOSyste
|
|||
// Skip commented lines
|
||||
if (linePart == partComment)
|
||||
{
|
||||
string postComment = NextAfterNewLine(ss, linePart);
|
||||
DefaultLogger::get()->debug("//" + postComment + " (comment line ignored)");
|
||||
NextAfterNewLine(ss, linePart);
|
||||
continue;
|
||||
}
|
||||
if (linePart != partMaterial)
|
||||
|
@ -306,8 +360,7 @@ bool OgreImporter::ReadTechnique(const std::string &techniqueName, stringstream
|
|||
// Skip commented lines
|
||||
if (linePart == partComment)
|
||||
{
|
||||
string postComment = SkipLine(ss);
|
||||
DefaultLogger::get()->debug(" //" + postComment + " (comment line ignored)");
|
||||
SkipLine(ss);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -347,8 +400,7 @@ bool OgreImporter::ReadPass(const std::string &passName, stringstream &ss, aiMat
|
|||
// Skip commented lines
|
||||
if (linePart == partComment)
|
||||
{
|
||||
string postComment = SkipLine(ss);
|
||||
DefaultLogger::get()->debug(" //" + postComment + " (comment line ignored)");
|
||||
SkipLine(ss);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -416,8 +468,7 @@ bool OgreImporter::ReadTextureUnit(const std::string &textureUnitName, stringstr
|
|||
// Skip commented lines
|
||||
if (linePart == partComment)
|
||||
{
|
||||
string postComment = SkipLine(ss);
|
||||
DefaultLogger::get()->debug(" //" + postComment + " (comment line ignored)");
|
||||
SkipLine(ss);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,569 +0,0 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "AssimpPCH.h"
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "OgreImporter.h"
|
||||
#include "TinyFormatter.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
{
|
||||
|
||||
void OgreImporter::ReadSubMesh(const unsigned int submeshIndex, SubMesh &submesh, XmlReader *reader)
|
||||
{
|
||||
if (reader->getAttributeValue("material")) {
|
||||
submesh.MaterialName = GetAttribute<string>(reader, "material");
|
||||
}
|
||||
if (reader->getAttributeValue("use32bitindexes")) {
|
||||
submesh.Use32bitIndexes = GetAttribute<bool>(reader, "use32bitindexes");
|
||||
}
|
||||
if (reader->getAttributeValue("usesharedvertices")) {
|
||||
submesh.UseSharedGeometry = GetAttribute<bool>(reader, "usesharedvertices");
|
||||
}
|
||||
|
||||
DefaultLogger::get()->debug(Formatter::format() << "Reading submesh " << submeshIndex);
|
||||
DefaultLogger::get()->debug(Formatter::format() << " - Material '" << submesh.MaterialName << "'");
|
||||
DefaultLogger::get()->debug(Formatter::format() << " - Shader geometry = " << (submesh.UseSharedGeometry ? "true" : "false") <<
|
||||
", 32bit indexes = " << (submesh.Use32bitIndexes ? "true" : "false"));
|
||||
|
||||
//TODO: maybe we have alsways just 1 faces and 1 geometry and always in this order. this loop will only work correct, when the order
|
||||
//of faces and geometry changed, and not if we have more than one of one
|
||||
/// @todo Fix above comment with better read logic below
|
||||
|
||||
NextNode(reader);
|
||||
string currentNodeName = reader->getNodeName();
|
||||
|
||||
const string nnFaces = "faces";
|
||||
const string nnFace = "face";
|
||||
const string nnGeometry = "geometry";
|
||||
const string nnBoneAssignments = "boneassignments";
|
||||
const string nnVertexBuffer = "vertexbuffer";
|
||||
|
||||
bool quadWarned = false;
|
||||
|
||||
while(currentNodeName == nnFaces ||
|
||||
currentNodeName == nnGeometry ||
|
||||
currentNodeName == nnBoneAssignments)
|
||||
{
|
||||
if (currentNodeName == nnFaces)
|
||||
{
|
||||
unsigned int numFaces = GetAttribute<unsigned int>(reader, "count");
|
||||
|
||||
NextNode(reader);
|
||||
currentNodeName = reader->getNodeName();
|
||||
|
||||
while(currentNodeName == nnFace)
|
||||
{
|
||||
Face NewFace;
|
||||
NewFace.VertexIndices[0] = GetAttribute<int>(reader, "v1");
|
||||
NewFace.VertexIndices[1] = GetAttribute<int>(reader, "v2");
|
||||
NewFace.VertexIndices[2] = GetAttribute<int>(reader, "v3");
|
||||
|
||||
/// @todo Support quads
|
||||
if (!quadWarned && reader->getAttributeValue("v4")) {
|
||||
DefaultLogger::get()->warn("Submesh has quads, only triangles are supported at the moment!");
|
||||
}
|
||||
|
||||
submesh.Faces.push_back(NewFace);
|
||||
|
||||
// Advance
|
||||
NextNode(reader);
|
||||
currentNodeName = reader->getNodeName();
|
||||
}
|
||||
|
||||
if (submesh.Faces.size() == numFaces)
|
||||
{
|
||||
DefaultLogger::get()->debug(Formatter::format() << " - Faces " << numFaces);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw DeadlyImportError(Formatter::format() << "Read only " << submesh.Faces.size() << " faces when should have read " << numFaces);
|
||||
}
|
||||
}
|
||||
else if (currentNodeName == nnGeometry)
|
||||
{
|
||||
unsigned int numVertices = GetAttribute<int>(reader, "vertexcount");
|
||||
|
||||
NextNode(reader);
|
||||
while(string(reader->getNodeName()) == nnVertexBuffer) {
|
||||
ReadVertexBuffer(submesh, reader, numVertices);
|
||||
}
|
||||
}
|
||||
else if (reader->getNodeName() == nnBoneAssignments)
|
||||
{
|
||||
ReadBoneWeights(submesh, reader);
|
||||
}
|
||||
|
||||
currentNodeName = reader->getNodeName();
|
||||
}
|
||||
}
|
||||
|
||||
void OgreImporter::ReadVertexBuffer(SubMesh &submesh, XmlReader *reader, const unsigned int numVertices)
|
||||
{
|
||||
DefaultLogger::get()->debug(Formatter::format() << "Reading vertex buffer with " << numVertices << " vertices");
|
||||
|
||||
submesh.HasGeometry = true;
|
||||
|
||||
if (reader->getAttributeValue("positions") && GetAttribute<bool>(reader, "positions"))
|
||||
{
|
||||
submesh.HasPositions = true;
|
||||
submesh.Positions.reserve(numVertices);
|
||||
DefaultLogger::get()->debug(" - Has positions");
|
||||
}
|
||||
if (reader->getAttributeValue("normals") && GetAttribute<bool>(reader, "normals"))
|
||||
{
|
||||
submesh.HasNormals = true;
|
||||
submesh.Normals.reserve(numVertices);
|
||||
DefaultLogger::get()->debug(" - Has normals");
|
||||
}
|
||||
if (reader->getAttributeValue("tangents") && GetAttribute<bool>(reader, "tangents"))
|
||||
{
|
||||
submesh.HasTangents = true;
|
||||
submesh.Tangents.reserve(numVertices);
|
||||
DefaultLogger::get()->debug(" - Has tangents");
|
||||
}
|
||||
if (reader->getAttributeValue("texture_coords"))
|
||||
{
|
||||
submesh.Uvs.resize(GetAttribute<unsigned int>(reader, "texture_coords"));
|
||||
for(size_t i=0, len=submesh.Uvs.size(); i<len; ++i) {
|
||||
submesh.Uvs[i].reserve(numVertices);
|
||||
}
|
||||
DefaultLogger::get()->debug(Formatter::format() << " - Has " << submesh.Uvs.size() << " texture coords");
|
||||
}
|
||||
|
||||
if (!submesh.HasPositions) {
|
||||
throw DeadlyImportError("Vertex buffer does not contain positions!");
|
||||
}
|
||||
|
||||
const string nnVertex = "vertex";
|
||||
const string nnPosition = "position";
|
||||
const string nnNormal = "normal";
|
||||
const string nnTangent = "tangent";
|
||||
const string nnBinormal = "binormal";
|
||||
const string nnTexCoord = "texcoord";
|
||||
const string nnColorDiffuse = "colour_diffuse";
|
||||
const string nnColorSpecular = "colour_specular";
|
||||
|
||||
bool warnBinormal = true;
|
||||
bool warnColorDiffuse = true;
|
||||
bool warnColorSpecular = true;
|
||||
|
||||
NextNode(reader);
|
||||
string currentNodeName = reader->getNodeName();
|
||||
|
||||
/// @todo Make this loop nicer.
|
||||
while(currentNodeName == nnVertex ||
|
||||
currentNodeName == nnPosition ||
|
||||
currentNodeName == nnNormal ||
|
||||
currentNodeName == nnTangent ||
|
||||
currentNodeName == nnBinormal ||
|
||||
currentNodeName == nnTexCoord ||
|
||||
currentNodeName == nnColorDiffuse ||
|
||||
currentNodeName == nnColorSpecular)
|
||||
{
|
||||
if (currentNodeName == nnVertex)
|
||||
{
|
||||
NextNode(reader);
|
||||
currentNodeName = reader->getNodeName();
|
||||
}
|
||||
|
||||
/// @todo Implement nnBinormal, nnColorDiffuse and nnColorSpecular
|
||||
|
||||
if (submesh.HasPositions && currentNodeName == nnPosition)
|
||||
{
|
||||
aiVector3D NewPos;
|
||||
NewPos.x = GetAttribute<float>(reader, "x");
|
||||
NewPos.y = GetAttribute<float>(reader, "y");
|
||||
NewPos.z = GetAttribute<float>(reader, "z");
|
||||
submesh.Positions.push_back(NewPos);
|
||||
}
|
||||
else if (submesh.HasNormals && currentNodeName == nnNormal)
|
||||
{
|
||||
aiVector3D NewNormal;
|
||||
NewNormal.x = GetAttribute<float>(reader, "x");
|
||||
NewNormal.y = GetAttribute<float>(reader, "y");
|
||||
NewNormal.z = GetAttribute<float>(reader, "z");
|
||||
submesh.Normals.push_back(NewNormal);
|
||||
}
|
||||
else if (submesh.HasTangents && currentNodeName == nnTangent)
|
||||
{
|
||||
aiVector3D NewTangent;
|
||||
NewTangent.x = GetAttribute<float>(reader, "x");
|
||||
NewTangent.y = GetAttribute<float>(reader, "y");
|
||||
NewTangent.z = GetAttribute<float>(reader, "z");
|
||||
submesh.Tangents.push_back(NewTangent);
|
||||
}
|
||||
else if (submesh.Uvs.size() > 0 && currentNodeName == nnTexCoord)
|
||||
{
|
||||
for(size_t i=0, len=submesh.Uvs.size(); i<len; ++i)
|
||||
{
|
||||
if (currentNodeName != nnTexCoord) {
|
||||
throw DeadlyImportError("Vertex buffer declared more UVs than can be found in a vertex");
|
||||
}
|
||||
|
||||
aiVector3D NewUv;
|
||||
NewUv.x = GetAttribute<float>(reader, "u");
|
||||
NewUv.y = GetAttribute<float>(reader, "v") * (-1)+1; //flip the uv vertikal, blender exports them so! (ahem... @todo ????)
|
||||
submesh.Uvs[i].push_back(NewUv);
|
||||
|
||||
NextNode(reader);
|
||||
currentNodeName = reader->getNodeName();
|
||||
}
|
||||
// Continue main loop as above already read next node
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/// @todo Remove this stuff once implemented. We only want to log warnings once per element.
|
||||
bool warn = true;
|
||||
if (currentNodeName == nnBinormal)
|
||||
{
|
||||
if (warnBinormal)
|
||||
{
|
||||
warnBinormal = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
warn = false;
|
||||
}
|
||||
}
|
||||
else if (currentNodeName == nnColorDiffuse)
|
||||
{
|
||||
if (warnColorDiffuse)
|
||||
{
|
||||
warnColorDiffuse = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
warn = false;
|
||||
}
|
||||
}
|
||||
else if (currentNodeName == nnColorSpecular)
|
||||
{
|
||||
if (warnColorSpecular)
|
||||
{
|
||||
warnColorSpecular = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
warn = false;
|
||||
}
|
||||
}
|
||||
if (warn) {
|
||||
DefaultLogger::get()->warn(string("Vertex buffer attribute read not implemented for element: ") + currentNodeName);
|
||||
}
|
||||
}
|
||||
|
||||
// Advance
|
||||
NextNode(reader);
|
||||
currentNodeName = reader->getNodeName();
|
||||
}
|
||||
|
||||
DefaultLogger::get()->debug(Formatter::format() <<
|
||||
" - Positions " << submesh.Positions.size() <<
|
||||
" Normals " << submesh.Normals.size() <<
|
||||
" TexCoords " << submesh.Uvs.size() <<
|
||||
" Tangents " << submesh.Tangents.size());
|
||||
|
||||
// Sanity checks
|
||||
if (submesh.HasNormals && submesh.Normals.size() != numVertices) {
|
||||
throw DeadlyImportError(Formatter::format() << "Read only " << submesh.Normals.size() << " normals when should have read " << numVertices);
|
||||
}
|
||||
if (submesh.HasTangents && submesh.Tangents.size() != numVertices) {
|
||||
throw DeadlyImportError(Formatter::format() << "Read only " << submesh.Tangents.size() << " tangents when should have read " << numVertices);
|
||||
}
|
||||
for(unsigned int i=0; i<submesh.Uvs.size(); ++i)
|
||||
{
|
||||
if (submesh.Uvs[i].size() != numVertices) {
|
||||
throw DeadlyImportError(Formatter::format() << "Read only " << submesh.Uvs[i].size()
|
||||
<< " uvs for uv index " << i << " when should have read " << numVertices);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OgreImporter::ReadBoneWeights(SubMesh &submesh, XmlReader *reader)
|
||||
{
|
||||
submesh.Weights.resize(submesh.Positions.size());
|
||||
|
||||
unsigned int numRead = 0;
|
||||
const string nnVertexBoneAssignment = "vertexboneassignment";
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, nnVertexBoneAssignment))
|
||||
{
|
||||
numRead++;
|
||||
|
||||
BoneWeight weight;
|
||||
weight.Id = GetAttribute<int>(reader, "boneindex");
|
||||
weight.Value = GetAttribute<float>(reader, "weight");
|
||||
|
||||
//calculate the number of bones used (this is the highest id +1 becuase bone ids start at 0)
|
||||
/// @todo This can probably be refactored to something else.
|
||||
submesh.BonesUsed = max(submesh.BonesUsed, weight.Id+1);
|
||||
|
||||
const unsigned int vertexId = GetAttribute<int>(reader, "vertexindex");
|
||||
submesh.Weights[vertexId].push_back(weight);
|
||||
|
||||
NextNode(reader);
|
||||
}
|
||||
DefaultLogger::get()->debug(Formatter::format() << " - Bone weights " << numRead);
|
||||
}
|
||||
|
||||
void OgreImporter::ProcessSubMesh(SubMesh &submesh, SubMesh &sharedGeometry)
|
||||
{
|
||||
// Make all vertexes unique. Required by Assimp.
|
||||
vector<Face> uniqueFaceList(submesh.Faces.size());
|
||||
unsigned int uniqueVertexCount = submesh.Faces.size() * 3;
|
||||
|
||||
vector<aiVector3D> uniquePositions(uniqueVertexCount);
|
||||
vector<aiVector3D> uniqueNormals(uniqueVertexCount);
|
||||
vector<aiVector3D> uniqueTangents(uniqueVertexCount);
|
||||
|
||||
vector<vector<BoneWeight> > uniqueWeights(uniqueVertexCount);
|
||||
vector<vector<aiVector3D> > uniqueUvs(submesh.UseSharedGeometry ? sharedGeometry.Uvs.size() : submesh.Uvs.size());
|
||||
|
||||
for(size_t uvi=0; uvi<uniqueUvs.size(); ++uvi) {
|
||||
uniqueUvs[uvi].resize(uniqueVertexCount);
|
||||
}
|
||||
|
||||
/* Support for shared geometry.
|
||||
We can use this loop to copy vertex informations from the shared data pool. In order to do so
|
||||
we just use a reference to a submodel instead of our submodel itself */
|
||||
SubMesh &vertexSource = (submesh.UseSharedGeometry ? sharedGeometry : submesh);
|
||||
if (submesh.UseSharedGeometry)
|
||||
{
|
||||
submesh.HasPositions = sharedGeometry.HasPositions;
|
||||
submesh.HasNormals = sharedGeometry.HasNormals;
|
||||
submesh.HasTangents = sharedGeometry.HasTangents;
|
||||
submesh.BonesUsed = sharedGeometry.BonesUsed;
|
||||
}
|
||||
|
||||
for (size_t i=0, flen=submesh.Faces.size(); i<flen; ++i)
|
||||
{
|
||||
const Face &face = submesh.Faces[i];
|
||||
|
||||
// We pre calculate the index values here,
|
||||
// because we need them in all vertex attributes.
|
||||
unsigned int v1 = face.VertexIndices[0];
|
||||
unsigned int v2 = face.VertexIndices[1];
|
||||
unsigned int v3 = face.VertexIndices[2];
|
||||
|
||||
size_t pos = i*3;
|
||||
|
||||
uniqueFaceList[i].VertexIndices[0] = pos;
|
||||
uniqueFaceList[i].VertexIndices[1] = pos + 1;
|
||||
uniqueFaceList[i].VertexIndices[2] = pos + 2;
|
||||
|
||||
uniquePositions[pos] = vertexSource.Positions[v1];
|
||||
uniquePositions[pos+1] = vertexSource.Positions[v2];
|
||||
uniquePositions[pos+2] = vertexSource.Positions[v3];
|
||||
|
||||
if (vertexSource.HasNormals)
|
||||
{
|
||||
uniqueNormals[pos ] = vertexSource.Normals[v1];
|
||||
uniqueNormals[pos+1] = vertexSource.Normals[v2];
|
||||
uniqueNormals[pos+2] = vertexSource.Normals[v3];
|
||||
}
|
||||
|
||||
if (vertexSource.HasTangents)
|
||||
{
|
||||
uniqueTangents[pos] = vertexSource.Tangents[v1];
|
||||
uniqueTangents[pos+1] = vertexSource.Tangents[v2];
|
||||
uniqueTangents[pos+2] = vertexSource.Tangents[v3];
|
||||
}
|
||||
|
||||
for(size_t uvi=0; uvi<uniqueUvs.size(); ++uvi)
|
||||
{
|
||||
const std::vector<aiVector3D> &uv = vertexSource.Uvs[uvi];
|
||||
uniqueUvs[uvi][pos] = uv[v1];
|
||||
uniqueUvs[uvi][pos+1] = uv[v2];
|
||||
uniqueUvs[uvi][pos+2] = uv[v3];
|
||||
}
|
||||
|
||||
if (!vertexSource.Weights.empty())
|
||||
{
|
||||
uniqueWeights[pos] = vertexSource.Weights[v1];
|
||||
uniqueWeights[pos+1] = vertexSource.Weights[v2];
|
||||
uniqueWeights[pos+2] = vertexSource.Weights[v3];
|
||||
}
|
||||
}
|
||||
|
||||
// Now we have the unique data, but want them in the SubMesh, so we swap all the containers.
|
||||
// If we don't have one of them, we just swap empty containers, so everything is ok.
|
||||
submesh.Faces.swap(uniqueFaceList);
|
||||
submesh.Positions.swap(uniquePositions);
|
||||
submesh.Normals.swap(uniqueNormals);
|
||||
submesh.Tangents.swap(uniqueTangents);
|
||||
submesh.Uvs.swap(uniqueUvs);
|
||||
submesh.Weights.swap(uniqueWeights);
|
||||
|
||||
// Normalize bone weights
|
||||
// For example the Blender exporter doesn't care about whether the sum of all bone
|
||||
// weights for a single vertex equals 1 or not, so validate here.
|
||||
for(size_t vertexId=0, wlen=submesh.Weights.size(); vertexId<wlen; ++vertexId)
|
||||
{
|
||||
std::vector<BoneWeight> &weights = submesh.Weights[vertexId];
|
||||
|
||||
float sum = 0.0f;
|
||||
for(size_t boneId=0, blen=weights.size(); boneId<blen; ++boneId) {
|
||||
sum += weights[boneId].Value;
|
||||
}
|
||||
|
||||
//check if the sum is too far away from 1
|
||||
if ((sum < (1.0f - 0.05f)) || (sum > (1.0f + 0.05f)))
|
||||
{
|
||||
for(size_t boneId=0, blen=weights.size(); boneId<blen; ++boneId) {
|
||||
weights[boneId].Value /= sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aiMesh *OgreImporter::CreateAssimpSubMesh(aiScene *pScene, const SubMesh& submesh, const vector<Bone>& bones) const
|
||||
{
|
||||
const size_t sizeVector3D = sizeof(aiVector3D);
|
||||
|
||||
aiMesh *dest = new aiMesh();
|
||||
|
||||
// Material
|
||||
dest->mMaterialIndex = submesh.MaterialIndex;
|
||||
|
||||
// Positions
|
||||
dest->mVertices = new aiVector3D[submesh.Positions.size()];
|
||||
dest->mNumVertices = submesh.Positions.size();
|
||||
memcpy(dest->mVertices, &submesh.Positions[0], submesh.Positions.size() * sizeVector3D);
|
||||
|
||||
// Normals
|
||||
if (submesh.HasNormals)
|
||||
{
|
||||
dest->mNormals = new aiVector3D[submesh.Normals.size()];
|
||||
memcpy(dest->mNormals, &submesh.Normals[0], submesh.Normals.size() * sizeVector3D);
|
||||
}
|
||||
|
||||
// Tangents
|
||||
// Until we have support for bitangents, no tangents will be written
|
||||
/// @todo Investigate why the above?
|
||||
if (submesh.HasTangents)
|
||||
{
|
||||
DefaultLogger::get()->warn("Tangents found from Ogre mesh but writing to Assimp mesh not yet supported!");
|
||||
//dest->mTangents = new aiVector3D[submesh.Tangents.size()];
|
||||
//memcpy(dest->mTangents, &submesh.Tangents[0], submesh.Tangents.size() * sizeVector3D);
|
||||
}
|
||||
|
||||
// UVs
|
||||
for (size_t i=0, len=submesh.Uvs.size(); i<len; ++i)
|
||||
{
|
||||
dest->mNumUVComponents[i] = 2;
|
||||
dest->mTextureCoords[i] = new aiVector3D[submesh.Uvs[i].size()];
|
||||
memcpy(dest->mTextureCoords[i], &(submesh.Uvs[i][0]), submesh.Uvs[i].size() * sizeVector3D);
|
||||
}
|
||||
|
||||
// Bone weights. Convert internal vertex-to-bone mapping to bone-to-vertex.
|
||||
vector<vector<aiVertexWeight> > assimpWeights(submesh.BonesUsed);
|
||||
for(size_t vertexId=0, len=submesh.Weights.size(); vertexId<len; ++vertexId)
|
||||
{
|
||||
const vector<BoneWeight> &vertexWeights = submesh.Weights[vertexId];
|
||||
for (size_t boneId=0, len=vertexWeights.size(); boneId<len; ++boneId)
|
||||
{
|
||||
const BoneWeight &ogreWeight = vertexWeights[boneId];
|
||||
assimpWeights[ogreWeight.Id].push_back(aiVertexWeight(vertexId, ogreWeight.Value));
|
||||
}
|
||||
}
|
||||
|
||||
// Bones.
|
||||
vector<aiBone*> assimpBones;
|
||||
assimpBones.reserve(submesh.BonesUsed);
|
||||
|
||||
for(size_t boneId=0, len=submesh.BonesUsed; boneId<len; ++boneId)
|
||||
{
|
||||
const vector<aiVertexWeight> &boneWeights = assimpWeights[boneId];
|
||||
if (boneWeights.size() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// @note The bones list is sorted by id's, this was done in LoadSkeleton.
|
||||
aiBone *assimpBone = new aiBone();
|
||||
assimpBone->mName = bones[boneId].Name;
|
||||
assimpBone->mOffsetMatrix = bones[boneId].BoneToWorldSpace;
|
||||
assimpBone->mNumWeights = boneWeights.size();
|
||||
assimpBone->mWeights = new aiVertexWeight[boneWeights.size()];
|
||||
memcpy(assimpBone->mWeights, &boneWeights[0], boneWeights.size() * sizeof(aiVertexWeight));
|
||||
|
||||
assimpBones.push_back(assimpBone);
|
||||
}
|
||||
|
||||
if (!assimpBones.empty())
|
||||
{
|
||||
dest->mBones = new aiBone*[assimpBones.size()];
|
||||
dest->mNumBones = assimpBones.size();
|
||||
|
||||
for(size_t i=0, len=assimpBones.size(); i<len; ++i) {
|
||||
dest->mBones[i] = assimpBones[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Faces
|
||||
dest->mFaces = new aiFace[submesh.Faces.size()];
|
||||
dest->mNumFaces = submesh.Faces.size();
|
||||
|
||||
for(size_t i=0, len=submesh.Faces.size(); i<len; ++i)
|
||||
{
|
||||
dest->mFaces[i].mNumIndices = 3;
|
||||
dest->mFaces[i].mIndices = new unsigned int[3];
|
||||
|
||||
const Face &f = submesh.Faces[i];
|
||||
dest->mFaces[i].mIndices[0] = f.VertexIndices[0];
|
||||
dest->mFaces[i].mIndices[1] = f.VertexIndices[1];
|
||||
dest->mFaces[i].mIndices[2] = f.VertexIndices[2];
|
||||
}
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
|
|
@ -1,3 +1,42 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef AI_OGREPARSINGUTILS_H_INC
|
||||
#define AI_OGREPARSINGUTILS_H_INC
|
||||
|
@ -5,144 +44,13 @@
|
|||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "ParsingUtils.h"
|
||||
#include "irrXMLWrapper.h"
|
||||
#include "fast_atof.h"
|
||||
#include <functional>
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
{
|
||||
|
||||
typedef irr::io::IrrXMLReader XmlReader;
|
||||
|
||||
static void ThrowAttibuteError(const XmlReader* reader, const std::string &name, const std::string &error = "")
|
||||
{
|
||||
if (!error.empty())
|
||||
{
|
||||
throw DeadlyImportError(error + " in node '" + std::string(reader->getNodeName()) + "' and attribute '" + name + "'");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw DeadlyImportError("Attribute '" + name + "' does not exist in node '" + std::string(reader->getNodeName()) + "'");
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
inline T GetAttribute(const XmlReader* reader, const std::string &name);
|
||||
|
||||
template<>
|
||||
inline int GetAttribute<int>(const XmlReader* reader, const std::string &name)
|
||||
{
|
||||
const char* value = reader->getAttributeValue(name.c_str());
|
||||
if (value)
|
||||
{
|
||||
return atoi(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
ThrowAttibuteError(reader, name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
inline unsigned int GetAttribute<unsigned int>(const XmlReader* reader, const std::string &name)
|
||||
{
|
||||
const char* value = reader->getAttributeValue(name.c_str());
|
||||
if (value)
|
||||
{
|
||||
return static_cast<unsigned int>(atoi(value)); ///< @todo Find a better way...
|
||||
}
|
||||
else
|
||||
{
|
||||
ThrowAttibuteError(reader, name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
inline float GetAttribute<float>(const XmlReader* reader, const std::string &name)
|
||||
{
|
||||
const char* value = reader->getAttributeValue(name.c_str());
|
||||
if (value)
|
||||
{
|
||||
return fast_atof(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
ThrowAttibuteError(reader, name);
|
||||
return 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
inline std::string GetAttribute<std::string>(const XmlReader* reader, const std::string &name)
|
||||
{
|
||||
const char* value = reader->getAttributeValue(name.c_str());
|
||||
if (value)
|
||||
{
|
||||
return std::string(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
ThrowAttibuteError(reader, name);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
template<>
|
||||
inline bool GetAttribute<bool>(const XmlReader* reader, const std::string &name)
|
||||
{
|
||||
std::string value = GetAttribute<std::string>(reader, name);
|
||||
if (ASSIMP_stricmp(value, "true") == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (ASSIMP_stricmp(value, "false") == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
ThrowAttibuteError(reader, name, "Boolean value is expected to be 'true' or 'false', encountered '" + value + "'");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
inline bool NextNode(XmlReader* reader)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (!reader->read()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
while(reader->getNodeType() != irr::io::EXN_ELEMENT);
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool CurrentNodeNameEquals(const XmlReader* reader, const std::string &name)
|
||||
{
|
||||
return (ASSIMP_stricmp(std::string(reader->getNodeName()), name) == 0);
|
||||
}
|
||||
|
||||
/// Skips a line from current @ss position until a newline. Returns the skipped part.
|
||||
static inline std::string SkipLine(std::stringstream &ss)
|
||||
{
|
||||
std::string skipped;
|
||||
getline(ss, skipped);
|
||||
return skipped;
|
||||
}
|
||||
|
||||
/// Skips a line and reads next element from @c ss to @c nextElement.
|
||||
/** @return Skipped line content until newline. */
|
||||
static inline std::string NextAfterNewLine(std::stringstream &ss, std::string &nextElement)
|
||||
{
|
||||
std::string skipped = SkipLine(ss);
|
||||
ss >> nextElement;
|
||||
return skipped;
|
||||
}
|
||||
|
||||
/// Returns a lower cased copy of @s.
|
||||
static inline std::string ToLower(std::string s)
|
||||
{
|
||||
|
@ -207,6 +115,23 @@ static inline std::string &Trim(std::string &s, bool newlines = true)
|
|||
return TrimLeft(TrimRight(s, newlines), newlines);
|
||||
}
|
||||
|
||||
/// Skips a line from current @ss position until a newline. Returns the skipped part.
|
||||
static inline std::string SkipLine(std::stringstream &ss)
|
||||
{
|
||||
std::string skipped;
|
||||
getline(ss, skipped);
|
||||
return skipped;
|
||||
}
|
||||
|
||||
/// Skips a line and reads next element from @c ss to @c nextElement.
|
||||
/** @return Skipped line content until newline. */
|
||||
static inline std::string NextAfterNewLine(std::stringstream &ss, std::string &nextElement)
|
||||
{
|
||||
std::string skipped = SkipLine(ss);
|
||||
ss >> nextElement;
|
||||
return skipped;
|
||||
}
|
||||
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
|
|
|
@ -1,446 +0,0 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in aSource and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of aSource 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "AssimpPCH.h"
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "OgreImporter.h"
|
||||
#include "TinyFormatter.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
{
|
||||
|
||||
void OgreImporter::ReadSkeleton(const std::string &pFile, Assimp::IOSystem *pIOHandler, const aiScene *pScene,
|
||||
const std::string &skeletonFile, vector<Bone> &Bones, vector<Animation> &Animations) const
|
||||
{
|
||||
string filename = skeletonFile;
|
||||
if (EndsWith(filename, ".skeleton"))
|
||||
{
|
||||
DefaultLogger::get()->warn("Mesh is referencing a Ogre binary skeleton. Parsing binary Ogre assets is not supported at the moment. Trying to find .skeleton.xml file instead.");
|
||||
filename += ".xml";
|
||||
}
|
||||
|
||||
if (!pIOHandler->Exists(filename))
|
||||
{
|
||||
DefaultLogger::get()->error("Failed to find skeleton file '" + filename + "', skeleton will be missing.");
|
||||
return;
|
||||
}
|
||||
|
||||
boost::scoped_ptr<IOStream> file(pIOHandler->Open(filename));
|
||||
if (!file.get()) {
|
||||
throw DeadlyImportError("Failed to open skeleton file " + filename);
|
||||
}
|
||||
|
||||
boost::scoped_ptr<CIrrXML_IOStreamReader> stream(new CIrrXML_IOStreamReader(file.get()));
|
||||
XmlReader* reader = irr::io::createIrrXMLReader(stream.get());
|
||||
if (!reader) {
|
||||
throw DeadlyImportError("Failed to create XML reader for skeleton file " + filename);
|
||||
}
|
||||
|
||||
DefaultLogger::get()->debug("Reading skeleton '" + filename + "'");
|
||||
|
||||
// Root
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "skeleton")) {
|
||||
throw DeadlyImportError("Root node is not <skeleton> but <" + string(reader->getNodeName()) + "> in " + filename);
|
||||
}
|
||||
|
||||
// Bones
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "bones")) {
|
||||
throw DeadlyImportError("No <bones> node in skeleton " + skeletonFile);
|
||||
}
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, "bone"))
|
||||
{
|
||||
/** @todo Fix this mandatory ordering. Some exporters might just write rotation first etc.
|
||||
There is no technical reason this has to be so strict. */
|
||||
|
||||
Bone bone;
|
||||
bone.Id = GetAttribute<int>(reader, "id");
|
||||
bone.Name = GetAttribute<string>(reader, "name");
|
||||
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "position")) {
|
||||
throw DeadlyImportError("Position is not first node in Bone!");
|
||||
}
|
||||
|
||||
bone.Position.x = GetAttribute<float>(reader, "x");
|
||||
bone.Position.y = GetAttribute<float>(reader, "y");
|
||||
bone.Position.z = GetAttribute<float>(reader, "z");
|
||||
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "rotation")) {
|
||||
throw DeadlyImportError("Rotation is not the second node in Bone!");
|
||||
}
|
||||
|
||||
bone.RotationAngle = GetAttribute<float>(reader, "angle");
|
||||
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "axis")) {
|
||||
throw DeadlyImportError("No axis specified for bone rotation!");
|
||||
}
|
||||
|
||||
bone.RotationAxis.x = GetAttribute<float>(reader, "x");
|
||||
bone.RotationAxis.y = GetAttribute<float>(reader, "y");
|
||||
bone.RotationAxis.z = GetAttribute<float>(reader, "z");
|
||||
|
||||
Bones.push_back(bone);
|
||||
|
||||
NextNode(reader);
|
||||
}
|
||||
|
||||
// Order bones by Id
|
||||
std::sort(Bones.begin(), Bones.end());
|
||||
|
||||
// Validate that bone indexes are not skipped.
|
||||
/** @note Left this from original authors code, but not sure if this is strictly necessary
|
||||
as per the Ogre skeleton spec. It might be more that other (later) code in this imported does not break. */
|
||||
for (size_t i=0, len=Bones.size(); i<len; ++i)
|
||||
{
|
||||
if (static_cast<int>(Bones[i].Id) != static_cast<int>(i)) {
|
||||
throw DeadlyImportError("Bone Ids are not in sequence in " + skeletonFile);
|
||||
}
|
||||
}
|
||||
|
||||
DefaultLogger::get()->debug(Formatter::format() << " - Bones " << Bones.size());
|
||||
|
||||
// Bone hierarchy
|
||||
if (!CurrentNodeNameEquals(reader, "bonehierarchy")) {
|
||||
throw DeadlyImportError("No <bonehierarchy> node found after <bones> in " + skeletonFile);
|
||||
}
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, "boneparent"))
|
||||
{
|
||||
string childName = GetAttribute<string>(reader, "bone");
|
||||
string parentName = GetAttribute<string>(reader, "parent");
|
||||
|
||||
vector<Bone>::iterator iterChild = find(Bones.begin(), Bones.end(), childName);
|
||||
vector<Bone>::iterator iterParent = find(Bones.begin(), Bones.end(), parentName);
|
||||
|
||||
if (iterChild != Bones.end() && iterParent != Bones.end())
|
||||
{
|
||||
iterChild->ParentId = iterParent->Id;
|
||||
iterParent->Children.push_back(iterChild->Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
DefaultLogger::get()->warn("Failed to find bones for parenting: Child " + childName + " Parent " + parentName);
|
||||
}
|
||||
|
||||
NextNode(reader);
|
||||
}
|
||||
|
||||
// Calculate bone matrices for root bones. Recursively does their children.
|
||||
BOOST_FOREACH(Bone &theBone, Bones)
|
||||
{
|
||||
if (!theBone.IsParented()) {
|
||||
theBone.CalculateBoneToWorldSpaceMatrix(Bones);
|
||||
}
|
||||
}
|
||||
|
||||
aiVector3D zeroVec(0.f, 0.f, 0.f);
|
||||
|
||||
// Animations
|
||||
if (CurrentNodeNameEquals(reader, "animations"))
|
||||
{
|
||||
DefaultLogger::get()->debug(" - Animations");
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, "animation"))
|
||||
{
|
||||
Animation animation;
|
||||
animation.Name = GetAttribute<string>(reader, "name");
|
||||
animation.Length = GetAttribute<float>(reader, "length");
|
||||
|
||||
// Tracks
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "tracks")) {
|
||||
throw DeadlyImportError("No <tracks> node found in animation '" + animation.Name + "' in " + skeletonFile);
|
||||
}
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, "track"))
|
||||
{
|
||||
Track track;
|
||||
track.BoneName = GetAttribute<string>(reader, "bone");
|
||||
|
||||
// Keyframes
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "keyframes")) {
|
||||
throw DeadlyImportError("No <keyframes> node found in a track in animation '" + animation.Name + "' in " + skeletonFile);
|
||||
}
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, "keyframe"))
|
||||
{
|
||||
KeyFrame keyFrame;
|
||||
keyFrame.Time = GetAttribute<float>(reader, "time");
|
||||
|
||||
NextNode(reader);
|
||||
while(CurrentNodeNameEquals(reader, "translate") || CurrentNodeNameEquals(reader, "rotate") || CurrentNodeNameEquals(reader, "scale"))
|
||||
{
|
||||
if (CurrentNodeNameEquals(reader, "translate"))
|
||||
{
|
||||
keyFrame.Position.x = GetAttribute<float>(reader, "x");
|
||||
keyFrame.Position.y = GetAttribute<float>(reader, "y");
|
||||
keyFrame.Position.z = GetAttribute<float>(reader, "z");
|
||||
}
|
||||
else if (CurrentNodeNameEquals(reader, "rotate"))
|
||||
{
|
||||
float angle = GetAttribute<float>(reader, "angle");
|
||||
|
||||
NextNode(reader);
|
||||
if (!CurrentNodeNameEquals(reader, "axis")) {
|
||||
throw DeadlyImportError("No axis for keyframe rotation in animation '" + animation.Name + "'");
|
||||
}
|
||||
|
||||
aiVector3D axis;
|
||||
axis.x = GetAttribute<float>(reader, "x");
|
||||
axis.y = GetAttribute<float>(reader, "y");
|
||||
axis.z = GetAttribute<float>(reader, "z");
|
||||
|
||||
if (axis.Equal(zeroVec))
|
||||
{
|
||||
axis.x = 1.0f;
|
||||
if (angle != 0) {
|
||||
DefaultLogger::get()->warn("Found invalid a key frame with a zero rotation axis in animation '" + animation.Name + "'");
|
||||
}
|
||||
}
|
||||
keyFrame.Rotation = aiQuaternion(axis, angle);
|
||||
}
|
||||
else if (CurrentNodeNameEquals(reader, "scale"))
|
||||
{
|
||||
keyFrame.Scaling.x = GetAttribute<float>(reader, "x");
|
||||
keyFrame.Scaling.y = GetAttribute<float>(reader, "y");
|
||||
keyFrame.Scaling.z = GetAttribute<float>(reader, "z");
|
||||
}
|
||||
NextNode(reader);
|
||||
}
|
||||
track.Keyframes.push_back(keyFrame);
|
||||
}
|
||||
animation.Tracks.push_back(track);
|
||||
}
|
||||
Animations.push_back(animation);
|
||||
|
||||
DefaultLogger::get()->debug(Formatter::format() << " " << animation.Name << " (" << animation.Length << " sec, " << animation.Tracks.size() << " tracks)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OgreImporter::CreateAssimpSkeleton(aiScene *pScene, const std::vector<Bone> &bones, const std::vector<Animation> &animations)
|
||||
{
|
||||
if (bones.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pScene->mRootNode) {
|
||||
throw DeadlyImportError("Creating Assimp skeleton: No root node created!");
|
||||
}
|
||||
if (pScene->mRootNode->mNumChildren > 0) {
|
||||
throw DeadlyImportError("Creating Assimp skeleton: Root node already has children!");
|
||||
}
|
||||
|
||||
// Bones
|
||||
vector<aiNode*> rootBones;
|
||||
BOOST_FOREACH(const Bone &bone, bones)
|
||||
{
|
||||
if (!bone.IsParented()) {
|
||||
rootBones.push_back(CreateNodeFromBone(bone.Id, bones, pScene->mRootNode));
|
||||
}
|
||||
}
|
||||
|
||||
if (!rootBones.empty())
|
||||
{
|
||||
pScene->mRootNode->mChildren = new aiNode*[rootBones.size()];
|
||||
pScene->mRootNode->mNumChildren = rootBones.size();
|
||||
|
||||
for(size_t i=0, len=rootBones.size(); i<len; ++i) {
|
||||
pScene->mRootNode->mChildren[i] = rootBones[i];
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Auf nicht vorhandene Animationskeys achten!
|
||||
// @todo Pay attention to non-existing animation Keys (google translated from above german comment)
|
||||
|
||||
// Animations
|
||||
if (!animations.empty())
|
||||
{
|
||||
pScene->mAnimations = new aiAnimation*[animations.size()];
|
||||
pScene->mNumAnimations = animations.size();
|
||||
|
||||
for(size_t ai=0, alen=animations.size(); ai<alen; ++ai)
|
||||
{
|
||||
const Animation &aSource = animations[ai];
|
||||
|
||||
aiAnimation *animation = new aiAnimation();
|
||||
animation->mName = aSource.Name;
|
||||
animation->mDuration = aSource.Length;
|
||||
animation->mTicksPerSecond = 1.0f;
|
||||
|
||||
// Tracks
|
||||
animation->mChannels = new aiNodeAnim*[aSource.Tracks.size()];
|
||||
animation->mNumChannels = aSource.Tracks.size();
|
||||
|
||||
for(size_t ti=0, tlen=aSource.Tracks.size(); ti<tlen; ++ti)
|
||||
{
|
||||
const Track &tSource = aSource.Tracks[ti];
|
||||
|
||||
aiNodeAnim *animationNode = new aiNodeAnim();
|
||||
animationNode->mNodeName = tSource.BoneName;
|
||||
|
||||
// We need this, to access the bones default pose.
|
||||
// Which we need to make keys absolute to the default bone pose.
|
||||
vector<Bone>::const_iterator boneIter = find(bones.begin(), bones.end(), tSource.BoneName);
|
||||
if (boneIter == bones.end())
|
||||
{
|
||||
for(size_t createdAnimationIndex=0; createdAnimationIndex<ai; createdAnimationIndex++) {
|
||||
delete pScene->mAnimations[createdAnimationIndex];
|
||||
}
|
||||
delete [] pScene->mAnimations;
|
||||
pScene->mAnimations = NULL;
|
||||
pScene->mNumAnimations = 0;
|
||||
|
||||
DefaultLogger::get()->error("Failed to find bone for name " + tSource.BoneName + " when creating animation " + aSource.Name +
|
||||
". This is a serious error, animations wont be imported.");
|
||||
return;
|
||||
}
|
||||
|
||||
aiMatrix4x4 t0, t1;
|
||||
aiMatrix4x4 defaultBonePose = aiMatrix4x4::Translation(boneIter->Position, t1) * aiMatrix4x4::Rotation(boneIter->RotationAngle, boneIter->RotationAxis, t0);
|
||||
|
||||
// Keyframes
|
||||
unsigned int numKeyframes = tSource.Keyframes.size();
|
||||
|
||||
animationNode->mPositionKeys = new aiVectorKey[numKeyframes];
|
||||
animationNode->mRotationKeys = new aiQuatKey[numKeyframes];
|
||||
animationNode->mScalingKeys = new aiVectorKey[numKeyframes];
|
||||
animationNode->mNumPositionKeys = numKeyframes;
|
||||
animationNode->mNumRotationKeys = numKeyframes;
|
||||
animationNode->mNumScalingKeys = numKeyframes;
|
||||
|
||||
//...and fill them
|
||||
for(size_t kfi=0; kfi<numKeyframes; ++kfi)
|
||||
{
|
||||
const KeyFrame &kfSource = tSource.Keyframes[kfi];
|
||||
|
||||
// Create a matrix to transform a vector from the bones
|
||||
// default pose to the bone bones in this animation key
|
||||
aiMatrix4x4 t2, t3;
|
||||
aiMatrix4x4 keyBonePose =
|
||||
aiMatrix4x4::Translation(kfSource.Position, t3) *
|
||||
aiMatrix4x4(kfSource.Rotation.GetMatrix()) *
|
||||
aiMatrix4x4::Scaling(kfSource.Scaling, t2);
|
||||
|
||||
// Calculate the complete transformation from world space to bone space
|
||||
aiMatrix4x4 CompleteTransform = defaultBonePose * keyBonePose;
|
||||
|
||||
aiVector3D kfPos; aiQuaternion kfRot; aiVector3D kfScale;
|
||||
CompleteTransform.Decompose(kfScale, kfRot, kfPos);
|
||||
|
||||
animationNode->mPositionKeys[kfi].mTime = static_cast<double>(kfSource.Time);
|
||||
animationNode->mRotationKeys[kfi].mTime = static_cast<double>(kfSource.Time);
|
||||
animationNode->mScalingKeys[kfi].mTime = static_cast<double>(kfSource.Time);
|
||||
|
||||
animationNode->mPositionKeys[kfi].mValue = kfPos;
|
||||
animationNode->mRotationKeys[kfi].mValue = kfRot;
|
||||
animationNode->mScalingKeys[kfi].mValue = kfScale;
|
||||
}
|
||||
animation->mChannels[ti] = animationNode;
|
||||
}
|
||||
pScene->mAnimations[ai] = animation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aiNode* OgreImporter::CreateNodeFromBone(int boneId, const std::vector<Bone> &bones, aiNode* parent)
|
||||
{
|
||||
aiMatrix4x4 t0,t1;
|
||||
const Bone &source = bones[boneId];
|
||||
|
||||
aiNode* boneNode = new aiNode(source.Name);
|
||||
boneNode->mParent = parent;
|
||||
boneNode->mTransformation = aiMatrix4x4::Translation(source.Position, t0) * aiMatrix4x4::Rotation(source.RotationAngle, source.RotationAxis, t1);
|
||||
|
||||
if (!source.Children.empty())
|
||||
{
|
||||
boneNode->mChildren = new aiNode*[source.Children.size()];
|
||||
boneNode->mNumChildren = source.Children.size();
|
||||
|
||||
for(size_t i=0, len=source.Children.size(); i<len; ++i) {
|
||||
boneNode->mChildren[i] = CreateNodeFromBone(source.Children[i], bones, boneNode);
|
||||
}
|
||||
}
|
||||
|
||||
return boneNode;
|
||||
}
|
||||
|
||||
void Bone::CalculateBoneToWorldSpaceMatrix(vector<Bone> &Bones)
|
||||
{
|
||||
aiMatrix4x4 t0, t1;
|
||||
aiMatrix4x4 transform = aiMatrix4x4::Rotation(-RotationAngle, RotationAxis, t1) * aiMatrix4x4::Translation(-Position, t0);
|
||||
|
||||
if (!IsParented())
|
||||
{
|
||||
BoneToWorldSpace = transform;
|
||||
}
|
||||
else
|
||||
{
|
||||
BoneToWorldSpace = transform * Bones[ParentId].BoneToWorldSpace;
|
||||
}
|
||||
|
||||
// Recursively for all children now that the parent matrix has been calculated.
|
||||
BOOST_FOREACH(int childId, Children)
|
||||
{
|
||||
Bones[childId].CalculateBoneToWorldSpaceMatrix(Bones);
|
||||
}
|
||||
}
|
||||
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,681 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef AI_OGRESTRUCTS_H_INC
|
||||
#define AI_OGRESTRUCTS_H_INC
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "AssimpPCH.h"
|
||||
#include "MemoryIOWrapper.h"
|
||||
|
||||
/** @note Parts of this implementation, for example enums, deserialization constants and logic
|
||||
has been copied directly with minor modifications from the MIT licensed Ogre3D code base.
|
||||
See more from https://bitbucket.org/sinbad/ogre. */
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
{
|
||||
|
||||
// Forward decl
|
||||
class Mesh;
|
||||
class MeshXml;
|
||||
class SubMesh;
|
||||
class SubMeshXml;
|
||||
class Skeleton;
|
||||
|
||||
#define OGRE_SAFE_DELETE(p) delete p; p=0;
|
||||
|
||||
// Typedefs
|
||||
typedef Assimp::MemoryIOStream MemoryStream;
|
||||
typedef boost::shared_ptr<MemoryStream> MemoryStreamPtr;
|
||||
typedef std::map<uint16_t, MemoryStreamPtr> VertexBufferBindings;
|
||||
|
||||
// Ogre Vertex Element
|
||||
class VertexElement
|
||||
{
|
||||
public:
|
||||
/// Vertex element semantics, used to identify the meaning of vertex buffer contents
|
||||
enum Semantic {
|
||||
/// Position, 3 reals per vertex
|
||||
VES_POSITION = 1,
|
||||
/// Blending weights
|
||||
VES_BLEND_WEIGHTS = 2,
|
||||
/// Blending indices
|
||||
VES_BLEND_INDICES = 3,
|
||||
/// Normal, 3 reals per vertex
|
||||
VES_NORMAL = 4,
|
||||
/// Diffuse colours
|
||||
VES_DIFFUSE = 5,
|
||||
/// Specular colours
|
||||
VES_SPECULAR = 6,
|
||||
/// Texture coordinates
|
||||
VES_TEXTURE_COORDINATES = 7,
|
||||
/// Binormal (Y axis if normal is Z)
|
||||
VES_BINORMAL = 8,
|
||||
/// Tangent (X axis if normal is Z)
|
||||
VES_TANGENT = 9,
|
||||
/// The number of VertexElementSemantic elements (note - the first value VES_POSITION is 1)
|
||||
VES_COUNT = 9
|
||||
};
|
||||
|
||||
/// Vertex element type, used to identify the base types of the vertex contents
|
||||
enum Type
|
||||
{
|
||||
VET_FLOAT1 = 0,
|
||||
VET_FLOAT2 = 1,
|
||||
VET_FLOAT3 = 2,
|
||||
VET_FLOAT4 = 3,
|
||||
/// alias to more specific colour type - use the current rendersystem's colour packing
|
||||
VET_COLOUR = 4,
|
||||
VET_SHORT1 = 5,
|
||||
VET_SHORT2 = 6,
|
||||
VET_SHORT3 = 7,
|
||||
VET_SHORT4 = 8,
|
||||
VET_UBYTE4 = 9,
|
||||
/// D3D style compact colour
|
||||
VET_COLOUR_ARGB = 10,
|
||||
/// GL style compact colour
|
||||
VET_COLOUR_ABGR = 11,
|
||||
VET_DOUBLE1 = 12,
|
||||
VET_DOUBLE2 = 13,
|
||||
VET_DOUBLE3 = 14,
|
||||
VET_DOUBLE4 = 15,
|
||||
VET_USHORT1 = 16,
|
||||
VET_USHORT2 = 17,
|
||||
VET_USHORT3 = 18,
|
||||
VET_USHORT4 = 19,
|
||||
VET_INT1 = 20,
|
||||
VET_INT2 = 21,
|
||||
VET_INT3 = 22,
|
||||
VET_INT4 = 23,
|
||||
VET_UINT1 = 24,
|
||||
VET_UINT2 = 25,
|
||||
VET_UINT3 = 26,
|
||||
VET_UINT4 = 27
|
||||
};
|
||||
|
||||
VertexElement();
|
||||
|
||||
/// Size of the vertex element in bytes.
|
||||
size_t Size() const;
|
||||
|
||||
/// Count of components in this element, eg. VET_FLOAT3 return 3.
|
||||
size_t ComponentCount() const;
|
||||
|
||||
/// Type as string.
|
||||
std::string TypeToString();
|
||||
|
||||
/// Semantic as string.
|
||||
std::string SemanticToString();
|
||||
|
||||
static size_t TypeSize(Type type);
|
||||
static size_t ComponentCount(Type type);
|
||||
static std::string TypeToString(Type type);
|
||||
static std::string SemanticToString(Semantic semantic);
|
||||
|
||||
uint16_t index;
|
||||
uint16_t source;
|
||||
uint16_t offset;
|
||||
Type type;
|
||||
Semantic semantic;
|
||||
};
|
||||
typedef std::vector<VertexElement> VertexElementList;
|
||||
|
||||
/// Ogre Vertex Bone Assignment
|
||||
struct VertexBoneAssignment
|
||||
{
|
||||
uint32_t vertexIndex;
|
||||
uint16_t boneIndex;
|
||||
float weight;
|
||||
};
|
||||
typedef std::vector<VertexBoneAssignment> VertexBoneAssignmentList;
|
||||
typedef std::map<uint32_t, VertexBoneAssignmentList > VertexBoneAssignmentsMap;
|
||||
typedef std::map<uint16_t, std::vector<aiVertexWeight> > AssimpVertexBoneWeightList;
|
||||
|
||||
// Ogre Vertex Data interface, inherited by the binary and XML implementations.
|
||||
class IVertexData
|
||||
{
|
||||
public:
|
||||
IVertexData();
|
||||
|
||||
/// Returns if bone assignments are available.
|
||||
bool HasBoneAssignments() const;
|
||||
|
||||
/// Add vertex mapping from old to new index.
|
||||
void AddVertexMapping(uint32_t oldIndex, uint32_t newIndex);
|
||||
|
||||
/// Returns re-mapped bone assignments.
|
||||
/** @note Uses mappings added via AddVertexMapping. */
|
||||
AssimpVertexBoneWeightList AssimpBoneWeights(size_t vertices);
|
||||
|
||||
/// Returns a set of bone indexes that are referenced by bone assignments (weights).
|
||||
std::set<uint16_t> ReferencedBonesByWeights() const;
|
||||
|
||||
/// Vertex count.
|
||||
uint32_t count;
|
||||
|
||||
/// Bone assignments.
|
||||
VertexBoneAssignmentList boneAssignments;
|
||||
|
||||
private:
|
||||
void BoneAssignmentsForVertex(uint32_t currentIndex, uint32_t newIndex, VertexBoneAssignmentList &dest) const;
|
||||
|
||||
std::map<uint32_t, std::vector<uint32_t> > vertexIndexMapping;
|
||||
VertexBoneAssignmentsMap boneAssignmentsMap;
|
||||
};
|
||||
|
||||
// Ogre Vertex Data
|
||||
class VertexData : public IVertexData
|
||||
{
|
||||
public:
|
||||
VertexData();
|
||||
~VertexData();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
void Reset();
|
||||
|
||||
/// Get vertex size for @c source.
|
||||
uint32_t VertexSize(uint16_t source) const;
|
||||
|
||||
/// Get vertex buffer for @c source.
|
||||
MemoryStream *VertexBuffer(uint16_t source);
|
||||
|
||||
/// Get vertex element for @c semantic for @c index.
|
||||
VertexElement *GetVertexElement(VertexElement::Semantic semantic, uint16_t index = 0);
|
||||
|
||||
/// Vertex elements.
|
||||
VertexElementList vertexElements;
|
||||
|
||||
/// Vertex buffers mapped to bind index.
|
||||
VertexBufferBindings vertexBindings;
|
||||
};
|
||||
|
||||
// Ogre Index Data
|
||||
class IndexData
|
||||
{
|
||||
public:
|
||||
IndexData();
|
||||
~IndexData();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
void Reset();
|
||||
|
||||
/// Index size in bytes.
|
||||
size_t IndexSize() const;
|
||||
|
||||
/// Face size in bytes.
|
||||
size_t FaceSize() const;
|
||||
|
||||
/// Index count.
|
||||
uint32_t count;
|
||||
|
||||
/// Face count.
|
||||
uint32_t faceCount;
|
||||
|
||||
/// If has 32-bit indexes.
|
||||
bool is32bit;
|
||||
|
||||
/// Index buffer.
|
||||
MemoryStreamPtr buffer;
|
||||
};
|
||||
|
||||
/// Ogre Pose
|
||||
class Pose
|
||||
{
|
||||
public:
|
||||
struct Vertex
|
||||
{
|
||||
uint32_t index;
|
||||
aiVector3D offset;
|
||||
aiVector3D normal;
|
||||
};
|
||||
typedef std::map<uint32_t, Vertex> PoseVertexMap;
|
||||
|
||||
Pose() : target(0), hasNormals(false) {}
|
||||
|
||||
/// Name.
|
||||
std::string name;
|
||||
|
||||
/// Target.
|
||||
uint16_t target;
|
||||
|
||||
/// Does vertices map have normals.
|
||||
bool hasNormals;
|
||||
|
||||
/// Vertex offset and normals.
|
||||
PoseVertexMap vertices;
|
||||
};
|
||||
typedef std::vector<Pose*> PoseList;
|
||||
|
||||
/// Ogre Pose Key Frame Ref
|
||||
struct PoseRef
|
||||
{
|
||||
uint16_t index;
|
||||
float influence;
|
||||
};
|
||||
typedef std::vector<PoseRef> PoseRefList;
|
||||
|
||||
/// Ogre Pose Key Frame
|
||||
struct PoseKeyFrame
|
||||
{
|
||||
/// Time position in the animation.
|
||||
float timePos;
|
||||
|
||||
PoseRefList references;
|
||||
};
|
||||
typedef std::vector<PoseKeyFrame> PoseKeyFrameList;
|
||||
|
||||
/// Ogre Morph Key Frame
|
||||
struct MorphKeyFrame
|
||||
{
|
||||
/// Time position in the animation.
|
||||
float timePos;
|
||||
|
||||
MemoryStreamPtr buffer;
|
||||
};
|
||||
typedef std::vector<MorphKeyFrame> MorphKeyFrameList;
|
||||
|
||||
/// Ogre animation key frame
|
||||
struct TransformKeyFrame
|
||||
{
|
||||
TransformKeyFrame();
|
||||
|
||||
aiMatrix4x4 Transform();
|
||||
|
||||
float timePos;
|
||||
|
||||
aiQuaternion rotation;
|
||||
aiVector3D position;
|
||||
aiVector3D scale;
|
||||
};
|
||||
typedef std::vector<TransformKeyFrame> TransformKeyFrameList;
|
||||
|
||||
/// Ogre Animation Track
|
||||
struct VertexAnimationTrack
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
/// No animation
|
||||
VAT_NONE = 0,
|
||||
/// Morph animation is made up of many interpolated snapshot keyframes
|
||||
VAT_MORPH = 1,
|
||||
/// Pose animation is made up of a single delta pose keyframe
|
||||
VAT_POSE = 2,
|
||||
/// Keyframe that has its on pos, rot and scale for a time position
|
||||
VAT_TRANSFORM = 3
|
||||
};
|
||||
|
||||
VertexAnimationTrack();
|
||||
|
||||
/// Convert to Assimp node animation.
|
||||
aiNodeAnim *ConvertToAssimpAnimationNode(Skeleton *skeleton);
|
||||
|
||||
// Animation type.
|
||||
Type type;
|
||||
|
||||
/// Vertex data target.
|
||||
/** 0 == shared geometry
|
||||
>0 == submesh index + 1 */
|
||||
uint16_t target;
|
||||
|
||||
/// Only valid for VAT_TRANSFORM.
|
||||
std::string boneName;
|
||||
|
||||
/// Only one of these will contain key frames, depending on the type enum.
|
||||
PoseKeyFrameList poseKeyFrames;
|
||||
MorphKeyFrameList morphKeyFrames;
|
||||
TransformKeyFrameList transformKeyFrames;
|
||||
};
|
||||
typedef std::vector<VertexAnimationTrack> VertexAnimationTrackList;
|
||||
|
||||
/// Ogre Animation
|
||||
class Animation
|
||||
{
|
||||
public:
|
||||
Animation(Skeleton *parent);
|
||||
Animation(Mesh *parent);
|
||||
|
||||
/// Returns the associated vertex data for a track in this animation.
|
||||
/** @note Only valid to call when parent Mesh is set. */
|
||||
VertexData *AssociatedVertexData(VertexAnimationTrack *track) const;
|
||||
|
||||
/// Convert to Assimp animation.
|
||||
aiAnimation *ConvertToAssimpAnimation();
|
||||
|
||||
/// Parent mesh.
|
||||
/** @note Set only when animation is read from a mesh. */
|
||||
Mesh *parentMesh;
|
||||
|
||||
/// Parent skeleton.
|
||||
/** @note Set only when animation is read from a skeleton. */
|
||||
Skeleton *parentSkeleton;
|
||||
|
||||
/// Animation name.
|
||||
std::string name;
|
||||
|
||||
/// Base animation name.
|
||||
std::string baseName;
|
||||
|
||||
/// Length in seconds.
|
||||
float length;
|
||||
|
||||
/// Base animation key time.
|
||||
float baseTime;
|
||||
|
||||
/// Animation tracks.
|
||||
VertexAnimationTrackList tracks;
|
||||
};
|
||||
typedef std::vector<Animation*> AnimationList;
|
||||
|
||||
/// Ogre Bone
|
||||
class Bone
|
||||
{
|
||||
public:
|
||||
Bone();
|
||||
|
||||
/// Returns if this bone is parented.
|
||||
bool IsParented() const;
|
||||
|
||||
/// Parent index as uint16_t. Internally int32_t as -1 means unparented.
|
||||
uint16_t ParentId() const;
|
||||
|
||||
/// Add child bone.
|
||||
void AddChild(Bone *bone);
|
||||
|
||||
/// Calculates the world matrix for bone and its children.
|
||||
void CalculateWorldMatrixAndDefaultPose(Skeleton *skeleton);
|
||||
|
||||
/// Convert to Assimp node (animation nodes).
|
||||
aiNode *ConvertToAssimpNode(Skeleton *parent, aiNode *parentNode = 0);
|
||||
|
||||
/// Convert to Assimp bone (mesh bones).
|
||||
aiBone *ConvertToAssimpBone(Skeleton *parent, const std::vector<aiVertexWeight> &boneWeights);
|
||||
|
||||
uint16_t id;
|
||||
std::string name;
|
||||
|
||||
Bone *parent;
|
||||
int32_t parentId;
|
||||
std::vector<uint16_t> children;
|
||||
|
||||
aiVector3D position;
|
||||
aiQuaternion rotation;
|
||||
aiVector3D scale;
|
||||
|
||||
aiMatrix4x4 worldMatrix;
|
||||
aiMatrix4x4 defaultPose;
|
||||
};
|
||||
typedef std::vector<Bone*> BoneList;
|
||||
|
||||
/// Ogre Skeleton
|
||||
class Skeleton
|
||||
{
|
||||
public:
|
||||
enum BlendMode
|
||||
{
|
||||
/// Animations are applied by calculating a weighted average of all animations
|
||||
ANIMBLEND_AVERAGE = 0,
|
||||
/// Animations are applied by calculating a weighted cumulative total
|
||||
ANIMBLEND_CUMULATIVE = 1
|
||||
};
|
||||
|
||||
Skeleton();
|
||||
~Skeleton();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
void Reset();
|
||||
|
||||
/// Returns unparented root bones.
|
||||
BoneList RootBones() const;
|
||||
|
||||
/// Returns number of unparented root bones.
|
||||
size_t NumRootBones() const;
|
||||
|
||||
/// Get bone by name.
|
||||
Bone *BoneByName(const std::string &name) const;
|
||||
|
||||
/// Get bone by id.
|
||||
Bone *BoneById(uint16_t id) const;
|
||||
|
||||
BoneList bones;
|
||||
AnimationList animations;
|
||||
|
||||
/// @todo Take blend mode into account, but where?
|
||||
BlendMode blendMode;
|
||||
};
|
||||
|
||||
/// Ogre Sub Mesh interface, inherited by the binary and XML implementations.
|
||||
class ISubMesh
|
||||
{
|
||||
public:
|
||||
/// @note Full list of Ogre types, not all of them are supported and exposed to Assimp.
|
||||
enum OperationType
|
||||
{
|
||||
/// A list of points, 1 vertex per point
|
||||
OT_POINT_LIST = 1,
|
||||
/// A list of lines, 2 vertices per line
|
||||
OT_LINE_LIST = 2,
|
||||
/// A strip of connected lines, 1 vertex per line plus 1 start vertex
|
||||
OT_LINE_STRIP = 3,
|
||||
/// A list of triangles, 3 vertices per triangle
|
||||
OT_TRIANGLE_LIST = 4,
|
||||
/// A strip of triangles, 3 vertices for the first triangle, and 1 per triangle after that
|
||||
OT_TRIANGLE_STRIP = 5,
|
||||
/// A fan of triangles, 3 vertices for the first triangle, and 1 per triangle after that
|
||||
OT_TRIANGLE_FAN = 6
|
||||
};
|
||||
|
||||
ISubMesh();
|
||||
|
||||
/// SubMesh index.
|
||||
unsigned int index;
|
||||
|
||||
/// SubMesh name.
|
||||
std::string name;
|
||||
|
||||
/// Material used by this submesh.
|
||||
std::string materialRef;
|
||||
|
||||
/// Texture alias information.
|
||||
std::string textureAliasName;
|
||||
std::string textureAliasRef;
|
||||
|
||||
/// Assimp scene material index used by this submesh.
|
||||
/** -1 if no material or material could not be imported. */
|
||||
int materialIndex;
|
||||
|
||||
/// If submesh uses shared geometry from parent mesh.
|
||||
bool usesSharedVertexData;
|
||||
|
||||
/// Operation type.
|
||||
OperationType operationType;
|
||||
};
|
||||
|
||||
/// Ogre SubMesh
|
||||
class SubMesh : public ISubMesh
|
||||
{
|
||||
public:
|
||||
SubMesh();
|
||||
~SubMesh();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
/** @note Vertex and index data contains shared ptrs
|
||||
that are freed automatically. In practice the ref count
|
||||
should be 0 after this reset. */
|
||||
void Reset();
|
||||
|
||||
/// Covert to Assimp mesh.
|
||||
aiMesh *ConvertToAssimpMesh(Mesh *parent);
|
||||
|
||||
/// Vertex data.
|
||||
VertexData *vertexData;
|
||||
|
||||
/// Index data.
|
||||
IndexData *indexData;
|
||||
};
|
||||
typedef std::vector<SubMesh*> SubMeshList;
|
||||
|
||||
/// Ogre Mesh
|
||||
class Mesh
|
||||
{
|
||||
public:
|
||||
Mesh();
|
||||
~Mesh();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
void Reset();
|
||||
|
||||
/// Returns number of subMeshes.
|
||||
size_t NumSubMeshes() const;
|
||||
|
||||
/// Returns submesh for @c index.
|
||||
SubMesh *GetSubMesh(uint16_t index) const;
|
||||
|
||||
/// Convert mesh to Assimp scene.
|
||||
void ConvertToAssimpScene(aiScene* dest);
|
||||
|
||||
/// Mesh has skeletal animations.
|
||||
bool hasSkeletalAnimations;
|
||||
|
||||
/// Skeleton reference.
|
||||
std::string skeletonRef;
|
||||
|
||||
/// Skeleton.
|
||||
Skeleton *skeleton;
|
||||
|
||||
/// Vertex data
|
||||
VertexData *sharedVertexData;
|
||||
|
||||
/// Sub meshes.
|
||||
SubMeshList subMeshes;
|
||||
|
||||
/// Animations
|
||||
AnimationList animations;
|
||||
|
||||
/// Poses
|
||||
PoseList poses;
|
||||
};
|
||||
|
||||
/// Ogre XML Vertex Data
|
||||
class VertexDataXml : public IVertexData
|
||||
{
|
||||
public:
|
||||
VertexDataXml();
|
||||
|
||||
bool HasPositions() const;
|
||||
bool HasNormals() const;
|
||||
bool HasTangents() const;
|
||||
bool HasUvs() const;
|
||||
size_t NumUvs() const;
|
||||
|
||||
std::vector<aiVector3D> positions;
|
||||
std::vector<aiVector3D> normals;
|
||||
std::vector<aiVector3D> tangents;
|
||||
std::vector<std::vector<aiVector3D> > uvs;
|
||||
};
|
||||
|
||||
/// Ogre XML Index Data
|
||||
class IndexDataXml
|
||||
{
|
||||
public:
|
||||
IndexDataXml() : faceCount(0) {}
|
||||
|
||||
/// Face count.
|
||||
uint32_t faceCount;
|
||||
|
||||
std::vector<aiFace> faces;
|
||||
};
|
||||
|
||||
/// Ogre XML SubMesh
|
||||
class SubMeshXml : public ISubMesh
|
||||
{
|
||||
public:
|
||||
SubMeshXml();
|
||||
~SubMeshXml();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
void Reset();
|
||||
|
||||
aiMesh *ConvertToAssimpMesh(MeshXml *parent);
|
||||
|
||||
IndexDataXml *indexData;
|
||||
VertexDataXml *vertexData;
|
||||
};
|
||||
typedef std::vector<SubMeshXml*> SubMeshXmlList;
|
||||
|
||||
/// Ogre XML Mesh
|
||||
class MeshXml
|
||||
{
|
||||
public:
|
||||
MeshXml();
|
||||
~MeshXml();
|
||||
|
||||
/// Releases all memory that this data structure owns.
|
||||
void Reset();
|
||||
|
||||
/// Returns number of subMeshes.
|
||||
size_t NumSubMeshes() const;
|
||||
|
||||
/// Returns submesh for @c index.
|
||||
SubMeshXml *GetSubMesh(uint16_t index) const;
|
||||
|
||||
/// Convert mesh to Assimp scene.
|
||||
void ConvertToAssimpScene(aiScene* dest);
|
||||
|
||||
/// Skeleton reference.
|
||||
std::string skeletonRef;
|
||||
|
||||
/// Skeleton.
|
||||
Skeleton *skeleton;
|
||||
|
||||
/// Vertex data
|
||||
VertexDataXml *sharedVertexData;
|
||||
|
||||
/// Sub meshes.
|
||||
SubMeshXmlList subMeshes;
|
||||
};
|
||||
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
#endif // AI_OGRESTRUCTS_H_INC
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef AI_OGREXMLSERIALIZER_H_INC
|
||||
#define AI_OGREXMLSERIALIZER_H_INC
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
|
||||
#include "OgreStructs.h"
|
||||
#include "irrXMLWrapper.h"
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
namespace Ogre
|
||||
{
|
||||
|
||||
typedef irr::io::IrrXMLReader XmlReader;
|
||||
typedef boost::shared_ptr<XmlReader> XmlReaderPtr;
|
||||
|
||||
class OgreXmlSerializer
|
||||
{
|
||||
public:
|
||||
/// Imports mesh and returns the result.
|
||||
/** @note Fatal unrecoverable errors will throw a DeadlyImportError. */
|
||||
static MeshXml *ImportMesh(XmlReader *reader);
|
||||
|
||||
/// Imports skeleton to @c mesh.
|
||||
/** If mesh does not have a skeleton reference or the skeleton file
|
||||
cannot be found it is not a fatal DeadlyImportError.
|
||||
@return If skeleton import was successful. */
|
||||
static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, MeshXml *mesh);
|
||||
static bool ImportSkeleton(Assimp::IOSystem *pIOHandler, Mesh *mesh);
|
||||
|
||||
private:
|
||||
OgreXmlSerializer(XmlReader *reader) :
|
||||
m_reader(reader)
|
||||
{
|
||||
}
|
||||
|
||||
static XmlReaderPtr OpenReader(Assimp::IOSystem *pIOHandler, const std::string &filename);
|
||||
|
||||
// Mesh
|
||||
void ReadMesh(MeshXml *mesh);
|
||||
void ReadSubMesh(MeshXml *mesh);
|
||||
|
||||
void ReadGeometry(VertexDataXml *dest);
|
||||
void ReadGeometryVertexBuffer(VertexDataXml *dest);
|
||||
|
||||
void ReadBoneAssignments(VertexDataXml *dest);
|
||||
|
||||
// Skeleton
|
||||
void ReadSkeleton(Skeleton *skeleton);
|
||||
|
||||
void ReadBones(Skeleton *skeleton);
|
||||
void ReadBoneHierarchy(Skeleton *skeleton);
|
||||
|
||||
void ReadAnimations(Skeleton *skeleton);
|
||||
void ReadAnimationTracks(Animation *dest);
|
||||
void ReadAnimationKeyFrames(Animation *anim, VertexAnimationTrack *dest);
|
||||
|
||||
template<typename T>
|
||||
T ReadAttribute(const std::string &name) const;
|
||||
bool HasAttribute(const std::string &name) const;
|
||||
|
||||
std::string &NextNode();
|
||||
std::string &SkipCurrentNode();
|
||||
|
||||
bool CurrentNodeNameEquals(const std::string &name) const;
|
||||
std::string CurrentNodeName(bool forceRead = false);
|
||||
|
||||
XmlReader *m_reader;
|
||||
std::string m_currentNodeName;
|
||||
};
|
||||
|
||||
} // Ogre
|
||||
} // Assimp
|
||||
|
||||
#endif // ASSIMP_BUILD_NO_OGRE_IMPORTER
|
||||
#endif // AI_OGREXMLSERIALIZER_H_INC
|
|
@ -47,22 +47,28 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#ifndef ASSIMP_BUILD_NO_OPTIMIZEMESHES_PROCESS
|
||||
|
||||
using namespace Assimp;
|
||||
|
||||
#include "OptimizeMeshes.h"
|
||||
#include "ProcessHelper.h"
|
||||
#include "SceneCombiner.h"
|
||||
|
||||
static const unsigned int NotSet = 0xffffffff;
|
||||
static const unsigned int DeadBeef = 0xdeadbeef;
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Constructor to be privately used by Importer
|
||||
OptimizeMeshesProcess::OptimizeMeshesProcess()
|
||||
: pts (false)
|
||||
, max_verts (0xffffffff)
|
||||
, max_faces (0xffffffff)
|
||||
{}
|
||||
, max_verts( NotSet )
|
||||
, max_faces( NotSet ) {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Destructor, private as well
|
||||
OptimizeMeshesProcess::~OptimizeMeshesProcess()
|
||||
{}
|
||||
OptimizeMeshesProcess::~OptimizeMeshesProcess() {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Returns whether the processing step is present in the given flag field.
|
||||
|
@ -74,17 +80,17 @@ bool OptimizeMeshesProcess::IsActive( unsigned int pFlags) const
|
|||
// That's a serious design flaw, consider redesign.
|
||||
if( 0 != (pFlags & aiProcess_OptimizeMeshes) ) {
|
||||
pts = (0 != (pFlags & aiProcess_SortByPType));
|
||||
max_verts = (0 != (pFlags & aiProcess_SplitLargeMeshes)) ? 0xdeadbeef : max_verts;
|
||||
max_verts = ( 0 != ( pFlags & aiProcess_SplitLargeMeshes ) ) ? DeadBeef : max_verts;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Setup properties for the postprocessing step
|
||||
// Setup properties for the post-processing step
|
||||
void OptimizeMeshesProcess::SetupProperties(const Importer* pImp)
|
||||
{
|
||||
if (max_verts == 0xdeadbeef /* magic hack */) {
|
||||
if( max_verts == DeadBeef /* magic hack */ ) {
|
||||
max_faces = pImp->GetPropertyInteger(AI_CONFIG_PP_SLM_TRIANGLE_LIMIT,AI_SLM_DEFAULT_MAX_TRIANGLES);
|
||||
max_verts = pImp->GetPropertyInteger(AI_CONFIG_PP_SLM_VERTEX_LIMIT,AI_SLM_DEFAULT_MAX_VERTICES);
|
||||
}
|
||||
|
@ -104,35 +110,36 @@ void OptimizeMeshesProcess::Execute( aiScene* pScene)
|
|||
mScene = pScene;
|
||||
|
||||
// need to clear persistent members from previous runs
|
||||
merge_list.clear();
|
||||
output.clear();
|
||||
merge_list.resize( 0 );
|
||||
output.resize( 0 );
|
||||
|
||||
// ensure we have the right sizes
|
||||
merge_list.reserve(pScene->mNumMeshes);
|
||||
output.reserve(pScene->mNumMeshes);
|
||||
|
||||
// Prepare lookup tables
|
||||
meshes.resize(pScene->mNumMeshes);
|
||||
FindInstancedMeshes(pScene->mRootNode);
|
||||
if (max_verts == 0xdeadbeef) /* undo the magic hack */
|
||||
max_verts = 0xffffffff;
|
||||
if( max_verts == DeadBeef ) /* undo the magic hack */
|
||||
max_verts = NotSet;
|
||||
|
||||
// ... instanced meshes are immediately processed and added to the output list
|
||||
for (unsigned int i = 0, n = 0; i < pScene->mNumMeshes;++i) {
|
||||
meshes[i].vertex_format = GetMeshVFormatUnique(pScene->mMeshes[i]);
|
||||
|
||||
if (meshes[i].instance_cnt > 1 && meshes[i].output_id == 0xffffffff) {
|
||||
if (meshes[i].instance_cnt > 1 && meshes[i].output_id == NotSet ) {
|
||||
meshes[i].output_id = n++;
|
||||
output.push_back(mScene->mMeshes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// and process all nodes in the scenegraoh recursively
|
||||
// and process all nodes in the scenegraph recursively
|
||||
ProcessNode(pScene->mRootNode);
|
||||
if (!output.size()) {
|
||||
throw DeadlyImportError("OptimizeMeshes: No meshes remaining; there's definitely something wrong");
|
||||
}
|
||||
|
||||
meshes.clear();
|
||||
meshes.resize( 0 );
|
||||
ai_assert(output.size() <= num_old);
|
||||
|
||||
mScene->mNumMeshes = output.size();
|
||||
|
@ -142,8 +149,9 @@ void OptimizeMeshesProcess::Execute( aiScene* pScene)
|
|||
char tmp[512];
|
||||
::sprintf(tmp,"OptimizeMeshesProcess finished. Input meshes: %i, Output meshes: %i",num_old,pScene->mNumMeshes);
|
||||
DefaultLogger::get()->info(tmp);
|
||||
} else {
|
||||
DefaultLogger::get()->debug( "OptimizeMeshesProcess finished" );
|
||||
}
|
||||
else DefaultLogger::get()->debug("OptimizeMeshesProcess finished");
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
@ -157,7 +165,7 @@ void OptimizeMeshesProcess::ProcessNode( aiNode* pNode)
|
|||
im = meshes[im].output_id;
|
||||
}
|
||||
else {
|
||||
merge_list.clear();
|
||||
merge_list.resize( 0 );
|
||||
unsigned int verts = 0, faces = 0;
|
||||
|
||||
// Find meshes to merge with us
|
||||
|
@ -170,8 +178,9 @@ void OptimizeMeshesProcess::ProcessNode( aiNode* pNode)
|
|||
faces += mScene->mMeshes[am]->mNumFaces;
|
||||
|
||||
--pNode->mNumMeshes;
|
||||
for (unsigned int n = a; n < pNode->mNumMeshes; ++n)
|
||||
for( unsigned int n = a; n < pNode->mNumMeshes; ++n ) {
|
||||
pNode->mMeshes[ n ] = pNode->mMeshes[ n + 1 ];
|
||||
}
|
||||
|
||||
--a;
|
||||
}
|
||||
|
@ -184,8 +193,7 @@ void OptimizeMeshesProcess::ProcessNode( aiNode* pNode)
|
|||
aiMesh* out;
|
||||
SceneCombiner::MergeMeshes(&out,0,merge_list.begin(),merge_list.end());
|
||||
output.push_back(out);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
output.push_back(mScene->mMeshes[im]);
|
||||
}
|
||||
im = output.size()-1;
|
||||
|
@ -193,9 +201,10 @@ void OptimizeMeshesProcess::ProcessNode( aiNode* pNode)
|
|||
}
|
||||
|
||||
|
||||
for (unsigned int i = 0; i < pNode->mNumChildren; ++i)
|
||||
for( unsigned int i = 0; i < pNode->mNumChildren; ++i ) {
|
||||
ProcessNode( pNode->mChildren[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Check whether two meshes can be joined
|
||||
|
@ -206,8 +215,8 @@ bool OptimizeMeshesProcess::CanJoin ( unsigned int a, unsigned int b, unsigned i
|
|||
|
||||
aiMesh* ma = mScene->mMeshes[a], *mb = mScene->mMeshes[b];
|
||||
|
||||
if ((0xffffffff != max_verts && verts+mb->mNumVertices > max_verts) ||
|
||||
(0xffffffff != max_faces && faces+mb->mNumFaces > max_faces)) {
|
||||
if ((NotSet != max_verts && verts+mb->mNumVertices > max_verts) ||
|
||||
(NotSet != max_faces && faces+mb->mNumFaces > max_faces)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -221,7 +230,7 @@ bool OptimizeMeshesProcess::CanJoin ( unsigned int a, unsigned int b, unsigned i
|
|||
return false;
|
||||
|
||||
// If both meshes are skinned, check whether we have many bones defined in both meshes.
|
||||
// If yes, we can savely join them.
|
||||
// If yes, we can join them.
|
||||
if (ma->HasBones()) {
|
||||
// TODO
|
||||
return false;
|
||||
|
@ -230,14 +239,18 @@ bool OptimizeMeshesProcess::CanJoin ( unsigned int a, unsigned int b, unsigned i
|
|||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Buidl a LUT of all instanced meshes
|
||||
// Build a LUT of all instanced meshes
|
||||
void OptimizeMeshesProcess::FindInstancedMeshes (aiNode* pNode)
|
||||
{
|
||||
for (unsigned int i = 0; i < pNode->mNumMeshes;++i)
|
||||
for( unsigned int i = 0; i < pNode->mNumMeshes; ++i ) {
|
||||
++meshes[ pNode->mMeshes[ i ] ].instance_cnt;
|
||||
|
||||
for (unsigned int i = 0; i < pNode->mNumChildren; ++i)
|
||||
FindInstancedMeshes(pNode->mChildren[i]);
|
||||
}
|
||||
|
||||
for( unsigned int i = 0; i < pNode->mNumChildren; ++i ) {
|
||||
FindInstancedMeshes( pNode->mChildren[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
#endif // !! ASSIMP_BUILD_NO_OPTIMIZEMESHES_PROCESS
|
||||
|
|
|
@ -38,6 +38,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
// TODO: refactor entire file to get rid of the "flat-copy" first approach
|
||||
// to copying structures. This easily breaks in the most unintuitive way
|
||||
// possible as new fields are added to assimp structures.
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** @file Implements Assimp::SceneCombiner. This is a smart utility
|
||||
|
@ -1194,10 +1197,53 @@ void SceneCombiner::Copy (aiNode** _dest, const aiNode* src)
|
|||
// get a flat copy
|
||||
::memcpy(dest,src,sizeof(aiNode));
|
||||
|
||||
if (src->mMetaData) {
|
||||
Copy(&dest->mMetaData, src->mMetaData);
|
||||
}
|
||||
|
||||
// and reallocate all arrays
|
||||
GetArrayCopy( dest->mMeshes, dest->mNumMeshes );
|
||||
CopyPtrArray( dest->mChildren, src->mChildren,dest->mNumChildren);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void SceneCombiner::Copy (aiMetadata** _dest, const aiMetadata* src)
|
||||
{
|
||||
ai_assert(NULL != _dest && NULL != src);
|
||||
|
||||
aiMetadata* dest = *_dest = new aiMetadata();
|
||||
dest->mNumProperties = src->mNumProperties;
|
||||
dest->mKeys = new aiString[src->mNumProperties];
|
||||
std::copy(src->mKeys, src->mKeys + src->mNumProperties, dest->mKeys);
|
||||
|
||||
dest->mValues = new aiMetadataEntry[src->mNumProperties];
|
||||
for (unsigned int i = 0; i < src->mNumProperties; ++i) {
|
||||
aiMetadataEntry& in = src->mValues[i];
|
||||
aiMetadataEntry& out = dest->mValues[i];
|
||||
out.mType = in.mType;
|
||||
switch (dest->mValues[i].mType) {
|
||||
case AI_BOOL:
|
||||
out.mData = new bool(*static_cast<bool*>(in.mData));
|
||||
break;
|
||||
case AI_INT:
|
||||
out.mData = new int(*static_cast<int*>(in.mData));
|
||||
break;
|
||||
case AI_UINT64:
|
||||
out.mData = new uint64_t(*static_cast<uint64_t*>(in.mData));
|
||||
break;
|
||||
case AI_FLOAT:
|
||||
out.mData = new float(*static_cast<float*>(in.mData));
|
||||
break;
|
||||
case AI_AISTRING:
|
||||
out.mData = new aiString(*static_cast<aiString*>(in.mData));
|
||||
break;
|
||||
case AI_AIVECTOR3D:
|
||||
out.mData = new aiVector3D(*static_cast<aiVector3D*>(in.mData));
|
||||
break;
|
||||
default:
|
||||
ai_assert(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -349,6 +349,7 @@ public:
|
|||
static void Copy (aiBone** dest, const aiBone* src);
|
||||
static void Copy (aiLight** dest, const aiLight* src);
|
||||
static void Copy (aiNodeAnim** dest, const aiNodeAnim* src);
|
||||
static void Copy (aiMetadata** dest, const aiMetadata* src);
|
||||
|
||||
// recursive, of course
|
||||
static void Copy (aiNode** dest, const aiNode* src);
|
||||
|
|
|
@ -0,0 +1,517 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
@author: Richard Steffen, 2014
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "AssimpPCH.h"
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||
#ifndef ASSIMP_BUILD_NO_XFILE_EXPORTER
|
||||
#include "XFileExporter.h"
|
||||
#include "ConvertToLHProcess.h"
|
||||
#include "Bitmap.h"
|
||||
#include "fast_atof.h"
|
||||
#include "SceneCombiner.h"
|
||||
|
||||
#include <ctime>
|
||||
#include <set>
|
||||
|
||||
using namespace Assimp;
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Worker function for exporting a scene to Collada. Prototyped and registered in Exporter.cpp
|
||||
void ExportSceneXFile(const char* pFile,IOSystem* pIOSystem, const aiScene* pScene)
|
||||
{
|
||||
std::string path = "";
|
||||
std::string file = pFile;
|
||||
|
||||
// We need to test both types of folder separators because pIOSystem->getOsSeparator() is not reliable.
|
||||
// Moreover, the path given by some applications is not even consistent with the OS specific type of separator.
|
||||
const char* end_path = std::max(strrchr(pFile, '\\'), strrchr(pFile, '/'));
|
||||
|
||||
if(end_path != NULL) {
|
||||
path = std::string(pFile, end_path + 1 - pFile);
|
||||
file = file.substr(end_path + 1 - pFile, file.npos);
|
||||
|
||||
std::size_t pos = file.find_last_of('.');
|
||||
if(pos != file.npos) {
|
||||
file = file.substr(0, pos);
|
||||
}
|
||||
}
|
||||
|
||||
// invoke the exporter
|
||||
XFileExporter iDoTheExportThing( pScene, pIOSystem, path, file);
|
||||
|
||||
// we're still here - export successfully completed. Write result to the given IOSYstem
|
||||
boost::scoped_ptr<IOStream> outfile (pIOSystem->Open(pFile,"wt"));
|
||||
if(outfile == NULL) {
|
||||
throw DeadlyExportError("could not open output .dae file: " + std::string(pFile));
|
||||
}
|
||||
|
||||
// XXX maybe use a small wrapper around IOStream that behaves like std::stringstream in order to avoid the extra copy.
|
||||
outfile->Write( iDoTheExportThing.mOutput.str().c_str(), static_cast<size_t>(iDoTheExportThing.mOutput.tellp()),1);
|
||||
}
|
||||
|
||||
} // end of namespace Assimp
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Constructor for a specific scene to export
|
||||
XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file) : mIOSystem(pIOSystem), mPath(path), mFile(file)
|
||||
{
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
mOutput.imbue( std::locale("C") );
|
||||
|
||||
mScene = pScene;
|
||||
mSceneOwned = false;
|
||||
|
||||
// set up strings
|
||||
endstr = "\n";
|
||||
|
||||
// start writing
|
||||
WriteFile();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Destructor
|
||||
XFileExporter::~XFileExporter()
|
||||
{
|
||||
if(mSceneOwned) {
|
||||
delete mScene;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Starts writing the contents
|
||||
void XFileExporter::WriteFile()
|
||||
{
|
||||
// note, that all realnumber values must be comma separated in x files
|
||||
mOutput.setf(std::ios::fixed);
|
||||
mOutput.precision(6); // precission for float
|
||||
|
||||
// entry of writing the file
|
||||
WriteHeader();
|
||||
|
||||
mOutput << startstr << "Frame DXCC_ROOT {" << endstr;
|
||||
PushTag();
|
||||
|
||||
aiMatrix4x4 I; // identity
|
||||
WriteFrameTransform(I);
|
||||
|
||||
WriteNode(mScene->mRootNode);
|
||||
PopTag();
|
||||
|
||||
mOutput << startstr << "}" << endstr;
|
||||
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Writes the asset header
|
||||
void XFileExporter::WriteHeader()
|
||||
{
|
||||
mOutput << startstr << "xof 0303txt 0032" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template Frame {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<3d82ab46-62da-11cf-ab39-0020af71e433>" << endstr;
|
||||
mOutput << startstr << "[...]" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template Matrix4x4 {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<f6f23f45-7686-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "array FLOAT matrix[16];" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template FrameTransformMatrix {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<f6f23f41-7686-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "Matrix4x4 frameMatrix;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template Vector {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<3d82ab5e-62da-11cf-ab39-0020af71e433>" << endstr;
|
||||
mOutput << startstr << "FLOAT x;" << endstr;
|
||||
mOutput << startstr << "FLOAT y;" << endstr;
|
||||
mOutput << startstr << "FLOAT z;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template MeshFace {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<3d82ab5f-62da-11cf-ab39-0020af71e433>" << endstr;
|
||||
mOutput << startstr << "DWORD nFaceVertexIndices;" << endstr;
|
||||
mOutput << startstr << "array DWORD faceVertexIndices[nFaceVertexIndices];" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template Mesh {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<3d82ab44-62da-11cf-ab39-0020af71e433>" << endstr;
|
||||
mOutput << startstr << "DWORD nVertices;" << endstr;
|
||||
mOutput << startstr << "array Vector vertices[nVertices];" << endstr;
|
||||
mOutput << startstr << "DWORD nFaces;" << endstr;
|
||||
mOutput << startstr << "array MeshFace faces[nFaces];" << endstr;
|
||||
mOutput << startstr << "[...]" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template MeshNormals {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<f6f23f43-7686-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "DWORD nNormals;" << endstr;
|
||||
mOutput << startstr << "array Vector normals[nNormals];" << endstr;
|
||||
mOutput << startstr << "DWORD nFaceNormals;" << endstr;
|
||||
mOutput << startstr << "array MeshFace faceNormals[nFaceNormals];" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template Coords2d {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<f6f23f44-7686-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "FLOAT u;" << endstr;
|
||||
mOutput << startstr << "FLOAT v;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template MeshTextureCoords {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<f6f23f40-7686-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "DWORD nTextureCoords;" << endstr;
|
||||
mOutput << startstr << "array Coords2d textureCoords[nTextureCoords];" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template ColorRGBA {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<35ff44e0-6c7c-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "FLOAT red;" << endstr;
|
||||
mOutput << startstr << "FLOAT green;" << endstr;
|
||||
mOutput << startstr << "FLOAT blue;" << endstr;
|
||||
mOutput << startstr << "FLOAT alpha;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template IndexedColor {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<1630b820-7842-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "DWORD index;" << endstr;
|
||||
mOutput << startstr << "ColorRGBA indexColor;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template MeshVertexColors {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<1630b821-7842-11cf-8f52-0040333594a3>" << endstr;
|
||||
mOutput << startstr << "DWORD nVertexColors;" << endstr;
|
||||
mOutput << startstr << "array IndexedColor vertexColors[nVertexColors];" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template VertexElement {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<f752461c-1e23-48f6-b9f8-8350850f336f>" << endstr;
|
||||
mOutput << startstr << "DWORD Type;" << endstr;
|
||||
mOutput << startstr << "DWORD Method;" << endstr;
|
||||
mOutput << startstr << "DWORD Usage;" << endstr;
|
||||
mOutput << startstr << "DWORD UsageIndex;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
mOutput << startstr << "template DeclData {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "<bf22e553-292c-4781-9fea-62bd554bdd93>" << endstr;
|
||||
mOutput << startstr << "DWORD nElements;" << endstr;
|
||||
mOutput << startstr << "array VertexElement Elements[nElements];" << endstr;
|
||||
mOutput << startstr << "DWORD nDWords;" << endstr;
|
||||
mOutput << startstr << "array DWORD data[nDWords];" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
mOutput << endstr;
|
||||
}
|
||||
|
||||
|
||||
// Writes the material setup
|
||||
void XFileExporter::WriteFrameTransform(aiMatrix4x4& m)
|
||||
{
|
||||
mOutput << startstr << "FrameTransformMatrix {" << endstr << " ";
|
||||
PushTag();
|
||||
mOutput << startstr << m.a1 << ", " << m.b1 << ", " << m.c1 << ", " << m.d1 << "," << endstr;
|
||||
mOutput << startstr << m.a2 << ", " << m.b2 << ", " << m.c2 << ", " << m.d2 << "," << endstr;
|
||||
mOutput << startstr << m.a3 << ", " << m.b3 << ", " << m.c3 << ", " << m.d3 << "," << endstr;
|
||||
mOutput << startstr << m.a4 << ", " << m.b4 << ", " << m.c4 << ", " << m.d4 << ";;" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr << endstr;
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Recursively writes the given node
|
||||
void XFileExporter::WriteNode( aiNode* pNode)
|
||||
{
|
||||
if (pNode->mName.length==0)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << "Node_" << pNode;
|
||||
pNode->mName.Set(ss.str());
|
||||
}
|
||||
mOutput << startstr << "Frame " << pNode->mName.C_Str() << " {" << endstr;
|
||||
|
||||
PushTag();
|
||||
|
||||
aiMatrix4x4 m = pNode->mTransformation;
|
||||
|
||||
WriteFrameTransform(m);
|
||||
|
||||
for (size_t i = 0; i < pNode->mNumMeshes; i++)
|
||||
WriteMesh(mScene->mMeshes[pNode->mMeshes[i]]);
|
||||
|
||||
// recursive call the Nodes
|
||||
for (size_t a = 0; a < pNode->mNumChildren; a++)
|
||||
WriteNode( mScene->mRootNode->mChildren[a]);
|
||||
|
||||
PopTag();
|
||||
|
||||
mOutput << startstr << "}" << endstr << endstr;
|
||||
}
|
||||
|
||||
void XFileExporter::WriteMesh(const aiMesh* mesh)
|
||||
{
|
||||
mOutput << startstr << "Mesh " << mesh->mName.C_Str() << "_mShape" << " {" << endstr;
|
||||
|
||||
PushTag();
|
||||
|
||||
// write all the vertices
|
||||
mOutput << startstr << mesh->mNumVertices << ";" << endstr;
|
||||
for (size_t a = 0; a < mesh->mNumVertices; a++)
|
||||
{
|
||||
aiVector3D &v = mesh->mVertices[a];
|
||||
mOutput << startstr << v[0] << ";"<< v[1] << ";" << v[2] << ";";
|
||||
if (a < mesh->mNumVertices - 1)
|
||||
mOutput << "," << endstr;
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
|
||||
// write all the faces
|
||||
mOutput << startstr << mesh->mNumFaces << ";" << endstr;
|
||||
for( size_t a = 0; a < mesh->mNumFaces; ++a )
|
||||
{
|
||||
const aiFace& face = mesh->mFaces[a];
|
||||
mOutput << startstr << face.mNumIndices << ";";
|
||||
// must be counter clockwise triangle
|
||||
//for(int b = face.mNumIndices - 1; b >= 0 ; --b)
|
||||
for(size_t b = 0; b < face.mNumIndices ; ++b)
|
||||
{
|
||||
mOutput << face.mIndices[b];
|
||||
//if (b > 0)
|
||||
if (b<face.mNumIndices-1)
|
||||
mOutput << ",";
|
||||
else
|
||||
mOutput << ";";
|
||||
}
|
||||
|
||||
if (a < mesh->mNumFaces - 1)
|
||||
mOutput << "," << endstr;
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
|
||||
mOutput << endstr;
|
||||
|
||||
if (mesh->HasTextureCoords(0))
|
||||
{
|
||||
const aiMaterial* mat = mScene->mMaterials[mesh->mMaterialIndex];
|
||||
aiString relpath;
|
||||
mat->Get(_AI_MATKEY_TEXTURE_BASE, aiTextureType_DIFFUSE, 0, relpath);
|
||||
|
||||
mOutput << startstr << "MeshMaterialList {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "1;" << endstr; // number of materials
|
||||
mOutput << startstr << mesh->mNumFaces << ";" << endstr; // number of faces
|
||||
mOutput << startstr;
|
||||
for( size_t a = 0; a < mesh->mNumFaces; ++a )
|
||||
{
|
||||
mOutput << "0"; // the material index
|
||||
if (a < mesh->mNumFaces - 1)
|
||||
mOutput << ", ";
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
mOutput << startstr << "Material {" << endstr;
|
||||
PushTag();
|
||||
mOutput << startstr << "1.0; 1.0; 1.0; 1.000000;;" << endstr;
|
||||
mOutput << startstr << "1.000000;" << endstr; // power
|
||||
mOutput << startstr << "0.000000; 0.000000; 0.000000;;" << endstr; // specularity
|
||||
mOutput << startstr << "0.000000; 0.000000; 0.000000;;" << endstr; // emission
|
||||
mOutput << startstr << "TextureFilename { \"";
|
||||
|
||||
writePath(relpath);
|
||||
|
||||
mOutput << "\"; }" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr;
|
||||
}
|
||||
|
||||
// write normals (every vertex has one)
|
||||
if (mesh->HasNormals())
|
||||
{
|
||||
mOutput << endstr << startstr << "MeshNormals {" << endstr;
|
||||
mOutput << startstr << mesh->mNumVertices << ";" << endstr;
|
||||
for (size_t a = 0; a < mesh->mNumVertices; a++)
|
||||
{
|
||||
aiVector3D &v = mesh->mNormals[a];
|
||||
// because we have a LHS and also changed wth winding, we need to invert the normals again
|
||||
mOutput << startstr << -v[0] << ";"<< -v[1] << ";" << -v[2] << ";";
|
||||
if (a < mesh->mNumVertices - 1)
|
||||
mOutput << "," << endstr;
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
|
||||
mOutput << startstr << mesh->mNumFaces << ";" << endstr;
|
||||
for (size_t a = 0; a < mesh->mNumFaces; a++)
|
||||
{
|
||||
const aiFace& face = mesh->mFaces[a];
|
||||
mOutput << startstr << face.mNumIndices << ";";
|
||||
|
||||
//for(int b = face.mNumIndices-1; b >= 0 ; --b)
|
||||
for(size_t b = 0; b < face.mNumIndices ; ++b)
|
||||
{
|
||||
mOutput << face.mIndices[b];
|
||||
//if (b > 0)
|
||||
if (b<face.mNumIndices-1)
|
||||
mOutput << ",";
|
||||
else
|
||||
mOutput << ";";
|
||||
}
|
||||
|
||||
if (a < mesh->mNumFaces-1)
|
||||
mOutput << "," << endstr;
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
mOutput << startstr << "}" << endstr;
|
||||
}
|
||||
|
||||
// write texture UVs if available
|
||||
if (mesh->HasTextureCoords(0))
|
||||
{
|
||||
mOutput << endstr << startstr << "MeshTextureCoords {" << endstr;
|
||||
mOutput << startstr << mesh->mNumVertices << ";" << endstr;
|
||||
for (size_t a = 0; a < mesh->mNumVertices; a++)
|
||||
//for (int a = (int)mesh->mNumVertices-1; a >=0 ; a--)
|
||||
{
|
||||
aiVector3D& uv = mesh->mTextureCoords[0][a]; // uv of first uv layer for the vertex
|
||||
mOutput << startstr << uv.x << ";" << uv.y;
|
||||
if (a < mesh->mNumVertices-1)
|
||||
//if (a >0 )
|
||||
mOutput << ";," << endstr;
|
||||
else
|
||||
mOutput << ";;" << endstr;
|
||||
}
|
||||
mOutput << startstr << "}" << endstr;
|
||||
}
|
||||
|
||||
// write color channel if available
|
||||
if (mesh->HasVertexColors(0))
|
||||
{
|
||||
mOutput << endstr << startstr << "MeshVertexColors {" << endstr;
|
||||
mOutput << startstr << mesh->mNumVertices << ";" << endstr;
|
||||
for (size_t a = 0; a < mesh->mNumVertices; a++)
|
||||
{
|
||||
aiColor4D& mColors = mesh->mColors[0][a]; // color of first vertex color set for the vertex
|
||||
mOutput << startstr << a << ";" << mColors.r << ";" << mColors.g << ";" << mColors.b << ";" << mColors.a << ";;";
|
||||
if (a < mesh->mNumVertices-1)
|
||||
mOutput << "," << endstr;
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
mOutput << startstr << "}" << endstr;
|
||||
}
|
||||
/*
|
||||
else
|
||||
{
|
||||
mOutput << endstr << startstr << "MeshVertexColors {" << endstr;
|
||||
mOutput << startstr << mesh->mNumVertices << ";" << endstr;
|
||||
for (size_t a = 0; a < mesh->mNumVertices; a++)
|
||||
{
|
||||
aiColor4D* mColors = mesh->mColors[a];
|
||||
mOutput << startstr << a << ";0.500000;0.000000;0.000000;0.500000;;";
|
||||
if (a < mesh->mNumVertices-1)
|
||||
mOutput << "," << endstr;
|
||||
else
|
||||
mOutput << ";" << endstr;
|
||||
}
|
||||
mOutput << startstr << "}" << endstr;
|
||||
}
|
||||
*/
|
||||
PopTag();
|
||||
mOutput << startstr << "}" << endstr << endstr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void XFileExporter::writePath(aiString path)
|
||||
{
|
||||
std::string str = std::string(path.C_Str());
|
||||
BaseImporter::ConvertUTF8toISO8859_1(str);
|
||||
|
||||
while( str.find( "\\\\") != std::string::npos)
|
||||
str.replace( str.find( "\\\\"), 2, "\\");
|
||||
|
||||
while( str.find( "\\") != std::string::npos)
|
||||
str.replace( str.find( "\\"), 1, "/");
|
||||
|
||||
mOutput << str;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2012, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software 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.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
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.
|
||||
|
||||
@author: Richard Steffen, 2014
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** @file XFileExporter.h
|
||||
* Declares the exporter class to write a scene to a Collada file
|
||||
*/
|
||||
#ifndef AI_XFILEEXPORTER_H_INC
|
||||
#define AI_XFILEEXPORTER_H_INC
|
||||
|
||||
#include "../include/assimp/ai_assert.h"
|
||||
#include <sstream>
|
||||
|
||||
struct aiScene;
|
||||
struct aiNode;
|
||||
|
||||
namespace Assimp
|
||||
{
|
||||
|
||||
/// Helper class to export a given scene to a X-file.
|
||||
/// Note: an xFile uses a left hand system. Assimp used a right hand system (OpenGL), therefore we have to transform everything
|
||||
class XFileExporter
|
||||
{
|
||||
public:
|
||||
/// Constructor for a specific scene to export
|
||||
XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file);
|
||||
|
||||
/// Destructor
|
||||
virtual ~XFileExporter();
|
||||
|
||||
protected:
|
||||
/// Starts writing the contents
|
||||
void WriteFile();
|
||||
|
||||
/// Writes the asset header
|
||||
void WriteHeader();
|
||||
|
||||
/// write a frame transform
|
||||
void WriteFrameTransform(aiMatrix4x4& m);
|
||||
|
||||
/// Recursively writes the given node
|
||||
void WriteNode( aiNode* pNode );
|
||||
|
||||
/// write a mesh entry of the scene
|
||||
void WriteMesh(const aiMesh* mesh);
|
||||
|
||||
/// Enters a new xml element, which increases the indentation
|
||||
void PushTag() { startstr.append( " "); }
|
||||
|
||||
/// Leaves an element, decreasing the indentation
|
||||
void PopTag() { ai_assert( startstr.length() > 1); startstr.erase( startstr.length() - 2); }
|
||||
|
||||
public:
|
||||
/// Stringstream to write all output into
|
||||
std::stringstream mOutput;
|
||||
|
||||
protected:
|
||||
|
||||
/// write a path
|
||||
void writePath(aiString path);
|
||||
|
||||
/// The IOSystem for output
|
||||
IOSystem* mIOSystem;
|
||||
|
||||
/// Path of the directory where the scene will be exported
|
||||
const std::string mPath;
|
||||
|
||||
/// Name of the file (without extension) where the scene will be exported
|
||||
const std::string mFile;
|
||||
|
||||
/// The scene to be written
|
||||
const aiScene* mScene;
|
||||
bool mSceneOwned;
|
||||
|
||||
/// current line start string, contains the current indentation for simple stream insertion
|
||||
std::string startstr;
|
||||
|
||||
/// current line end string for simple stream insertion
|
||||
std::string endstr;
|
||||
|
||||
protected:
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // !! AI_XFILEEXPORTER_H_INC
|
Binary file not shown.
Binary file not shown.
1622
doc/Doxyfile
1622
doc/Doxyfile
File diff suppressed because it is too large
Load Diff
2124
doc/Doxyfile_Cmd
2124
doc/Doxyfile_Cmd
File diff suppressed because it is too large
Load Diff
445
doc/style.css
445
doc/style.css
|
@ -1,445 +0,0 @@
|
|||
body, table, div, p, dl {
|
||||
font-family: Verdana, Geneva, Arial, sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* @group Heading Levels */
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
font-size: 160%;
|
||||
color: black;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
caption {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.qindex, div.navtab{
|
||||
background-color: #e8eef2;
|
||||
border: 1px solid #84b0c7;
|
||||
text-align: center;
|
||||
margin: 2px;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
div.qindex, div.navpath {
|
||||
width: 100%;
|
||||
line-height: 140%;
|
||||
}
|
||||
|
||||
div.navtab {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
/* @group Link Styling */
|
||||
|
||||
a {
|
||||
color: #153788;
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.contents a:visited {
|
||||
color: #1b77c5;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a.qindex {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a.qindexHL {
|
||||
font-weight: bold;
|
||||
background-color: #6666cc;
|
||||
color: #ffffff;
|
||||
border: 1px double #9295C2;
|
||||
}
|
||||
|
||||
.contents a.qindexHL:visited {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
a.el {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a.elRef {
|
||||
}
|
||||
|
||||
a.code {
|
||||
}
|
||||
|
||||
a.codeRef {
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
dl.el {
|
||||
margin-left: -1cm;
|
||||
}
|
||||
|
||||
.fragment {
|
||||
font-family: monospace, fixed;
|
||||
font-size: 105%;
|
||||
}
|
||||
|
||||
pre.fragment {
|
||||
border: 1px solid #CCCCCC;
|
||||
background-color: #f5f5f5;
|
||||
padding: 4px 6px;
|
||||
margin: 4px 8px 4px 2px;
|
||||
}
|
||||
|
||||
div.ah {
|
||||
background-color: black;
|
||||
font-weight: bold;
|
||||
color: #ffffff;
|
||||
margin-bottom: 3px;
|
||||
margin-top: 3px
|
||||
}
|
||||
|
||||
div.groupHeader {
|
||||
margin-left: 16px;
|
||||
margin-top: 12px;
|
||||
margin-bottom: 6px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.groupText {
|
||||
margin-left: 16px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
body {
|
||||
background: white;
|
||||
color: #252525;
|
||||
margin-right: 20px;
|
||||
margin-left: 20px;
|
||||
margin: 20px;
|
||||
}
|
||||
|
||||
td.indexkey {
|
||||
background-color: #e8eef2;
|
||||
font-weight: bold;
|
||||
border: 1px solid #CCCCCC;
|
||||
margin: 2px 0px 2px 0;
|
||||
padding: 2px 10px;
|
||||
}
|
||||
|
||||
td.indexvalue {
|
||||
background-color: #e8eef2;
|
||||
border: 1px solid #CCCCCC;
|
||||
padding: 2px 10px;
|
||||
margin: 2px 0px;
|
||||
}
|
||||
|
||||
tr.memlist {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
p.formulaDsp {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
img.formulaDsp {
|
||||
|
||||
}
|
||||
|
||||
img.formulaInl {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* @group Code Colorization */
|
||||
|
||||
span.keyword {
|
||||
color: #008000
|
||||
}
|
||||
|
||||
span.keywordtype {
|
||||
color: #604020
|
||||
}
|
||||
|
||||
span.keywordflow {
|
||||
color: #e08000
|
||||
}
|
||||
|
||||
span.comment {
|
||||
color: #800000
|
||||
}
|
||||
|
||||
span.preprocessor {
|
||||
color: #806020
|
||||
}
|
||||
|
||||
span.stringliteral {
|
||||
color: #002080
|
||||
}
|
||||
|
||||
span.charliteral {
|
||||
color: #008080
|
||||
}
|
||||
|
||||
span.vhdldigit {
|
||||
color: #ff00ff
|
||||
}
|
||||
|
||||
span.vhdlchar {
|
||||
color: #000000
|
||||
}
|
||||
|
||||
span.vhdlkeyword {
|
||||
color: #700070
|
||||
}
|
||||
|
||||
span.vhdllogic {
|
||||
color: #ff0000
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
.search {
|
||||
color: #003399;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
form.search {
|
||||
margin-bottom: 0px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
input.search {
|
||||
font-size: 75%;
|
||||
color: #000080;
|
||||
font-weight: normal;
|
||||
background-color: #e8eef2;
|
||||
}
|
||||
|
||||
td.tiny {
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
.dirtab {
|
||||
padding: 4px;
|
||||
border-collapse: collapse;
|
||||
border: 1px solid #84b0c7;
|
||||
}
|
||||
|
||||
th.dirtab {
|
||||
background: #e8eef2;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
hr {
|
||||
height: 0;
|
||||
border: none;
|
||||
border-top: 1px solid #666;
|
||||
}
|
||||
|
||||
/* @group Member Descriptions */
|
||||
|
||||
.mdescLeft, .mdescRight,
|
||||
.memItemLeft, .memItemRight,
|
||||
.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
|
||||
background-color: #FAFAFA;
|
||||
border: none;
|
||||
margin: 4px;
|
||||
padding: 1px 0 0 8px;
|
||||
}
|
||||
|
||||
.mdescLeft, .mdescRight {
|
||||
padding: 0px 8px 4px 8px;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.memItemLeft, .memItemRight, .memTemplParams {
|
||||
border-top: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.memTemplParams {
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Member Details */
|
||||
|
||||
/* Styles for detailed member documentation */
|
||||
|
||||
.memtemplate {
|
||||
font-size: 80%;
|
||||
color: #606060;
|
||||
font-weight: normal;
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.memnav {
|
||||
background-color: #e8eef2;
|
||||
border: 1px solid #84b0c7;
|
||||
text-align: center;
|
||||
margin: 2px;
|
||||
margin-right: 15px;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.memitem {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.memname {
|
||||
white-space: nowrap;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.memproto, .memdoc {
|
||||
border: 1px solid #84b0c7;
|
||||
}
|
||||
|
||||
.memproto {
|
||||
padding: 0;
|
||||
background-color: #d5e1e8;
|
||||
font-weight: bold;
|
||||
-webkit-border-top-left-radius: 8px;
|
||||
-webkit-border-top-right-radius: 8px;
|
||||
-moz-border-radius-topleft: 8px;
|
||||
-moz-border-radius-topright: 8px;
|
||||
}
|
||||
|
||||
.memdoc {
|
||||
padding: 2px 5px;
|
||||
background-color: #eef3f5;
|
||||
border-top-width: 0;
|
||||
-webkit-border-bottom-left-radius: 8px;
|
||||
-webkit-border-bottom-right-radius: 8px;
|
||||
-moz-border-radius-bottomleft: 8px;
|
||||
-moz-border-radius-bottomright: 8px;
|
||||
}
|
||||
|
||||
.paramkey {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.paramtype {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.paramname {
|
||||
color: #602020;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.paramname em {
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
/* @group Directory (tree) */
|
||||
|
||||
/* for the tree view */
|
||||
|
||||
.ftvtree {
|
||||
font-family: sans-serif;
|
||||
margin: 0.5em;
|
||||
}
|
||||
|
||||
/* these are for tree view when used as main index */
|
||||
|
||||
.directory {
|
||||
font-size: 9pt;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.directory h3 {
|
||||
margin: 0px;
|
||||
margin-top: 1em;
|
||||
font-size: 11pt;
|
||||
}
|
||||
|
||||
/*
|
||||
The following two styles can be used to replace the root node title
|
||||
with an image of your choice. Simply uncomment the next two styles,
|
||||
specify the name of your image and be sure to set 'height' to the
|
||||
proper pixel height of your image.
|
||||
*/
|
||||
|
||||
/*
|
||||
.directory h3.swap {
|
||||
height: 61px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url("yourimage.gif");
|
||||
}
|
||||
.directory h3.swap span {
|
||||
display: none;
|
||||
}
|
||||
*/
|
||||
|
||||
.directory > h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.directory p {
|
||||
margin: 0px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.directory div {
|
||||
display: none;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.directory img {
|
||||
vertical-align: -30%;
|
||||
}
|
||||
|
||||
/* these are for tree view when not used as main index */
|
||||
|
||||
.directory-alt {
|
||||
font-size: 100%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.directory-alt h3 {
|
||||
margin: 0px;
|
||||
margin-top: 1em;
|
||||
font-size: 11pt;
|
||||
}
|
||||
|
||||
.directory-alt > h3 {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.directory-alt p {
|
||||
margin: 0px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.directory-alt div {
|
||||
display: none;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.directory-alt img {
|
||||
vertical-align: -30%;
|
||||
}
|
||||
|
||||
/* @end */
|
||||
|
||||
address {
|
||||
font-style: normal;
|
||||
color: #333;
|
||||
}
|
|
@ -251,7 +251,11 @@ public:
|
|||
// -------------------------------------------------------------------
|
||||
/** Returns the number of export file formats available in the current
|
||||
* Assimp build. Use #Exporter::GetExportFormatDescription to
|
||||
* retrieve infos of a specific export format */
|
||||
* retrieve infos of a specific export format.
|
||||
*
|
||||
* This includes built-in exporters as well as exporters registered
|
||||
* using #RegisterExporter.
|
||||
**/
|
||||
size_t GetExportFormatCount() const;
|
||||
|
||||
|
||||
|
@ -259,6 +263,12 @@ public:
|
|||
/** Returns a description of the nth export file format. Use #
|
||||
* #Exporter::GetExportFormatCount to learn how many export
|
||||
* formats are supported.
|
||||
*
|
||||
* The returned pointer is of static storage duration iff the
|
||||
* pIndex pertains to a built-in exporter (i.e. one not registered
|
||||
* via #RegistrerExporter). It is restricted to the life-time of the
|
||||
* #Exporter instance otherwise.
|
||||
*
|
||||
* @param pIndex Index of the export format to retrieve information
|
||||
* for. Valid range is 0 to #Exporter::GetExportFormatCount
|
||||
* @return A description of that specific export format.
|
||||
|
@ -269,7 +279,9 @@ public:
|
|||
// -------------------------------------------------------------------
|
||||
/** Register a custom exporter. Custom export formats are limited to
|
||||
* to the current #Exporter instance and do not affect the
|
||||
* library globally.
|
||||
* library globally. The indexes under which the format's
|
||||
* export format description can be queried are assigned
|
||||
* monotonously.
|
||||
* @param desc Exporter description.
|
||||
* @return aiReturn_SUCCESS if the export format was successfully
|
||||
* registered. A common cause that would prevent an exporter
|
||||
|
|
|
@ -84,8 +84,8 @@ public:
|
|||
* @param rotation The rotation as a hamilton quaternion
|
||||
* @param position The position for the x,y,z axes
|
||||
*/
|
||||
aiMatrix4x4t(aiVector3t<TReal>& scaling, aiQuaterniont<TReal>& rotation,
|
||||
aiVector3t<TReal>& position);
|
||||
aiMatrix4x4t(const aiVector3t<TReal>& scaling, const aiQuaterniont<TReal>& rotation,
|
||||
const aiVector3t<TReal>& position);
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ inline aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiMatrix3x3t<TReal>& m)
|
|||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>::aiMatrix4x4t (aiVector3t<TReal>& scaling, aiQuaterniont<TReal>& rotation, aiVector3t<TReal>& position)
|
||||
inline aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiVector3t<TReal>& scaling, const aiQuaterniont<TReal>& rotation, const aiVector3t<TReal>& position)
|
||||
{
|
||||
// build a 3x3 rotation matrix
|
||||
aiMatrix3x3t<TReal> m = rotation.GetMatrix();
|
||||
|
|
|
@ -48,7 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include <assert.h>
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER <= 1500)
|
||||
#include "pstdint.h"
|
||||
#include "Compiler/pstdint.h"
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
|
|
@ -55,7 +55,7 @@ template <typename TReal>
|
|||
class aiQuaterniont
|
||||
{
|
||||
public:
|
||||
aiQuaterniont() : w(), x(), y(), z() {}
|
||||
aiQuaterniont() : w(1.0), x(), y(), z() {}
|
||||
aiQuaterniont(TReal pw, TReal px, TReal py, TReal pz)
|
||||
: w(pw), x(px), y(py), z(pz) {}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ INCLUDE_DIRECTORIES(
|
|||
LINK_DIRECTORIES(
|
||||
${Assimp_BINARY_DIR}
|
||||
${Assimp_BINARY_DIR}/lib/
|
||||
${Assimp_SOURCE_DIR}/samples/DevIL/lib/
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE( assimp_simpletexturedogl WIN32
|
||||
|
|
|
@ -1,316 +0,0 @@
|
|||
<skeleton>
|
||||
<bones>
|
||||
<bone id="1" name="Unten">
|
||||
<position x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotation angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="0" name="Oben">
|
||||
<position x="0.000000" y="1.900000" z="0.000000"/>
|
||||
<rotation angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
</bones>
|
||||
<bonehierarchy>
|
||||
<boneparent bone="Oben" parent="Unten" />
|
||||
</bonehierarchy>
|
||||
<animations>
|
||||
<animation name="Winken" length="1.600000">
|
||||
<tracks>
|
||||
<track bone="Oben">
|
||||
<keyframes>
|
||||
<keyframe time="0.000000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.040000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.158026">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.080000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.349055">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.120000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.567840">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.160000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.800710">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.200000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.026944">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.240000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.225277">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.280000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.381198">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.320000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.489394">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.360000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.551204">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.400000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.570796">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.440000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.559713">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.480000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.525461">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.520000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.465579">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.560000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.376290">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.600000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.252558">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.640000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.088552">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.680000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.879007">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.720000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.622084">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.760000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.323567">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.800000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.840000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.323568">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.880000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.622084">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.920000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.879007">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.960000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.088552">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.000000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.252558">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.040000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.376290">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.080000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.465579">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.120000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.525460">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.160000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.559713">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.200000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.570796">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.240000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.551204">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.280000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.489394">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.320000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.381198">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.360000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.225277">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.400000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="1.026944">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.440000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.800710">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.480000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.567840">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.520000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.349055">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.560000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.158026">
|
||||
<axis x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.600000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
</tracks>
|
||||
</animation>
|
||||
</animations>
|
||||
</skeleton>
|
|
@ -1,259 +0,0 @@
|
|||
<mesh>
|
||||
<submeshes>
|
||||
<submesh material="Material" usesharedvertices="false">
|
||||
<faces count="28">
|
||||
<face v1="0" v2="1" v3="2"/>
|
||||
<face v1="0" v2="2" v3="3"/>
|
||||
<face v1="4" v2="5" v3="7"/>
|
||||
<face v1="5" v2="6" v3="7"/>
|
||||
<face v1="8" v2="9" v3="11"/>
|
||||
<face v1="9" v2="10" v3="11"/>
|
||||
<face v1="12" v2="13" v3="15"/>
|
||||
<face v1="13" v2="14" v3="15"/>
|
||||
<face v1="16" v2="17" v3="18"/>
|
||||
<face v1="16" v2="18" v3="19"/>
|
||||
<face v1="5" v2="4" v3="21"/>
|
||||
<face v1="4" v2="20" v3="21"/>
|
||||
<face v1="19" v2="18" v3="23"/>
|
||||
<face v1="18" v2="22" v3="23"/>
|
||||
<face v1="9" v2="8" v3="24"/>
|
||||
<face v1="9" v2="24" v3="25"/>
|
||||
<face v1="0" v2="3" v3="27"/>
|
||||
<face v1="3" v2="26" v3="27"/>
|
||||
<face v1="27" v2="26" v3="29"/>
|
||||
<face v1="26" v2="28" v3="29"/>
|
||||
<face v1="25" v2="24" v3="30"/>
|
||||
<face v1="25" v2="30" v3="31"/>
|
||||
<face v1="23" v2="22" v3="32"/>
|
||||
<face v1="23" v2="32" v3="33"/>
|
||||
<face v1="21" v2="20" v3="35"/>
|
||||
<face v1="20" v2="34" v3="35"/>
|
||||
<face v1="36" v2="37" v3="39"/>
|
||||
<face v1="37" v2="38" v3="39"/>
|
||||
</faces>
|
||||
<geometry vertexcount="40">
|
||||
<vertexbuffer positions="true" normals="true">
|
||||
<vertex>
|
||||
<position x="1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="0.999999" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="0.999999" z="1.000000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="3.000000" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="-1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="3.000000" z="-1.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="3.000000" z="1.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="3.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="5.000000" z="-0.999999"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="5.000000" z="-0.999999"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="5.000000" z="-0.999999"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="5.000000" z="1.000001"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="5.000000" z="1.000001"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="5.000000" z="-0.999999"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="5.000000" z="1.000001"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="5.000000" z="1.000001"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="5.000000" z="1.000001"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="5.000000" z="-0.999999"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="5.000000" z="-0.999999"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="5.000000" z="1.000001"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
</vertexbuffer>
|
||||
</geometry>
|
||||
<boneassignments>
|
||||
<vertexboneassignment vertexindex="0" boneindex="1" weight="0.906643"/>
|
||||
<vertexboneassignment vertexindex="0" boneindex="0" weight="0.093356"/>
|
||||
<vertexboneassignment vertexindex="1" boneindex="1" weight="0.980516"/>
|
||||
<vertexboneassignment vertexindex="2" boneindex="1" weight="0.980662"/>
|
||||
<vertexboneassignment vertexindex="3" boneindex="1" weight="0.906108"/>
|
||||
<vertexboneassignment vertexindex="3" boneindex="0" weight="0.093892"/>
|
||||
<vertexboneassignment vertexindex="4" boneindex="1" weight="0.907323"/>
|
||||
<vertexboneassignment vertexindex="4" boneindex="0" weight="0.092677"/>
|
||||
<vertexboneassignment vertexindex="5" boneindex="1" weight="0.907298"/>
|
||||
<vertexboneassignment vertexindex="5" boneindex="0" weight="0.092702"/>
|
||||
<vertexboneassignment vertexindex="6" boneindex="1" weight="0.980827"/>
|
||||
<vertexboneassignment vertexindex="7" boneindex="1" weight="0.980624"/>
|
||||
<vertexboneassignment vertexindex="8" boneindex="1" weight="0.906643"/>
|
||||
<vertexboneassignment vertexindex="8" boneindex="0" weight="0.093356"/>
|
||||
<vertexboneassignment vertexindex="9" boneindex="1" weight="0.907323"/>
|
||||
<vertexboneassignment vertexindex="9" boneindex="0" weight="0.092677"/>
|
||||
<vertexboneassignment vertexindex="10" boneindex="1" weight="0.980624"/>
|
||||
<vertexboneassignment vertexindex="11" boneindex="1" weight="0.980516"/>
|
||||
<vertexboneassignment vertexindex="12" boneindex="1" weight="0.980516"/>
|
||||
<vertexboneassignment vertexindex="13" boneindex="1" weight="0.980624"/>
|
||||
<vertexboneassignment vertexindex="14" boneindex="1" weight="0.980827"/>
|
||||
<vertexboneassignment vertexindex="15" boneindex="1" weight="0.980662"/>
|
||||
<vertexboneassignment vertexindex="16" boneindex="1" weight="0.980662"/>
|
||||
<vertexboneassignment vertexindex="17" boneindex="1" weight="0.980827"/>
|
||||
<vertexboneassignment vertexindex="18" boneindex="1" weight="0.907298"/>
|
||||
<vertexboneassignment vertexindex="18" boneindex="0" weight="0.092702"/>
|
||||
<vertexboneassignment vertexindex="19" boneindex="1" weight="0.906108"/>
|
||||
<vertexboneassignment vertexindex="19" boneindex="0" weight="0.093892"/>
|
||||
<vertexboneassignment vertexindex="20" boneindex="1" weight="0.092568"/>
|
||||
<vertexboneassignment vertexindex="20" boneindex="0" weight="0.907432"/>
|
||||
<vertexboneassignment vertexindex="21" boneindex="1" weight="0.092574"/>
|
||||
<vertexboneassignment vertexindex="21" boneindex="0" weight="0.907426"/>
|
||||
<vertexboneassignment vertexindex="22" boneindex="1" weight="0.092574"/>
|
||||
<vertexboneassignment vertexindex="22" boneindex="0" weight="0.907426"/>
|
||||
<vertexboneassignment vertexindex="23" boneindex="1" weight="0.092465"/>
|
||||
<vertexboneassignment vertexindex="23" boneindex="0" weight="0.907535"/>
|
||||
<vertexboneassignment vertexindex="24" boneindex="1" weight="0.092519"/>
|
||||
<vertexboneassignment vertexindex="24" boneindex="0" weight="0.907481"/>
|
||||
<vertexboneassignment vertexindex="25" boneindex="1" weight="0.092568"/>
|
||||
<vertexboneassignment vertexindex="25" boneindex="0" weight="0.907432"/>
|
||||
<vertexboneassignment vertexindex="26" boneindex="1" weight="0.092465"/>
|
||||
<vertexboneassignment vertexindex="26" boneindex="0" weight="0.907535"/>
|
||||
<vertexboneassignment vertexindex="27" boneindex="1" weight="0.092519"/>
|
||||
<vertexboneassignment vertexindex="27" boneindex="0" weight="0.907481"/>
|
||||
<vertexboneassignment vertexindex="28" boneindex="0" weight="0.980879"/>
|
||||
<vertexboneassignment vertexindex="29" boneindex="0" weight="0.980707"/>
|
||||
<vertexboneassignment vertexindex="30" boneindex="0" weight="0.980707"/>
|
||||
<vertexboneassignment vertexindex="31" boneindex="0" weight="0.980864"/>
|
||||
<vertexboneassignment vertexindex="32" boneindex="0" weight="0.980699"/>
|
||||
<vertexboneassignment vertexindex="33" boneindex="0" weight="0.980879"/>
|
||||
<vertexboneassignment vertexindex="34" boneindex="0" weight="0.980864"/>
|
||||
<vertexboneassignment vertexindex="35" boneindex="0" weight="0.980699"/>
|
||||
<vertexboneassignment vertexindex="36" boneindex="0" weight="0.980864"/>
|
||||
<vertexboneassignment vertexindex="37" boneindex="0" weight="0.980707"/>
|
||||
<vertexboneassignment vertexindex="38" boneindex="0" weight="0.980879"/>
|
||||
<vertexboneassignment vertexindex="39" boneindex="0" weight="0.980699"/>
|
||||
</boneassignments>
|
||||
</submesh>
|
||||
</submeshes>
|
||||
<skeletonlink name="Arm.skeleton"/>
|
||||
</mesh>
|
|
@ -1,14 +0,0 @@
|
|||
material Material
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.640000 0.640000 0.640000 1.000000
|
||||
specular 0.500000 0.500000 0.500000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,779 +0,0 @@
|
|||
<mesh>
|
||||
<submeshes>
|
||||
<submesh material="Axt" usesharedvertices="false">
|
||||
<faces count="104">
|
||||
<face v1="0" v2="1" v3="2"/>
|
||||
<face v1="0" v2="2" v3="3"/>
|
||||
<face v1="3" v2="2" v3="5"/>
|
||||
<face v1="2" v2="4" v3="5"/>
|
||||
<face v1="5" v2="4" v3="7"/>
|
||||
<face v1="4" v2="6" v3="7"/>
|
||||
<face v1="7" v2="6" v3="9"/>
|
||||
<face v1="6" v2="8" v3="9"/>
|
||||
<face v1="10" v2="11" v3="12"/>
|
||||
<face v1="10" v2="12" v3="13"/>
|
||||
<face v1="1" v2="0" v3="13"/>
|
||||
<face v1="1" v2="13" v3="12"/>
|
||||
<face v1="1" v2="12" v3="15"/>
|
||||
<face v1="12" v2="14" v3="15"/>
|
||||
<face v1="12" v2="11" v3="14"/>
|
||||
<face v1="11" v2="16" v3="14"/>
|
||||
<face v1="8" v2="6" v3="17"/>
|
||||
<face v1="8" v2="17" v3="18"/>
|
||||
<face v1="6" v2="4" v3="19"/>
|
||||
<face v1="6" v2="19" v3="17"/>
|
||||
<face v1="4" v2="2" v3="20"/>
|
||||
<face v1="4" v2="20" v3="19"/>
|
||||
<face v1="2" v2="1" v3="20"/>
|
||||
<face v1="1" v2="15" v3="20"/>
|
||||
<face v1="20" v2="15" v3="22"/>
|
||||
<face v1="15" v2="21" v3="22"/>
|
||||
<face v1="19" v2="20" v3="22"/>
|
||||
<face v1="19" v2="22" v3="23"/>
|
||||
<face v1="17" v2="19" v3="23"/>
|
||||
<face v1="17" v2="23" v3="24"/>
|
||||
<face v1="18" v2="17" v3="24"/>
|
||||
<face v1="18" v2="24" v3="25"/>
|
||||
<face v1="14" v2="16" v3="27"/>
|
||||
<face v1="16" v2="26" v3="27"/>
|
||||
<face v1="15" v2="14" v3="21"/>
|
||||
<face v1="14" v2="27" v3="21"/>
|
||||
<face v1="28" v2="22" v3="21"/>
|
||||
<face v1="28" v2="23" v3="22"/>
|
||||
<face v1="28" v2="24" v3="23"/>
|
||||
<face v1="28" v2="25" v3="24"/>
|
||||
<face v1="28" v2="27" v3="26"/>
|
||||
<face v1="28" v2="21" v3="27"/>
|
||||
<face v1="13" v2="0" v3="29"/>
|
||||
<face v1="13" v2="29" v3="30"/>
|
||||
<face v1="10" v2="13" v3="30"/>
|
||||
<face v1="10" v2="30" v3="31"/>
|
||||
<face v1="7" v2="9" v3="33"/>
|
||||
<face v1="9" v2="32" v3="33"/>
|
||||
<face v1="5" v2="7" v3="34"/>
|
||||
<face v1="7" v2="33" v3="34"/>
|
||||
<face v1="3" v2="5" v3="35"/>
|
||||
<face v1="5" v2="34" v3="35"/>
|
||||
<face v1="0" v2="3" v3="35"/>
|
||||
<face v1="0" v2="35" v3="29"/>
|
||||
<face v1="29" v2="35" v3="36"/>
|
||||
<face v1="29" v2="36" v3="37"/>
|
||||
<face v1="35" v2="34" v3="36"/>
|
||||
<face v1="34" v2="38" v3="36"/>
|
||||
<face v1="34" v2="33" v3="39"/>
|
||||
<face v1="34" v2="39" v3="38"/>
|
||||
<face v1="33" v2="32" v3="40"/>
|
||||
<face v1="33" v2="40" v3="39"/>
|
||||
<face v1="31" v2="30" v3="42"/>
|
||||
<face v1="30" v2="41" v3="42"/>
|
||||
<face v1="30" v2="29" v3="37"/>
|
||||
<face v1="30" v2="37" v3="41"/>
|
||||
<face v1="43" v2="37" v3="36"/>
|
||||
<face v1="43" v2="36" v3="38"/>
|
||||
<face v1="43" v2="38" v3="39"/>
|
||||
<face v1="43" v2="39" v3="40"/>
|
||||
<face v1="43" v2="42" v3="41"/>
|
||||
<face v1="41" v2="37" v3="43"/>
|
||||
<face v1="44" v2="45" v3="46"/>
|
||||
<face v1="44" v2="46" v3="47"/>
|
||||
<face v1="48" v2="49" v3="50"/>
|
||||
<face v1="48" v2="50" v3="51"/>
|
||||
<face v1="52" v2="53" v3="55"/>
|
||||
<face v1="53" v2="54" v3="55"/>
|
||||
<face v1="56" v2="57" v3="59"/>
|
||||
<face v1="57" v2="58" v3="59"/>
|
||||
<face v1="60" v2="61" v3="63"/>
|
||||
<face v1="61" v2="62" v3="63"/>
|
||||
<face v1="64" v2="65" v3="67"/>
|
||||
<face v1="65" v2="66" v3="67"/>
|
||||
<face v1="68" v2="69" v3="70"/>
|
||||
<face v1="68" v2="70" v3="71"/>
|
||||
<face v1="72" v2="73" v3="75"/>
|
||||
<face v1="73" v2="74" v3="75"/>
|
||||
<face v1="76" v2="77" v3="79"/>
|
||||
<face v1="77" v2="78" v3="79"/>
|
||||
<face v1="80" v2="81" v3="83"/>
|
||||
<face v1="81" v2="82" v3="83"/>
|
||||
<face v1="84" v2="85" v3="86"/>
|
||||
<face v1="84" v2="86" v3="87"/>
|
||||
<face v1="88" v2="89" v3="91"/>
|
||||
<face v1="89" v2="90" v3="91"/>
|
||||
<face v1="92" v2="93" v3="94"/>
|
||||
<face v1="92" v2="94" v3="95"/>
|
||||
<face v1="96" v2="97" v3="99"/>
|
||||
<face v1="97" v2="98" v3="99"/>
|
||||
<face v1="100" v2="101" v3="102"/>
|
||||
<face v1="100" v2="102" v3="103"/>
|
||||
<face v1="104" v2="105" v3="106"/>
|
||||
<face v1="107" v2="108" v3="109"/>
|
||||
</faces>
|
||||
<geometry vertexcount="110">
|
||||
<vertexbuffer positions="true" normals="true" texture_coords="1">
|
||||
<vertex>
|
||||
<position x="0.342551" y="0.146381" z="0.021625"/>
|
||||
<normal x="0.505943" y="0.855782" z="0.107976"/>
|
||||
<texcoord u="0.145130" v="0.876796"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.118562" y="0.146381" z="3.696396"/>
|
||||
<normal x="0.546138" y="0.837595" z="0.012940"/>
|
||||
<texcoord u="0.159006" v="0.603674"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.243823" y="-0.053579" z="3.690870"/>
|
||||
<normal x="0.957146" y="-0.288712" z="0.022737"/>
|
||||
<texcoord u="0.120945" v="0.605992"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.467934" y="-0.053579" z="0.021625"/>
|
||||
<normal x="0.941239" y="-0.311112" z="0.131446"/>
|
||||
<texcoord u="0.126331" v="0.876965"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.098395" y="-0.199961" z="3.705967"/>
|
||||
<normal x="0.150152" y="-0.988656" z="0.003571"/>
|
||||
<texcoord u="0.082716" v="0.603437"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.125382" y="-0.199961" z="0.021625"/>
|
||||
<normal x="0.111731" y="-0.985618" z="0.126777"/>
|
||||
<texcoord u="0.097844" v="0.881754"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.565874" y="-0.146382" z="3.726588"/>
|
||||
<normal x="-0.546442" y="-0.837410" z="-0.012055"/>
|
||||
<texcoord u="0.043735" v="0.601491"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.342551" y="-0.146382" z="0.021625"/>
|
||||
<normal x="-0.553251" y="-0.782938" z="0.284469"/>
|
||||
<texcoord u="0.056352" v="0.903124"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.691135" y="0.053579" z="3.732114"/>
|
||||
<normal x="-0.957284" y="0.288372" z="-0.021180"/>
|
||||
<texcoord u="0.002819" v="0.599802"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.467934" y="0.053579" z="0.021625"/>
|
||||
<normal x="-0.889985" y="0.247240" z="0.383144"/>
|
||||
<texcoord u="0.019898" v="0.913950"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.467934" y="0.053579" z="0.021625"/>
|
||||
<normal x="-0.889985" y="0.247240" z="0.383144"/>
|
||||
<texcoord u="0.223702" v="0.917139"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.691135" y="0.053579" z="3.732114"/>
|
||||
<normal x="-0.957284" y="0.288372" z="-0.021180"/>
|
||||
<texcoord u="0.239294" v="0.599156"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.348917" y="0.199961" z="3.717018"/>
|
||||
<normal x="-0.150276" y="0.988639" z="-0.003266"/>
|
||||
<texcoord u="0.198313" v="0.601515"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.125382" y="0.199961" z="0.021625"/>
|
||||
<normal x="-0.179819" y="0.965870" z="0.186441"/>
|
||||
<texcoord u="0.182132" v="0.895435"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.270595" y="0.199961" z="8.916198"/>
|
||||
<normal x="-0.153086" y="0.988131" z="0.012727"/>
|
||||
<texcoord u="0.200322" v="0.288378"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.187462" y="0.146381" z="8.820560"/>
|
||||
<normal x="0.552853" y="0.832042" z="-0.045382"/>
|
||||
<texcoord u="0.161749" v="0.295310"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.605915" y="0.053579" z="8.986208"/>
|
||||
<normal x="-0.956438" y="0.280806" z="0.079838"/>
|
||||
<texcoord u="0.239293" v="0.280184"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.483178" y="-0.146382" z="8.960582"/>
|
||||
<normal x="-0.552316" y="-0.832365" z="0.045993"/>
|
||||
<texcoord u="0.040208" v="0.287732"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.605915" y="0.053579" z="8.986208"/>
|
||||
<normal x="-0.956438" y="0.280806" z="0.079838"/>
|
||||
<texcoord u="0.000000" v="0.280769"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.025122" y="-0.199961" z="8.864945"/>
|
||||
<normal x="0.153329" y="-0.988096" z="-0.012513"/>
|
||||
<texcoord u="0.077838" v="0.294037"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.310198" y="-0.053579" z="8.794935"/>
|
||||
<normal x="0.956673" y="-0.280315" z="-0.078739"/>
|
||||
<texcoord u="0.119791" v="0.300010"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.840783" y="0.146381" z="13.117238"/>
|
||||
<normal x="0.524190" y="0.688930" z="0.500599"/>
|
||||
<texcoord u="0.138164" v="0.069971"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.964404" y="-0.053579" z="13.096293"/>
|
||||
<normal x="0.852430" y="-0.240063" z="0.464471"/>
|
||||
<texcoord u="0.124102" v="0.075538"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.626666" y="-0.199961" z="13.153516"/>
|
||||
<normal x="0.214642" y="-0.780287" z="0.587436"/>
|
||||
<texcoord u="0.107019" v="0.057301"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.165307" y="-0.146382" z="13.231682"/>
|
||||
<normal x="-0.336232" y="-0.692912" z="0.637825"/>
|
||||
<texcoord u="0.074276" v="0.034711"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.041686" y="0.053579" z="13.252626"/>
|
||||
<normal x="-0.666638" y="0.241562" z="0.705154"/>
|
||||
<texcoord u="0.047425" v="0.005032"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.041686" y="0.053579" z="13.252626"/>
|
||||
<normal x="-0.666638" y="0.241562" z="0.705154"/>
|
||||
<texcoord u="0.189030" v="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.379424" y="0.199961" z="13.195405"/>
|
||||
<normal x="-0.010590" y="0.781801" z="0.623438"/>
|
||||
<texcoord u="0.160038" v="0.032572"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.503045" y="-0.000000" z="13.174460"/>
|
||||
<normal x="0.167031" y="0.000000" z="0.985952"/>
|
||||
<texcoord u="0.124781" v="0.027016"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.347913" y="0.225758" z="-0.355553"/>
|
||||
<normal x="0.476896" y="0.774032" z="-0.416467"/>
|
||||
<texcoord u="0.138828" v="0.899830"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.373761" y="0.308391" z="-0.355553"/>
|
||||
<normal x="-0.148783" y="0.946747" z="-0.285541"/>
|
||||
<texcoord u="0.170729" v="0.942704"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.902064" y="0.082633" z="-0.355553"/>
|
||||
<normal x="-0.922481" y="0.346823" z="-0.169536"/>
|
||||
<texcoord u="0.207639" v="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.902064" y="0.082633" z="-0.355553"/>
|
||||
<normal x="-0.922481" y="0.346823" z="-0.169536"/>
|
||||
<texcoord u="0.046945" v="0.996510"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.708692" y="-0.225758" z="-0.355553"/>
|
||||
<normal x="-0.510067" y="-0.833143" z="-0.213787"/>
|
||||
<texcoord u="0.068933" v="0.958477"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.012983" y="-0.308392" z="-0.355553"/>
|
||||
<normal x="0.127478" y="-0.928084" z="-0.349870"/>
|
||||
<texcoord u="0.106771" v="0.912190"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.541286" y="-0.082633" z="-0.355553"/>
|
||||
<normal x="0.829580" y="-0.271654" z="-0.487854"/>
|
||||
<texcoord u="0.126981" v="0.895197"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.069411" y="-0.027697" z="-0.482086"/>
|
||||
<normal x="0.168343" y="-0.115576" z="-0.978929"/>
|
||||
<texcoord u="0.126701" v="0.917187"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.004596" y="0.075670" z="-0.482086"/>
|
||||
<normal x="0.105596" y="0.268599" z="-0.957447"/>
|
||||
<texcoord u="0.133913" v="0.921384"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.107666" y="-0.103367" z="-0.482086"/>
|
||||
<normal x="0.033693" y="-0.309219" z="-0.950394"/>
|
||||
<texcoord u="0.118842" v="0.929706"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.349558" y="-0.075670" z="-0.482086"/>
|
||||
<normal x="-0.102666" y="-0.266584" z="-0.958328"/>
|
||||
<texcoord u="0.107387" v="0.953060"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.414373" y="0.027697" z="-0.482086"/>
|
||||
<normal x="-0.163488" y="0.114109" z="-0.979924"/>
|
||||
<texcoord u="0.110601" v="0.969146"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.237295" y="0.103367" z="-0.482086"/>
|
||||
<normal x="-0.031862" y="0.309008" z="-0.950525"/>
|
||||
<texcoord u="0.143141" v="0.942908"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.414373" y="0.027697" z="-0.482086"/>
|
||||
<normal x="-0.163488" y="0.114109" z="-0.979924"/>
|
||||
<texcoord u="0.145943" v="0.967208"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.172481" y="-0.000000" z="-0.482086"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.128167" v="0.940441"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451740" y="0.323387" z="11.265723"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.654728" v="0.129168"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="0.323387" z="12.911845"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.653249" v="0.394769"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="0.323387" z="12.687066"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.848878" v="0.394693"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759380" y="0.323387" z="11.040944"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.850358" v="0.129092"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="-0.323386" z="12.687066"/>
|
||||
<normal x="0.000000" y="-1.000000" z="0.000000"/>
|
||||
<texcoord u="0.851621" v="0.584783"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="-0.323386" z="12.911845"/>
|
||||
<normal x="0.000000" y="-1.000000" z="0.000000"/>
|
||||
<texcoord u="0.685584" v="0.571305"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451741" y="-0.323386" z="11.265723"/>
|
||||
<normal x="0.000000" y="-1.000000" z="0.000000"/>
|
||||
<texcoord u="0.746714" v="0.802359"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759379" y="-0.323386" z="11.040943"/>
|
||||
<normal x="0.000000" y="-1.000000" z="0.000000"/>
|
||||
<texcoord u="0.881340" v="0.767133"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759380" y="0.323387" z="11.040944"/>
|
||||
<normal x="-0.182481" y="0.000002" z="-0.983209"/>
|
||||
<texcoord u="0.963883" v="0.832229"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759379" y="-0.323386" z="11.040943"/>
|
||||
<normal x="-0.182481" y="0.000002" z="-0.983209"/>
|
||||
<texcoord u="0.881340" v="0.767133"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451741" y="-0.323386" z="11.265723"/>
|
||||
<normal x="-0.182481" y="0.000002" z="-0.983209"/>
|
||||
<texcoord u="0.746714" v="0.802359"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451740" y="0.323387" z="11.265723"/>
|
||||
<normal x="-0.182481" y="0.000002" z="-0.983209"/>
|
||||
<texcoord u="0.749646" v="0.906673"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="0.323387" z="12.911845"/>
|
||||
<normal x="0.182480" y="-0.000000" z="0.983210"/>
|
||||
<texcoord u="0.688903" v="0.465655"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="-0.323386" z="12.911845"/>
|
||||
<normal x="0.182480" y="-0.000000" z="0.983210"/>
|
||||
<texcoord u="0.685584" v="0.571305"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="-0.323386" z="12.687066"/>
|
||||
<normal x="0.182480" y="-0.000000" z="0.983210"/>
|
||||
<texcoord u="0.851621" v="0.584783"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="0.323387" z="12.687066"/>
|
||||
<normal x="0.182480" y="-0.000000" z="0.983210"/>
|
||||
<texcoord u="0.897806" v="0.505172"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="0.323387" z="12.687066"/>
|
||||
<normal x="0.834158" y="0.000001" z="0.551525"/>
|
||||
<texcoord u="0.897806" v="0.505172"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="-0.323386" z="12.687066"/>
|
||||
<normal x="0.834158" y="0.000001" z="0.551525"/>
|
||||
<texcoord u="0.851621" v="0.584783"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.285309" y="-0.223392" z="12.338371"/>
|
||||
<normal x="0.834158" y="0.000001" z="0.551525"/>
|
||||
<texcoord u="0.893577" v="0.610195"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.285308" y="0.223393" z="12.338371"/>
|
||||
<normal x="0.834158" y="0.000001" z="0.551525"/>
|
||||
<texcoord u="0.948132" v="0.567619"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759379" y="-0.323386" z="11.040943"/>
|
||||
<normal x="0.627722" y="0.000000" z="-0.778438"/>
|
||||
<texcoord u="0.881340" v="0.767133"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759380" y="0.323387" z="11.040944"/>
|
||||
<normal x="0.627722" y="0.000000" z="-0.778438"/>
|
||||
<texcoord u="0.963883" v="0.832229"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.084783" y="0.223393" z="11.303345"/>
|
||||
<normal x="0.627722" y="0.000000" z="-0.778438"/>
|
||||
<texcoord u="0.984409" v="0.746005"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.084782" y="-0.223392" z="11.303345"/>
|
||||
<normal x="0.627722" y="0.000000" z="-0.778438"/>
|
||||
<texcoord u="0.912956" v="0.728923"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="-0.323386" z="12.687066"/>
|
||||
<normal x="0.337497" y="-0.939377" z="-0.060561"/>
|
||||
<texcoord u="0.851621" v="0.584783"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759379" y="-0.323386" z="11.040943"/>
|
||||
<normal x="0.337497" y="-0.939377" z="-0.060561"/>
|
||||
<texcoord u="0.881340" v="0.767133"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.084782" y="-0.223392" z="11.303345"/>
|
||||
<normal x="0.337497" y="-0.939377" z="-0.060561"/>
|
||||
<texcoord u="0.912956" v="0.728923"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.285309" y="-0.223392" z="12.338371"/>
|
||||
<normal x="0.337497" y="-0.939377" z="-0.060561"/>
|
||||
<texcoord u="0.893577" v="0.610195"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.759380" y="0.323387" z="11.040944"/>
|
||||
<normal x="0.322326" y="0.944860" z="-0.057838"/>
|
||||
<texcoord u="0.850358" v="0.129092"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.054760" y="0.323387" z="12.687066"/>
|
||||
<normal x="0.322326" y="0.944860" z="-0.057838"/>
|
||||
<texcoord u="0.848878" v="0.394693"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.285308" y="0.223393" z="12.338371"/>
|
||||
<normal x="0.322326" y="0.944860" z="-0.057838"/>
|
||||
<texcoord u="0.897640" v="0.346926"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.084783" y="0.223393" z="11.303345"/>
|
||||
<normal x="0.322326" y="0.944860" z="-0.057838"/>
|
||||
<texcoord u="0.896392" v="0.179495"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.285308" y="0.223393" z="12.338371"/>
|
||||
<normal x="0.981745" y="0.000001" z="-0.190204"/>
|
||||
<texcoord u="0.948132" v="0.567619"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.285309" y="-0.223392" z="12.338371"/>
|
||||
<normal x="0.981745" y="0.000001" z="-0.190204"/>
|
||||
<texcoord u="0.893577" v="0.610195"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.084782" y="-0.223392" z="11.303345"/>
|
||||
<normal x="0.981745" y="0.000001" z="-0.190204"/>
|
||||
<texcoord u="0.912956" v="0.728923"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.084783" y="0.223393" z="11.303345"/>
|
||||
<normal x="0.981745" y="0.000001" z="-0.190204"/>
|
||||
<texcoord u="0.984409" v="0.746005"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="-0.323386" z="12.911845"/>
|
||||
<normal x="0.129506" y="-0.000000" z="0.991579"/>
|
||||
<texcoord u="0.685584" v="0.571305"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="0.323387" z="12.911845"/>
|
||||
<normal x="0.129506" y="-0.000000" z="0.991579"/>
|
||||
<texcoord u="0.688903" v="0.465655"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545399" y="0.204365" z="12.962656"/>
|
||||
<normal x="0.129506" y="-0.000000" z="0.991579"/>
|
||||
<texcoord u="0.622092" v="0.490630"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545400" y="-0.204363" z="12.962656"/>
|
||||
<normal x="0.129506" y="-0.000000" z="0.991579"/>
|
||||
<texcoord u="0.622589" v="0.565308"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451740" y="0.323387" z="11.265723"/>
|
||||
<normal x="-0.883264" y="0.000001" z="-0.468876"/>
|
||||
<texcoord u="0.749646" v="0.906673"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451741" y="-0.323386" z="11.265723"/>
|
||||
<normal x="-0.883264" y="0.000001" z="-0.468876"/>
|
||||
<texcoord u="0.746714" v="0.802359"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="-0.204363" z="11.811641"/>
|
||||
<normal x="-0.883264" y="0.000001" z="-0.468876"/>
|
||||
<texcoord u="0.658107" v="0.776793"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="0.204365" z="11.811641"/>
|
||||
<normal x="-0.883264" y="0.000001" z="-0.468876"/>
|
||||
<texcoord u="0.649643" v="0.858936"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451741" y="-0.323386" z="11.265723"/>
|
||||
<normal x="-0.286033" y="-0.956844" z="0.051326"/>
|
||||
<texcoord u="0.746714" v="0.802359"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="-0.323386" z="12.911845"/>
|
||||
<normal x="-0.286033" y="-0.956844" z="0.051326"/>
|
||||
<texcoord u="0.685584" v="0.571305"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545400" y="-0.204363" z="12.962656"/>
|
||||
<normal x="-0.286033" y="-0.956844" z="0.051326"/>
|
||||
<texcoord u="0.622589" v="0.565308"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="-0.204363" z="11.811641"/>
|
||||
<normal x="-0.286033" y="-0.956844" z="0.051326"/>
|
||||
<texcoord u="0.658107" v="0.776793"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.156360" y="0.323387" z="12.911845"/>
|
||||
<normal x="-0.293031" y="0.954656" z="0.052581"/>
|
||||
<texcoord u="0.653249" v="0.394769"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.451740" y="0.323387" z="11.265723"/>
|
||||
<normal x="-0.293031" y="0.954656" z="0.052581"/>
|
||||
<texcoord u="0.654728" v="0.129168"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="0.204365" z="11.811641"/>
|
||||
<normal x="-0.293031" y="0.954656" z="0.052581"/>
|
||||
<texcoord u="0.590806" v="0.206022"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545399" y="0.204365" z="12.962656"/>
|
||||
<normal x="-0.293031" y="0.954656" z="0.052581"/>
|
||||
<texcoord u="0.588220" v="0.391438"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545399" y="0.204365" z="12.962656"/>
|
||||
<normal x="-0.109846" y="0.993772" z="0.018718"/>
|
||||
<texcoord u="0.588220" v="0.391438"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="0.204365" z="11.811641"/>
|
||||
<normal x="-0.109846" y="0.993772" z="0.018718"/>
|
||||
<texcoord u="0.590806" v="0.206022"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-2.631943" y="0.000003" z="11.567838"/>
|
||||
<normal x="-0.109846" y="0.993772" z="0.018718"/>
|
||||
<texcoord u="0.300801" v="0.113367"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-2.228676" y="0.000003" z="13.749098"/>
|
||||
<normal x="-0.109846" y="0.993772" z="0.018718"/>
|
||||
<texcoord u="0.300801" v="0.465655"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="-0.204363" z="11.811641"/>
|
||||
<normal x="-0.111732" y="-0.993556" z="0.019040"/>
|
||||
<texcoord u="0.658107" v="0.776793"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545400" y="-0.204363" z="12.962656"/>
|
||||
<normal x="-0.111732" y="-0.993556" z="0.019040"/>
|
||||
<texcoord u="0.622589" v="0.565308"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-2.228676" y="0.000003" z="13.749098"/>
|
||||
<normal x="-0.111732" y="-0.993556" z="0.019040"/>
|
||||
<texcoord u="0.300802" v="0.502768"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-2.631943" y="0.000003" z="11.567838"/>
|
||||
<normal x="-0.111732" y="-0.993556" z="0.019040"/>
|
||||
<texcoord u="0.300801" v="0.853883"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="0.204365" z="11.811641"/>
|
||||
<normal x="0.127909" y="-0.000000" z="-0.991786"/>
|
||||
<texcoord u="0.649643" v="0.858936"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.741538" y="-0.204363" z="11.811641"/>
|
||||
<normal x="0.127909" y="-0.000000" z="-0.991786"/>
|
||||
<texcoord u="0.658107" v="0.776793"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-2.631943" y="0.000003" z="11.567838"/>
|
||||
<normal x="0.127909" y="-0.000000" z="-0.991786"/>
|
||||
<texcoord u="0.300801" v="0.853883"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545400" y="-0.204363" z="12.962656"/>
|
||||
<normal x="0.423289" y="-0.000000" z="0.905995"/>
|
||||
<texcoord u="0.622589" v="0.565308"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.545399" y="0.204365" z="12.962656"/>
|
||||
<normal x="0.423289" y="-0.000000" z="0.905995"/>
|
||||
<texcoord u="0.622092" v="0.490630"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-2.228676" y="0.000003" z="13.749098"/>
|
||||
<normal x="0.423289" y="-0.000000" z="0.905995"/>
|
||||
<texcoord u="0.300802" v="0.502768"/>
|
||||
</vertex>
|
||||
</vertexbuffer>
|
||||
</geometry>
|
||||
<boneassignments>
|
||||
<vertexboneassignment vertexindex="0" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="1" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="2" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="3" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="4" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="5" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="6" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="7" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="8" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="9" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="10" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="11" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="12" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="13" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="14" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="15" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="16" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="17" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="18" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="19" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="20" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="21" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="22" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="23" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="24" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="25" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="26" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="27" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="28" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="29" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="30" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="31" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="32" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="33" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="34" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="35" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="36" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="37" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="38" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="39" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="40" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="41" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="42" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="43" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="44" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="45" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="46" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="47" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="48" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="49" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="50" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="51" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="52" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="53" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="54" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="55" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="56" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="57" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="58" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="59" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="60" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="61" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="62" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="63" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="64" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="65" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="66" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="67" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="68" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="69" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="70" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="71" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="72" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="73" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="74" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="75" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="76" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="77" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="78" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="79" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="80" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="81" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="82" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="83" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="84" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="85" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="86" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="87" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="88" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="89" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="90" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="91" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="92" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="93" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="94" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="95" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="96" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="97" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="98" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="99" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="100" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="101" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="102" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="103" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="104" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="105" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="106" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="107" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="108" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="109" boneindex="11" weight="1.000000"/>
|
||||
</boneassignments>
|
||||
</submesh>
|
||||
</submeshes>
|
||||
<skeletonlink name="Axt.skeleton"/>
|
||||
</mesh>
|
|
@ -1,143 +0,0 @@
|
|||
<skeleton>
|
||||
<bones>
|
||||
<bone id="3" name="Becken">
|
||||
<position x="12.913236" y="-8.539813" z="-1.441562"/>
|
||||
<rotation angle="1.566044">
|
||||
<axis x="0.999200" y="0.018091" z="-0.035655"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="10" name="BeinIK_L">
|
||||
<position x="21.656969" y="-22.222187" z="-0.135527"/>
|
||||
<rotation angle="1.574681">
|
||||
<axis x="-0.999207" y="0.035524" z="0.017970"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="12" name="BeinIK_R">
|
||||
<position x="3.940197" y="-21.908747" z="0.812478"/>
|
||||
<rotation angle="1.574681">
|
||||
<axis x="-0.999207" y="0.035524" z="0.017970"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="13" name="OBein_R">
|
||||
<position x="0.400000" y="0.469402" z="0.101386"/>
|
||||
<rotation angle="2.694438">
|
||||
<axis x="-0.164408" y="-0.696455" z="-0.698513"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="14" name="OBein_L">
|
||||
<position x="-0.400000" y="0.469402" z="0.101386"/>
|
||||
<rotation angle="2.694436">
|
||||
<axis x="-0.164409" y="0.696455" z="0.698513"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="0" name="Rücken1">
|
||||
<position x="0.000000" y="0.469992" z="-0.098613"/>
|
||||
<rotation angle="1.567843">
|
||||
<axis x="-1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="4" name="UBein_R">
|
||||
<position x="-0.000000" y="1.624908" z="-0.000000"/>
|
||||
<rotation angle="0.172356">
|
||||
<axis x="-0.233239" y="-0.891951" z="-0.387329"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="17" name="UBein_L">
|
||||
<position x="0.000000" y="1.624906" z="0.000000"/>
|
||||
<rotation angle="0.172359">
|
||||
<axis x="-0.233236" y="0.891946" z="0.387342"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="1" name="Rücken2">
|
||||
<position x="-0.000000" y="1.000011" z="-0.000000"/>
|
||||
<rotation angle="0.000000">
|
||||
<axis x="0.057339" y="-0.997784" z="-0.033756"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="2" name="Fuß_R">
|
||||
<position x="-0.000000" y="2.179777" z="-0.000000"/>
|
||||
<rotation angle="2.647994">
|
||||
<axis x="0.219642" y="0.813298" z="0.538799"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="19" name="Fuß_L">
|
||||
<position x="-0.000000" y="2.179786" z="-0.000000"/>
|
||||
<rotation angle="2.648001">
|
||||
<axis x="0.219640" y="-0.813298" z="-0.538799"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="16" name="HandIK_L">
|
||||
<position x="3.017000" y="1.044323" z="-0.000448"/>
|
||||
<rotation angle="1.570795">
|
||||
<axis x="-1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="8" name="OArm_R">
|
||||
<position x="1.120446" y="0.999989" z="-0.000002"/>
|
||||
<rotation angle="1.582578">
|
||||
<axis x="-0.095890" y="-0.000000" z="-0.995392"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="18" name="OArm_L">
|
||||
<position x="-1.120000" y="0.999994" z="-0.000002"/>
|
||||
<rotation angle="1.582592">
|
||||
<axis x="-0.095839" y="0.000000" z="0.995397"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="7" name="Kopf">
|
||||
<position x="0.000000" y="1.365379" z="-0.000000"/>
|
||||
<rotation angle="0.000000">
|
||||
<axis x="0.057339" y="-0.997784" z="-0.033756"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="5" name="HandIK_R">
|
||||
<position x="-3.016674" y="1.044323" z="-0.000448"/>
|
||||
<rotation angle="1.570795">
|
||||
<axis x="-1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="15" name="UArm_R">
|
||||
<position x="0.000000" y="0.823681" z="-0.000000"/>
|
||||
<rotation angle="0.244839">
|
||||
<axis x="0.694823" y="0.676003" z="0.245440"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="6" name="UArm_L">
|
||||
<position x="0.000000" y="0.824125" z="0.000000"/>
|
||||
<rotation angle="0.244772">
|
||||
<axis x="0.694793" y="-0.675983" z="-0.245581"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="9" name="Hand_R">
|
||||
<position x="-0.000000" y="1.081340" z="0.000000"/>
|
||||
<rotation angle="0.119749">
|
||||
<axis x="-0.592006" y="-0.598930" z="-0.539270"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="11" name="Hand_L">
|
||||
<position x="-0.000000" y="1.081342" z="-0.000000"/>
|
||||
<rotation angle="0.119749">
|
||||
<axis x="-0.592006" y="0.598926" z="0.539274"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
</bones>
|
||||
<bonehierarchy>
|
||||
<boneparent bone="OBein_R" parent="Becken" />
|
||||
<boneparent bone="OBein_L" parent="Becken" />
|
||||
<boneparent bone="Rücken1" parent="Becken" />
|
||||
<boneparent bone="UBein_R" parent="OBein_R" />
|
||||
<boneparent bone="UBein_L" parent="OBein_L" />
|
||||
<boneparent bone="Rücken2" parent="Rücken1" />
|
||||
<boneparent bone="Fuß_R" parent="UBein_R" />
|
||||
<boneparent bone="Fuß_L" parent="UBein_L" />
|
||||
<boneparent bone="HandIK_L" parent="Rücken2" />
|
||||
<boneparent bone="OArm_R" parent="Rücken2" />
|
||||
<boneparent bone="OArm_L" parent="Rücken2" />
|
||||
<boneparent bone="Kopf" parent="Rücken2" />
|
||||
<boneparent bone="HandIK_R" parent="Rücken2" />
|
||||
<boneparent bone="UArm_R" parent="OArm_R" />
|
||||
<boneparent bone="UArm_L" parent="OArm_L" />
|
||||
<boneparent bone="Hand_R" parent="UArm_R" />
|
||||
<boneparent bone="Hand_L" parent="UArm_L" />
|
||||
</bonehierarchy>
|
||||
</skeleton>
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,943 +0,0 @@
|
|||
<mesh>
|
||||
<submeshes>
|
||||
<submesh material="Pistol" usesharedvertices="false">
|
||||
<faces count="232">
|
||||
<face v1="0" v2="1" v3="2"/>
|
||||
<face v1="0" v2="2" v3="3"/>
|
||||
<face v1="3" v2="2" v3="4"/>
|
||||
<face v1="3" v2="4" v3="5"/>
|
||||
<face v1="5" v2="4" v3="6"/>
|
||||
<face v1="5" v2="6" v3="7"/>
|
||||
<face v1="7" v2="6" v3="9"/>
|
||||
<face v1="6" v2="8" v3="9"/>
|
||||
<face v1="9" v2="8" v3="11"/>
|
||||
<face v1="8" v2="10" v3="11"/>
|
||||
<face v1="11" v2="10" v3="13"/>
|
||||
<face v1="10" v2="12" v3="13"/>
|
||||
<face v1="13" v2="12" v3="15"/>
|
||||
<face v1="12" v2="14" v3="15"/>
|
||||
<face v1="1" v2="0" v3="14"/>
|
||||
<face v1="0" v2="15" v3="14"/>
|
||||
<face v1="15" v2="0" v3="17"/>
|
||||
<face v1="0" v2="16" v3="17"/>
|
||||
<face v1="13" v2="15" v3="18"/>
|
||||
<face v1="15" v2="17" v3="18"/>
|
||||
<face v1="11" v2="13" v3="19"/>
|
||||
<face v1="13" v2="18" v3="19"/>
|
||||
<face v1="9" v2="11" v3="20"/>
|
||||
<face v1="11" v2="19" v3="20"/>
|
||||
<face v1="7" v2="9" v3="21"/>
|
||||
<face v1="9" v2="20" v3="21"/>
|
||||
<face v1="5" v2="7" v3="22"/>
|
||||
<face v1="7" v2="21" v3="22"/>
|
||||
<face v1="3" v2="5" v3="23"/>
|
||||
<face v1="5" v2="22" v3="23"/>
|
||||
<face v1="0" v2="3" v3="16"/>
|
||||
<face v1="3" v2="23" v3="16"/>
|
||||
<face v1="16" v2="23" v3="25"/>
|
||||
<face v1="23" v2="24" v3="25"/>
|
||||
<face v1="23" v2="22" v3="24"/>
|
||||
<face v1="22" v2="26" v3="24"/>
|
||||
<face v1="22" v2="21" v3="27"/>
|
||||
<face v1="22" v2="27" v3="26"/>
|
||||
<face v1="20" v2="19" v3="29"/>
|
||||
<face v1="19" v2="28" v3="29"/>
|
||||
<face v1="19" v2="18" v3="28"/>
|
||||
<face v1="18" v2="30" v3="28"/>
|
||||
<face v1="18" v2="17" v3="30"/>
|
||||
<face v1="17" v2="31" v3="30"/>
|
||||
<face v1="17" v2="16" v3="31"/>
|
||||
<face v1="16" v2="25" v3="31"/>
|
||||
<face v1="31" v2="25" v3="32"/>
|
||||
<face v1="31" v2="32" v3="33"/>
|
||||
<face v1="30" v2="31" v3="34"/>
|
||||
<face v1="31" v2="33" v3="34"/>
|
||||
<face v1="28" v2="30" v3="35"/>
|
||||
<face v1="30" v2="34" v3="35"/>
|
||||
<face v1="29" v2="28" v3="36"/>
|
||||
<face v1="28" v2="35" v3="36"/>
|
||||
<face v1="26" v2="27" v3="37"/>
|
||||
<face v1="26" v2="37" v3="38"/>
|
||||
<face v1="24" v2="26" v3="38"/>
|
||||
<face v1="24" v2="38" v3="39"/>
|
||||
<face v1="25" v2="24" v3="39"/>
|
||||
<face v1="25" v2="39" v3="32"/>
|
||||
<face v1="32" v2="39" v3="41"/>
|
||||
<face v1="39" v2="40" v3="41"/>
|
||||
<face v1="39" v2="38" v3="40"/>
|
||||
<face v1="38" v2="42" v3="40"/>
|
||||
<face v1="35" v2="34" v3="43"/>
|
||||
<face v1="35" v2="43" v3="44"/>
|
||||
<face v1="34" v2="33" v3="45"/>
|
||||
<face v1="34" v2="45" v3="43"/>
|
||||
<face v1="33" v2="32" v3="45"/>
|
||||
<face v1="32" v2="41" v3="45"/>
|
||||
<face v1="46" v2="41" v3="40"/>
|
||||
<face v1="46" v2="40" v3="42"/>
|
||||
<face v1="46" v2="44" v3="43"/>
|
||||
<face v1="46" v2="43" v3="45"/>
|
||||
<face v1="45" v2="41" v3="46"/>
|
||||
<face v1="1" v2="14" v3="48"/>
|
||||
<face v1="14" v2="47" v3="48"/>
|
||||
<face v1="14" v2="12" v3="47"/>
|
||||
<face v1="12" v2="49" v3="47"/>
|
||||
<face v1="12" v2="10" v3="50"/>
|
||||
<face v1="12" v2="50" v3="49"/>
|
||||
<face v1="10" v2="8" v3="51"/>
|
||||
<face v1="10" v2="51" v3="50"/>
|
||||
<face v1="8" v2="6" v3="52"/>
|
||||
<face v1="8" v2="52" v3="51"/>
|
||||
<face v1="6" v2="4" v3="52"/>
|
||||
<face v1="4" v2="53" v3="52"/>
|
||||
<face v1="4" v2="2" v3="53"/>
|
||||
<face v1="2" v2="54" v3="53"/>
|
||||
<face v1="2" v2="1" v3="54"/>
|
||||
<face v1="1" v2="48" v3="54"/>
|
||||
<face v1="55" v2="54" v3="48"/>
|
||||
<face v1="55" v2="53" v3="54"/>
|
||||
<face v1="55" v2="52" v3="53"/>
|
||||
<face v1="55" v2="51" v3="52"/>
|
||||
<face v1="55" v2="50" v3="51"/>
|
||||
<face v1="55" v2="49" v3="50"/>
|
||||
<face v1="55" v2="47" v3="49"/>
|
||||
<face v1="55" v2="48" v3="47"/>
|
||||
<face v1="42" v2="44" v3="46"/>
|
||||
<face v1="37" v2="56" v3="38"/>
|
||||
<face v1="56" v2="42" v3="38"/>
|
||||
<face v1="35" v2="44" v3="57"/>
|
||||
<face v1="35" v2="57" v3="36"/>
|
||||
<face v1="29" v2="27" v3="59"/>
|
||||
<face v1="27" v2="58" v3="59"/>
|
||||
<face v1="20" v2="29" v3="59"/>
|
||||
<face v1="20" v2="59" v3="60"/>
|
||||
<face v1="27" v2="21" v3="58"/>
|
||||
<face v1="21" v2="61" v3="58"/>
|
||||
<face v1="21" v2="20" v3="60"/>
|
||||
<face v1="21" v2="60" v3="61"/>
|
||||
<face v1="61" v2="60" v3="63"/>
|
||||
<face v1="60" v2="62" v3="63"/>
|
||||
<face v1="58" v2="61" v3="63"/>
|
||||
<face v1="58" v2="63" v3="64"/>
|
||||
<face v1="60" v2="59" v3="62"/>
|
||||
<face v1="59" v2="65" v3="62"/>
|
||||
<face v1="59" v2="58" v3="64"/>
|
||||
<face v1="59" v2="64" v3="65"/>
|
||||
<face v1="56" v2="37" v3="66"/>
|
||||
<face v1="56" v2="66" v3="67"/>
|
||||
<face v1="36" v2="57" v3="69"/>
|
||||
<face v1="57" v2="68" v3="69"/>
|
||||
<face v1="70" v2="56" v3="71"/>
|
||||
<face v1="56" v2="67" v3="71"/>
|
||||
<face v1="72" v2="70" v3="73"/>
|
||||
<face v1="70" v2="71" v3="73"/>
|
||||
<face v1="57" v2="72" v3="73"/>
|
||||
<face v1="57" v2="73" v3="68"/>
|
||||
<face v1="74" v2="36" v3="69"/>
|
||||
<face v1="74" v2="69" v3="75"/>
|
||||
<face v1="76" v2="74" v3="77"/>
|
||||
<face v1="74" v2="75" v3="77"/>
|
||||
<face v1="37" v2="76" v3="66"/>
|
||||
<face v1="76" v2="77" v3="66"/>
|
||||
<face v1="27" v2="76" v3="37"/>
|
||||
<face v1="29" v2="36" v3="74"/>
|
||||
<face v1="27" v2="29" v3="76"/>
|
||||
<face v1="29" v2="74" v3="76"/>
|
||||
<face v1="63" v2="62" v3="78"/>
|
||||
<face v1="63" v2="78" v3="79"/>
|
||||
<face v1="64" v2="63" v3="77"/>
|
||||
<face v1="63" v2="79" v3="77"/>
|
||||
<face v1="62" v2="65" v3="75"/>
|
||||
<face v1="62" v2="75" v3="78"/>
|
||||
<face v1="65" v2="64" v3="75"/>
|
||||
<face v1="64" v2="77" v3="75"/>
|
||||
<face v1="67" v2="66" v3="80"/>
|
||||
<face v1="67" v2="80" v3="81"/>
|
||||
<face v1="69" v2="68" v3="83"/>
|
||||
<face v1="68" v2="82" v3="83"/>
|
||||
<face v1="71" v2="67" v3="81"/>
|
||||
<face v1="71" v2="81" v3="84"/>
|
||||
<face v1="73" v2="71" v3="85"/>
|
||||
<face v1="71" v2="84" v3="85"/>
|
||||
<face v1="68" v2="73" v3="82"/>
|
||||
<face v1="73" v2="85" v3="82"/>
|
||||
<face v1="66" v2="77" v3="80"/>
|
||||
<face v1="77" v2="79" v3="80"/>
|
||||
<face v1="75" v2="69" v3="83"/>
|
||||
<face v1="75" v2="83" v3="78"/>
|
||||
<face v1="81" v2="80" v3="86"/>
|
||||
<face v1="81" v2="86" v3="87"/>
|
||||
<face v1="83" v2="82" v3="89"/>
|
||||
<face v1="82" v2="88" v3="89"/>
|
||||
<face v1="84" v2="81" v3="87"/>
|
||||
<face v1="84" v2="87" v3="90"/>
|
||||
<face v1="85" v2="84" v3="91"/>
|
||||
<face v1="84" v2="90" v3="91"/>
|
||||
<face v1="82" v2="85" v3="88"/>
|
||||
<face v1="85" v2="91" v3="88"/>
|
||||
<face v1="79" v2="78" v3="92"/>
|
||||
<face v1="79" v2="92" v3="93"/>
|
||||
<face v1="80" v2="79" v3="86"/>
|
||||
<face v1="79" v2="93" v3="86"/>
|
||||
<face v1="78" v2="83" v3="89"/>
|
||||
<face v1="78" v2="89" v3="92"/>
|
||||
<face v1="87" v2="86" v3="94"/>
|
||||
<face v1="87" v2="94" v3="95"/>
|
||||
<face v1="89" v2="88" v3="97"/>
|
||||
<face v1="88" v2="96" v3="97"/>
|
||||
<face v1="90" v2="87" v3="95"/>
|
||||
<face v1="90" v2="95" v3="98"/>
|
||||
<face v1="91" v2="90" v3="99"/>
|
||||
<face v1="90" v2="98" v3="99"/>
|
||||
<face v1="88" v2="91" v3="96"/>
|
||||
<face v1="91" v2="99" v3="96"/>
|
||||
<face v1="93" v2="92" v3="100"/>
|
||||
<face v1="93" v2="100" v3="101"/>
|
||||
<face v1="86" v2="93" v3="101"/>
|
||||
<face v1="86" v2="101" v3="94"/>
|
||||
<face v1="92" v2="89" v3="100"/>
|
||||
<face v1="89" v2="97" v3="100"/>
|
||||
<face v1="95" v2="94" v3="102"/>
|
||||
<face v1="95" v2="102" v3="103"/>
|
||||
<face v1="97" v2="96" v3="105"/>
|
||||
<face v1="96" v2="104" v3="105"/>
|
||||
<face v1="98" v2="95" v3="106"/>
|
||||
<face v1="95" v2="103" v3="106"/>
|
||||
<face v1="99" v2="98" v3="107"/>
|
||||
<face v1="98" v2="106" v3="107"/>
|
||||
<face v1="96" v2="99" v3="107"/>
|
||||
<face v1="96" v2="107" v3="104"/>
|
||||
<face v1="101" v2="100" v3="108"/>
|
||||
<face v1="101" v2="108" v3="109"/>
|
||||
<face v1="94" v2="101" v3="109"/>
|
||||
<face v1="94" v2="109" v3="102"/>
|
||||
<face v1="100" v2="97" v3="108"/>
|
||||
<face v1="97" v2="105" v3="108"/>
|
||||
<face v1="103" v2="102" v3="104"/>
|
||||
<face v1="102" v2="105" v3="104"/>
|
||||
<face v1="103" v2="104" v3="107"/>
|
||||
<face v1="103" v2="107" v3="106"/>
|
||||
<face v1="102" v2="109" v3="105"/>
|
||||
<face v1="109" v2="108" v3="105"/>
|
||||
<face v1="72" v2="57" v3="110"/>
|
||||
<face v1="72" v2="110" v3="111"/>
|
||||
<face v1="70" v2="72" v3="112"/>
|
||||
<face v1="72" v2="111" v3="112"/>
|
||||
<face v1="56" v2="70" v3="113"/>
|
||||
<face v1="70" v2="112" v3="113"/>
|
||||
<face v1="57" v2="44" v3="110"/>
|
||||
<face v1="44" v2="114" v3="110"/>
|
||||
<face v1="42" v2="56" v3="113"/>
|
||||
<face v1="42" v2="113" v3="115"/>
|
||||
<face v1="44" v2="42" v3="115"/>
|
||||
<face v1="44" v2="115" v3="114"/>
|
||||
<face v1="115" v2="113" v3="112"/>
|
||||
<face v1="114" v2="111" v3="110"/>
|
||||
<face v1="115" v2="112" v3="111"/>
|
||||
<face v1="115" v2="111" v3="114"/>
|
||||
</faces>
|
||||
<geometry vertexcount="116">
|
||||
<vertexbuffer positions="true" normals="true" texture_coords="1">
|
||||
<vertex>
|
||||
<position x="0.257881" y="-4.291811" z="1.187402"/>
|
||||
<normal x="0.350662" y="0.000000" z="0.936502"/>
|
||||
<texcoord u="0.278421" v="0.065951"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.257881" y="-6.291811" z="1.187402"/>
|
||||
<normal x="0.350662" y="0.000000" z="0.936502"/>
|
||||
<texcoord u="0.072521" v="0.065951"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622320" y="-6.291811" z="0.870155"/>
|
||||
<normal x="0.910876" y="-0.000153" z="0.412681"/>
|
||||
<texcoord u="0.072521" v="0.098611"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622321" y="-4.291811" z="0.870154"/>
|
||||
<normal x="0.910780" y="0.000000" z="0.412892"/>
|
||||
<texcoord u="0.278421" v="0.098611"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="-6.291811" z="-0.224715"/>
|
||||
<normal x="0.831222" y="-0.131141" z="-0.540252"/>
|
||||
<texcoord u="0.072521" v="0.211328"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="-4.291811" z="-0.224715"/>
|
||||
<normal x="0.885719" y="0.000000" z="-0.464223"/>
|
||||
<texcoord u="0.278421" v="0.211328"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.192120" y="-6.291811" z="-0.521966"/>
|
||||
<normal x="0.262678" y="-0.227917" z="-0.937579"/>
|
||||
<texcoord u="0.072521" v="0.241930"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.192119" y="-4.291811" z="-0.521966"/>
|
||||
<normal x="0.299359" y="0.000000" z="-0.954140"/>
|
||||
<texcoord u="0.278421" v="0.241930"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192360" y="-6.291811" z="-0.521806"/>
|
||||
<normal x="-0.263286" y="-0.227884" z="-0.937416"/>
|
||||
<texcoord u="0.072521" v="0.241913"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192360" y="-4.291811" z="-0.521806"/>
|
||||
<normal x="-0.300004" y="0.000000" z="-0.953938"/>
|
||||
<texcoord u="0.278421" v="0.241913"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="-6.291811" z="-0.224329"/>
|
||||
<normal x="-0.831432" y="-0.131080" z="-0.539944"/>
|
||||
<texcoord u="0.072521" v="0.211288"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="-4.291811" z="-0.224329"/>
|
||||
<normal x="-0.885877" y="0.000000" z="-0.463920"/>
|
||||
<texcoord u="0.278421" v="0.211288"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="-6.291811" z="0.870541"/>
|
||||
<normal x="-0.910712" y="-0.000122" z="0.413042"/>
|
||||
<texcoord u="0.072521" v="0.098571"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="-4.291811" z="0.870540"/>
|
||||
<normal x="-0.910616" y="0.000000" z="0.413253"/>
|
||||
<texcoord u="0.278421" v="0.098572"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257621" y="-6.291811" z="1.187562"/>
|
||||
<normal x="-0.350120" y="0.000000" z="0.936705"/>
|
||||
<texcoord u="0.072521" v="0.065934"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257622" y="-4.291811" z="1.187561"/>
|
||||
<normal x="-0.350120" y="0.000000" z="0.936705"/>
|
||||
<texcoord u="0.278421" v="0.065934"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.257881" y="-2.147161" z="1.187402"/>
|
||||
<normal x="0.350662" y="0.000000" z="0.936502"/>
|
||||
<texcoord u="0.499212" v="0.065951"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257622" y="-2.147161" z="1.187561"/>
|
||||
<normal x="-0.347984" y="0.000000" z="0.937500"/>
|
||||
<texcoord u="0.499212" v="0.065934"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="-2.147161" z="0.870540"/>
|
||||
<normal x="-0.911568" y="0.000000" z="0.411150"/>
|
||||
<texcoord u="0.499212" v="0.098572"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="-2.147161" z="-0.224329"/>
|
||||
<normal x="-0.884455" y="0.003449" z="-0.466613"/>
|
||||
<texcoord u="0.499212" v="0.211288"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192360" y="-2.147161" z="-0.521806"/>
|
||||
<normal x="-0.587252" y="-0.517180" z="-0.622624"/>
|
||||
<texcoord u="0.499212" v="0.241913"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.192119" y="-2.147161" z="-0.521966"/>
|
||||
<normal x="0.586832" y="-0.517095" z="-0.623090"/>
|
||||
<texcoord u="0.499212" v="0.241930"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="-2.147161" z="-0.224715"/>
|
||||
<normal x="0.883197" y="0.003449" z="-0.468990"/>
|
||||
<texcoord u="0.499212" v="0.211328"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622321" y="-2.147161" z="0.870154"/>
|
||||
<normal x="0.909819" y="0.000000" z="0.415005"/>
|
||||
<texcoord u="0.499212" v="0.098611"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622321" y="-1.862473" z="0.870154"/>
|
||||
<normal x="0.902451" y="-0.022035" z="0.430228"/>
|
||||
<texcoord u="0.528521" v="0.098611"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.257881" y="-1.862473" z="1.187402"/>
|
||||
<normal x="0.345022" y="-0.047885" z="0.937372"/>
|
||||
<texcoord u="0.528521" v="0.065951"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="-1.862473" z="-0.224715"/>
|
||||
<normal x="0.883189" y="0.000488" z="-0.469016"/>
|
||||
<texcoord u="0.528521" v="0.211328"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.192119" y="-1.915866" z="-0.514339"/>
|
||||
<normal x="0.613466" y="0.498775" z="-0.612276"/>
|
||||
<texcoord u="0.523024" v="0.241144"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="-1.862473" z="-0.224329"/>
|
||||
<normal x="-0.883349" y="0.000458" z="-0.468715"/>
|
||||
<texcoord u="0.528521" v="0.211288"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192360" y="-1.915866" z="-0.514179"/>
|
||||
<normal x="-0.613866" y="0.498655" z="-0.611974"/>
|
||||
<texcoord u="0.523024" v="0.241128"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="-1.862473" z="0.870540"/>
|
||||
<normal x="-0.902274" y="-0.022065" z="0.430598"/>
|
||||
<texcoord u="0.528521" v="0.098572"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257622" y="-1.862473" z="1.187561"/>
|
||||
<normal x="-0.344469" y="-0.047884" z="0.937576"/>
|
||||
<texcoord u="0.528521" v="0.065934"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.257881" y="-0.382096" z="1.339235"/>
|
||||
<normal x="0.340078" y="-0.029421" z="0.939937"/>
|
||||
<texcoord u="0.680925" v="0.050319"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257622" y="-0.382096" z="1.339395"/>
|
||||
<normal x="-0.339551" y="-0.029420" z="0.940128"/>
|
||||
<texcoord u="0.680925" v="0.050303"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="-0.382096" z="1.022373"/>
|
||||
<normal x="-0.898087" y="-0.013886" z="0.439598"/>
|
||||
<texcoord u="0.680925" v="0.082940"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="-0.382096" z="-0.072496"/>
|
||||
<normal x="-0.932979" y="-0.003144" z="-0.359916"/>
|
||||
<texcoord u="0.680925" v="0.195657"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.507696" y="-0.389723" z="-0.377600"/>
|
||||
<normal x="-0.708741" y="-0.340500" z="-0.617856"/>
|
||||
<texcoord u="0.680140" v="0.227067"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.507466" y="-0.389723" z="-0.377760"/>
|
||||
<normal x="0.708480" y="-0.340689" z="-0.618051"/>
|
||||
<texcoord u="0.680140" v="0.227084"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="-0.382096" z="-0.072882"/>
|
||||
<normal x="0.932830" y="-0.003143" z="-0.360302"/>
|
||||
<texcoord u="0.680925" v="0.195697"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622321" y="-0.382096" z="1.021988"/>
|
||||
<normal x="0.898268" y="-0.013856" z="0.439230"/>
|
||||
<texcoord u="0.680925" v="0.082980"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622321" y="1.538969" z="0.957390"/>
|
||||
<normal x="0.767833" y="0.402518" z="0.498409"/>
|
||||
<texcoord u="0.878699" v="0.089630"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.257881" y="1.293574" z="1.268720"/>
|
||||
<normal x="0.287829" y="0.267442" z="0.919581"/>
|
||||
<texcoord u="0.853435" v="0.057579"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="1.882954" z="0.019456"/>
|
||||
<normal x="0.654059" y="0.671730" z="0.347829"/>
|
||||
<texcoord u="0.914112" v="0.186190"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="1.538895" z="0.957768"/>
|
||||
<normal x="-0.767641" y="0.402513" z="0.498709"/>
|
||||
<texcoord u="0.878691" v="0.089591"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="1.882880" z="0.019835"/>
|
||||
<normal x="-0.653879" y="0.671763" z="0.348105"/>
|
||||
<texcoord u="0.914104" v="0.186152"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257622" y="1.293543" z="1.268876"/>
|
||||
<normal x="-0.287304" y="0.267437" z="0.919747"/>
|
||||
<texcoord u="0.853432" v="0.057563"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.000000" y="1.935333" z="0.871009"/>
|
||||
<normal x="0.000031" y="0.881203" z="0.472738"/>
|
||||
<texcoord u="0.919504" v="0.098523"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.257621" y="-6.842207" z="1.187562"/>
|
||||
<normal x="-0.281784" y="-0.593508" z="0.753887"/>
|
||||
<texcoord u="0.015858" v="0.065934"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.257881" y="-6.842207" z="1.187402"/>
|
||||
<normal x="0.282212" y="-0.593538" z="0.753703"/>
|
||||
<texcoord u="0.015858" v="0.065951"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.622213" y="-6.842207" z="0.870541"/>
|
||||
<normal x="-0.736886" y="-0.611940" z="0.287277"/>
|
||||
<texcoord u="0.015858" v="0.098571"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.618905" y="-6.704918" z="-0.067972"/>
|
||||
<normal x="-0.666253" y="-0.635429" z="-0.390303"/>
|
||||
<texcoord u="0.029992" v="0.195191"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192360" y="-6.640087" z="-0.315873"/>
|
||||
<normal x="-0.168282" y="-0.734502" z="-0.657411"/>
|
||||
<texcoord u="0.036666" v="0.220713"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.192120" y="-6.640087" z="-0.316033"/>
|
||||
<normal x="0.167857" y="-0.734510" z="-0.657510"/>
|
||||
<texcoord u="0.036666" v="0.220729"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.618778" y="-6.704918" z="-0.068358"/>
|
||||
<normal x="0.666091" y="-0.635479" z="-0.390499"/>
|
||||
<texcoord u="0.029992" v="0.195231"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.622320" y="-6.842207" z="0.870155"/>
|
||||
<normal x="0.736979" y="-0.611972" z="0.286972"/>
|
||||
<texcoord u="0.015858" v="0.098611"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.000000" y="-6.842207" z="0.599695"/>
|
||||
<normal x="-0.000031" y="-0.992513" z="-0.122138"/>
|
||||
<texcoord u="0.015858" v="0.126455"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.507152" y="1.553654" z="-0.352785"/>
|
||||
<normal x="0.657875" y="0.452511" z="-0.602025"/>
|
||||
<texcoord u="0.880210" v="0.224513"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.507289" y="1.553580" z="-0.352407"/>
|
||||
<normal x="-0.658234" y="0.452444" z="-0.601682"/>
|
||||
<texcoord u="0.880203" v="0.224474"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.191774" y="-1.908239" z="-1.414074"/>
|
||||
<normal x="0.578184" y="0.569608" z="0.584166"/>
|
||||
<texcoord u="0.523809" v="0.333772"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192705" y="-1.908239" z="-1.413914"/>
|
||||
<normal x="-0.577947" y="0.569402" z="0.584601"/>
|
||||
<texcoord u="0.523809" v="0.333756"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.192705" y="-2.063371" z="-1.580589"/>
|
||||
<normal x="-0.575778" y="-0.539246" z="-0.614568"/>
|
||||
<texcoord u="0.507838" v="0.350915"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.191774" y="-2.063371" z="-1.580749"/>
|
||||
<normal x="0.575479" y="-0.539069" z="-0.615002"/>
|
||||
<texcoord u="0.507838" v="0.350931"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.193161" y="-0.752365" z="-1.512469"/>
|
||||
<normal x="-0.610531" y="-0.184609" z="-0.770176"/>
|
||||
<texcoord u="0.642806" v="0.343902"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.191318" y="-0.752365" z="-1.512629"/>
|
||||
<normal x="0.610573" y="-0.184795" z="-0.770098"/>
|
||||
<texcoord u="0.642806" v="0.343918"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.191318" y="-0.828458" z="-1.395364"/>
|
||||
<normal x="0.664931" y="-0.115212" z="0.737965"/>
|
||||
<texcoord u="0.634972" v="0.331846"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.193161" y="-0.828458" z="-1.395204"/>
|
||||
<normal x="-0.663511" y="-0.114720" z="0.739319"/>
|
||||
<texcoord u="0.634972" v="0.331829"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.428753" y="-0.230256" z="-1.273562"/>
|
||||
<normal x="0.881463" y="-0.465483" z="-0.079686"/>
|
||||
<texcoord u="0.696557" v="0.319306"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.428567" y="1.437753" z="-1.283939"/>
|
||||
<normal x="0.815335" y="0.578837" z="0.013307"/>
|
||||
<texcoord u="0.868278" v="0.320375"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.428726" y="1.437690" z="-1.283594"/>
|
||||
<normal x="-0.815359" y="0.578802" z="0.013307"/>
|
||||
<texcoord u="0.868272" v="0.320339"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.428967" y="-0.230268" z="-1.273369"/>
|
||||
<normal x="-0.881693" y="-0.465109" z="-0.079319"/>
|
||||
<texcoord u="0.696556" v="0.319287"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.206217" y="1.553629" z="-0.352659"/>
|
||||
<normal x="0.122992" y="0.729957" z="-0.672336"/>
|
||||
<texcoord u="0.880208" v="0.224500"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.206217" y="1.609294" z="-1.264863"/>
|
||||
<normal x="0.301373" y="0.937903" z="0.171790"/>
|
||||
<texcoord u="0.885939" v="0.318411"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.206344" y="1.553604" z="-0.352533"/>
|
||||
<normal x="-0.123756" y="0.729934" z="-0.672221"/>
|
||||
<texcoord u="0.880205" v="0.224487"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.206344" y="1.609269" z="-1.264736"/>
|
||||
<normal x="-0.301316" y="0.937916" z="0.171823"/>
|
||||
<texcoord u="0.885936" v="0.318398"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.206547" y="-0.389724" z="-0.377654"/>
|
||||
<normal x="-0.231580" y="-0.771284" z="-0.592868"/>
|
||||
<texcoord u="0.680140" v="0.227073"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.199854" y="-0.565360" z="-1.322375"/>
|
||||
<normal x="-0.602575" y="-0.657937" z="0.451687"/>
|
||||
<texcoord u="0.662058" v="0.324332"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.206307" y="-0.389724" z="-0.377707"/>
|
||||
<normal x="0.231031" y="-0.771284" z="-0.593082"/>
|
||||
<texcoord u="0.680140" v="0.227078"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.198813" y="-0.565360" z="-1.322482"/>
|
||||
<normal x="0.602234" y="-0.658755" z="0.450950"/>
|
||||
<texcoord u="0.662058" v="0.324343"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.196508" y="-0.418461" z="-1.700714"/>
|
||||
<normal x="-0.588503" y="-0.658025" z="-0.469752"/>
|
||||
<texcoord u="0.677181" v="0.363282"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.195066" y="-0.418461" z="-1.700847"/>
|
||||
<normal x="0.587197" y="-0.658796" z="-0.470307"/>
|
||||
<texcoord u="0.677181" v="0.363295"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.428753" y="-0.202809" z="-1.471183"/>
|
||||
<normal x="0.945198" y="-0.316663" z="-0.079532"/>
|
||||
<texcoord u="0.699383" v="0.339651"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.428567" y="1.465200" z="-1.481561"/>
|
||||
<normal x="0.891993" y="0.419765" z="0.167766"/>
|
||||
<texcoord u="0.871104" v="0.340720"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.428726" y="1.465137" z="-1.481215"/>
|
||||
<normal x="-0.891948" y="0.419850" z="0.167793"/>
|
||||
<texcoord u="0.871098" v="0.340684"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.428967" y="-0.202820" z="-1.470991"/>
|
||||
<normal x="-0.945636" y="-0.315476" z="-0.079045"/>
|
||||
<texcoord u="0.699382" v="0.339632"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.206217" y="1.684167" z="-1.462484"/>
|
||||
<normal x="0.362512" y="0.864133" z="0.349084"/>
|
||||
<texcoord u="0.893647" v="0.338756"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.206344" y="1.684143" z="-1.462358"/>
|
||||
<normal x="-0.362383" y="0.864177" z="0.349107"/>
|
||||
<texcoord u="0.893644" v="0.338743"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.463469" y="0.169557" z="-2.695868"/>
|
||||
<normal x="0.948661" y="-0.305925" z="-0.080327"/>
|
||||
<texcoord u="0.737718" v="0.465732"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.463268" y="2.075319" z="-2.691277"/>
|
||||
<normal x="0.881151" y="0.454523" z="0.130317"/>
|
||||
<texcoord u="0.933916" v="0.465260"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.463408" y="2.075251" z="-2.690904"/>
|
||||
<normal x="-0.881112" y="0.454580" z="0.130377"/>
|
||||
<texcoord u="0.933909" v="0.465222"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.463668" y="0.169545" z="-2.695660"/>
|
||||
<normal x="-0.949060" y="-0.304766" z="-0.080022"/>
|
||||
<texcoord u="0.737717" v="0.465711"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.222926" y="2.260744" z="-2.670656"/>
|
||||
<normal x="0.327684" y="0.906541" z="0.266096"/>
|
||||
<texcoord u="0.953005" v="0.463137"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.223024" y="2.260717" z="-2.670520"/>
|
||||
<normal x="-0.327591" y="0.906566" z="0.266125"/>
|
||||
<texcoord u="0.953002" v="0.463123"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.212392" y="-0.186994" z="-2.704358"/>
|
||||
<normal x="-0.461969" y="-0.860978" z="-0.212841"/>
|
||||
<texcoord u="0.701011" v="0.466607"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.210872" y="-0.186994" z="-2.704502"/>
|
||||
<normal x="0.460775" y="-0.861580" z="-0.212992"/>
|
||||
<texcoord u="0.701011" v="0.466621"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.428753" y="0.421632" z="-3.708104"/>
|
||||
<normal x="0.922492" y="-0.280254" z="-0.265453"/>
|
||||
<texcoord u="0.763669" v="0.569942"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.428567" y="2.208205" z="-3.702673"/>
|
||||
<normal x="0.835437" y="0.489286" z="-0.250289"/>
|
||||
<texcoord u="0.947596" v="0.569383"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.428726" y="2.208142" z="-3.702327"/>
|
||||
<normal x="-0.835537" y="0.489212" z="-0.250099"/>
|
||||
<texcoord u="0.947590" v="0.569347"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.428967" y="0.421620" z="-3.707911"/>
|
||||
<normal x="-0.922971" y="-0.279132" z="-0.264970"/>
|
||||
<texcoord u="0.763668" v="0.569922"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.206217" y="2.379746" z="-3.683596"/>
|
||||
<normal x="0.297228" y="0.918206" z="-0.261826"/>
|
||||
<texcoord u="0.965256" v="0.567419"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.206344" y="2.379722" z="-3.683470"/>
|
||||
<normal x="-0.297442" y="0.918146" z="-0.261795"/>
|
||||
<texcoord u="0.965254" v="0.567406"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.196508" y="0.059948" z="-3.714775"/>
|
||||
<normal x="-0.434261" y="-0.783556" z="-0.444363"/>
|
||||
<texcoord u="0.726434" v="0.570629"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.195066" y="0.059948" z="-3.714908"/>
|
||||
<normal x="0.433128" y="-0.784098" z="-0.444511"/>
|
||||
<texcoord u="0.726434" v="0.570643"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.335584" y="0.675966" z="-4.017669"/>
|
||||
<normal x="0.605441" y="-0.129463" z="-0.785290"/>
|
||||
<texcoord u="0.789853" v="0.601812"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.335438" y="1.981678" z="-4.025793"/>
|
||||
<normal x="0.568999" y="0.245618" z="-0.784800"/>
|
||||
<texcoord u="0.924275" v="0.602648"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.335648" y="1.981629" z="-4.025522"/>
|
||||
<normal x="-0.569369" y="0.245528" z="-0.784561"/>
|
||||
<texcoord u="0.924270" v="0.602620"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.335836" y="0.675958" z="-4.017519"/>
|
||||
<normal x="-0.605827" y="-0.128850" z="-0.785093"/>
|
||||
<texcoord u="0.789852" v="0.601796"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.161374" y="2.115960" z="-4.010859"/>
|
||||
<normal x="0.157878" y="0.530310" z="-0.832974"/>
|
||||
<texcoord u="0.938100" v="0.601111"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.161578" y="2.115941" z="-4.010761"/>
|
||||
<normal x="-0.158548" y="0.530272" z="-0.832871"/>
|
||||
<texcoord u="0.938098" v="0.601101"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.153878" y="0.343342" z="-4.035266"/>
|
||||
<normal x="-0.294634" y="-0.420953" z="-0.857898"/>
|
||||
<texcoord u="0.755609" v="0.603623"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.152644" y="0.343342" z="-4.035370"/>
|
||||
<normal x="0.293507" y="-0.421292" z="-0.858118"/>
|
||||
<texcoord u="0.755609" v="0.603634"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.206388" y="2.500194" z="-0.447516"/>
|
||||
<normal x="-0.373645" y="0.478905" z="-0.794380"/>
|
||||
<texcoord u="0.977657" v="0.234265"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.084069" y="2.500219" z="-0.447642"/>
|
||||
<normal x="-0.000610" y="0.506042" z="-0.862509"/>
|
||||
<texcoord u="0.977659" v="0.234278"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.083616" y="2.500243" z="-0.447769"/>
|
||||
<normal x="-0.000610" y="0.506042" z="-0.862509"/>
|
||||
<texcoord u="0.977662" v="0.234291"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.205931" y="2.500268" z="-0.447895"/>
|
||||
<normal x="0.372733" y="0.479093" z="-0.794694"/>
|
||||
<texcoord u="0.977664" v="0.234304"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.251754" y="2.624012" z="-0.162210"/>
|
||||
<normal x="-0.506648" y="0.832805" z="0.223034"/>
|
||||
<texcoord u="0.990404" v="0.204893"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.251301" y="2.624086" z="-0.162588"/>
|
||||
<normal x="0.506523" y="0.832954" z="0.222758"/>
|
||||
<texcoord u="0.990411" v="0.204932"/>
|
||||
</vertex>
|
||||
</vertexbuffer>
|
||||
</geometry>
|
||||
<boneassignments>
|
||||
<vertexboneassignment vertexindex="0" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="1" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="2" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="3" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="4" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="5" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="6" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="7" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="8" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="9" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="10" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="11" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="12" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="13" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="14" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="15" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="16" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="17" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="18" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="19" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="20" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="21" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="22" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="23" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="24" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="25" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="26" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="27" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="28" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="29" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="30" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="31" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="32" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="33" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="34" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="35" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="36" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="37" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="38" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="39" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="40" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="41" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="42" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="43" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="44" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="45" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="46" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="47" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="48" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="49" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="50" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="51" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="52" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="53" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="54" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="55" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="56" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="57" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="58" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="59" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="60" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="61" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="62" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="63" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="64" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="65" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="66" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="67" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="68" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="69" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="70" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="71" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="72" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="73" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="74" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="75" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="76" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="77" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="78" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="79" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="80" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="81" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="82" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="83" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="84" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="85" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="86" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="87" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="88" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="89" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="90" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="91" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="92" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="93" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="94" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="95" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="96" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="97" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="98" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="99" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="100" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="101" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="102" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="103" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="104" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="105" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="106" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="107" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="108" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="109" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="110" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="111" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="112" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="113" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="114" boneindex="11" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="115" boneindex="11" weight="1.000000"/>
|
||||
</boneassignments>
|
||||
</submesh>
|
||||
</submeshes>
|
||||
<skeletonlink name="Pistol.skeleton"/>
|
||||
</mesh>
|
|
@ -1,143 +0,0 @@
|
|||
<skeleton>
|
||||
<bones>
|
||||
<bone id="3" name="Becken">
|
||||
<position x="15.924885" y="26.461205" z="-6.069913"/>
|
||||
<rotation angle="2.092691">
|
||||
<axis x="0.576781" y="0.576781" z="0.578487"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="10" name="BeinIK_L">
|
||||
<position x="41.881607" y="43.537239" z="-2.724984"/>
|
||||
<rotation angle="2.094679">
|
||||
<axis x="-0.577445" y="-0.577445" z="0.577161"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="12" name="BeinIK_R">
|
||||
<position x="41.881607" y="9.496918" z="-2.729228"/>
|
||||
<rotation angle="2.094679">
|
||||
<axis x="-0.577445" y="-0.577445" z="0.577161"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="13" name="OBein_R">
|
||||
<position x="0.400000" y="0.469402" z="0.101386"/>
|
||||
<rotation angle="2.694438">
|
||||
<axis x="-0.164408" y="-0.696455" z="-0.698513"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="14" name="OBein_L">
|
||||
<position x="-0.400000" y="0.469402" z="0.101386"/>
|
||||
<rotation angle="2.694436">
|
||||
<axis x="-0.164409" y="0.696455" z="0.698513"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="0" name="Rücken1">
|
||||
<position x="-0.000000" y="0.469992" z="-0.098613"/>
|
||||
<rotation angle="1.567843">
|
||||
<axis x="-1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="4" name="UBein_R">
|
||||
<position x="0.000000" y="1.624908" z="0.000000"/>
|
||||
<rotation angle="0.172356">
|
||||
<axis x="-0.233239" y="-0.891951" z="-0.387329"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="17" name="UBein_L">
|
||||
<position x="0.000000" y="1.624906" z="0.000000"/>
|
||||
<rotation angle="0.172359">
|
||||
<axis x="-0.233236" y="0.891946" z="0.387342"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="1" name="Rücken2">
|
||||
<position x="-0.000000" y="1.000011" z="0.000000"/>
|
||||
<rotation angle="0.000000">
|
||||
<axis x="-0.087665" y="0.962836" z="0.255464"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="2" name="Fuß_R">
|
||||
<position x="-0.000000" y="2.179777" z="0.000000"/>
|
||||
<rotation angle="2.647994">
|
||||
<axis x="0.219642" y="0.813298" z="0.538799"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="19" name="Fuß_L">
|
||||
<position x="-0.000000" y="2.179786" z="-0.000000"/>
|
||||
<rotation angle="2.648001">
|
||||
<axis x="0.219640" y="-0.813298" z="-0.538799"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="16" name="HandIK_L">
|
||||
<position x="3.017000" y="1.044323" z="-0.000448"/>
|
||||
<rotation angle="1.570795">
|
||||
<axis x="-1.000000" y="-0.000000" z="0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="8" name="OArm_R">
|
||||
<position x="1.120446" y="0.999989" z="-0.000002"/>
|
||||
<rotation angle="1.582578">
|
||||
<axis x="-0.095890" y="-0.000000" z="-0.995392"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="18" name="OArm_L">
|
||||
<position x="-1.120000" y="0.999994" z="-0.000002"/>
|
||||
<rotation angle="1.582592">
|
||||
<axis x="-0.095839" y="0.000000" z="0.995397"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="7" name="Kopf">
|
||||
<position x="0.000000" y="1.365379" z="0.000000"/>
|
||||
<rotation angle="0.000000">
|
||||
<axis x="-0.275746" y="-0.527518" z="0.803548"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="5" name="HandIK_R">
|
||||
<position x="-3.016675" y="1.044323" z="-0.000448"/>
|
||||
<rotation angle="1.570795">
|
||||
<axis x="-1.000000" y="-0.000000" z="0.000000"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="15" name="UArm_R">
|
||||
<position x="0.000000" y="0.823681" z="-0.000000"/>
|
||||
<rotation angle="0.244839">
|
||||
<axis x="0.694823" y="0.676003" z="0.245440"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="6" name="UArm_L">
|
||||
<position x="0.000000" y="0.824125" z="0.000000"/>
|
||||
<rotation angle="0.244772">
|
||||
<axis x="0.694793" y="-0.675983" z="-0.245581"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="9" name="Hand_R">
|
||||
<position x="-0.000000" y="1.081340" z="0.000000"/>
|
||||
<rotation angle="0.119749">
|
||||
<axis x="-0.592006" y="-0.598930" z="-0.539270"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="11" name="Hand_L">
|
||||
<position x="-0.000000" y="1.081342" z="-0.000000"/>
|
||||
<rotation angle="0.119749">
|
||||
<axis x="-0.592006" y="0.598926" z="0.539274"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
</bones>
|
||||
<bonehierarchy>
|
||||
<boneparent bone="OBein_R" parent="Becken" />
|
||||
<boneparent bone="OBein_L" parent="Becken" />
|
||||
<boneparent bone="Rücken1" parent="Becken" />
|
||||
<boneparent bone="UBein_R" parent="OBein_R" />
|
||||
<boneparent bone="UBein_L" parent="OBein_L" />
|
||||
<boneparent bone="Rücken2" parent="Rücken1" />
|
||||
<boneparent bone="Fuß_R" parent="UBein_R" />
|
||||
<boneparent bone="Fuß_L" parent="UBein_L" />
|
||||
<boneparent bone="HandIK_L" parent="Rücken2" />
|
||||
<boneparent bone="OArm_R" parent="Rücken2" />
|
||||
<boneparent bone="OArm_L" parent="Rücken2" />
|
||||
<boneparent bone="Kopf" parent="Rücken2" />
|
||||
<boneparent bone="HandIK_R" parent="Rücken2" />
|
||||
<boneparent bone="UArm_R" parent="OArm_R" />
|
||||
<boneparent bone="UArm_L" parent="OArm_L" />
|
||||
<boneparent bone="Hand_R" parent="UArm_R" />
|
||||
<boneparent bone="Hand_L" parent="UArm_L" />
|
||||
</bonehierarchy>
|
||||
</skeleton>
|
Binary file not shown.
Before Width: | Height: | Size: 1.0 MiB |
|
@ -1,62 +0,0 @@
|
|||
material Player
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.800000 0.800000 0.800000 1.000000
|
||||
specular 0.000000 0.000000 0.000000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
texture_unit
|
||||
{
|
||||
texture PlayerTextur.tga
|
||||
tex_address_mode wrap
|
||||
filtering trilinear
|
||||
colour_op alpha_blend
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
material Pistol
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.640000 0.640000 0.640000 1.000000
|
||||
specular 0.500000 0.500000 0.500000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
texture_unit
|
||||
{
|
||||
texture DesertEagle.tga
|
||||
tex_address_mode wrap
|
||||
filtering trilinear
|
||||
colour_op alpha_blend
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
material Axt
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.640000 0.640000 0.640000 1.000000
|
||||
specular 0.500000 0.500000 0.500000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
texture_unit
|
||||
{
|
||||
texture axt.tga
|
||||
tex_address_mode wrap
|
||||
filtering trilinear
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 256 KiB |
|
@ -1,20 +0,0 @@
|
|||
material Sarg
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.640000 0.640000 0.640000 1.000000
|
||||
specular 0.500000 0.500000 0.500000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
texture_unit
|
||||
{
|
||||
texture SargTextur.tga
|
||||
tex_address_mode wrap
|
||||
filtering linear linear none
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,364 +0,0 @@
|
|||
<mesh>
|
||||
<submeshes>
|
||||
<submesh material="Sarg" usesharedvertices="false">
|
||||
<faces count="32">
|
||||
<face v1="0" v2="1" v3="2"/>
|
||||
<face v1="0" v2="2" v3="3"/>
|
||||
<face v1="4" v2="5" v3="7"/>
|
||||
<face v1="5" v2="6" v3="7"/>
|
||||
<face v1="8" v2="9" v3="11"/>
|
||||
<face v1="9" v2="10" v3="11"/>
|
||||
<face v1="12" v2="13" v3="14"/>
|
||||
<face v1="12" v2="14" v3="15"/>
|
||||
<face v1="16" v2="17" v3="19"/>
|
||||
<face v1="17" v2="18" v3="19"/>
|
||||
<face v1="20" v2="21" v3="23"/>
|
||||
<face v1="21" v2="22" v3="23"/>
|
||||
<face v1="24" v2="25" v3="27"/>
|
||||
<face v1="25" v2="26" v3="27"/>
|
||||
<face v1="28" v2="29" v3="31"/>
|
||||
<face v1="29" v2="30" v3="31"/>
|
||||
<face v1="32" v2="33" v3="35"/>
|
||||
<face v1="33" v2="34" v3="35"/>
|
||||
<face v1="36" v2="37" v3="38"/>
|
||||
<face v1="36" v2="38" v3="39"/>
|
||||
<face v1="40" v2="41" v3="43"/>
|
||||
<face v1="41" v2="42" v3="43"/>
|
||||
<face v1="44" v2="45" v3="47"/>
|
||||
<face v1="45" v2="46" v3="47"/>
|
||||
<face v1="48" v2="49" v3="50"/>
|
||||
<face v1="48" v2="50" v3="51"/>
|
||||
<face v1="52" v2="53" v3="55"/>
|
||||
<face v1="53" v2="54" v3="55"/>
|
||||
<face v1="56" v2="57" v3="59"/>
|
||||
<face v1="57" v2="58" v3="59"/>
|
||||
<face v1="60" v2="61" v3="63"/>
|
||||
<face v1="61" v2="62" v3="63"/>
|
||||
</faces>
|
||||
<geometry vertexcount="64">
|
||||
<vertexbuffer positions="true" normals="true" texture_coords="1">
|
||||
<vertex>
|
||||
<position x="-1.000000" y="2.600000" z="0.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.980852" v="0.278482"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="2.600000" z="0.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.980852" v="0.178658"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-2.400000" z="0.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.731292" v="0.178658"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000001" y="-2.400000" z="0.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.731292" v="0.278482"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="2.600000" z="0.000000"/>
|
||||
<normal x="0.000001" y="1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.142856" v="0.999999"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="2.600000" z="1.500000"/>
|
||||
<normal x="0.000001" y="1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.142857" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="2.599999" z="1.500000"/>
|
||||
<normal x="0.000001" y="1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.000000" v="0.892856"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="2.600000" z="0.000000"/>
|
||||
<normal x="0.000001" y="1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.000000" v="0.999999"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="2.600000" z="0.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
<texcoord u="1.000000" v="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="2.599999" z="1.500000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
<texcoord u="1.000000" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-2.400001" z="1.500000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
<texcoord u="0.642856" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-2.400000" z="0.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
<texcoord u="0.642856" v="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-2.400000" z="0.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.642856" v="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-2.400001" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.642856" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-2.400000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.499998" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000001" y="-2.400000" z="0.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
<texcoord u="0.499998" v="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="2.600000" z="1.500000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.142857" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="2.600000" z="0.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.142856" v="0.999999"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000001" y="-2.400000" z="0.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.499998" v="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-2.400000" z="1.500000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.499998" v="0.892857"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="-2.600000" z="1.500000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.710529" v="0.809813"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="-2.600000" z="1.700000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.710528" v="0.826554"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="2.800000" z="1.700000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.838700" v="0.838551"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="2.800000" z="1.500000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.838700" v="0.821810"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="2.800000" z="1.699999"/>
|
||||
<normal x="1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.455000" v="0.828149"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="-2.600000" z="1.700000"/>
|
||||
<normal x="1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.582710" v="0.820457"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="-2.600000" z="1.500000"/>
|
||||
<normal x="1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.582711" v="0.803715"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="2.799999" z="1.500000"/>
|
||||
<normal x="1.000000" y="0.000000" z="0.000000"/>
|
||||
<texcoord u="0.455001" v="0.811407"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="2.800000" z="1.700000"/>
|
||||
<normal x="-0.000000" y="1.000000" z="-0.000005"/>
|
||||
<texcoord u="0.838700" v="0.838551"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="2.800000" z="1.699999"/>
|
||||
<normal x="-0.000000" y="1.000000" z="-0.000005"/>
|
||||
<texcoord u="0.966515" v="0.844641"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="2.799999" z="1.500000"/>
|
||||
<normal x="-0.000000" y="1.000000" z="-0.000005"/>
|
||||
<texcoord u="0.966515" v="0.827900"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="2.800000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="1.000000" z="-0.000005"/>
|
||||
<texcoord u="0.838700" v="0.821810"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="2.800000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.398215" v="0.878927"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="2.799999" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.398215" v="0.707499"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="-2.600000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.012500" v="0.707499"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="-2.600000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="-1.000000"/>
|
||||
<texcoord u="0.012500" v="0.878927"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="-2.600000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="0.000001"/>
|
||||
<texcoord u="0.710529" v="0.809813"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="-2.600000" z="1.500000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="0.000001"/>
|
||||
<texcoord u="0.582711" v="0.803715"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="-2.600000" z="1.700000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="0.000001"/>
|
||||
<texcoord u="0.582710" v="0.820457"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="-2.600000" z="1.700000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="0.000001"/>
|
||||
<texcoord u="0.710528" v="0.826554"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="-2.600000" z="1.700000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
<texcoord u="0.012893" v="0.301880"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="-2.600000" z="1.700000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
<texcoord u="0.012893" v="0.697404"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.200000" y="2.800000" z="1.699999"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
<texcoord u="0.902822" v="0.697404"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.200000" y="2.800000" z="1.700000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
<texcoord u="0.902822" v="0.301880"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="1.900000" z="2.000000"/>
|
||||
<normal x="-0.000000" y="-0.196116" z="0.980581"/>
|
||||
<texcoord u="0.545037" v="0.007487"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="1.900000" z="2.000000"/>
|
||||
<normal x="-0.000000" y="-0.196116" z="0.980581"/>
|
||||
<texcoord u="0.105042" v="0.007487"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="0.900000" z="1.800000"/>
|
||||
<normal x="-0.000000" y="-0.196116" z="0.980581"/>
|
||||
<texcoord u="0.105042" v="0.287930"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.799999" y="0.900000" z="1.800000"/>
|
||||
<normal x="-0.000000" y="-0.196116" z="0.980581"/>
|
||||
<texcoord u="0.545037" v="0.287930"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="1.900000" z="1.700000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000001"/>
|
||||
<texcoord u="0.598120" v="0.801486"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="1.900000" z="2.000000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000001"/>
|
||||
<texcoord u="0.598121" v="0.780057"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.799999" y="0.900000" z="1.800000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000001"/>
|
||||
<texcoord u="0.526691" v="0.794342"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="0.900000" z="1.700000"/>
|
||||
<normal x="1.000000" y="-0.000001" z="-0.000001"/>
|
||||
<texcoord u="0.526726" v="0.803715"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="0.900000" z="1.700000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000003"/>
|
||||
<texcoord u="0.526726" v="0.803715"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.799999" y="0.900000" z="1.800000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000003"/>
|
||||
<texcoord u="0.526691" v="0.794342"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="0.900000" z="1.800000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000003"/>
|
||||
<texcoord u="0.455000" v="0.789713"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="0.900000" z="1.700000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000003"/>
|
||||
<texcoord u="0.455035" v="0.799087"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="0.900000" z="1.700000"/>
|
||||
<normal x="-1.000000" y="0.000001" z="-0.000002"/>
|
||||
<texcoord u="0.783835" v="0.803713"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="0.900000" z="1.800000"/>
|
||||
<normal x="-1.000000" y="0.000001" z="-0.000002"/>
|
||||
<texcoord u="0.783835" v="0.794343"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="1.900000" z="2.000000"/>
|
||||
<normal x="-1.000000" y="0.000001" z="-0.000002"/>
|
||||
<texcoord u="0.712407" v="0.780058"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="1.900000" z="1.700000"/>
|
||||
<normal x="-1.000000" y="0.000001" z="-0.000002"/>
|
||||
<texcoord u="0.712407" v="0.801486"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="1.900000" z="1.700000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.712407" v="0.801486"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.800000" y="1.900000" z="2.000000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.712407" v="0.780058"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="1.900000" z="2.000000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.598121" v="0.780057"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.800000" y="1.900000" z="1.700000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
<texcoord u="0.598120" v="0.801486"/>
|
||||
</vertex>
|
||||
</vertexbuffer>
|
||||
</geometry>
|
||||
</submesh>
|
||||
</submeshes>
|
||||
</mesh>
|
Binary file not shown.
Before Width: | Height: | Size: 256 KiB |
|
@ -0,0 +1,21 @@
|
|||
OGRE (www.ogre3d.org) is made available under the MIT License.
|
||||
|
||||
Copyright (c) 2000-2013 Torus Knot Software Ltd
|
||||
|
||||
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.
|
|
@ -0,0 +1,10 @@
|
|||
The assets found in this folder are copied from the Ogre3D SDK samples.
|
||||
|
||||
This asset set is used to test the full functionality of both binary and XML Assimp scene import of the Ogre mesh and skeleton file formats and in addition the text based material parser.
|
||||
|
||||
* Binary mesh and skeleton files have not been modified.
|
||||
* XML mesh and skeleton files were produced from the binary versions with the `OgreXMLConverter` tool.
|
||||
* Material file was created by copying the relevant material parts from the sample sources. See the file for further information.
|
||||
* Some textures were converted from .png to .jpg to reduce the file size.
|
||||
|
||||
See the LICENSE file in this folder for further copyright information about these assets.
|
|
@ -0,0 +1,52 @@
|
|||
// Materials copied from the Ogre3D SDK
|
||||
// from location Samples/Media/materials/scripts
|
||||
|
||||
// fish.mesh
|
||||
|
||||
material Examples/Fish
|
||||
{
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
texture_unit
|
||||
{
|
||||
texture fish.jpg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ninja.mesh
|
||||
|
||||
material Examples/Ninja
|
||||
{
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
|
||||
texture_unit
|
||||
{
|
||||
texture ninja.jpg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// razor.mesh
|
||||
|
||||
material Material__25
|
||||
{
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
|
||||
texture_unit
|
||||
{
|
||||
texture razor.jpg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -0,0 +1,120 @@
|
|||
<skeleton blendmode="average">
|
||||
<bones>
|
||||
<bone id="0" name="zzwxy">
|
||||
<position x="0" y="0" z="0" />
|
||||
<rotation angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="1" name="Bone01">
|
||||
<position x="-3.95093" y="0" z="0.00265706" />
|
||||
<rotation angle="1.5708">
|
||||
<axis x="-1" y="-0" z="-0" />
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="2" name="Bone02">
|
||||
<position x="2.96562" y="-0.0183002" z="0" />
|
||||
<rotation angle="0.340339">
|
||||
<axis x="-0" y="-0" z="1" />
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="3" name="Bone03">
|
||||
<position x="2.79479" y="-4.94082e-007" z="0" />
|
||||
<rotation angle="0.305433">
|
||||
<axis x="-0" y="-0" z="1" />
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="4" name="Bone04">
|
||||
<position x="1.3291" y="1.80418e-007" z="0" />
|
||||
<rotation angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotation>
|
||||
</bone>
|
||||
</bones>
|
||||
<bonehierarchy>
|
||||
<boneparent bone="zzwxy" parent="Bone01" />
|
||||
<boneparent bone="Bone02" parent="Bone01" />
|
||||
<boneparent bone="Bone03" parent="Bone02" />
|
||||
<boneparent bone="Bone04" parent="Bone03" />
|
||||
</bonehierarchy>
|
||||
<animations>
|
||||
<animation name="swim" length="2">
|
||||
<tracks>
|
||||
<track bone="zzwxy">
|
||||
<keyframes>
|
||||
<keyframe time="0">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
<track bone="Bone01">
|
||||
<keyframes>
|
||||
<keyframe time="0">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
<track bone="Bone02">
|
||||
<keyframes>
|
||||
<keyframe time="0">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
<keyframe time="1">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0.680678">
|
||||
<axis x="-0" y="-0" z="-1" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
<keyframe time="2">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
<track bone="Bone03">
|
||||
<keyframes>
|
||||
<keyframe time="0">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
<keyframe time="1">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0.610865">
|
||||
<axis x="-0" y="-0" z="-1" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
<keyframe time="2">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
<track bone="Bone04">
|
||||
<keyframes>
|
||||
<keyframe time="0">
|
||||
<translate x="0" y="0" z="0" />
|
||||
<rotate angle="0">
|
||||
<axis x="1" y="0" z="0" />
|
||||
</rotate>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
</tracks>
|
||||
</animation>
|
||||
</animations>
|
||||
</skeleton>
|
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
After Width: | Height: | Size: 87 KiB |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
|
@ -1,762 +0,0 @@
|
|||
<mesh>
|
||||
<submeshes>
|
||||
<submesh material="Material" usesharedvertices="false">
|
||||
<faces count="68">
|
||||
<face v1="0" v2="1" v3="2"/>
|
||||
<face v1="0" v2="2" v3="3"/>
|
||||
<face v1="4" v2="5" v3="7"/>
|
||||
<face v1="5" v2="6" v3="7"/>
|
||||
<face v1="8" v2="9" v3="11"/>
|
||||
<face v1="9" v2="10" v3="11"/>
|
||||
<face v1="12" v2="13" v3="14"/>
|
||||
<face v1="12" v2="14" v3="15"/>
|
||||
<face v1="5" v2="4" v3="17"/>
|
||||
<face v1="4" v2="16" v3="17"/>
|
||||
<face v1="18" v2="19" v3="20"/>
|
||||
<face v1="18" v2="20" v3="21"/>
|
||||
<face v1="0" v2="3" v3="23"/>
|
||||
<face v1="3" v2="22" v3="23"/>
|
||||
<face v1="24" v2="25" v3="27"/>
|
||||
<face v1="25" v2="26" v3="27"/>
|
||||
<face v1="28" v2="29" v3="31"/>
|
||||
<face v1="29" v2="30" v3="31"/>
|
||||
<face v1="32" v2="33" v3="34"/>
|
||||
<face v1="32" v2="34" v3="35"/>
|
||||
<face v1="36" v2="37" v3="38"/>
|
||||
<face v1="36" v2="38" v3="39"/>
|
||||
<face v1="40" v2="41" v3="43"/>
|
||||
<face v1="41" v2="42" v3="43"/>
|
||||
<face v1="44" v2="45" v3="47"/>
|
||||
<face v1="45" v2="46" v3="47"/>
|
||||
<face v1="48" v2="49" v3="50"/>
|
||||
<face v1="48" v2="50" v3="51"/>
|
||||
<face v1="52" v2="53" v3="55"/>
|
||||
<face v1="53" v2="54" v3="55"/>
|
||||
<face v1="56" v2="57" v3="58"/>
|
||||
<face v1="56" v2="58" v3="59"/>
|
||||
<face v1="60" v2="61" v3="62"/>
|
||||
<face v1="60" v2="62" v3="63"/>
|
||||
<face v1="64" v2="65" v3="67"/>
|
||||
<face v1="65" v2="66" v3="67"/>
|
||||
<face v1="68" v2="69" v3="71"/>
|
||||
<face v1="69" v2="70" v3="71"/>
|
||||
<face v1="72" v2="73" v3="74"/>
|
||||
<face v1="72" v2="74" v3="75"/>
|
||||
<face v1="76" v2="77" v3="78"/>
|
||||
<face v1="76" v2="78" v3="79"/>
|
||||
<face v1="80" v2="81" v3="83"/>
|
||||
<face v1="81" v2="82" v3="83"/>
|
||||
<face v1="84" v2="85" v3="86"/>
|
||||
<face v1="84" v2="86" v3="87"/>
|
||||
<face v1="88" v2="89" v3="91"/>
|
||||
<face v1="89" v2="90" v3="91"/>
|
||||
<face v1="92" v2="93" v3="94"/>
|
||||
<face v1="92" v2="94" v3="95"/>
|
||||
<face v1="96" v2="97" v3="98"/>
|
||||
<face v1="96" v2="98" v3="99"/>
|
||||
<face v1="100" v2="101" v3="103"/>
|
||||
<face v1="101" v2="102" v3="103"/>
|
||||
<face v1="104" v2="105" v3="106"/>
|
||||
<face v1="104" v2="106" v3="107"/>
|
||||
<face v1="108" v2="109" v3="111"/>
|
||||
<face v1="109" v2="110" v3="111"/>
|
||||
<face v1="112" v2="113" v3="114"/>
|
||||
<face v1="112" v2="114" v3="115"/>
|
||||
<face v1="116" v2="117" v3="119"/>
|
||||
<face v1="117" v2="118" v3="119"/>
|
||||
<face v1="120" v2="121" v3="123"/>
|
||||
<face v1="121" v2="122" v3="123"/>
|
||||
<face v1="124" v2="125" v3="127"/>
|
||||
<face v1="125" v2="126" v3="127"/>
|
||||
<face v1="128" v2="129" v3="131"/>
|
||||
<face v1="129" v2="130" v3="131"/>
|
||||
</faces>
|
||||
<geometry vertexcount="132">
|
||||
<vertexbuffer positions="true" normals="true">
|
||||
<vertex>
|
||||
<position x="1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="-0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="0.999999" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="-1.000000" z="1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="3.000000" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="1.000000"/>
|
||||
<normal x="-0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="0.999999" z="1.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="3.000000" z="-1.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="3.000000" z="1.000000"/>
|
||||
<normal x="1.000000" y="-0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="3.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000001" y="3.000000" z="1.000000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="3.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="-1.000000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="1.000000"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="-1.000000"/>
|
||||
<normal x="-0.962806" y="0.000000" z="-0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="-0.962806" y="0.000000" z="-0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="1.645738" z="-0.354262"/>
|
||||
<normal x="-0.962806" y="0.000000" z="-0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="-0.354262"/>
|
||||
<normal x="-0.962806" y="0.000000" z="-0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="1.000000"/>
|
||||
<normal x="-0.962806" y="0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="-1.000000"/>
|
||||
<normal x="-0.962806" y="0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="-0.354262"/>
|
||||
<normal x="-0.962806" y="0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="0.354263"/>
|
||||
<normal x="-0.962806" y="0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="1.000000"/>
|
||||
<normal x="-0.962806" y="0.000000" z="0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-0.999999" y="3.000000" z="1.000000"/>
|
||||
<normal x="-0.962806" y="0.000000" z="0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="0.354263"/>
|
||||
<normal x="-0.962806" y="0.000000" z="0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181214" y="1.645738" z="0.354263"/>
|
||||
<normal x="-0.962806" y="0.000000" z="0.270193"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="-0.962806" y="-0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.000000" y="1.000000" z="1.000000"/>
|
||||
<normal x="-0.962806" y="-0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181214" y="1.645738" z="0.354263"/>
|
||||
<normal x="-0.962806" y="-0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="1.645738" z="-0.354262"/>
|
||||
<normal x="-0.962806" y="-0.270193" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="1.645738" z="-0.354262"/>
|
||||
<normal x="0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181214" y="1.645738" z="0.354263"/>
|
||||
<normal x="0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="0.354263"/>
|
||||
<normal x="0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="-0.354262"/>
|
||||
<normal x="0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="0.354263"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="-0.354262"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698967" y="2.354263" z="-0.354262"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="2.354263" z="0.354263"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="-0.354262"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="1.645738" z="-0.354262"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="-0.354262"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698967" y="2.354263" z="-0.354262"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="-0.354262"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="0.354263"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="2.354263" z="0.354263"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698967" y="2.354263" z="-0.354262"/>
|
||||
<normal x="-1.000000" y="0.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="0.999999" z="1.000000"/>
|
||||
<normal x="0.256681" y="-0.000000" z="0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="0.256681" y="-0.000000" z="0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798460" y="-0.256789" z="0.256789"/>
|
||||
<normal x="0.256681" y="-0.000000" z="0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="0.256789"/>
|
||||
<normal x="0.256681" y="-0.000000" z="0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="0.999999" y="-1.000001" z="1.000000"/>
|
||||
<normal x="0.256681" y="-0.966496" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="0.256681" y="-0.966496" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.256681" y="-0.966496" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798460" y="-0.256789" z="0.256789"/>
|
||||
<normal x="0.256681" y="-0.966496" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="0.256681" y="0.966496" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="0.999999" z="1.000000"/>
|
||||
<normal x="0.256681" y="0.966496" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="0.256789"/>
|
||||
<normal x="0.256681" y="0.966496" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="-0.256789"/>
|
||||
<normal x="0.256681" y="0.966496" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="-1.000000" z="-1.000000"/>
|
||||
<normal x="0.256681" y="0.000000" z="-0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="1.000000" y="1.000000" z="-1.000000"/>
|
||||
<normal x="0.256681" y="0.000000" z="-0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="-0.256789"/>
|
||||
<normal x="0.256681" y="0.000000" z="-0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.256681" y="0.000000" z="-0.966496"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="-1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="0.256789"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="0.256789" z="0.256789"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="1.000000" z="0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="0.256789" z="0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798460" y="-0.256789" z="0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135863" y="-0.256790" z="0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="0.256789" z="0.256789"/>
|
||||
<normal x="0.000000" y="0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="0.256789" z="-0.256789"/>
|
||||
<normal x="1.000000" y="-0.000002" z="-0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="0.256789" z="0.256789"/>
|
||||
<normal x="1.000000" y="-0.000002" z="-0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135863" y="-0.256790" z="0.256789"/>
|
||||
<normal x="1.000000" y="-0.000002" z="-0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="1.000000" y="-0.000002" z="-0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135863" y="-0.256790" z="0.256789"/>
|
||||
<normal x="0.000000" y="0.292311" z="0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798460" y="-0.256789" z="0.256789"/>
|
||||
<normal x="0.000000" y="0.292311" z="0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.710779" y="-0.693429" z="0.390253"/>
|
||||
<normal x="0.000000" y="0.292311" z="0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.223545" y="-0.693429" z="0.390253"/>
|
||||
<normal x="0.000000" y="0.292311" z="0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.980428" y="0.196879" z="0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135863" y="-0.256790" z="0.256789"/>
|
||||
<normal x="0.980428" y="0.196879" z="0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.223545" y="-0.693429" z="0.390253"/>
|
||||
<normal x="0.980428" y="0.196879" z="0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.223546" y="-0.693429" z="-0.390253"/>
|
||||
<normal x="0.980428" y="0.196879" z="0.000001"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="0.292312" z="-0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.135864" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="0.000000" y="0.292312" z="-0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.223546" y="-0.693429" z="-0.390253"/>
|
||||
<normal x="0.000000" y="0.292312" z="-0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.710779" y="-0.693429" z="-0.390253"/>
|
||||
<normal x="0.000000" y="0.292312" z="-0.956323"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798460" y="-0.256789" z="0.256789"/>
|
||||
<normal x="-0.980428" y="0.196879" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.798461" y="-0.256789" z="-0.256789"/>
|
||||
<normal x="-0.980428" y="0.196879" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.710779" y="-0.693429" z="-0.390253"/>
|
||||
<normal x="-0.980428" y="0.196879" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.710779" y="-0.693429" z="0.390253"/>
|
||||
<normal x="-0.980428" y="0.196879" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.710779" y="-0.693429" z="0.390253"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="3.710779" y="-0.693429" z="-0.390253"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.223546" y="-0.693429" z="-0.390253"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="4.223545" y="-0.693429" z="0.390253"/>
|
||||
<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="2.354263" z="0.354263"/>
|
||||
<normal x="-0.994906" y="0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="0.354263"/>
|
||||
<normal x="-0.994906" y="0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.479761" y="1.945713" z="2.517612"/>
|
||||
<normal x="-0.994906" y="0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.479761" y="2.054286" z="2.517612"/>
|
||||
<normal x="-0.994906" y="0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="0.354263"/>
|
||||
<normal x="0.000000" y="0.990523" z="0.137349"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="2.354263" z="0.354263"/>
|
||||
<normal x="0.000000" y="0.990523" z="0.137349"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.479761" y="2.054286" z="2.517612"/>
|
||||
<normal x="0.000000" y="0.990523" z="0.137349"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.400421" y="2.054286" z="2.517612"/>
|
||||
<normal x="0.000000" y="0.990523" z="0.137349"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.698968" y="1.645738" z="0.354263"/>
|
||||
<normal x="0.000000" y="-0.990523" z="0.137348"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181214" y="1.645738" z="0.354263"/>
|
||||
<normal x="0.000000" y="-0.990523" z="0.137348"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.400421" y="1.945713" z="2.517612"/>
|
||||
<normal x="0.000000" y="-0.990523" z="0.137348"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.479761" y="1.945713" z="2.517612"/>
|
||||
<normal x="0.000000" y="-0.990523" z="0.137348"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181214" y="1.645738" z="0.354263"/>
|
||||
<normal x="0.994906" y="-0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.181213" y="2.354263" z="0.354263"/>
|
||||
<normal x="0.994906" y="-0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.400421" y="2.054286" z="2.517612"/>
|
||||
<normal x="0.994906" y="-0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.400421" y="1.945713" z="2.517612"/>
|
||||
<normal x="0.994906" y="-0.000000" z="0.100811"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.400421" y="1.945713" z="2.517612"/>
|
||||
<normal x="0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.400421" y="2.054286" z="2.517612"/>
|
||||
<normal x="0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.479761" y="2.054286" z="2.517612"/>
|
||||
<normal x="0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
<vertex>
|
||||
<position x="-1.479761" y="1.945713" z="2.517612"/>
|
||||
<normal x="0.000000" y="-0.000000" z="1.000000"/>
|
||||
</vertex>
|
||||
</vertexbuffer>
|
||||
</geometry>
|
||||
<boneassignments>
|
||||
<vertexboneassignment vertexindex="0" boneindex="1" weight="0.999988"/>
|
||||
<vertexboneassignment vertexindex="1" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="2" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="3" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="4" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="5" boneindex="1" weight="0.993866"/>
|
||||
<vertexboneassignment vertexindex="6" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="7" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="8" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="9" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="10" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="11" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="12" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="13" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="14" boneindex="1" weight="0.993866"/>
|
||||
<vertexboneassignment vertexindex="15" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="16" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="17" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="18" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="19" boneindex="1" weight="0.999988"/>
|
||||
<vertexboneassignment vertexindex="20" boneindex="1" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="21" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="22" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="23" boneindex="1" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="24" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="25" boneindex="1" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="26" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="27" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="28" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="29" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="30" boneindex="1" weight="0.991075"/>
|
||||
<vertexboneassignment vertexindex="31" boneindex="1" weight="0.999966"/>
|
||||
<vertexboneassignment vertexindex="32" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="33" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="34" boneindex="1" weight="0.999966"/>
|
||||
<vertexboneassignment vertexindex="35" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="36" boneindex="1" weight="0.993866"/>
|
||||
<vertexboneassignment vertexindex="37" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="38" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="39" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="40" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="41" boneindex="1" weight="0.993866"/>
|
||||
<vertexboneassignment vertexindex="42" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="43" boneindex="1" weight="0.991075"/>
|
||||
<vertexboneassignment vertexindex="44" boneindex="1" weight="0.991075"/>
|
||||
<vertexboneassignment vertexindex="45" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="46" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="47" boneindex="1" weight="0.999952"/>
|
||||
<vertexboneassignment vertexindex="48" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="49" boneindex="1" weight="0.999966"/>
|
||||
<vertexboneassignment vertexindex="50" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="51" boneindex="1" weight="0.993960"/>
|
||||
<vertexboneassignment vertexindex="52" boneindex="1" weight="0.999966"/>
|
||||
<vertexboneassignment vertexindex="53" boneindex="1" weight="0.991075"/>
|
||||
<vertexboneassignment vertexindex="54" boneindex="1" weight="0.999952"/>
|
||||
<vertexboneassignment vertexindex="55" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="56" boneindex="1" weight="0.999952"/>
|
||||
<vertexboneassignment vertexindex="57" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="58" boneindex="1" weight="0.993960"/>
|
||||
<vertexboneassignment vertexindex="59" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="60" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="61" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="62" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="63" boneindex="1" weight="0.024940"/>
|
||||
<vertexboneassignment vertexindex="63" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="64" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="65" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="66" boneindex="1" weight="0.011483"/>
|
||||
<vertexboneassignment vertexindex="66" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="67" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="68" boneindex="1" weight="0.999988"/>
|
||||
<vertexboneassignment vertexindex="69" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="70" boneindex="1" weight="0.024940"/>
|
||||
<vertexboneassignment vertexindex="70" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="71" boneindex="1" weight="0.000002"/>
|
||||
<vertexboneassignment vertexindex="71" boneindex="0" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="72" boneindex="1" weight="0.999853"/>
|
||||
<vertexboneassignment vertexindex="73" boneindex="1" weight="0.999988"/>
|
||||
<vertexboneassignment vertexindex="74" boneindex="1" weight="0.000002"/>
|
||||
<vertexboneassignment vertexindex="74" boneindex="0" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="75" boneindex="1" weight="0.011483"/>
|
||||
<vertexboneassignment vertexindex="75" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="76" boneindex="1" weight="0.011483"/>
|
||||
<vertexboneassignment vertexindex="76" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="77" boneindex="1" weight="0.000002"/>
|
||||
<vertexboneassignment vertexindex="77" boneindex="0" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="78" boneindex="1" weight="0.006757"/>
|
||||
<vertexboneassignment vertexindex="78" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="79" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="80" boneindex="1" weight="0.000002"/>
|
||||
<vertexboneassignment vertexindex="80" boneindex="0" weight="0.999994"/>
|
||||
<vertexboneassignment vertexindex="81" boneindex="1" weight="0.024940"/>
|
||||
<vertexboneassignment vertexindex="81" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="82" boneindex="1" weight="0.000057"/>
|
||||
<vertexboneassignment vertexindex="82" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="83" boneindex="1" weight="0.006757"/>
|
||||
<vertexboneassignment vertexindex="83" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="84" boneindex="1" weight="0.024940"/>
|
||||
<vertexboneassignment vertexindex="84" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="85" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="86" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="87" boneindex="1" weight="0.000057"/>
|
||||
<vertexboneassignment vertexindex="87" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="88" boneindex="1" weight="0.006757"/>
|
||||
<vertexboneassignment vertexindex="88" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="89" boneindex="1" weight="0.000057"/>
|
||||
<vertexboneassignment vertexindex="89" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="90" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="91" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="92" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="93" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="94" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="95" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="96" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="97" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="98" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="99" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="100" boneindex="1" weight="0.011483"/>
|
||||
<vertexboneassignment vertexindex="100" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="101" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="102" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="103" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="104" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="105" boneindex="1" weight="0.011483"/>
|
||||
<vertexboneassignment vertexindex="105" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="106" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="107" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="108" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="109" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="110" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="111" boneindex="0" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="112" boneindex="1" weight="0.993960"/>
|
||||
<vertexboneassignment vertexindex="113" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="114" boneindex="1" weight="0.999955"/>
|
||||
<vertexboneassignment vertexindex="115" boneindex="1" weight="0.999870"/>
|
||||
<vertexboneassignment vertexindex="116" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="117" boneindex="1" weight="0.993960"/>
|
||||
<vertexboneassignment vertexindex="118" boneindex="1" weight="0.999870"/>
|
||||
<vertexboneassignment vertexindex="119" boneindex="1" weight="0.999981"/>
|
||||
<vertexboneassignment vertexindex="120" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="121" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="122" boneindex="1" weight="0.999997"/>
|
||||
<vertexboneassignment vertexindex="123" boneindex="1" weight="0.999955"/>
|
||||
<vertexboneassignment vertexindex="124" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="125" boneindex="1" weight="1.000000"/>
|
||||
<vertexboneassignment vertexindex="126" boneindex="1" weight="0.999981"/>
|
||||
<vertexboneassignment vertexindex="127" boneindex="1" weight="0.999997"/>
|
||||
<vertexboneassignment vertexindex="128" boneindex="1" weight="0.999997"/>
|
||||
<vertexboneassignment vertexindex="129" boneindex="1" weight="0.999981"/>
|
||||
<vertexboneassignment vertexindex="130" boneindex="1" weight="0.999870"/>
|
||||
<vertexboneassignment vertexindex="131" boneindex="1" weight="0.999955"/>
|
||||
</boneassignments>
|
||||
</submesh>
|
||||
</submeshes>
|
||||
<skeletonlink name="Cube.skeleton"/>
|
||||
</mesh>
|
|
@ -1,456 +0,0 @@
|
|||
<skeleton>
|
||||
<bones>
|
||||
<bone id="1" name="Bone">
|
||||
<position x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotation angle="2.094395">
|
||||
<axis x="0.577350" y="0.577350" z="-0.577350"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
<bone id="0" name="Bone.001">
|
||||
<position x="-0.000000" y="3.900000" z="-0.000000"/>
|
||||
<rotation angle="2.094396">
|
||||
<axis x="0.577350" y="-0.577351" z="-0.577350"/>
|
||||
</rotation>
|
||||
</bone>
|
||||
</bones>
|
||||
<bonehierarchy>
|
||||
<boneparent bone="Bone.001" parent="Bone" />
|
||||
</bonehierarchy>
|
||||
<animations>
|
||||
<animation name="Pos" length="2.400000">
|
||||
<tracks>
|
||||
<track bone="Bone.001">
|
||||
<keyframes>
|
||||
<keyframe time="0.000000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.040000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.045863"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.080000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.182779"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.120000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.403225"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.160000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.688689"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.200000">
|
||||
<translate x="0.000000" y="0.000000" z="-1.009270"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.240000">
|
||||
<translate x="0.000000" y="0.000000" z="-1.327951"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.280000">
|
||||
<translate x="0.000000" y="0.000000" z="-1.608584"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.320000">
|
||||
<translate x="0.000001" y="0.000000" z="-1.823324"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.360000">
|
||||
<translate x="0.000001" y="0.000000" z="-1.955807"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.400000">
|
||||
<translate x="0.000001" y="0.000000" z="-2.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.440000">
|
||||
<translate x="0.000001" y="0.000000" z="-1.955699"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.480000">
|
||||
<translate x="0.000001" y="0.000000" z="-1.822506"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.520000">
|
||||
<translate x="0.000000" y="0.000000" z="-1.606114"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.560000">
|
||||
<translate x="0.000000" y="0.000000" z="-1.323143"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.600000">
|
||||
<translate x="0.000000" y="0.000000" z="-1.002381"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.640000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.681123"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.680000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.396901"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.720000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.179043"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.760000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.044722"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.800000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.840000">
|
||||
<translate x="-0.044721" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.880000">
|
||||
<translate x="-0.179042" y="0.000000" z="0.000001"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.920000">
|
||||
<translate x="-0.396900" y="0.000000" z="0.000001"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="0.960000">
|
||||
<translate x="-0.681122" y="0.000000" z="0.000001"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.000000">
|
||||
<translate x="-1.002380" y="0.000000" z="0.000001"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.040000">
|
||||
<translate x="-1.323143" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.080000">
|
||||
<translate x="-1.606113" y="0.000001" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.120000">
|
||||
<translate x="-1.822505" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.160000">
|
||||
<translate x="-1.955699" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.200000">
|
||||
<translate x="-2.000000" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.240000">
|
||||
<translate x="-1.955699" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.280000">
|
||||
<translate x="-1.822505" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.320000">
|
||||
<translate x="-1.606113" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.360000">
|
||||
<translate x="-1.323143" y="0.000000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.400000">
|
||||
<translate x="-1.002380" y="0.000001" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.440000">
|
||||
<translate x="-0.681122" y="0.000000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.480000">
|
||||
<translate x="-0.396900" y="0.000000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.520000">
|
||||
<translate x="-0.179042" y="0.000000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.560000">
|
||||
<translate x="-0.044721" y="0.000000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.600000">
|
||||
<translate x="0.000000" y="0.000000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.640000">
|
||||
<translate x="-0.000000" y="-0.042450" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.680000">
|
||||
<translate x="-0.000000" y="-0.169973" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.720000">
|
||||
<translate x="-0.000000" y="-0.376856" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.760000">
|
||||
<translate x="-0.000000" y="-0.646827" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.800000">
|
||||
<translate x="-0.000000" y="-0.952042" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.840000">
|
||||
<translate x="-0.000000" y="-1.256833" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.880000">
|
||||
<translate x="-0.000001" y="-1.525729" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.920000">
|
||||
<translate x="-0.000001" y="-1.731354" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="1.960000">
|
||||
<translate x="-0.000001" y="-1.857910" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.000000">
|
||||
<translate x="-0.000001" y="-1.900000" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.040000">
|
||||
<translate x="-0.000001" y="-1.858003" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.080000">
|
||||
<translate x="-0.000001" y="-1.732059" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.120000">
|
||||
<translate x="-0.000001" y="-1.527857" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.160000">
|
||||
<translate x="-0.000000" y="-1.260974" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.200000">
|
||||
<translate x="-0.000000" y="-0.957975" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.240000">
|
||||
<translate x="-0.000000" y="-0.653338" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.280000">
|
||||
<translate x="-0.000000" y="-0.382294" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.320000">
|
||||
<translate x="-0.000000" y="-0.173183" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.360000">
|
||||
<translate x="-0.000000" y="-0.043430" z="-0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
<keyframe time="2.400000">
|
||||
<translate x="0.000000" y="0.000000" z="0.000000"/>
|
||||
<rotate angle="0.000000">
|
||||
<axis x="1.000000" y="0.000000" z="0.000000"/>
|
||||
</rotate>
|
||||
<scale x="1.000000" y="1.000000" z="1.000000"/>
|
||||
</keyframe>
|
||||
</keyframes>
|
||||
</track>
|
||||
</tracks>
|
||||
</animation>
|
||||
</animations>
|
||||
</skeleton>
|
|
@ -1,14 +0,0 @@
|
|||
material Material
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.640000 0.640000 0.640000 1.000000
|
||||
specular 0.500000 0.500000 0.500000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -188,6 +188,7 @@ if __name__ == "__main__":
|
|||
stdout=subprocess.PIPE).communicate()
|
||||
ext_list = str(ext_list).lower().split(";")
|
||||
|
||||
# todo: Fix for multi dot extensions like .skeleton.xml
|
||||
ext_list = list(filter(lambda f: not f in settings.exclude_extensions,
|
||||
map(clean, ext_list)))
|
||||
|
||||
|
|
|
@ -172,6 +172,12 @@ def process_dir(d, outfile_results, zipin, result):
|
|||
#print("Didn't find "+fullpath+" (Hash is "+filehash+") in database")
|
||||
continue
|
||||
|
||||
# Ignore extensions via settings.py configured list
|
||||
# todo: Fix for multi dot extensions like .skeleton.xml
|
||||
ext = os.path.splitext(fullpath)[1].lower()
|
||||
if ext != "" and ext in settings.exclude_extensions:
|
||||
continue
|
||||
|
||||
print("-"*60 + "\n " + os.path.realpath(fullpath) + " pp: " + pppreset)
|
||||
|
||||
outfile_actual = mkoutputdir_andgetpath(fullpath, filehash, "ACTUAL")
|
||||
|
|
|
@ -46,11 +46,16 @@ test scripts rely on this)
|
|||
"""
|
||||
|
||||
import os
|
||||
|
||||
# -------------------------------------------------------------------------------
|
||||
# List of file extensions to be excluded from the regression suite
|
||||
# File extensions are case insensitive
|
||||
# -------------------------------------------------------------------------------
|
||||
exclude_extensions = [".lws",".assbin",".assxml",".txt",".jpeg",".jpg",".png",".gif",".tga",".bmp"]
|
||||
exclude_extensions = [
|
||||
".lws", ".assbin", ".assxml", ".txt", ".md",
|
||||
".jpeg", ".jpg", ".png", ".gif", ".tga", ".bmp",
|
||||
".skeleton", ".skeleton.xml"
|
||||
]
|
||||
|
||||
# -------------------------------------------------------------------------------
|
||||
# Post processing configurations to be included in the test. The
|
||||
|
@ -114,5 +119,8 @@ dump_header_skip = 500
|
|||
# -------------------------------------------------------------------------------
|
||||
results = os.path.join("..","results")
|
||||
|
||||
# Create results directory if it does not exist
|
||||
if not os.path.exists(results):
|
||||
os.makedirs(results)
|
||||
|
||||
# vim: ai ts=4 sts=4 et sw=4
|
||||
|
|
|
@ -87,20 +87,28 @@ def find_assimp_or_die():
|
|||
|
||||
global assimp_bin_path
|
||||
if os.name == "nt":
|
||||
search_x86 = [
|
||||
os.path.join("..","..","bin","assimpcmd_release-dll_Win32","assimp.exe"),
|
||||
os.path.join("..","..","bin","x86","assimp"),
|
||||
os.path.join("..","..","bin","Release","assimp.exe")
|
||||
]
|
||||
if platform.machine() == "x86":
|
||||
search = [os.path.join("..","..","bin","assimpcmd_release-dll_Win32","assimp.exe"),
|
||||
os.path.join("..","..","bin","x86","assimp")]
|
||||
|
||||
search = search_x86
|
||||
else: # amd64, hopefully
|
||||
search = [os.path.join("..","..","bin","assimpcmd_release-dll_x64","assimp.exe"),
|
||||
os.path.join("..","..","bin","x64","assimp")]
|
||||
search = [
|
||||
os.path.join("..","..","bin","assimpcmd_release-dll_x64","assimp.exe"),
|
||||
os.path.join("..","..","bin","x64","assimp")
|
||||
]
|
||||
# x64 platform does not guarantee a x64 build. Also look for x86 as last paths.
|
||||
search += search_x86
|
||||
|
||||
assimp_bin_path = locate_file(search)
|
||||
if assimp_bin_path is None:
|
||||
print("Can't locate assimp_cmd binary")
|
||||
print("Looked in", search)
|
||||
sys.exit(-5)
|
||||
|
||||
print("Located assimp/assimp_cmd binary at ",assimp_bin_path)
|
||||
print("Located assimp/assimp_cmd binary from", assimp_bin_path)
|
||||
elif os.name == "posix":
|
||||
#search = [os.path.join("..","..","bin","gcc","assimp"),
|
||||
# os.path.join("/usr","local","bin",'assimp')]
|
||||
|
@ -110,8 +118,6 @@ def find_assimp_or_die():
|
|||
print("Unsupported operating system")
|
||||
sys.exit(-5)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
find_assimp_or_die()
|
||||
|
||||
|
|
|
@ -36,43 +36,6 @@ IDI_ASSIMP_VIEW ICON "../shared/assimp_tools_icon.ico
|
|||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1, 1, GitVersion, 0
|
||||
PRODUCTVERSION 1, 1, GitVersion, 1
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x4L
|
||||
FILETYPE 0x0L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040704b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "assimp team"
|
||||
VALUE "FileDescription", "ASSIMP Command-line Tools"
|
||||
VALUE "FileVersion", "1, 1, SVNRevision, 0"
|
||||
VALUE "InternalName", "assimp_view"
|
||||
VALUE "LegalCopyright", "Licensed under the LGPL"
|
||||
VALUE "OriginalFilename", "assimp.exe"
|
||||
VALUE "ProductName", "ASSIMP Command-line Tools"
|
||||
VALUE "ProductVersion", "1, 1, SVNRevision, 0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x407, 1200
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,164 +0,0 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||
# Visual Studio 2008
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimpview", "assimp_view.vcproj", "{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp", "assimp.vcproj", "{5691E159-2D9B-407F-971F-EA5C592DC524}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit", "UnitTest.vcproj", "{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimpcmd", "assimp_cmd.vcproj", "{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
debug|Win32 = debug|Win32
|
||||
debug|x64 = debug|x64
|
||||
debug-dll|Win32 = debug-dll|Win32
|
||||
debug-dll|x64 = debug-dll|x64
|
||||
debug-noboost-st|Win32 = debug-noboost-st|Win32
|
||||
debug-noboost-st|x64 = debug-noboost-st|x64
|
||||
debug-st|Win32 = debug-st|Win32
|
||||
debug-st|x64 = debug-st|x64
|
||||
release|Win32 = release|Win32
|
||||
release|x64 = release|x64
|
||||
release-dll|Win32 = release-dll|Win32
|
||||
release-dll|x64 = release-dll|x64
|
||||
release-noboost-st|Win32 = release-noboost-st|Win32
|
||||
release-noboost-st|x64 = release-noboost-st|x64
|
||||
release-st|Win32 = release-st|Win32
|
||||
release-st|x64 = release-st|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|Win32.ActiveCfg = debug|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|Win32.Build.0 = debug|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|x64.ActiveCfg = debug|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|x64.Build.0 = debug|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|x64.Build.0 = debug-dll|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|x64.Build.0 = debug-noboost-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|Win32.Build.0 = debug-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|x64.ActiveCfg = debug-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|x64.Build.0 = debug-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|Win32.ActiveCfg = release|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|Win32.Build.0 = release|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|x64.ActiveCfg = release|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|x64.Build.0 = release|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|Win32.Build.0 = release-dll|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.ActiveCfg = release-dll|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.Build.0 = release-dll|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.ActiveCfg = release-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.Build.0 = release-st|Win32
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|x64.ActiveCfg = release-st|x64
|
||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|x64.Build.0 = release-st|x64
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|Win32.ActiveCfg = debug|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|Win32.Build.0 = debug|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|x64.ActiveCfg = debug|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|x64.ActiveCfg = debug-dll|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|Win32.Build.0 = debug-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|x64.ActiveCfg = debug-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|Win32.ActiveCfg = release|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|Win32.Build.0 = release|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|x64.ActiveCfg = release|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|Win32.Build.0 = release-dll|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.ActiveCfg = release-dll|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|x64.ActiveCfg = release-noboost-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.ActiveCfg = release-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.Build.0 = release-st|Win32
|
||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|x64.ActiveCfg = release-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|Win32.ActiveCfg = debug|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|Win32.Build.0 = debug|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|x64.ActiveCfg = debug|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|x64.Build.0 = debug|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|x64.Build.0 = debug-dll|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|x64.Build.0 = debug-noboost-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|Win32.Build.0 = debug-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|x64.ActiveCfg = debug-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|x64.Build.0 = debug-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|Win32.ActiveCfg = release|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|Win32.Build.0 = release|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|x64.ActiveCfg = release|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|x64.Build.0 = release|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|Win32.Build.0 = release-dll|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.ActiveCfg = release-dll|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.Build.0 = release-dll|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.ActiveCfg = release-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.Build.0 = release-st|Win32
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.ActiveCfg = release-st|x64
|
||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.Build.0 = release-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|Win32.ActiveCfg = Debug|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|Win32.Build.0 = Debug|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|x64.ActiveCfg = Debug|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|x64.Build.0 = Debug|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|x64.Build.0 = debug-dll|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|x64.Build.0 = debug-noboost-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|Win32.Build.0 = debug-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|x64.ActiveCfg = debug-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|x64.Build.0 = debug-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|Win32.ActiveCfg = Release|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|Win32.Build.0 = Release|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|x64.ActiveCfg = Release|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|x64.Build.0 = Release|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|Win32.Build.0 = release-dll|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|x64.ActiveCfg = release-dll|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|x64.Build.0 = release-dll|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|Win32.ActiveCfg = release-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|Win32.Build.0 = release-st|Win32
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|x64.ActiveCfg = release-st|x64
|
||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|x64.Build.0 = release-st|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,17 +0,0 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioPropertySheet
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="DllShared"
|
||||
OutputDirectory="./../../bin/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
||||
IntermediateDirectory="./../../obj/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="ASSIMP_BUILD_DLL_EXPORT"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
CommandLine=""
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
|
@ -1,11 +0,0 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioPropertySheet
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="FastSTL"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="_HAS_ITERATOR_DEBUGGING=0;_SECURE_SCL=0"
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
|
@ -1,9 +0,0 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioPropertySheet
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="LibShared"
|
||||
OutputDirectory="./../../lib/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
||||
IntermediateDirectory="./../../obj/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
||||
>
|
||||
</VisualStudioPropertySheet>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue