Merge remote-tracking branch 'upstream/master'

pull/800/head
Paul Holland 2016-02-18 12:11:57 -08:00
commit fe68765df9
52 changed files with 1812 additions and 506 deletions

42
CHANGES
View File

@ -2,6 +2,24 @@
CHANGELOG
----------------------------------------------------------------------
3.2.0 (2015-11-03)
FEATURES:
- OpenDDL-Parser is part of contrib-source.
- Experimental OpenGEX-support
- CI-check for linux and windows
- Coverity check added
- New regression testsuite.
FIXES/HOUSEKEEPING:
- Hundreds of bugfixes in all parts of the library
- Unified line endings
API COMPATIBILITY:
- Removed precompiled header to increase build speed for linux
3.1.1 (2014-06-15)
FEATURES:
@ -18,18 +36,18 @@ FEATURES:
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)
FEATURES:
- new export interface similar to the import API.
- new export interface similar to the import API.
- Supported export formats: Collada, OBJ, PLY and STL
- added new import formats: XGL/ZGL, M3 (experimental)
- new postprocessing steps: Debone
@ -46,11 +64,11 @@ FIXES/HOUSEKEEPING:
- improved CMake build system
- templatized math library
- reduce dependency on boost.thread, only remaining spot
is synchronization for the C logging API
is synchronization for the C logging API
API COMPATIBILITY:
- renamed headers, export interface, C API properties and meta data
prevent compatibility with code written for 2.0, but in
prevent compatibility with code written for 2.0, but in
most cases these can be easily resolved
- Note: 3.0 is not binary compatible with 2.0
@ -68,9 +86,9 @@ FEATURES:
spatial structure) in some expensive postprocessing steps
- AssimpView now uses a reworked layout which leaves more space
to the scene hierarchy window
- Add C# bindings ('Assimp.NET')
- Keep BSD-licensed and otherwise free test files in separate
- Keep BSD-licensed and otherwise free test files in separate
folders (./test/models and ./test/models-nonbsd).
FIXES:
@ -80,20 +98,20 @@ FIXES:
- OpenGL-sample now works with MinGW
- Fix Importer::FindLoader failing on uppercase file extensions
- Fix flawed path handling when locating external files
- Limit the maximum number of vertices, faces, face indices and
- Limit the maximum number of vertices, faces, face indices and
weights that Assimp is able to handle. This is to avoid
crashes due to overflowing counters.
- Updated XCode project files
- Further CMAKE build improvements
API CHANGES:
- Add data structures for vertex-based animations (These are not
currently used, however ...)
- Some Assimp::Importer methods are const now.

View File

@ -1,6 +1,5 @@
Open Asset Import Library (assimp)
========
==================================
Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export.
APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.
@ -80,14 +79,15 @@ __Exporters__:
- glTF
### Building ###
Take a look into the `INSTALL` file. Our build system is CMake, if you used CMake before there is a good chance you know what to do.
### Ports ###
* [Android](port/AndroidJNI/README.md)
* [Python](port/PyAssimp/README.md)
* [.NET](port/AssimpNET/Readme.md)
* [Pascal](port/AssimpPascal/Readme.md)
#### Repository structure ####
Open Asset Import Library is implemented in C++. The directory structure is:
/code Source code
@ -105,8 +105,6 @@ Open Asset Import Library is implemented in C++. The directory structure is:
### Where to get help ###
For more information, visit [our website](http://assimp.sourceforge.net/). Or check out the `./doc`- folder, which contains the official documentation in HTML format.
(CHMs for Windows are included in some release packages and should be located right here in the root folder).
@ -119,12 +117,10 @@ And we also have an IRC-channel at freenode: #assetimporterlib . You can easily
> /join #assetimporterlib
### Contributing ###
Contributions to assimp are highly appreciated. The easiest way to get involved is to submit
a pull request with your changes against the main repository's `master` branch.
### License ###
Our license is based on the modified, __3-clause BSD__-License.
An _informal_ summary is: do whatever you want, but include Assimp's license text with your product -
@ -132,5 +128,4 @@ and don't sue us if our code doesn't work. Note that, unlike LGPLed code, you ma
For the legal details, see the `LICENSE` file.
### Why this name ###
Sorry, we're germans :-), no english native speakers ...

View File

@ -13,11 +13,22 @@ branches:
platform:
- x86
- x64
configuration: Release
build:
configuration:
- 2015
- 2013
- 2012
#- MinGW
- 2010 # only works for x86
init:
- if "%platform%" EQU "x64" ( for %%a in (2008 2010 MinGW) do ( if "%Configuration%"=="%%a" (echo "Skipping unsupported configuration" && exit /b 1 ) ) )
install:
# Make compiler command line tools available
- call c:\projects\assimp\appveyor\compiler_setup.bat
build_script:
- cd c:\projects\assimp
- cmake CMakeLists.txt -G "Visual Studio 11"
- cmake CMakeLists.txt -G "Visual Studio %Configuration%"
- msbuild /m /p:Configuration=Release /p:Platform="Win32" Assimp.sln

View File

@ -21,7 +21,8 @@ endif()
set(GTEST_CMAKE_ARGS
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
"-Dgtest_force_shared_crt=ON"
"-Dgtest_disable_pthreads:BOOL=${DISABLE_PTHREADS}")
"-Dgtest_disable_pthreads:BOOL=${DISABLE_PTHREADS}"
"-DBUILD_GTEST=ON")
set(GTEST_RELEASE_LIB_DIR "")
set(GTEST_DEBUGLIB_DIR "")
if (MSVC)
@ -41,7 +42,7 @@ else(NOT GIT_FOUND)
set(AddGTest_FOUND true CACHE BOOL "Was gtest setup correctly?")
ExternalProject_Add(gtest
GIT_REPOSITORY https://chromium.googlesource.com/external/googletest
GIT_REPOSITORY https://github.com/google/googletest.git
TIMEOUT 10
PREFIX "${GTEST_PREFIX}"
CMAKE_ARGS "${GTEST_CMAKE_ARGS}"
@ -56,10 +57,10 @@ else(NOT GIT_FOUND)
set(LIB_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(GTEST_LOCATION "${GTEST_PREFIX}/src/gtest-build")
set(GTEST_DEBUG_LIBRARIES
"${GTEST_LOCATION}/${DEBUG_LIB_DIR}/${LIB_PREFIX}gtest${LIB_SUFFIX}"
"${LIB_PREFIX}gtest${LIB_SUFFIX}"
"${CMAKE_THREAD_LIBS_INIT}")
SET(GTEST_RELEASE_LIBRARIES
"${GTEST_LOCATION}/${RELEASE_LIB_DIR}/${LIB_PREFIX}gtest${LIB_SUFFIX}"
"${LIB_PREFIX}gtest${LIB_SUFFIX}"
"${CMAKE_THREAD_LIBS_INIT}")
if(MSVC_VERSION EQUAL 1700)
@ -67,9 +68,11 @@ else(NOT GIT_FOUND)
endif()
ExternalProject_Get_Property(gtest source_dir)
include_directories(${source_dir}/include)
include_directories(${source_dir}/googletest/include)
include_directories(${source_dir}/gtest/include)
ExternalProject_Get_Property(gtest binary_dir)
link_directories(${binary_dir})
link_directories(${binary_dir}/googlemock/gtest)
link_directories(${binary_dir}/googlemock/gtest/${RELEASE_LIB_DIR})
link_directories(${binary_dir}/googlemock/gtest/${DEBUG_LIB_DIR})
endif(NOT GIT_FOUND)

View File

@ -70,8 +70,9 @@ void Discreet3DSImporter::ReplaceDefaultMaterial()
for (unsigned int i = 0; i < mScene->mMaterials.size();++i)
{
std::string s = mScene->mMaterials[i].mName;
for (std::string::iterator it = s.begin(); it != s.end(); ++it)
*it = ::tolower(*it);
for ( std::string::iterator it = s.begin(); it != s.end(); ++it ) {
*it = static_cast< char >( ::tolower( *it ) );
}
if (std::string::npos == s.find("default"))continue;
@ -663,14 +664,14 @@ void Discreet3DSImporter::AddNodeToGraph(aiScene* pcSOut,aiNode* pcOut,
nda->mRotationKeys = new aiQuatKey[nda->mNumRotationKeys];
// Rotations are quaternion offsets
aiQuaternion abs;
aiQuaternion abs1;
for (unsigned int n = 0; n < nda->mNumRotationKeys;++n)
{
const aiQuatKey& q = pcIn->aRotationKeys[n];
abs = (n ? abs * q.mValue : q.mValue);
abs1 = (n ? abs1 * q.mValue : q.mValue);
nda->mRotationKeys[n].mTime = q.mTime;
nda->mRotationKeys[n].mValue = abs.Normalize();
nda->mRotationKeys[n].mValue = abs1.Normalize();
}
}

View File

@ -429,12 +429,18 @@ ASSIMP_API void aiDetachAllLogStreams(void)
#ifndef ASSIMP_BUILD_SINGLETHREADED
boost::mutex::scoped_lock lock(gLogStreamMutex);
#endif
Logger *logger( DefaultLogger::get() );
if ( NULL == logger ) {
return;
}
for (LogStreamMap::iterator it = gActiveLogStreams.begin(); it != gActiveLogStreams.end(); ++it) {
DefaultLogger::get()->detatchStream( it->second );
logger->detatchStream( it->second );
delete it->second;
}
gActiveLogStreams.clear();
DefaultLogger::kill();
ASSIMP_END_EXCEPTION_REGION(void);
}

View File

@ -798,7 +798,7 @@ if (ASSIMP_ANDROID_JNIIOSYSTEM)
endif(ASSIMP_ANDROID_JNIIOSYSTEM)
if(MSVC AND ASSIMP_INSTALL_PDB)
install(FILES ${Assimp_BINARY_DIR}/code/Debug/assimp${CMAKE_DEBUG_POSTFIX}.pdb
install(FILES ${Assimp_BINARY_DIR}/code/Debug/assimp${LIBRARY_SUFFIX}${CMAKE_DEBUG_POSTFIX}.pdb
DESTINATION ${ASSIMP_LIB_INSTALL_DIR}
CONFIGURATIONS Debug
)

View File

@ -597,6 +597,48 @@ struct Animation
for( std::vector<Animation*>::iterator it = mSubAnims.begin(); it != mSubAnims.end(); ++it)
delete *it;
}
/** Collect all channels in the animation hierarchy into a single channel list. */
void CollectChannelsRecursively(std::vector<AnimationChannel> &channels)
{
channels.insert(channels.end(), mChannels.begin(), mChannels.end());
for (std::vector<Animation*>::iterator it = mSubAnims.begin(); it != mSubAnims.end(); ++it)
{
Animation *pAnim = (*it);
pAnim->CollectChannelsRecursively(channels);
}
}
/** Combine all single-channel animations' channel into the same (parent) animation channel list. */
void CombineSingleChannelAnimations()
{
CombineSingleChannelAnimationsRecursively(this);
}
void CombineSingleChannelAnimationsRecursively(Animation *pParent)
{
for (std::vector<Animation*>::iterator it = pParent->mSubAnims.begin(); it != pParent->mSubAnims.end();)
{
Animation *anim = *it;
CombineSingleChannelAnimationsRecursively(anim);
if (anim->mChannels.size() == 1)
{
pParent->mChannels.push_back(anim->mChannels[0]);
it = pParent->mSubAnims.erase(it);
delete anim;
}
else
{
++it;
}
}
}
};
/** Description of a collada animation channel which has been determined to affect the current node */

View File

@ -187,6 +187,8 @@ void ColladaParser::ReadStructure()
ReadAssetInfo();
else if( IsElement( "library_animations"))
ReadAnimationLibrary();
else if (IsElement("library_animation_clips"))
ReadAnimationClipLibrary();
else if( IsElement( "library_controllers"))
ReadControllerLibrary();
else if( IsElement( "library_images"))
@ -215,6 +217,8 @@ void ColladaParser::ReadStructure()
break;
}
}
PostProcessRootAnimations();
}
// ------------------------------------------------------------------------------------------------
@ -271,6 +275,131 @@ void ColladaParser::ReadAssetInfo()
}
}
// ------------------------------------------------------------------------------------------------
// Reads the animation clips
void ColladaParser::ReadAnimationClipLibrary()
{
if (mReader->isEmptyElement())
return;
while (mReader->read())
{
if (mReader->getNodeType() == irr::io::EXN_ELEMENT)
{
if (IsElement("animation_clip"))
{
// optional name given as an attribute
std::string animName;
int indexName = TestAttribute("name");
int indexID = TestAttribute("id");
if (indexName >= 0)
animName = mReader->getAttributeValue(indexName);
else if (indexID >= 0)
animName = mReader->getAttributeValue(indexID);
else
animName = "animation_" + mAnimationClipLibrary.size();
std::pair<std::string, std::vector<std::string> > clip;
clip.first = animName;
while (mReader->read())
{
if (mReader->getNodeType() == irr::io::EXN_ELEMENT)
{
if (IsElement("instance_animation"))
{
int indexUrl = TestAttribute("url");
if (indexUrl >= 0)
{
const char* url = mReader->getAttributeValue(indexUrl);
if (url[0] != '#')
ThrowException("Unknown reference format");
url++;
clip.second.push_back(url);
}
}
else
{
// ignore the rest
SkipElement();
}
}
else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END)
{
if (strcmp(mReader->getNodeName(), "animation_clip") != 0)
ThrowException("Expected end of <animation_clip> element.");
break;
}
}
if (clip.second.size() > 0)
{
mAnimationClipLibrary.push_back(clip);
}
}
else
{
// ignore the rest
SkipElement();
}
}
else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END)
{
if (strcmp(mReader->getNodeName(), "library_animation_clips") != 0)
ThrowException("Expected end of <library_animation_clips> element.");
break;
}
}
}
// ------------------------------------------------------------------------------------------------
// Re-build animations from animation clip library, if present, otherwise combine single-channel animations
void ColladaParser::PostProcessRootAnimations()
{
if (mAnimationClipLibrary.size() > 0)
{
Animation temp;
for (AnimationClipLibrary::iterator it = mAnimationClipLibrary.begin(); it != mAnimationClipLibrary.end(); ++it)
{
std::string clipName = it->first;
Animation *clip = new Animation();
clip->mName = clipName;
temp.mSubAnims.push_back(clip);
for (std::vector<std::string>::iterator a = it->second.begin(); a != it->second.end(); ++a)
{
std::string animationID = *a;
AnimationLibrary::iterator animation = mAnimationLibrary.find(animationID);
if (animation != mAnimationLibrary.end())
{
Animation *pSourceAnimation = animation->second;
pSourceAnimation->CollectChannelsRecursively(clip->mChannels);
}
}
}
mAnims = temp;
// Ensure no double deletes.
temp.mSubAnims.clear();
}
else
{
mAnims.CombineSingleChannelAnimations();
}
}
// ------------------------------------------------------------------------------------------------
// Reads the animation library
void ColladaParser::ReadAnimationLibrary()
@ -318,12 +447,17 @@ void ColladaParser::ReadAnimation( Collada::Animation* pParent)
// optional name given as an attribute
std::string animName;
std::string animID;
int indexName = TestAttribute( "name");
int indexID = TestAttribute( "id");
if (indexID >= 0)
animID = mReader->getAttributeValue(indexID);
if( indexName >= 0)
animName = mReader->getAttributeValue( indexName);
else if( indexID >= 0)
animName = mReader->getAttributeValue( indexID);
animName = animID;
else
animName = "animation";
@ -395,11 +529,19 @@ void ColladaParser::ReadAnimation( Collada::Animation* pParent)
// it turned out to have channels - add them
if( !channels.empty())
{
// FIXME: Is this essentially doing the same as "single-anim-node" codepath in
// ColladaLoader::StoreAnimations? For now, this has been deferred to after
// all animations and all clips have been read. Due to handling of
// <library_animation_clips> this cannot be done here, as the channel owner
// is lost, and some exporters make up animations by referring to multiple
// single-channel animations from an <instance_animation>.
/*
// special filtering for stupid exporters packing each channel into a separate animation
if( channels.size() == 1)
{
pParent->mChannels.push_back( channels.begin()->second);
} else
*/
{
// else create the animation, if not done yet, and store the channels
if( !anim)
@ -410,6 +552,11 @@ void ColladaParser::ReadAnimation( Collada::Animation* pParent)
}
for( ChannelMap::const_iterator it = channels.begin(); it != channels.end(); ++it)
anim->mChannels.push_back( it->second);
if (indexID >= 0)
{
mAnimationLibrary[animID] = anim;
}
}
}
}

View File

@ -82,6 +82,12 @@ namespace Assimp
/** Reads the animation library */
void ReadAnimationLibrary();
/** Reads the animation clip library */
void ReadAnimationClipLibrary();
/** Re-build animations from animation clip library, if present, otherwise combine single-channel animations */
void PostProcessRootAnimations();
/** Reads an animation into the given parent structure */
void ReadAnimation( Collada::Animation* pParent);
@ -312,6 +318,14 @@ namespace Assimp
/** Controller library: joint controllers by ID */
typedef std::map<std::string, Collada::Controller> ControllerLibrary;
ControllerLibrary mControllerLibrary;
/** Animation library: animation references by ID */
typedef std::map<std::string, Collada::Animation*> AnimationLibrary;
AnimationLibrary mAnimationLibrary;
/** Animation clip library: clip animation references by ID */
typedef std::vector<std::pair<std::string, std::vector<std::string> > > AnimationClipLibrary;
AnimationClipLibrary mAnimationClipLibrary;
/** Pointer to the root node. Don't delete, it just points to one of
the nodes in the node library. */

View File

@ -471,32 +471,38 @@ void MeshGeometry::ReadVertexDataColors(std::vector<aiColor4D>& colors_out, cons
mappings);
}
// ------------------------------------------------------------------------------------------------
static const std::string TangentIndexToken = "TangentIndex";
static const std::string TangentsIndexToken = "TangentsIndex";
void MeshGeometry::ReadVertexDataTangents(std::vector<aiVector3D>& tangents_out, const Scope& source,
const std::string& MappingInformationType,
const std::string& ReferenceInformationType)
{
const char * str = source.Elements().count( "Tangents" ) > 0 ? "Tangents" : "Tangent";
const char * strIdx = source.Elements().count( "Tangents" ) > 0 ? TangentsIndexToken.c_str() : TangentIndexToken.c_str();
ResolveVertexDataArray(tangents_out,source,MappingInformationType,ReferenceInformationType,
str,
"TangentIndex",
strIdx,
vertices.size(),
mapping_counts,
mapping_offsets,
mappings);
}
// ------------------------------------------------------------------------------------------------
static const std::string BinormalIndexToken = "BinormalIndex";
static const std::string BinormalsIndexToken = "BinormalsIndex";
void MeshGeometry::ReadVertexDataBinormals(std::vector<aiVector3D>& binormals_out, const Scope& source,
const std::string& MappingInformationType,
const std::string& ReferenceInformationType)
{
const char * str = source.Elements().count( "Binormals" ) > 0 ? "Binormals" : "Binormal";
const char * strIdx = source.Elements().count( "Binormals" ) > 0 ? BinormalsIndexToken.c_str() : BinormalIndexToken.c_str();
ResolveVertexDataArray(binormals_out,source,MappingInformationType,ReferenceInformationType,
str,
"BinormalIndex",
strIdx,
vertices.size(),
mapping_counts,
mapping_offsets,

View File

@ -357,23 +357,24 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex)
}
// adjust bone vertex weights.
for( int a = 0; a < (int)pMesh->mNumBones; a++)
{
for( int a = 0; a < (int)pMesh->mNumBones; a++) {
aiBone* bone = pMesh->mBones[a];
std::vector<aiVertexWeight> newWeights;
newWeights.reserve( bone->mNumWeights);
for( unsigned int b = 0; b < bone->mNumWeights; b++)
{
const aiVertexWeight& ow = bone->mWeights[b];
// if the vertex is a unique one, translate it
if( !(replaceIndex[ow.mVertexId] & 0x80000000))
{
aiVertexWeight nw;
nw.mVertexId = replaceIndex[ow.mVertexId];
nw.mWeight = ow.mWeight;
newWeights.push_back( nw);
if ( NULL != bone->mWeights ) {
for ( unsigned int b = 0; b < bone->mNumWeights; b++ ) {
const aiVertexWeight& ow = bone->mWeights[ b ];
// if the vertex is a unique one, translate it
if ( !( replaceIndex[ ow.mVertexId ] & 0x80000000 ) ) {
aiVertexWeight nw;
nw.mVertexId = replaceIndex[ ow.mVertexId ];
nw.mWeight = ow.mWeight;
newWeights.push_back( nw );
}
}
} else {
DefaultLogger::get()->error( "X-Export: aiBone shall contain weights, but pointer to them is NULL." );
}
if (newWeights.size() > 0) {

View File

@ -328,7 +328,12 @@ void AnimResolver::DoInterpolation2(std::vector<LWO::Key>::const_iterator beg,
break;
}
// linear interpolation - default
fill = (*beg).value + ((*end).value - (*beg).value)*(float)(((time - (*beg).time) / ((*end).time - (*beg).time)));
double duration = (*end).time - (*beg).time;
if (duration > 0.0) {
fill = (*beg).value + ((*end).value - (*beg).value)*(float)(((time - (*beg).time) / duration));
} else {
fill = (*beg).value;
}
}
// ------------------------------------------------------------------------------------------------

View File

@ -114,35 +114,34 @@ const aiImporterDesc* ObjFileImporter::GetInfo () const
// ------------------------------------------------------------------------------------------------
// Obj-file import implementation
void ObjFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler)
{
void ObjFileImporter::InternReadFile( const std::string &file, aiScene* pScene, IOSystem* pIOHandler) {
// Read file into memory
const std::string mode = "rb";
boost::scoped_ptr<IOStream> file( pIOHandler->Open( pFile, mode));
if( !file.get() ) {
throw DeadlyImportError( "Failed to open file " + pFile + "." );
static const std::string mode = "rb";
boost::scoped_ptr<IOStream> fileStream( pIOHandler->Open( file, mode));
if( !fileStream.get() ) {
throw DeadlyImportError( "Failed to open file " + file + "." );
}
// Get the file-size and validate it, throwing an exception when fails
size_t fileSize = file->FileSize();
size_t fileSize = fileStream->FileSize();
if( fileSize < ObjMinSize ) {
throw DeadlyImportError( "OBJ-file is too small.");
}
// Allocate buffer and read file into it
TextFileToBuffer(file.get(),m_Buffer);
TextFileToBuffer( fileStream.get(),m_Buffer);
// Get the model name
std::string modelName, folderName;
std::string::size_type pos = pFile.find_last_of( "\\/" );
std::string::size_type pos = file.find_last_of( "\\/" );
if ( pos != std::string::npos ) {
modelName = pFile.substr(pos+1, pFile.size() - pos - 1);
folderName = pFile.substr( 0, pos );
modelName = file.substr(pos+1, file.size() - pos - 1);
folderName = file.substr( 0, pos );
if ( !folderName.empty() ) {
pIOHandler->PushDirectory( folderName );
}
} else {
modelName = pFile;
modelName = file;
}
// This next stage takes ~ 1/3th of the total readFile task

View File

@ -293,7 +293,7 @@ void ObjFileParser::getVector( std::vector<aiVector3D> &point3d_array ) {
// -------------------------------------------------------------------
// Get values for a new 3D vector instance
void ObjFileParser::getVector3(std::vector<aiVector3D> &point3d_array) {
void ObjFileParser::getVector3( std::vector<aiVector3D> &point3d_array ) {
float x, y, z;
copyNextWord(m_buffer, Buffersize);
x = (float) fast_atof(m_buffer);
@ -323,19 +323,18 @@ void ObjFileParser::getVector2( std::vector<aiVector2D> &point2d_array ) {
m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine );
}
static const std::string DefaultObjName = "defaultobject";
// -------------------------------------------------------------------
// Get values for a new face instance
void ObjFileParser::getFace(aiPrimitiveType type)
{
void ObjFileParser::getFace(aiPrimitiveType type) {
copyNextLine(m_buffer, Buffersize);
if (m_DataIt == m_DataItEnd)
return;
char *pPtr = m_buffer;
char *pEnd = &pPtr[Buffersize];
pPtr = getNextToken<char*>(pPtr, pEnd);
if (pPtr == pEnd || *pPtr == '\0')
if ( pPtr == pEnd || *pPtr == '\0' ) {
return;
}
std::vector<unsigned int> *pIndices = new std::vector<unsigned int>;
std::vector<unsigned int> *pTexID = new std::vector<unsigned int>;
@ -349,20 +348,18 @@ void ObjFileParser::getFace(aiPrimitiveType type)
const bool vt = (!m_pModel->m_TextureCoord.empty());
const bool vn = (!m_pModel->m_Normals.empty());
int iStep = 0, iPos = 0;
while (pPtr != pEnd)
{
while (pPtr != pEnd) {
iStep = 1;
if (IsLineEnd(*pPtr))
if ( IsLineEnd( *pPtr ) ) {
break;
}
if (*pPtr=='/' )
{
if (*pPtr=='/' ) {
if (type == aiPrimitiveType_POINT) {
DefaultLogger::get()->error("Obj: Separator unexpected in point statement");
}
if (iPos == 0)
{
if (iPos == 0) {
//if there are no texture coordinates in the file, but normals
if (!vt && vn) {
iPos = 1;
@ -370,22 +367,20 @@ void ObjFileParser::getFace(aiPrimitiveType type)
}
}
iPos++;
}
else if( IsSpaceOrNewLine( *pPtr ) )
{
} else if( IsSpaceOrNewLine( *pPtr ) ) {
iPos = 0;
}
else
{
} else {
//OBJ USES 1 Base ARRAYS!!!!
const int iVal = atoi( pPtr );
const int iVal( ::atoi( pPtr ) );
// increment iStep position based off of the sign and # of digits
int tmp = iVal;
if (iVal < 0)
if ( iVal < 0 ) {
++iStep;
while ( ( tmp = tmp / 10 )!=0 )
}
while ( ( tmp = tmp / 10 ) != 0 ) {
++iStep;
}
if ( iVal > 0 )
{
@ -455,12 +450,12 @@ void ObjFileParser::getFace(aiPrimitiveType type)
// Create a default object, if nothing is there
if( NULL == m_pModel->m_pCurrent ) {
createObject( "defaultobject" );
createObject( DefaultObjName );
}
// Assign face to mesh
if ( NULL == m_pModel->m_pCurrentMesh ) {
createMesh( "defaultobject" );
createMesh( DefaultObjName );
}
// Store the face
@ -780,15 +775,15 @@ void ObjFileParser::createMesh( const std::string &meshName )
// -------------------------------------------------------------------
// Returns true, if a new mesh must be created.
bool ObjFileParser::needsNewMesh( const std::string &rMaterialName )
bool ObjFileParser::needsNewMesh( const std::string &materialName )
{
// If no mesh data yet
if(m_pModel->m_pCurrentMesh == 0)
{
// No mesh data yet
return true;
}
bool newMat = false;
int matIdx = getMaterialIndex( rMaterialName );
int matIdx = getMaterialIndex( materialName );
int curMatIdx = m_pModel->m_pCurrentMesh->m_uiMaterialIndex;
if ( curMatIdx != int(ObjFile::Mesh::NoMaterial) && curMatIdx != matIdx )
{

View File

@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2014, assimp team
Copyright (c) 2006-2016, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,

View File

@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2014, assimp team
Copyright (c) 2006-2016, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,

View File

@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2014, assimp team
Copyright (c) 2006-2016, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,
@ -225,6 +225,7 @@ OpenGEXImporter::OpenGEXImporter()
, m_tokenType( Grammar::NoneType )
, m_nodeStack()
, m_unresolvedRefStack() {
// empty
}
//------------------------------------------------------------------------------------------------
@ -423,7 +424,7 @@ static void getRefNames( DDLNode *node, std::vector<std::string> &names ) {
for( size_t i = 0; i < ref->m_numRefs; i++ ) {
Name *currentName( ref->m_referencedName[ i ] );
if( NULL != currentName && NULL != currentName->m_id ) {
const std::string name( currentName->m_id->m_text.m_buffer );
const std::string name( currentName->m_id->m_buffer );
if( !name.empty() ) {
names.push_back( name );
}
@ -541,7 +542,7 @@ static void propId2StdString( Property *prop, std::string &name, std::string &ke
}
if( NULL != prop->m_key ) {
name = prop->m_key->m_text.m_buffer;
name = prop->m_key->m_buffer;
if( Value::ddl_string == prop->m_value->m_type ) {
key = prop->m_value->getString();
}
@ -714,7 +715,7 @@ void OpenGEXImporter::handleIndexArrayNode( ODDLParser::DDLNode *node, aiScene *
current.mIndices = new unsigned int[ current.mNumIndices ];
Value *next( vaList->m_dataList );
for( size_t indices = 0; indices < current.mNumIndices; indices++ ) {
const int idx = next->getInt32();
const int idx( next->getUnsignedInt32() );
ai_assert( static_cast<size_t>( idx ) <= m_currentVertices.m_numVerts );
aiVector3D &pos = ( m_currentVertices.m_vertices[ idx ] );
@ -758,12 +759,16 @@ enum ColorType {
};
//------------------------------------------------------------------------------------------------
static ColorType getColorType( Identifier *id ) {
if( id->m_text == Grammar::DiffuseColorToken ) {
static ColorType getColorType( Text *id ) {
if ( NULL == id ) {
return NoneColor;
}
if( *id == Grammar::DiffuseColorToken ) {
return DiffuseColor;
} else if( id->m_text == Grammar::SpecularColorToken ) {
} else if( *id == Grammar::SpecularColorToken ) {
return SpecularColor;
} else if( id->m_text == Grammar::EmissionColorToken ) {
} else if( *id == Grammar::EmissionColorToken ) {
return EmissionColor;
}

View File

@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2014, assimp team
Copyright (c) 2006-2016, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,

View File

@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2014, assimp team
Copyright (c) 2006-2016, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,

View File

@ -292,7 +292,7 @@ bool Q3BSPZipArchive::mapArchive() {
// The file has EXACTLY the size of uncompressed_size. In C
// you need to mark the last character with '\0', so add
// another character
if(unzOpenCurrentFile(m_ZipFileHandle) == UNZ_OK) {
if(fileInfo.uncompressed_size != 0 && unzOpenCurrentFile(m_ZipFileHandle) == UNZ_OK) {
std::pair<std::map<std::string, ZipFile*>::iterator, bool> result = m_ArchiveMap.insert(std::make_pair(filename, new ZipFile(fileInfo.uncompressed_size)));
if(unzReadCurrentFile(m_ZipFileHandle, result.first->second->m_Buffer, fileInfo.uncompressed_size) == (long int) fileInfo.uncompressed_size) {

View File

@ -40,7 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** @file SIBImporter.cpp
* @brief Implementation of the SIB importer class
* @brief Implementation of the SIB importer class.
*
* The Nevercenter Silo SIB format is undocumented.
* All details here have been reverse engineered from
@ -163,7 +163,12 @@ static aiColor3D ReadColor(StreamReaderLE* stream)
static void UnknownChunk(StreamReaderLE* stream, const SIBChunk& chunk)
{
char temp[5] = { (chunk.Tag>>24)&0xff, (chunk.Tag>>16)&0xff, (chunk.Tag>>8)&0xff, chunk.Tag&0xff, '\0' };
char temp[5] = {
static_cast<char>(( chunk.Tag>>24 ) & 0xff),
static_cast<char>(( chunk.Tag>>16 ) & 0xff),
static_cast<char>(( chunk.Tag>>8 ) & 0xff),
static_cast<char>(chunk.Tag & 0xff), '\0'
};
DefaultLogger::get()->warn((Formatter::format(), "SIB: Skipping unknown '",temp,"' chunk."));
}
@ -512,7 +517,7 @@ static void ReadShape(SIB* sib, StreamReaderLE* stream)
aiString name;
while (stream->GetRemainingSizeToLimit() >= sizeof(SIBChunk))
{
{
SIBChunk chunk = ReadChunk(stream);
unsigned oldLimit = stream->SetReadLimit(stream->GetCurrentPos() + chunk.Size);
@ -720,7 +725,7 @@ static void ReadLight(SIB* sib, StreamReaderLE* stream)
aiLight* light = new aiLight();
while (stream->GetRemainingSizeToLimit() >= sizeof(SIBChunk))
{
{
SIBChunk chunk = ReadChunk(stream);
unsigned oldLimit = stream->SetReadLimit(stream->GetCurrentPos() + chunk.Size);
@ -768,18 +773,18 @@ static void ReadInstance(SIB* sib, StreamReaderLE* stream)
uint32_t shapeIndex = 0;
while (stream->GetRemainingSizeToLimit() >= sizeof(SIBChunk))
{
{
SIBChunk chunk = ReadChunk(stream);
unsigned oldLimit = stream->SetReadLimit(stream->GetCurrentPos() + chunk.Size);
switch (chunk.Tag)
{
case TAG('D','I','N','F'): break; // display info, not needed
case TAG('P','I','N','F'): break; // ?
case TAG('D','I','N','F'): break; // display info, not needed
case TAG('P','I','N','F'): break; // ?
case TAG('A','X','I','S'): ReadAxis(inst.axis, stream); break;
case TAG('I','N','S','I'): shapeIndex = stream->GetU4(); break;
case TAG('S','M','T','X'): ReadScale(inst.axis, stream); break;
case TAG('S','N','A','M'): inst.name = ReadString(stream, chunk.Size/2); break;
case TAG('I','N','S','I'): shapeIndex = stream->GetU4(); break;
case TAG('S','M','T','X'): ReadScale(inst.axis, stream); break;
case TAG('S','N','A','M'): inst.name = ReadString(stream, chunk.Size/2); break;
default: UnknownChunk(stream, chunk); break;
}
@ -808,7 +813,7 @@ static void ReadScene(SIB* sib, StreamReaderLE* stream)
{
// Parse each chunk in turn.
while (stream->GetRemainingSizeToLimit() >= sizeof(SIBChunk))
{
{
SIBChunk chunk = ReadChunk(stream);
unsigned oldLimit = stream->SetReadLimit(stream->GetCurrentPos() + chunk.Size);
@ -860,9 +865,9 @@ void SIBImporter::InternReadFile(const std::string& pFile,
pScene->mNumMaterials = sib.mtls.size();
pScene->mNumMeshes = sib.meshes.size();
pScene->mNumLights = sib.lights.size();
pScene->mMaterials = new aiMaterial* [pScene->mNumMaterials];
pScene->mMeshes = new aiMesh* [pScene->mNumMeshes];
pScene->mLights = new aiLight* [pScene->mNumLights];
pScene->mMaterials = pScene->mNumMaterials ? new aiMaterial*[pScene->mNumMaterials] : NULL;
pScene->mMeshes = pScene->mNumMeshes ? new aiMesh*[pScene->mNumMeshes] : NULL;
pScene->mLights = pScene->mNumLights ? new aiLight*[pScene->mNumLights] : NULL;
if (pScene->mNumMaterials)
memcpy(pScene->mMaterials, &sib.mtls[0], sizeof(aiMaterial*) * pScene->mNumMaterials);
if (pScene->mNumMeshes)
@ -875,7 +880,7 @@ void SIBImporter::InternReadFile(const std::string& pFile,
aiNode *root = new aiNode();
root->mName.Set("<SIBRoot>");
root->mNumChildren = sib.objs.size() + sib.lights.size();
root->mChildren = new aiNode* [root->mNumChildren];
root->mChildren = root->mNumChildren ? new aiNode*[root->mNumChildren] : NULL;
pScene->mRootNode = root;
// Add nodes for each object.
@ -889,7 +894,7 @@ void SIBImporter::InternReadFile(const std::string& pFile,
node->mTransformation = obj.axis;
node->mNumMeshes = obj.meshCount;
node->mMeshes = new unsigned[node->mNumMeshes];
node->mMeshes = node->mNumMeshes ? new unsigned[node->mNumMeshes] : NULL;
for (unsigned i=0;i<node->mNumMeshes;i++)
node->mMeshes[i] = obj.meshIdx + i;

View File

@ -1128,10 +1128,11 @@ void SceneCombiner::Copy (aiTexture** _dest, const aiTexture* src)
}
// ------------------------------------------------------------------------------------------------
void SceneCombiner::Copy (aiAnimation** _dest, const aiAnimation* src)
void SceneCombiner::Copy( aiAnimation** _dest, const aiAnimation* src )
{
ai_assert(NULL != _dest && NULL != src);
ai_assert( NULL != _dest );
ai_assert( NULL != src );
aiAnimation* dest = *_dest = new aiAnimation();
// get a flat copy

View File

@ -119,7 +119,7 @@ void ComputeNormalsWithSmoothingsGroups(MeshWithSmoothingGroups<T>& sMesh)
{
vNormals += sMesh.mNormals[(*a)];
}
vNormals.Normalize();
vNormals.NormalizeSafe();
// write back into all affected normals
for (std::vector<unsigned int>::const_iterator

View File

@ -0,0 +1,16 @@
===============================================================
OpenDDL-Parser
Developers and Contributors
===============================================================
- Kim Kulling ( kimmi ):
Founder
- Fredrik Hansson ( FredrikHson ):
Improvements value interface, serveral bugfixes.
- Henry Read ( henrya2 ):
Static build option, Interface improvements
- Paul Holland ( pkholland ):
Bugfixes.

View File

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2014 Kim Kulling
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.

View File

@ -1,29 +1,39 @@
The OpenDDL-Parser
==================
A simple and fast OpenDDL Parser
Current build status: [![Build Status](https://travis-ci.org/kimkulling/openddl-parser.png)](https://travis-ci.org/kimkulling/openddl-parser)
The OpenDDL-Parser is a small and easy to use library for OpenDDL-file-format-parsing. OpenDDL is the shortcut for Open Data Description Language, a data-declaration language introduced by Eric Lengyel. Please check http://openddl.org/ if you want to learn more about it.
Build status
============
Linux build status: [![Build Status](https://travis-ci.org/kimkulling/openddl-parser.png)](https://travis-ci.org/kimkulling/openddl-parser)
Current coverity check status:
<a href="https://scan.coverity.com/projects/5606">
<img alt="Coverity Scan Build Status"
src="https://scan.coverity.com/projects/5606/badge.svg"/>
</a>
Get the source code
===================
You can get the code from our git repository, which is located at GitHub. You can clone the repository like:
You can get the code from our git repository, which is located at GitHub. You can clone the repository with the following command:
> git clone https://github.com/kimkulling/openddl-parser.git
Build from repo
===============
To build the library you need to install cmake first ( see http://www.cmake.org/ for more information ). Make also sure that a compiler toolchain is installed on your machine.
After installing it you can open a console and type:
Building the source from the GitHub-Repo
========================================
To build the library you need to install cmake first ( see http://www.cmake.org/ for more information ). Make also sure that a compiler tool-chain is installed on your machine.
After installing it you can open a console and enter:
> cmake CMakeLists.txt
This command will generate a build environment for your installed build enrironment ( for Visual Studio the project files will be generated, for gcc the makefiles will be generated ).
This command will generate a build environment for your installed build enrironment ( for Visual-Studio-users the project files will be generated, for gcc-users the makefiles will be generated ).
When using an IDE open the IDE and run the build. When using GNU-make type in your console:
> make
and that's all.
When using Visual Studio CMake will generate you a solution for ythe library. Just build it there.
Use the library
===============
To use the OpenDDL-parser you need to build the lib first. Now add the
@ -88,24 +98,39 @@ int main( int argc, char *argv[] ) {
How to access the imported data
===============================
The data is organized as a tree. You can get the root tree with the following code:
The data is organized as a tree. You can get the root-node of the tree with the following code:
```
```cpp
OpenDDLParser theParser;
theParser.setBuffer( buffer, size );
const bool result( theParser.parse() );
if ( result ) {
DDLNode *root = theParser.getRoot();
DDLNode::DllNodeList childs = root->getChildNodeList();
for ( size_t i=0; i<childs.size(); i++ ) {
DDLNode *child = childs[ i ];
Property *prop = child->getProperty(); // to get properties
std:.string type = child->getType(); // to get the node type
Value *values = child->getValue(); // to get the data;
Property *prop = child->getProperty(); // to get properties
std::string type = child->getType(); // to get the node type
Value *values = child->getValue(); // to get the data;
// to loop through all values
while ( values != ddl_nullptr ) {
int current = values->getInt32();
values = value->getNext();
}
}
}
```
The instance called root contains the data.
The node instance called root contains the data.
All data lists are organized as linked lists.
Reference documentation
=======================
Please check http://kimkulling.github.io/openddl-parser/doxygen_html/index.html.
Projects using OpenDDL-Parser
=============================
- Asset Importer Lib: https://github.com/assimp/assimp .

View File

@ -153,7 +153,7 @@ Property *DDLNode::findPropertyByName( const std::string &name ) {
Property *current( m_properties );
while( ddl_nullptr != current ) {
int res = strncmp( current->m_key->m_text.m_buffer, name.c_str(), name.size() );
int res = strncmp( current->m_key->m_buffer, name.c_str(), name.size() );
if( 0 == res ) {
return current;
}

View File

@ -73,31 +73,14 @@ bool Text::operator == ( const Text &rhs ) const {
return ( 0 == res );
}
Identifier::Identifier( const char buffer[], size_t len )
: m_text( buffer, len ) {
// empty
}
Identifier::Identifier( const char buffer[] )
: m_text( buffer, strlen( buffer ) ) {
// empty
}
Identifier::~Identifier() {
// empty
}
bool Identifier::operator == ( const Identifier &rhs ) const {
return m_text == rhs.m_text;
}
Name::Name( NameType type, Identifier *id )
Name::Name( NameType type, Text *id )
: m_type( type )
, m_id( id ) {
// empty
}
Name::~Name() {
delete m_id;
m_id = ddl_nullptr;
}
@ -110,10 +93,12 @@ Reference::Reference()
Reference::Reference( size_t numrefs, Name **names )
: m_numRefs( numrefs )
, m_referencedName( ddl_nullptr ) {
m_referencedName = new Name *[ numrefs ];
for( size_t i = 0; i < numrefs; i++ ) {
Name *name = new Name( names[ i ]->m_type, names[ i ]->m_id );
m_referencedName[ i ] = name;
if ( numrefs > 0 ) {
m_referencedName = new Name *[ numrefs ];
for ( size_t i = 0; i < numrefs; i++ ) {
Name *name = new Name( names[ i ]->m_type, names[ i ]->m_id );
m_referencedName[ i ] = name;
}
}
}
@ -125,7 +110,23 @@ Reference::~Reference() {
m_referencedName = ddl_nullptr;
}
Property::Property( Identifier *id )
size_t Reference::sizeInBytes() {
if ( 0 == m_numRefs ) {
return 0;
}
size_t size( 0 );
for ( size_t i = 0; i < m_numRefs; i++ ) {
Name *name( m_referencedName[ i ] );
if ( ddl_nullptr != name ) {
size += name->m_id->m_len;
}
}
return size;
}
Property::Property( Text *id )
: m_key( id )
, m_value( ddl_nullptr )
, m_ref( ddl_nullptr )
@ -152,7 +153,7 @@ DataArrayList::~DataArrayList() {
}
size_t DataArrayList::size() {
size_t result=1;
size_t result( 0 );
DataArrayList *n=m_next;
while( n!=ddl_nullptr ) {
result++;
@ -167,7 +168,7 @@ Context::Context()
}
Context::~Context() {
m_root = ddl_nullptr;
clear();
}
void Context::clear() {

View File

@ -256,7 +256,7 @@ bool OpenDDLExport::writeProperties( DDLNode *node, std::string &statement ) {
} else {
first = false;
}
statement += std::string( prop->m_key->m_text.m_buffer );
statement += std::string( prop->m_key->m_buffer );
statement += " = ";
writeValue( prop->m_value, statement );
prop = prop->m_next;

View File

@ -97,12 +97,12 @@ static bool isUnsignedIntegerType( Value::ValueType integerType ) {
return true;
}
static DDLNode *createDDLNode( Identifier *id, OpenDDLParser *parser ) {
static DDLNode *createDDLNode( Text *id, OpenDDLParser *parser ) {
if( ddl_nullptr == id || ddl_nullptr == parser ) {
return ddl_nullptr;
}
const std::string type( id->m_text.m_buffer );
const std::string type( id->m_buffer );
DDLNode *parent( parser->top() );
DDLNode *node = DDLNode::create( type, "", parent );
@ -135,7 +135,7 @@ OpenDDLParser::OpenDDLParser()
// empty
}
OpenDDLParser::OpenDDLParser( char *buffer, size_t len )
OpenDDLParser::OpenDDLParser( const char *buffer, size_t len )
: m_logCallback( &logMessage )
, m_buffer()
, m_context( ddl_nullptr ) {
@ -162,7 +162,7 @@ OpenDDLParser::logCallback OpenDDLParser::getLogCallback() const {
return m_logCallback;
}
void OpenDDLParser::setBuffer( char *buffer, size_t len ) {
void OpenDDLParser::setBuffer( const char *buffer, size_t len ) {
clear();
if( 0 == len ) {
return;
@ -192,7 +192,7 @@ size_t OpenDDLParser::getBufferSize() const {
void OpenDDLParser::clear() {
m_buffer.resize( 0 );
if( m_context ) {
if( ddl_nullptr != m_context ) {
m_context->m_root = ddl_nullptr;
}
@ -255,7 +255,7 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
return in;
}
Identifier *id( ddl_nullptr );
Text *id( ddl_nullptr );
in = OpenDDLParser::parseIdentifier( in, end, &id );
#ifdef DEBUG_HEADER_NAME
@ -263,33 +263,7 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
#endif // DEBUG_HEADER_NAME
in = lookForNextToken( in, end );
Property *first( ddl_nullptr );
if( ddl_nullptr != id ) {
if( *in == Grammar::OpenPropertyToken[ 0 ] ) {
in++;
Property *prop( ddl_nullptr ), *prev( ddl_nullptr );
while( *in != Grammar::ClosePropertyToken[ 0 ] && in != end ) {
in = OpenDDLParser::parseProperty( in, end, &prop );
in = lookForNextToken( in, end );
if( *in != Grammar::CommaSeparator[ 0 ] && *in != Grammar::ClosePropertyToken[ 0 ] ) {
logInvalidTokenError( in, Grammar::ClosePropertyToken, m_logCallback );
return ddl_nullptr;
}
if( ddl_nullptr != prop && *in != Grammar::CommaSeparator[ 0 ] ) {
if( ddl_nullptr == first ) {
first = prop;
}
if( ddl_nullptr != prev ) {
prev->m_next = prop;
}
prev = prop;
}
}
in++;
}
// store the node
DDLNode *node( createDDLNode( id, this ) );
if( ddl_nullptr != node ) {
@ -298,17 +272,44 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
std::cerr << "nullptr returned by creating DDLNode." << std::endl;
}
// set the properties
if( ddl_nullptr != first && ddl_nullptr != node ) {
node->setProperties( first );
}
Name *name( ddl_nullptr );
in = OpenDDLParser::parseName( in, end, &name );
Name *name(ddl_nullptr);
in = OpenDDLParser::parseName(in, end, &name);
if( ddl_nullptr != name && ddl_nullptr != node ) {
const std::string nodeName( name->m_id->m_text.m_buffer );
const std::string nodeName( name->m_id->m_buffer );
node->setName( nodeName );
}
Property *first(ddl_nullptr);
in = lookForNextToken(in, end);
if (*in == Grammar::OpenPropertyToken[0]) {
in++;
Property *prop(ddl_nullptr), *prev(ddl_nullptr);
while (*in != Grammar::ClosePropertyToken[0] && in != end) {
in = OpenDDLParser::parseProperty(in, end, &prop);
in = lookForNextToken(in, end);
if (*in != Grammar::CommaSeparator[0] && *in != Grammar::ClosePropertyToken[0]) {
logInvalidTokenError(in, Grammar::ClosePropertyToken, m_logCallback);
return ddl_nullptr;
}
if (ddl_nullptr != prop && *in != Grammar::CommaSeparator[0]) {
if (ddl_nullptr == first) {
first = prop;
}
if (ddl_nullptr != prev) {
prev->m_next = prop;
}
prev = prop;
}
}
in++;
}
// set the properties
if (ddl_nullptr != first && ddl_nullptr != node) {
node->setProperties(first);
}
}
return in;
@ -499,7 +500,7 @@ char *OpenDDLParser::parseName( char *in, char *end, Name **name ) {
}
in++;
Name *currentName( ddl_nullptr );
Identifier *id( ddl_nullptr );
Text *id( ddl_nullptr );
in = parseIdentifier( in, end, &id );
if( id ) {
currentName = new Name( ntype, id );
@ -511,7 +512,7 @@ char *OpenDDLParser::parseName( char *in, char *end, Name **name ) {
return in;
}
char *OpenDDLParser::parseIdentifier( char *in, char *end, Identifier **id ) {
char *OpenDDLParser::parseIdentifier( char *in, char *end, Text **id ) {
*id = ddl_nullptr;
if( ddl_nullptr == in || in == end ) {
return in;
@ -534,7 +535,7 @@ char *OpenDDLParser::parseIdentifier( char *in, char *end, Identifier **id ) {
}
const size_t len( idLen );
Identifier *newId = new Identifier( start, len );
Text *newId = new Text( start, len );
*id = newId;
return in;
@ -715,6 +716,11 @@ char *OpenDDLParser::parseFloatingLiteral( char *in, char *end, Value **floating
// parse the float value
bool ok( false );
if ( isHexLiteral( start, end ) ) {
parseHexaLiteral( start, end, floating );
return in;
}
if( isNumeric( *start ) ) {
ok = true;
} else {
@ -767,7 +773,7 @@ char *OpenDDLParser::parseStringLiteral( char *in, char *end, Value **stringData
return in;
}
static void createPropertyWithData( Identifier *id, Value *primData, Property **prop ) {
static void createPropertyWithData( Text *id, Value *primData, Property **prop ) {
if( ddl_nullptr != primData ) {
( *prop ) = new Property( id );
( *prop )->m_value = primData;
@ -830,7 +836,7 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
}
in = lookForNextToken( in, end );
Identifier *id( ddl_nullptr );
Text *id( ddl_nullptr );
in = parseIdentifier( in, end, &id );
if( ddl_nullptr != id ) {
in = lookForNextToken( in, end );
@ -847,7 +853,7 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
} else if( isStringLiteral( *in ) ) { // string data
in = parseStringLiteral( in, end, &primData );
createPropertyWithData( id, primData, prop );
} else { // reference data
} else { // reference data
std::vector<Name*> names;
in = parseReference( in, end, names );
if( !names.empty() ) {
@ -862,7 +868,8 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
return in;
}
char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type, Value **data, size_t &numValues, Reference **refs, size_t &numRefs ) {
char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type, Value **data,
size_t &numValues, Reference **refs, size_t &numRefs ) {
*data = ddl_nullptr;
numValues = numRefs = 0;
if( ddl_nullptr == in || in == end ) {
@ -876,28 +883,24 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
while( '}' != *in ) {
current = ddl_nullptr;
in = lookForNextToken( in, end );
if (Value::ddl_none == type) {
if ( Value::ddl_ref == type ) {
std::vector<Name*> names;
in = parseReference( in, end, names );
if ( !names.empty() ) {
Reference *ref = new Reference( names.size(), &names[ 0 ] );
*refs = ref;
numRefs = names.size();
}
} else if ( Value::ddl_none == type ) {
if (isInteger( in, end )) {
in = parseIntegerLiteral( in, end, &current );
}
else if (isFloat( in, end )) {
} else if (isFloat( in, end )) {
in = parseFloatingLiteral( in, end, &current );
}
else if (isStringLiteral( *in )) {
} else if (isStringLiteral( *in )) {
in = parseStringLiteral( in, end, &current );
}
else if (isHexLiteral( in, end )) {
} else if (isHexLiteral( in, end )) {
in = parseHexaLiteral( in, end, &current );
}
else { // reference data
std::vector<Name*> names;
in = parseReference( in, end, names );
if (!names.empty()) {
Reference *ref = new Reference( names.size(), &names[ 0 ] );
*refs = ref;
numRefs = names.size();
}
}
} else {
switch(type){
case Value::ddl_int8:
@ -951,10 +954,10 @@ static DataArrayList *createDataArrayList( Value *currentValue, size_t numValues
dataList->m_numItems = numValues;
return dataList;
}
char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType type, DataArrayList **dataList ) {
*dataList = ddl_nullptr;
char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType type, DataArrayList **dataArrayList ) {
*dataArrayList = ddl_nullptr;
if( ddl_nullptr == in || in == end ) {
return in;
}
@ -970,10 +973,10 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType ty
currentValue = ddl_nullptr;
in = parseDataList( in, end, type, &currentValue, numValues, &refs, numRefs );
if( ddl_nullptr != currentValue ) {
if( ddl_nullptr != currentValue || 0 != numRefs ) {
if( ddl_nullptr == prev ) {
*dataList = createDataArrayList( currentValue, numValues );
prev = *dataList;
*dataArrayList = createDataArrayList( currentValue, numValues );
prev = *dataArrayList;
} else {
currentDataList = createDataArrayList( currentValue, numValues );
if( ddl_nullptr != prev ) {

View File

@ -240,10 +240,16 @@ void Value::setDouble( double value ) {
}
double Value::getDouble() const {
assert( ddl_double == m_type );
double v;
::memcpy( &v, m_data, m_size );
return v;
if ( m_type == ddl_double ) {
double v;
::memcpy( &v, m_data, m_size );
return ( float ) v;
}
else {
double tmp;
::memcpy( &tmp, m_data, 4 );
return ( double ) tmp;
}
}
void Value::setString( const std::string &str ) {
@ -251,60 +257,88 @@ void Value::setString( const std::string &str ) {
::memcpy( m_data, str.c_str(), str.size() );
m_data[ str.size() ] = '\0';
}
const char *Value::getString() const {
assert( ddl_string == m_type );
return (const char*) m_data;
}
void Value::setRef( Reference *ref ) {
assert( ddl_ref == m_type );
if ( ddl_nullptr != ref ) {
const size_t sizeInBytes( ref->sizeInBytes() );
if ( sizeInBytes > 0 ) {
if ( ddl_nullptr != m_data ) {
delete [] m_data;
}
m_data = new unsigned char[ sizeof( Reference ) ];
Reference *myRef = ( Reference * ) m_data;
myRef->m_numRefs = ref->m_numRefs;
myRef->m_referencedName = new Name *[ myRef->m_numRefs ];
for ( size_t i = 0; i < myRef->m_numRefs; i++ ) {
myRef->m_referencedName[ i ] = new Name( ref->m_referencedName[ i ]->m_type, ref->m_referencedName[ i ]->m_id );
}
}
}
}
Reference *Value::getRef() const {
assert( ddl_ref == m_type );
return (Reference*) m_data;
}
void Value::dump() {
switch( m_type ) {
case ddl_none:
std::cout << "None" << std::endl;
break;
case ddl_bool:
std::cout << getBool() << std::endl;
break;
case ddl_int8:
std::cout << getInt8() << std::endl;
break;
case ddl_int16:
std::cout << getInt16() << std::endl;
break;
case ddl_int32:
std::cout << getInt32() << std::endl;
break;
case ddl_int64:
std::cout << getInt64() << std::endl;
break;
case ddl_unsigned_int8:
std::cout << "Not supported" << std::endl;
break;
case ddl_unsigned_int16:
std::cout << "Not supported" << std::endl;
break;
case ddl_unsigned_int32:
std::cout << "Not supported" << std::endl;
break;
case ddl_unsigned_int64:
std::cout << "Not supported" << std::endl;
break;
case ddl_half:
std::cout << "Not supported" << std::endl;
break;
case ddl_float:
std::cout << getFloat() << std::endl;
break;
case ddl_double:
std::cout << getDouble() << std::endl;
break;
case ddl_string:
std::cout << "Not supported" << std::endl;
break;
case ddl_ref:
std::cout << "Not supported" << std::endl;
break;
default:
break;
case ddl_none:
std::cout << "None" << std::endl;
break;
case ddl_bool:
std::cout << getBool() << std::endl;
break;
case ddl_int8:
std::cout << getInt8() << std::endl;
break;
case ddl_int16:
std::cout << getInt16() << std::endl;
break;
case ddl_int32:
std::cout << getInt32() << std::endl;
break;
case ddl_int64:
std::cout << getInt64() << std::endl;
break;
case ddl_unsigned_int8:
std::cout << "Not supported" << std::endl;
break;
case ddl_unsigned_int16:
std::cout << "Not supported" << std::endl;
break;
case ddl_unsigned_int32:
std::cout << "Not supported" << std::endl;
break;
case ddl_unsigned_int64:
std::cout << "Not supported" << std::endl;
break;
case ddl_half:
std::cout << "Not supported" << std::endl;
break;
case ddl_float:
std::cout << getFloat() << std::endl;
break;
case ddl_double:
std::cout << getDouble() << std::endl;
break;
case ddl_string:
std::cout << getString() << std::endl;
break;
case ddl_ref:
std::cout << "Not supported" << std::endl;
break;
default:
break;
}
}

View File

@ -144,8 +144,8 @@ public:
private:
DDLNode( const std::string &type, const std::string &name, size_t idx, DDLNode *parent = ddl_nullptr );
DDLNode();
DDLNode( const DDLNode & );
DDLNode &operator = ( const DDLNode & );
DDLNode( const DDLNode & ) ddl_no_copy;
DDLNode &operator = ( const DDLNode & ) ddl_no_copy;
static void releaseNodes();
private:

View File

@ -32,7 +32,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# include <inttypes.h>
#endif
#ifdef _MSC_VER
#if defined(_MSC_VER) && !defined( OPENDDL_STATIC_LIBARY )
# define TAG_DLL_EXPORT __declspec(dllexport)
# define TAG_DLL_IMPORT __declspec(dllimport )
# ifdef OPENDDLPARSER_BUILD
@ -132,31 +133,6 @@ private:
Text &operator = ( const Text & ) ddl_no_copy;
};
/// @brief Stores an OpenDDL-specific identifier type.
struct DLL_ODDLPARSER_EXPORT Identifier {
Text m_text; ///< The text element.
/// @brief The constructor with a sized buffer full of characters.
/// @param buffer [in] The identifier buffer.
/// @param len [in] The length of the buffer
Identifier( const char buffer[], size_t len );
/// @brief The constructor with a buffer full of characters.
/// @param buffer [in] The identifier buffer.
/// @remark Buffer must be null-terminated.
Identifier( const char buffer[] );
/// @brief The destructor.
~Identifier();
/// @brief The compare operator.
bool operator == ( const Identifier &rhs ) const;
private:
Identifier( const Identifier & ) ddl_no_copy;
Identifier &operator = ( const Identifier & ) ddl_no_copy;
};
/// @brief Description of the type of a name.
enum NameType {
GlobalName, ///< Name is global.
@ -166,12 +142,12 @@ enum NameType {
/// @brief Stores an OpenDDL-specific name
struct DLL_ODDLPARSER_EXPORT Name {
NameType m_type; ///< The type of the name ( @see NameType ).
Identifier *m_id; ///< The id.
Text *m_id; ///< The id.
/// @brief The constructor with the type and the id.
/// @param type [in] The name type.
/// @param id [in] The id.
Name( NameType type, Identifier *id );
Name( NameType type, Text *id );
/// @brief The destructor.
~Name();
@ -197,6 +173,10 @@ struct DLL_ODDLPARSER_EXPORT Reference {
/// @brief The destructor.
~Reference();
/// @brief Returns the size in bytes to store one deep reference copy.
/// @return The size on bytes.
size_t sizeInBytes();
private:
Reference( const Reference & ) ddl_no_copy;
Reference &operator = ( const Reference & ) ddl_no_copy;
@ -204,7 +184,7 @@ private:
/// @brief Stores a property list.
struct DLL_ODDLPARSER_EXPORT Property {
Identifier *m_key; ///< The identifier / key of the property.
Text *m_key; ///< The identifier / key of the property.
Value *m_value; ///< The value assigned to its key / id ( ddl_nullptr if none ).
Reference *m_ref; ///< References assigned to its key / id ( ddl_nullptr if none ).
Property *m_next; ///< The next property ( ddl_nullptr if none ).
@ -214,7 +194,7 @@ struct DLL_ODDLPARSER_EXPORT Property {
/// @brief The constructor for initialization.
/// @param id [in] The identifier
Property( Identifier *id );
Property( Text *id );
/// @brief The destructor.
~Property();
@ -227,7 +207,7 @@ private:
/// @brief Stores a data array list.
struct DLL_ODDLPARSER_EXPORT DataArrayList {
size_t m_numItems; ///< The number of items in the list.
Value *m_dataList; ///< The data list ( ee Value ).
Value *m_dataList; ///< The data list ( a Value ).
DataArrayList *m_next; ///< The next data array list ( ddl_nullptr if last ).
/// @brief The default constructor for initialization.

View File

@ -93,6 +93,10 @@ protected:
bool writeValue( Value *val, std::string &statement );
bool writeValueArray( DataArrayList *al, std::string &statement );
private:
OpenDDLExport( const OpenDDLExport & ) ddl_no_copy;
OpenDDLExport &operator = ( const OpenDDLExport & ) ddl_no_copy;
private:
IOStreamBase *m_stream;
};

View File

@ -63,9 +63,6 @@ inline
T *getNextToken( T *in, T *end ) {
T *tmp( in );
in = lookForNextToken( in, end );
/*while( ( isSpace( *in ) || isNewLine( *in ) || ',' == *in ) && ( in != end ) ) {
in++;
}*/
if( tmp == in ) {
in++;
}
@ -103,7 +100,7 @@ public:
/// @brief The class constructor.
/// @param buffer [in] The buffer
/// @param len [in] Size of the buffer
OpenDDLParser( char *buffer, size_t len );
OpenDDLParser( const char *buffer, size_t len );
/// @brief The class destructor.
~OpenDDLParser();
@ -119,7 +116,7 @@ public:
/// @brief Assigns a new buffer to parse.
/// @param buffer [in] The buffer
/// @param len [in] Size of the buffer
void setBuffer( char *buffer, size_t len );
void setBuffer( const char *buffer, size_t len );
/// @brief Assigns a new buffer to parse.
/// @param buffer [in] The buffer as a std::vector.
@ -161,7 +158,7 @@ public: // parser helpers
DDLNode *top();
static void normalizeBuffer( std::vector<char> &buffer );
static char *parseName( char *in, char *end, Name **name );
static char *parseIdentifier( char *in, char *end, Identifier **id );
static char *parseIdentifier( char *in, char *end, Text **id );
static char *parsePrimitiveDataType( char *in, char *end, Value::ValueType &type, size_t &len );
static char *parseReference( char *in, char *end, std::vector<Name*> &names );
static char *parseBooleanLiteral( char *in, char *end, Value **boolean );
@ -175,8 +172,8 @@ public: // parser helpers
static const char *getVersion();
private:
OpenDDLParser( const OpenDDLParser & );
OpenDDLParser &operator = ( const OpenDDLParser & );
OpenDDLParser( const OpenDDLParser & ) ddl_no_copy;
OpenDDLParser &operator = ( const OpenDDLParser & ) ddl_no_copy;
private:
logCallback m_logCallback;

View File

@ -84,12 +84,7 @@ static const unsigned char chartype_table[ 256 ] = {
template<class T>
inline
bool isNumeric( const T in ) {
return ( in >= '0' && in <= '9' );
//return ( chartype_table[in] );
/*if (in >= '0' && in <= '9' )
return true;
return false;*/
return ( chartype_table[ in ] == 1 );
}
template<class T>

View File

@ -220,6 +220,14 @@ public:
/// @return The std::string value.
const char *getString() const;
/// @brief Set the reference.
/// @param ref [in] Pointer showing to the reference.
void setRef( Reference *ref );
/// @brief Returns the pointer showing to the reference.
/// @return Pointer showing to the reference.
Reference *getRef() const;
/// @brief Dumps the value.
void dump();
@ -241,8 +249,8 @@ public:
Value *m_next;
private:
Value &operator =( const Value & );
Value( const Value & );
Value &operator =( const Value & ) ddl_no_copy;
Value( const Value & ) ddl_no_copy;
};
///------------------------------------------------------------------------------------------------
@ -253,9 +261,9 @@ struct DLL_ODDLPARSER_EXPORT ValueAllocator {
static void releasePrimData( Value **data );
private:
ValueAllocator();
ValueAllocator( const ValueAllocator & );
ValueAllocator &operator = ( const ValueAllocator & );
ValueAllocator() ddl_no_copy;
ValueAllocator( const ValueAllocator & ) ddl_no_copy;
ValueAllocator &operator = ( const ValueAllocator & ) ddl_no_copy;
};
END_ODDLPARSER_NS

View File

@ -3,13 +3,13 @@
* BSD License:
****************************************************************************
*
* Copyright (c) 2005-2007 Paul Hsieh
* Copyright (c) 2005-2011 Paul Hsieh
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
@ -17,7 +17,7 @@
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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.
@ -31,7 +31,7 @@
*
****************************************************************************
*
* Version 0.1.10
* Version 0.1.12
*
* The ANSI C standard committee, for the C99 standard, specified the
* inclusion of a new standard include file called stdint.h. This is
@ -172,12 +172,15 @@
*
* Acknowledgements
*
* Edited by Philip G. Lee <rocketman768@gmail.com> 2011 to avoid overlap with sys/types.h
*
* The following people have made significant contributions to the
* development and testing of this file:
*
* Chris Howie
* John Steele Scott
* Dave Thorup
* John Dill
*
*/
@ -190,7 +193,7 @@
* do nothing else. On the Mac OS X version of gcc this is _STDINT_H_.
*/
#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)))) && !defined (_PSTDINT_H_INCLUDED) && !defined(_STDINT)
#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined (__UINT_FAST64_TYPE__)) )) && !defined (_PSTDINT_H_INCLUDED)
#include <stdint.h>
#define _PSTDINT_H_INCLUDED
# ifndef PRINTF_INT64_MODIFIER
@ -300,17 +303,10 @@
* definitions.
*/
#ifndef UINT8_MAX
# define UINT8_MAX 0xff
#endif
#ifndef uint8_t
# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S)
typedef unsigned char uint8_t;
# define UINT8_C(v) ((uint8_t) v)
# else
# error "Platform not supported"
# endif
#endif
// Avoid overlap with sys/types.h
#ifndef __int8_t_defined
#define __int8_t_defined
#ifndef INT8_MAX
# define INT8_MAX 0x7f
@ -320,13 +316,110 @@
#endif
#ifndef int8_t
# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S)
typedef signed char int8_t;
typedef signed char int8_t;
# define INT8_C(v) ((int8_t) v)
# else
# error "Platform not supported"
# endif
#endif
#ifndef INT16_MAX
# define INT16_MAX 0x7fff
#endif
#ifndef INT16_MIN
# define INT16_MIN INT16_C(0x8000)
#endif
#ifndef int16_t
#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S)
typedef signed int int16_t;
# define INT16_C(v) ((int16_t) (v))
# ifndef PRINTF_INT16_MODIFIER
# define PRINTF_INT16_MODIFIER ""
# endif
#elif (SHRT_MAX == INT16_MAX)
typedef signed short int16_t;
# define INT16_C(v) ((int16_t) (v))
# ifndef PRINTF_INT16_MODIFIER
# define PRINTF_INT16_MODIFIER "h"
# endif
#else
#error "Platform not supported"
#endif
#endif
#ifndef INT32_MAX
# define INT32_MAX (0x7fffffffL)
#endif
#ifndef INT32_MIN
# define INT32_MIN INT32_C(0x80000000)
#endif
#ifndef int32_t
#if ((LONG_MAX == INT32_MAX) || defined (S_SPLINT_S)) && ! defined(__FreeBSD__)
typedef signed long int32_t;
# define INT32_C(v) v ## L
# ifndef PRINTF_INT32_MODIFIER
# define PRINTF_INT32_MODIFIER "l"
# endif
#elif (INT_MAX == INT32_MAX)
typedef signed int int32_t;
# define INT32_C(v) v
# ifndef PRINTF_INT32_MODIFIER
# define PRINTF_INT32_MODIFIER ""
# endif
#elif (SHRT_MAX == INT32_MAX)
typedef signed short int32_t;
# define INT32_C(v) ((short) (v))
# ifndef PRINTF_INT32_MODIFIER
# define PRINTF_INT32_MODIFIER ""
# endif
#else
#error "Platform not supported"
#endif
#endif
// 64-bit shit seems more tricky. Philip Lee <rocketman768@gmail.com>
/*
* The macro stdint_int64_defined is temporarily used to record
* whether or not 64 integer support is available. It must be
* defined for any 64 integer extensions for new platforms that are
* added.
*/
#undef stdint_int64_defined
#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S)
# if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S)
# define stdint_int64_defined
typedef long long int64_t;
# endif
#endif
#if !defined (stdint_int64_defined)
# if defined(__GNUC__)
# define stdint_int64_defined
# ifndef __FreeBSD__
__extension__ typedef long long int64_t;
# endif
# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S)
# define stdint_int64_defined
typedef long long int64_t;
# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC)
# define stdint_int64_defined
typedef __int64 int64_t;
# endif
#endif
#endif /*ifndef __int8_t_defined*/
#ifndef UINT8_MAX
# define UINT8_MAX 0xff
#endif
#ifndef uint8_t
# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S)
typedef unsigned char uint8_t;
# define UINT8_C(v) ((uint8_t) v)
# else
# error "Platform not supported"
# endif
#endif
#ifndef UINT16_MAX
# define UINT16_MAX 0xffff
#endif
@ -348,35 +441,11 @@
#endif
#endif
#ifndef INT16_MAX
# define INT16_MAX 0x7fff
#endif
#ifndef INT16_MIN
# define INT16_MIN INT16_C(0x8000)
#endif
#ifndef int16_t
#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S)
typedef signed int int16_t;
# define INT16_C(v) ((int16_t) (v))
# ifndef PRINTF_INT16_MODIFIER
# define PRINTF_INT16_MODIFIER ""
# endif
#elif (SHRT_MAX == INT16_MAX)
typedef signed short int16_t;
# define INT16_C(v) ((int16_t) (v))
# ifndef PRINTF_INT16_MODIFIER
# define PRINTF_INT16_MODIFIER "h"
# endif
#else
#error "Platform not supported"
#endif
#endif
#ifndef UINT32_MAX
# define UINT32_MAX (0xffffffffUL)
#endif
#ifndef uint32_t
#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S)
#if ((ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S)) && ! defined(__FreeBSD__)
typedef unsigned long uint32_t;
# define UINT32_C(v) v ## UL
# ifndef PRINTF_INT32_MODIFIER
@ -399,36 +468,6 @@
#endif
#endif
#ifndef INT32_MAX
# define INT32_MAX (0x7fffffffL)
#endif
#ifndef INT32_MIN
# define INT32_MIN INT32_C(0x80000000)
#endif
#ifndef int32_t
#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S)
typedef signed long int32_t;
# define INT32_C(v) v ## L
# ifndef PRINTF_INT32_MODIFIER
# define PRINTF_INT32_MODIFIER "l"
# endif
#elif (INT_MAX == INT32_MAX)
typedef signed int int32_t;
# define INT32_C(v) v
# ifndef PRINTF_INT32_MODIFIER
# define PRINTF_INT32_MODIFIER ""
# endif
#elif (SHRT_MAX == INT32_MAX)
typedef signed short int32_t;
# define INT32_C(v) ((short) (v))
# ifndef PRINTF_INT32_MODIFIER
# define PRINTF_INT32_MODIFIER ""
# endif
#else
#error "Platform not supported"
#endif
#endif
/*
* The macro stdint_int64_defined is temporarily used to record
* whether or not 64 integer support is available. It must be
@ -438,10 +477,11 @@
#undef stdint_int64_defined
#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S)
# if (__STDC__ && __STDC_VERSION >= 199901L) || defined (S_SPLINT_S)
# if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S)
# define stdint_int64_defined
typedef long long int64_t;
typedef unsigned long long uint64_t;
# ifndef __FreeBSD__
typedef unsigned long long uint64_t;
# endif
# define UINT64_C(v) v ## ULL
# define INT64_C(v) v ## LL
# ifndef PRINTF_INT64_MODIFIER
@ -453,8 +493,9 @@
#if !defined (stdint_int64_defined)
# if defined(__GNUC__)
# define stdint_int64_defined
__extension__ typedef long long int64_t;
__extension__ typedef unsigned long long uint64_t;
# ifndef __FreeBSD__
__extension__ typedef unsigned long long uint64_t;
# endif
# define UINT64_C(v) v ## ULL
# define INT64_C(v) v ## LL
# ifndef PRINTF_INT64_MODIFIER
@ -462,7 +503,6 @@
# endif
# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S)
# define stdint_int64_defined
typedef long long int64_t;
typedef unsigned long long uint64_t;
# define UINT64_C(v) v ## ULL
# define INT64_C(v) v ## LL
@ -471,7 +511,6 @@
# endif
# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC)
# define stdint_int64_defined
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
# define UINT64_C(v) v ## UI64
# define INT64_C(v) v ## I64
@ -616,10 +655,12 @@
* stdint.h.
*/
#ifndef __FreeBSD__
typedef int_least8_t int_fast8_t;
typedef uint_least8_t uint_fast8_t;
typedef int_least16_t int_fast16_t;
typedef uint_least16_t uint_fast16_t;
#endif
typedef int_least32_t int_fast32_t;
typedef uint_least32_t uint_fast32_t;
#define UINT_FAST8_MAX UINT_LEAST8_MAX
@ -677,7 +718,7 @@ typedef uint_least32_t uint_fast32_t;
# elif defined (__i386__) || defined (_WIN32) || defined (WIN32)
# define stdint_intptr_bits 32
# elif defined (__INTEL_COMPILER)
/* TODO -- what will Intel do about x86-64? */
/* TODO -- what did Intel do about x86-64? */
# endif
# ifdef stdint_intptr_bits
@ -707,8 +748,15 @@ typedef uint_least32_t uint_fast32_t;
# ifndef UINTPTR_C
# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x)
# endif
typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t;
typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t;
// Philip <rocketman768@gmail.com>, need to check if [u]intprt_t is already defined...
# ifndef __uintptr_t_defined
# define __uintptr_t_defined
typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t;
# endif /*uintptr_t*/
# ifndef __intptr_t_defined
# define __intptr_t_defined
typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t;
# endif /*__intptr_t_defined*/
# else
/* TODO -- This following is likely wrong for some platforms, and does
nothing for the definition of uintptr_t. */
@ -727,3 +775,73 @@ typedef uint_least32_t uint_fast32_t;
#endif
#if defined (__TEST_PSTDINT_FOR_CORRECTNESS)
/*
* Please compile with the maximum warning settings to make sure macros are not
* defined more than once.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define glue3_aux(x,y,z) x ## y ## z
#define glue3(x,y,z) glue3_aux(x,y,z)
#define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,=) glue3(UINT,bits,_C) (0);
#define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,=) glue3(INT,bits,_C) (0);
#define DECL(us,bits) glue3(DECL,us,) (bits)
#define TESTUMAX(bits) glue3(u,bits,=) glue3(~,u,bits); if (glue3(UINT,bits,_MAX) glue3(!=,u,bits)) printf ("Something wrong with UINT%d_MAX\n", bits)
int main () {
DECL(I,8)
DECL(U,8)
DECL(I,16)
DECL(U,16)
DECL(I,32)
DECL(U,32)
#ifdef INT64_MAX
DECL(I,64)
DECL(U,64)
#endif
intmax_t imax = INTMAX_C(0);
uintmax_t umax = UINTMAX_C(0);
char str0[256], str1[256];
sprintf (str0, "%d %x\n", 0, ~0);
sprintf (str1, "%d %x\n", i8, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with i8 : %s\n", str1);
sprintf (str1, "%u %x\n", u8, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with u8 : %s\n", str1);
sprintf (str1, "%d %x\n", i16, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with i16 : %s\n", str1);
sprintf (str1, "%u %x\n", u16, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with u16 : %s\n", str1);
sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with i32 : %s\n", str1);
sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with u32 : %s\n", str1);
#ifdef INT64_MAX
sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with i64 : %s\n", str1);
#endif
sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with imax : %s\n", str1);
sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0);
if (0 != strcmp (str0, str1)) printf ("Something wrong with umax : %s\n", str1);
TESTUMAX(8);
TESTUMAX(16);
TESTUMAX(32);
#ifdef INT64_MAX
TESTUMAX(64);
#endif
return EXIT_SUCCESS;
}
#endif

View File

@ -86,7 +86,12 @@ public:
public:
// Red, green, blue and alpha color values
TReal r, g, b, a;
union {
struct {
TReal r, g, b, a;
};
TReal c[ 4 ];
};
} PACK_STRUCT; // !struct aiColor4D
typedef aiColor4t<float> aiColor4D;
@ -94,7 +99,12 @@ typedef aiColor4t<float> aiColor4D;
#else
struct aiColor4D {
float r, g, b, a;
union {
struct {
float r, g, b, a;
};
float c[ 4 ];
};
} PACK_STRUCT;
#endif // __cplusplus

View File

@ -161,10 +161,15 @@ public:
public:
TReal a1, a2, a3;
TReal b1, b2, b3;
TReal c1, c2, c3;
union {
struct {
TReal a1, a2, a3;
TReal b1, b2, b3;
TReal c1, c2, c3;
};
TReal m[ 3 ][ 3 ];
TReal mData[ 9 ];
};
} PACK_STRUCT;
typedef aiMatrix3x3t<float> aiMatrix3x3;
@ -172,13 +177,18 @@ typedef aiMatrix3x3t<float> aiMatrix3x3;
#else
struct aiMatrix3x3 {
float a1, a2, a3;
float b1, b2, b3;
float c1, c2, c3;
union {
struct {
float a1, a2, a3;
float b1, b2, b3;
float c1, c2, c3;
};
float m[ 3 ][ 3 ];
float mData[ 9 ];
};
} PACK_STRUCT;
#endif
#endif // __cplusplus
#include "./Compiler/poppack1.h"

View File

@ -213,8 +213,8 @@ public:
/** @brief A function for creating a rotation matrix that rotates a
* vector called "from" into another vector called "to".
* Input : from[3], to[3] which both must be *normalized* non-zero vectors
* Output: mtx[3][3] -- a 3x3 matrix in colum-major form
* Authors: Tomas M<EFBFBD>ller, John Hughes
* Output: mtx[3][3] -- a 3x3 matrix in column-major form
* Authors: Tomas Mueller, John Hughes
* "Efficiently Building a Matrix to Rotate One Vector to Another"
* Journal of Graphics Tools, 4(4):1-4, 1999
*/
@ -222,12 +222,16 @@ public:
const aiVector3t<TReal>& to, aiMatrix4x4t& out);
public:
TReal a1, a2, a3, a4;
TReal b1, b2, b3, b4;
TReal c1, c2, c3, c4;
TReal d1, d2, d3, d4;
union {
struct {
TReal a1, a2, a3, a4;
TReal b1, b2, b3, b4;
TReal c1, c2, c3, c4;
TReal d1, d2, d3, d4;
};
TReal m[ 4 ][ 4 ];
TReal mData[ 16 ];
};
} PACK_STRUCT;
typedef aiMatrix4x4t<float> aiMatrix4x4;
@ -235,11 +239,17 @@ typedef aiMatrix4x4t<float> aiMatrix4x4;
#else
struct aiMatrix4x4 {
float a1, a2, a3, a4;
float b1, b2, b3, b4;
float c1, c2, c3, c4;
float d1, d2, d3, d4;
};
union {
struct {
float a1, a2, a3, a4;
float b1, b2, b3, b4;
float c1, c2, c3, c4;
float d1, d2, d3, d4;
};
float m[ 4 ][ 4 ];
float mData[ 16 ];
};
} PACK_STRUCT;
#endif // __cplusplus

View File

@ -2,11 +2,11 @@
Open Asset Import Library (assimp)
----------------------------------------------------------------------
Copyright (c) 2006-2012, assimp team
Copyright (c) 2006-2016, 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
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
@ -23,16 +23,16 @@ following conditions are met:
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
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
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
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
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.
----------------------------------------------------------------------
@ -54,7 +54,7 @@ namespace Assimp {
// ---------------------------------------------------------------------------
/** Android extension to DefaultIOSystem using the standard C file functions */
class AndroidJNIIOSystem : public DefaultIOSystem
class ASSIMP_API AndroidJNIIOSystem : public DefaultIOSystem
{
public:

View File

@ -95,7 +95,13 @@ public:
template <typename TOther>
operator aiVector2t<TOther> () const;
TReal x, y;
union {
struct {
TReal x, y;
};
TReal v[ 2 ];
};
} PACK_STRUCT;
typedef aiVector2t<float> aiVector2D;
@ -103,7 +109,12 @@ typedef aiVector2t<float> aiVector2D;
#else
struct aiVector2D {
float x,y;
union {
struct {
float x, y;
};
float v[ 2 ];
};
};
#endif // __cplusplus

View File

@ -125,7 +125,12 @@ public:
* @param o Second factor */
const aiVector3t SymMul(const aiVector3t& o);
TReal x, y, z;
union {
struct {
TReal x, y, z;
};
TReal v[ 3 ];
};
} PACK_STRUCT;
@ -134,8 +139,12 @@ typedef aiVector3t<float> aiVector3D;
#else
struct aiVector3D {
float x,y,z;
union {
struct {
float x, y, z;
};
float v[ 3 ];
};
} PACK_STRUCT;
#endif // __cplusplus

View File

@ -3,12 +3,12 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
Copyright (c) 2006-2012, assimp team
Copyright (c) 2006-2016, 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
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
@ -25,16 +25,16 @@ conditions are met:
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
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
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
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
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.
---------------------------------------------------------------------------
*/
@ -59,14 +59,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using namespace Assimp;
// ------------------------------------------------------------------------------------------------
// Constructor.
// Constructor.
AndroidJNIIOSystem::AndroidJNIIOSystem(ANativeActivity* activity)
{
AndroidActivityInit(activity);
}
// ------------------------------------------------------------------------------------------------
// Destructor.
// Destructor.
AndroidJNIIOSystem::~AndroidJNIIOSystem()
{
// nothing to do here

View File

@ -1,27 +1,25 @@
--- Description ---
This module provides a facade to io stream access to files
behind android asset manager within Android native application.
Build Asset Importer Lib for Android
====================================
This module provides a fascade for the io-stream-access to files behind the
android-asset-management within an Android native application.
- It is built as a static library
- It requires Android NDK with android API > 9 support.
--- Building ---
### Building ###
To use this module please provide following cmake defines:
```
-DASSIMP_ANDROID_JNIIOSYSTEM=ON
-DCMAKE_TOOLCHAIN_FILE=$SOME_PATH/android.toolchain.cmake
```
"SOME_PATH" is a path to your cmake android toolchain script.
--- Code ---
### Code ###
A small example how to wrap assimp for Android:
```cpp
#include <assimp/port/AndroidJNI/AndroidJNIIOSystem.h>
...
Assimp::Importer* importer = new Assimp::Importer();
Assimp::AndroidJNIIOSystem* ioSystem = new Assimp::AndroidJNIIOSystem(app->activity);
importer->SetIOHandler(ioSystem);
...
```

View File

@ -0,0 +1,40 @@
@echo off
:: Now we declare a scope
Setlocal EnableDelayedExpansion EnableExtensions
if not defined Configuration set Configuration=2015
if "%Configuration%"=="MinGW" ( goto :mingw )
set arch=x86
if "%platform%" EQU "x64" ( set arch=x86_amd64 )
if "%Configuration%"=="2015" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
)
if "%Configuration%"=="2013" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
)
if "%Configuration%"=="2012" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"
)
if "%Configuration%"=="2010" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
)
if "%Configuration%"=="2008" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
)
:: Visual Studio detected
endlocal & call %SET_VS_ENV% %arch%
goto :eof
:: MinGW detected
:mingw
endlocal & set PATH=c:\mingw\bin;%PATH%

View File

@ -44,26 +44,27 @@ SET( TEST_SRCS
unit/utNoBoostTest.cpp
unit/utColladaExportCamera.cpp
unit/utColladaExportLight.cpp
unit/utIssues.cpp
)
SOURCE_GROUP( tests FILES ${TEST_SRCS} )
if(AddGTest_FOUND)
add_executable( unit
unit/CCompilerTest.c
unit/Main.cpp
../code/Version.cpp
${TEST_SRCS}
)
add_executable( unit
unit/CCompilerTest.c
unit/Main.cpp
../code/Version.cpp
${TEST_SRCS}
)
add_definitions(-DASSIMP_TEST_MODELS_DIR="${CMAKE_CURRENT_LIST_DIR}/models")
add_definitions(-DASSIMP_TEST_MODELS_DIR="${CMAKE_CURRENT_LIST_DIR}/models")
SET_PROPERTY( TARGET assimp PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX} )
SET_PROPERTY( TARGET assimp PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX} )
add_dependencies( unit gtest )
target_link_libraries( unit assimp
debug ${GTEST_DEBUG_LIBRARIES}
optimized ${GTEST_RELEASE_LIBRARIES}
)
add_dependencies( unit gtest )
target_link_libraries( unit assimp
debug ${GTEST_DEBUG_LIBRARIES}
optimized ${GTEST_RELEASE_LIBRARIES}
)
endif(AddGTest_FOUND)
add_subdirectory(headercheck)

View File

@ -0,0 +1,623 @@
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
<asset>
<contributor>
<author> Anonymous </author>
<authoring_tool> Collada Exporter for Blender 2.6+, by Juan Linietsky (juan@codenix.com) </authoring_tool>
</contributor>
<created>2016-02-04T00:44:39Z </created>
<modified>2016-02-04T00:44:39Z</modified>
<unit meter="1.0" name="meter"/>
<up_axis>Z_UP</up_axis>
</asset>
<library_images>
</library_images>
<library_effects>
<effect id="id-fx-8" name="Material-fx">
<profile_COMMON>
<technique sid="common">
<blinn>
<emission>
<color> 0.0 0.0 0.0 1.0 </color>
</emission>
<ambient>
<color> 0.0 0.0 0.0 1.0 </color>
</ambient>
<diffuse>
<color> 0.6400000190734865 0.6400000190734865 0.6400000190734865 1.0 </color>
</diffuse>
<specular>
<color> 0.5 0.5 0.5 1.0 </color>
</specular>
<shininess>
<float>50</float>
</shininess>
<reflective>
<color> 1.0 1.0 1.0 1.0 </color>
</reflective>
<index_of_refraction>
<float>4.0</float>
</index_of_refraction>
</blinn>
<extra>
<technique profile="FCOLLADA">
</technique>
<technique profile="GOOGLEEARTH">
<double_sided>0</double_sided>
</technique>
</extra>
</technique>
</profile_COMMON>
</effect>
</library_effects>
<library_materials>
<material id="id-material-9" name="Material">
<instance_effect url="#id-fx-8"/>
</material>
</library_materials>
<library_geometries>
<geometry id="id-mesh-10" name="Cube">
<mesh>
<source id="id-mesh-10-positions">
<float_array id="id-mesh-10-positions-array" count="216"> 1.0 0.9999999403953552 -1.0 1.0 -1.0 -1.0 -1.0000001192092896 -0.9999998211860657 -1.0 -0.9999996423721313 1.0000003576278687 -1.0 -0.9999999403953552 1.0 1.0 -1.0000003576278687 -0.9999996423721313 1.0 -1.0000003576278687 -0.9999996423721313 3.0 -0.9999999403953552 1.0 3.0 1.0 0.9999999403953552 -1.0 1.0000004768371582 0.999999463558197 1.0 0.9999993443489075 -1.0000005960464478 1.0 1.0 -1.0 -1.0 1.0 -1.0 -1.0 0.9999993443489075 -1.0000005960464478 1.0 -1.0000003576278687 -0.9999996423721313 1.0 -1.0000001192092896 -0.9999998211860657 -1.0 -1.0000001192092896 -0.9999998211860657 -1.0 -0.9999996423721313 1.0000003576278687 -1.0 1.0000004768371582 0.999999463558197 1.0 1.0 0.9999999403953552 -1.0 -0.9999996423721313 1.0000003576278687 -1.0 -0.9999999403953552 1.0 1.0 -0.9545343518257141 -0.9545336365699768 4.598935604095459 -0.9545339345932007 0.9545340538024902 4.598935604095459 0.9999993443489075 -1.0000005960464478 3.0 -1.0000003576278687 -0.9999996423721313 3.0 -0.9999999403953552 1.0 3.0 1.0000004768371582 0.999999463558197 3.0 1.0000004768371582 0.999999463558197 3.0 0.9999993443489075 -1.0000005960464478 3.0 -0.9025039672851562 0.9025040864944458 6.0 -0.9025043845176697 -0.9025037288665771 6.0 -0.8504744172096252 -0.8504738211631775 7.0 -0.8504740595817566 0.8504741191864014 7.0 0.9545333385467529 -0.954534649848938 4.598935604095459 -0.9545343518257141 -0.9545336365699768 4.598935604095459 -0.9545339345932007 0.9545340538024902 4.598935604095459 0.9545344710350037 0.9545334577560425 4.598935604095459 0.9545344710350037 0.9545334577560425 4.598935604095459 0.9545333385467529 -0.954534649848938 4.598935604095459 0.8504745364189148 0.8504736423492432 7.0 -0.8504740595817566 0.8504741191864014 7.0 -0.8504744172096252 -0.8504738211631775 7.0 0.8504735231399536 -0.8504747152328491 7.0 -0.9025043845176697 -0.9025037288665771 6.0 0.9025034308433533 -0.9025046825408936 6.0 0.8504735231399536 -0.8504747152328491 7.0 -0.8504744172096252 -0.8504738211631775 7.0 0.9025045037269592 0.9025035500526428 6.0 -0.9025039672851562 0.9025040864944458 6.0 -0.8504740595817566 0.8504741191864014 7.0 0.8504745364189148 0.8504736423492432 7.0 0.9025034308433533 -0.9025046825408936 6.0 0.9025045037269592 0.9025035500526428 6.0 0.8504745364189148 0.8504736423492432 7.0 0.8504735231399536 -0.8504747152328491 7.0 -0.9025039672851562 0.9025040864944458 6.0 0.9025045037269592 0.9025035500526428 6.0 0.9025050401687622 2.9289722442626953 6.009448051452637 -0.9025033712387085 2.9289727210998535 6.009448051452637 0.9545350074768066 2.925309658050537 4.607422351837158 -0.9545333385467529 2.9253101348876953 4.607422351837158 -0.9025033712387085 2.9289727210998535 6.009448051452637 0.9025050401687622 2.9289722442626953 6.009448051452637 -0.9025033712387085 2.9289727210998535 6.009448051452637 -0.9545333385467529 2.9253101348876953 4.607422351837158 0.9545344710350037 0.9545334577560425 4.598935604095459 -0.9545339345932007 0.9545340538024902 4.598935604095459 -0.9545333385467529 2.9253101348876953 4.607422351837158 0.9545350074768066 2.925309658050537 4.607422351837158 0.9545350074768066 2.925309658050537 4.607422351837158 0.9025050401687622 2.9289722442626953 6.009448051452637</float_array>
<technique_common>
<accessor source="#id-mesh-10-positions-array" count="72" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-mesh-10-normals">
<float_array id="id-mesh-10-normals-array" count="216"> 0.0 0.0 -1.0 0.0 0.0 -1.0 0.0 0.0 -1.0 0.0 0.0 -1.0 -0.9999999403953552 2.2351740369686013e-07 -6.70552182668871e-08 -1.0 2.2351743211856956e-07 -6.70552182668871e-08 -0.9999008774757385 2.1862656751636678e-07 0.01408354565501213 -0.9999008774757385 2.1862656751636678e-07 0.01408354565501213 1.0 -2.980232238769531e-07 4.470339831641468e-08 0.9999999403953552 -4.321336461998726e-07 2.2351700934564178e-08 1.0 -4.3213370304329146e-07 2.235169560549366e-08 1.0 -2.980232238769531e-07 4.470339831641468e-08 -2.831220911048149e-07 -1.0 -1.7881397695873602e-07 -3.7997961044311523e-07 -0.9999999403953552 -8.940698847936801e-08 -3.799796957082435e-07 -1.0 -8.940698847936801e-08 -2.831220911048149e-07 -1.0 -1.7881397695873602e-07 -1.0 2.384185791015625e-07 -1.341104365337742e-07 -1.0 2.384185791015625e-07 -1.341104365337742e-07 2.533197118737007e-07 1.0 8.195638656616211e-08 2.384185791015625e-07 1.0 1.6391278734317893e-07 2.384185791015625e-07 1.0 1.6391278734317893e-07 2.533197118737007e-07 1.0 8.195638656616211e-08 -0.9994659423828125 2.2885373596182035e-07 0.03267655521631241 -0.9994159936904907 -5.6084059906424955e-05 0.03417250141501427 -4.903030230707373e-07 -0.999900758266449 0.014083554036915302 -4.903030230707373e-07 -0.999900758266449 0.014083554036915302 2.793038049730967e-07 0.9999008774757385 0.014083568938076496 2.793038049730967e-07 0.9999008774757385 0.014083568938076496 0.9999008774757385 -5.880169169358851e-07 0.014083541929721832 0.9999008774757385 -5.880169169358851e-07 0.014083541929721832 -0.9991201162338257 -5.4629024816676974e-05 0.041940946131944656 -0.9990172386169434 2.1669733030194038e-07 0.044324908405542374 -0.9986491799354553 2.0373587972244422e-07 0.05195961520075798 -0.9986491799354553 2.0373587972244422e-07 0.05195961520075798 -5.205995421420084e-07 -0.9994659423828125 0.0326765701174736 -5.205994852985896e-07 -0.9994659423828125 0.032676566392183304 2.9053398975520395e-07 0.9995959997177124 0.02842373587191105 2.9053398975520395e-07 0.9995959997177124 0.02842373587191105 0.9994159936904907 -5.6835739087546244e-05 0.03417249023914337 0.9994659423828125 -6.028049028827809e-07 0.032676540315151215 5.150363904249389e-07 0.0 1.0 5.150363904249389e-07 0.0 1.0 5.150363904249389e-07 0.0 1.0 5.150363904249389e-07 0.0 1.0 -5.323321374817169e-07 -0.9990172386169434 0.04432494565844536 -5.323321374817169e-07 -0.9990172386169434 0.04432494565844536 -5.263181037662434e-07 -0.9986491203308105 0.05195968598127365 -5.263181037662434e-07 -0.9986491203308105 0.05195968598127365 2.886259267143032e-07 0.9986491203308105 0.05195966362953186 2.886259267143032e-07 0.9986491203308105 0.05195966362953186 2.886259267143032e-07 0.9986491203308105 0.05195966362953186 2.886259267143032e-07 0.9986491203308105 0.05195966362953186 0.9990172386169434 -6.030014674252016e-07 0.04432491585612297 0.9991201162338257 -5.53747704543639e-05 0.04194095358252525 0.9986491799354553 -6.112079518061364e-07 0.051959652453660965 0.9986491799354553 -6.112079518061364e-07 0.051959652453660965 -1.2316533348766256e-09 -0.0046622720547020435 0.9999890923500061 -1.2316533348766256e-09 -0.0046622720547020435 0.9999890923500061 -1.2316533348766256e-09 -0.0046622720547020435 0.9999890923500061 -1.2316533348766256e-09 -0.0046622720547020435 0.9999890923500061 2.564144381267397e-07 0.9999966025352478 -0.0026121772825717926 2.564144381267397e-07 0.9999966025352478 -0.0026121772825717926 2.564144381267397e-07 0.9999966025352478 -0.0026121772825717926 2.564144381267397e-07 0.9999966025352478 -0.0026121772825717926 -0.9993117451667786 -0.00016610079910606146 0.03709486126899719 -0.9993117451667786 -0.00016610079910606146 0.03709486126899719 7.69835608593894e-08 0.004306257236748934 -0.999990701675415 7.69835608593894e-08 0.004306257236748934 -0.999990701675415 7.69835608593894e-08 0.004306257236748934 -0.999990701675415 7.69835608593894e-08 0.004306257236748934 -0.999990701675415 0.9993118047714233 -0.00016669620526954532 0.03709486499428749 0.9993118047714233 -0.00016669620526954532 0.03709486499428749</float_array>
<technique_common>
<accessor source="#id-mesh-10-normals-array" count="72" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-mesh-10-texcoord-0">
<float_array id="id-mesh-10-texcoord-0-array" count="144"> 0.853708028793335 0.1462918519973755 0.853708028793335 0.00016813237743917853 0.9998317956924438 0.00016813237743917853 0.9998317360877991 0.1462918221950531 0.41687875986099243 0.15038259327411652 0.5629437565803528 0.14623311161994934 0.5670932531356812 0.29229798913002014 0.42102837562561035 0.29644766449928284 0.1580430120229721 0.005586783867329359 0.15262427926063538 0.1516100913286209 0.006601004861295223 0.14619146287441254 0.012019664980471134 0.00016813237743917853 0.7135531306266785 0.00016813237743917853 0.7135540843009949 0.14629174768924713 0.5674304366111755 0.1462927609682083 0.5674294829368591 0.0001691012439550832 0.5587943196296692 0.00016813237743917853 0.4127293825149536 0.0043175434693694115 0.853708028793335 0.2924155592918396 0.853708028793335 0.1462918519973755 0.9998317360877991 0.1462918221950531 0.9998318552970886 0.2924154996871948 0.5670915842056274 0.4092135429382324 0.42766785621643066 0.41317465901374817 0.713555097579956 0.2924153804779053 0.5674314498901367 0.29241642355918884 0.9998318552970886 0.43853920698165894 0.8537081480026245 0.4385392665863037 0.14720562100410461 0.29763343930244446 0.0011823981767520308 0.29221469163894653 0.43437695503234863 0.5154602527618408 0.5662007331848145 0.5117148756980896 0.5644786357879639 0.5849537253379822 0.44025471806526184 0.5884833335876465 0.7102342247962952 0.4092837870121002 0.5707541108131409 0.4092848598957062 0.9965101480484009 0.5554076433181763 0.8570300936698914 0.555407702922821 0.13955222070217133 0.4142983853816986 0.00016813237743917853 0.40912580490112305 0.7214940786361694 0.46781307458877563 0.8457685708999634 0.46781307458877563 0.8457684516906738 0.5920873880386353 0.7214942574501038 0.5920873880386353 0.5745562314987183 0.5117197632789612 0.7064335942268372 0.51171875 0.7026327252388 0.5848795175552368 0.5783581733703613 0.584880530834198 0.7176926732063293 0.39465245604515076 0.8495699167251587 0.39465245604515076 0.8457685708999634 0.46781307458877563 0.7214940786361694 0.46781307458877563 0.00016824003250803798 0.5116311311721802 0.13195458054542542 0.5165219306945801 0.12544254958629608 0.5894912481307983 0.0012538435403257608 0.5848821997642517 0.8495699167251587 0.39465245604515076 0.7176926732063293 0.39465245604515076 0.7176927328109741 0.24659334123134613 0.8495699763298035 0.2465934455394745 0.7138913869857788 0.1441582441329956 0.8533715605735779 0.14415842294692993 0.8495699763298035 0.2465934455394745 0.7176927328109741 0.24659334123134613 0.28639882802963257 0.520354688167572 0.2837550938129425 0.4178834557533264 0.7138914465904236 0.00016813237743917853 0.8533717393875122 0.00016831178800202906 0.8533715605735779 0.14415842294692993 0.7138913869857788 0.1441582441329956 0.28341880440711975 0.4202575087547302 0.2798847556114197 0.5227020382881165</float_array>
<technique_common>
<accessor source="#id-mesh-10-texcoord-0-array" count="72" stride="2">
<param name="S" type="float"/>
<param name="T" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-mesh-10-colors">
<float_array id="id-mesh-10-colors-array" count="216"> 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0</float_array>
<technique_common>
<accessor source="#id-mesh-10-colors-array" count="72" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="id-mesh-10-vertices">
<input semantic="POSITION" source="#id-mesh-10-positions"/>
</vertices>
<polygons count="26" material="id-trimat-11">
<input semantic="VERTEX" source="#id-mesh-10-vertices" offset="0"/>
<input semantic="NORMAL" source="#id-mesh-10-normals" offset="0"/>
<input semantic="TEXCOORD" source="#id-mesh-10-texcoord-0" offset="0" set="0"/>
<input semantic="COLOR" source="#id-mesh-10-colors" offset="0"/>
<p> 0 1 2 3 </p>
<p> 4 5 6 7 </p>
<p> 8 9 10 11 </p>
<p> 12 13 14 15 </p>
<p> 16 5 4 17 </p>
<p> 18 19 20 21 </p>
<p> 7 6 22 23 </p>
<p> 14 13 24 25 </p>
<p> 18 21 26 27 </p>
<p> 10 9 28 29 </p>
<p> 30 31 32 33 </p>
<p> 25 24 34 35 </p>
<p> 27 26 36 37 </p>
<p> 29 28 38 39 </p>
<p> 40 41 42 43 </p>
<p> 44 45 46 47 </p>
<p> 48 49 50 51 </p>
<p> 52 53 54 55 </p>
<p> 23 22 31 30 </p>
<p> 35 34 45 44 </p>
<p> 56 57 58 59 </p>
<p> 39 38 53 52 </p>
<p> 60 61 62 63 </p>
<p> 23 30 64 65 </p>
<p> 66 67 68 69 </p>
<p> 53 38 70 71 </p>
</polygons>
</mesh>
</geometry>
</library_geometries>
<library_controllers>
<controller id="id-controller-12">
<skin source="#id-mesh-10">
<bind_shape_matrix> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </bind_shape_matrix>
<source id="id-controller-12-joints">
<Name_array id="id-controller-12-joints-array" count="5"> id-skelbones-2-0 id-skelbones-2-1 id-skelbones-2-2 id-skelbones-2-3 id-skelbones-2-4</Name_array>
<technique_common>
<accessor source="#id-controller-12-joints-array" count="5" stride="1">
<param name="JOINT" type="Name"/>
</accessor>
</technique_common>
</source>
<source id="id-controller-12-bind_poses">
<float_array id="id-controller-12-bind_poses-array" count="80"> 1.0 -0.0 0.0 -0.0 -0.0 7.549790126404332e-08 1.0 1.0 0.0 -1.0 7.549790126404332e-08 7.549790126404332e-08 -0.0 0.0 -0.0 1.0 1.0 -0.0 0.0 -0.0 -0.0 7.549790126404332e-08 1.0 -1.0 0.0 -1.0 7.549790126404332e-08 7.549790126404332e-08 -0.0 0.0 -0.0 1.0 1.0 3.019916050561733e-07 0.0 -9.11989328999073e-14 -2.2799733224976824e-14 7.549790126404332e-08 1.0 -3.0 3.019916050561733e-07 -1.0 7.549790126404332e-08 7.549789415861596e-08 -0.0 0.0 -0.0 1.0 1.0 -0.0 -0.0 4.559946644995365e-14 -0.0 7.549790126404332e-08 1.0 -5.0 0.0 -1.0 7.549790126404332e-08 7.54979225803254e-08 -0.0 0.0 -0.0 1.0 1.0 -0.0 1.6940658945086007e-21 4.559945628555828e-14 -0.0 1.0 -0.0 -4.5298742179511464e-07 5.621949100372871e-15 -0.0 1.0 -5.0 -0.0 0.0 -0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-controller-12-bind_poses-array" count="5" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-controller-12-skin_weights">
<float_array id="id-controller-12-skin_weights-array" count="112"> 1.0 1.0 1.0 1.0 0.9710749387741089 1.0 0.5 0.5 0.4995494484901428 0.5004505515098572 1.0 0.9998676180839539 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.9998676180839539 1.0 1.0 0.9710749387741089 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.4995494484901428 0.5004505515098572 0.5 0.5 0.5 0.5 0.5 0.5 0.3333333432674408 0.6666666865348816 0.6666666865348816 0.3333333432674408 1.0 1.0 0.4999999403953552 0.5000000596046448 0.5 0.5 0.5 0.5 0.49981489777565 0.5001850128173828 0.49981489777565 0.5001850128173828 0.4999999403953552 0.5000000596046448 0.999976634979248 1.0 1.0 1.0 0.6666666865348816 0.3333333432674408 0.6666667461395264 0.333333283662796 1.0 1.0 0.33317145705223083 0.6668285131454468 0.3333333432674408 0.6666666865348816 1.0 0.999976634979248 0.6666667461395264 0.333333283662796 0.33317145705223083 0.6668285131454468 0.999976634979248 1.0 0.3333333432674408 0.6666666865348816 0.33317145705223083 0.6668285131454468 0.33317145705223083 0.6668285131454468 0.3333333432674408 0.6666666865348816 0.49981483817100525 0.5001851320266724 0.5 0.5 0.3333333432674408 0.6666666865348816 0.33317145705223083 0.6668285131454468 0.3333333432674408 0.6666666865348816 0.5 0.5 0.49981489777565 0.5001850128173828 0.5 0.5 0.5 0.5 0.49981483817100525 0.5001851320266724 0.49981483817100525 0.5001851320266724 0.33317145705223083 0.6668285131454468</float_array>
<technique_common>
<accessor source="#id-controller-12-skin_weights-array" count="112" stride="1">
<param name="WEIGHT" type="float"/>
</accessor>
</technique_common>
</source>
<joints>
<input semantic="JOINT" source="#id-controller-12-joints"/>
<input semantic="INV_BIND_MATRIX" source="#id-controller-12-bind_poses"/>
</joints>
<vertex_weights count="72">
<input semantic="JOINT" source="#id-controller-12-joints" offset="0"/>
<input semantic="WEIGHT" source="#id-controller-12-skin_weights" offset="1"/>
<vcount> 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 1 1 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2</vcount>
<v> 0 0 0 1 0 2 0 3 1 4 1 5 1 6 2 7 1 8 2 9 0 10 1 11 1 12 0 13 0 14 1 15 1 16 0 17 0 18 0 19 1 20 0 21 0 22 1 23 2 24 3 25 2 26 3 27 1 28 2 29 1 30 2 31 1 32 2 33 1 34 2 35 1 36 2 37 1 38 2 39 2 40 3 41 3 42 2 43 3 44 3 45 2 46 3 47 2 48 3 49 2 50 3 51 2 52 3 53 2 54 3 55 2 56 3 57 3 58 3 59 3 60 3 61 3 62 2 63 3 64 2 65 3 66 3 67 2 68 3 69 2 70 3 71 3 72 3 73 3 74 2 75 2 76 3 77 3 78 3 79 2 80 3 81 2 82 3 83 2 84 3 85 2 86 3 87 2 88 3 89 2 90 3 91 2 92 3 93 2 94 3 95 2 96 3 97 2 98 3 99 2 100 3 101 2 102 3 103 2 104 3 105 2 106 3 107 2 108 3 109 2 110 3 111</v>
</vertex_weights>
</skin>
</controller>
</library_controllers>
<library_cameras>
</library_cameras>
<library_lights>
</library_lights>
<library_animation_clips>
<animation_clip name="bend" start="0.041666666666666664" end="0.625">
<instance_animation url="#id-anim-13"/>
<instance_animation url="#id-anim-14"/>
<instance_animation url="#id-anim-15"/>
<instance_animation url="#id-anim-16"/>
<instance_animation url="#id-anim-17"/>
<instance_animation url="#id-anim-18"/>
</animation_clip>
<animation_clip name="turn" start="0.0" end="0.8333333333333333">
<instance_animation url="#id-anim-19"/>
<instance_animation url="#id-anim-20"/>
<instance_animation url="#id-anim-21"/>
<instance_animation url="#id-anim-22"/>
<instance_animation url="#id-anim-23"/>
<instance_animation url="#id-anim-24"/>
</animation_clip>
</library_animation_clips>
<library_visual_scenes>
<visual_scene id="id-scene-1" name="scene">
<node id="Armature" name="Armature" type="NODE">
<matrix sid="transform"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </matrix>
<node id="id-bone-3" sid="id-skelbones-2-0" name="Bone" type="JOINT">
<matrix sid="transform"> 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 0.0 0.0 1.0 7.549790126404332e-08 -1.0 0.0 0.0 0.0 1.0 </matrix>
<node id="id-bone-4" sid="id-skelbones-2-1" name="Bone.001" type="JOINT">
<matrix sid="transform"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 2.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </matrix>
<node id="id-bone-5" sid="id-skelbones-2-2" name="Bone.002" type="JOINT">
<matrix sid="transform"> 1.0 -2.2799733224976824e-14 3.019916050561733e-07 0.0 2.2799733224976824e-14 1.0 0.0 2.0 -3.019916050561733e-07 0.0 1.0 7.105427357601002e-15 0.0 0.0 0.0 1.0 </matrix>
<node id="id-bone-6" sid="id-skelbones-2-3" name="Bone.003" type="JOINT">
<matrix sid="transform"> 1.0 2.2799733224976824e-14 -3.019916050561733e-07 -3.3881317890172014e-21 -2.2799733224976824e-14 1.0 0.0 2.0 3.019916050561733e-07 0.0 1.0 -2.8421722982931164e-14 0.0 0.0 0.0 1.0 </matrix>
</node>
<node id="id-bone-7" sid="id-skelbones-2-4" name="Bone.004" type="JOINT">
<matrix sid="transform"> 1.0 3.019916050561733e-07 -1.6940658945086007e-21 -3.3881317890172014e-21 -2.8421682325349695e-14 7.549790126404332e-08 1.0 2.0 3.019916050561733e-07 -1.0 7.549790126404332e-08 -2.8421722982931164e-14 0.0 0.0 0.0 1.0 </matrix>
</node>
</node>
</node>
</node>
<node id="Cube" name="Cube" type="NODE">
<matrix sid="transform"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </matrix>
<instance_controller url="#id-controller-12">
<skeleton>#id-bone-3</skeleton>
<bind_material>
<technique_common>
<instance_material symbol="id-trimat-11" target="#id-material-9"/>
</technique_common>
</bind_material>
</instance_controller>
</node>
</node>
</visual_scene>
</library_visual_scenes>
<library_animations>
<animation id="id-anim-13">
<source id="id-anim-13-input">
<float_array id="id-anim-13-input-array" count="15"> 0.0 0.041666666666666664 0.08333333333333334 0.125 0.16666666666666666 0.20833333333333334 0.24999999999999997 0.29166666666666663 0.3333333333333333 0.37499999999999994 0.41666666666666663 0.4583333333333333 0.49999999999999994 0.5416666666666666 0.5833333333333334</float_array>
<technique_common>
<accessor source="#id-anim-13-input-array" count="15" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-13-transform-output">
<float_array id="id-anim-13-transform-output-array" count="240"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-13-transform-output-array" count="15" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-13-interpolation-output">
<Name_array id="id-anim-13-interpolation-output-array" count="15"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-13-interpolation-output-array" count="15" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-13-sampler">
<input semantic="INPUT" source="#id-anim-13-input"/>
<input semantic="OUTPUT" source="#id-anim-13-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-13-interpolation-output"/>
</sampler>
<channel source="#id-anim-13-sampler" target="Armature/transform"/>
</animation>
<animation id="id-anim-14">
<source id="id-anim-14-input">
<float_array id="id-anim-14-input-array" count="15"> 0.0 0.041666666666666664 0.08333333333333334 0.125 0.16666666666666666 0.20833333333333334 0.24999999999999997 0.29166666666666663 0.3333333333333333 0.37499999999999994 0.41666666666666663 0.4583333333333333 0.49999999999999994 0.5416666666666666 0.5833333333333334</float_array>
<technique_common>
<accessor source="#id-anim-14-input-array" count="15" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-14-transform-output">
<float_array id="id-anim-14-transform-output-array" count="240"> 1.0 3.019916050561733e-07 -1.6940658945086007e-21 -3.3881317890172014e-21 -2.8421682325349695e-14 7.549790126404332e-08 1.0 2.0 3.019916050561733e-07 -1.0 7.549790126404332e-08 -2.8421722982931164e-14 0.0 0.0 0.0 1.0 1.0 3.0198953027138487e-07 -1.5963781407890565e-09 4.261721642251359e-09 -2.1282611228912174e-09 7.553694558737334e-08 1.0 1.9999998807907104 3.0198589229257777e-07 -1.0 7.570474735985044e-08 4.5565684558823705e-10 0.0 0.0 0.0 1.0 1.0 3.019813448190689e-07 -4.2969077185261995e-09 -2.3610937205376104e-08 -7.037897375994362e-09 7.6121068559587e-08 1.0 2.000000238418579 3.0177761800587177e-07 -1.0 7.702328730374575e-08 7.712515071034431e-09 0.0 0.0 0.0 1.0 1.0 3.0174851417541504e-07 -9.467839845456183e-09 4.011599230580032e-08 -1.7462298274040222e-10 7.724156603217125e-08 1.0000001192092896 2.000000238418579 3.019813448190689e-07 -1.0 7.700873538851738e-08 -1.6298145055770874e-09 0.0 0.0 0.0 1.0 0.9999998807907104 3.026798367500305e-07 8.192728273570538e-09 1.9393337424844503e-07 -3.0253431759774685e-08 7.59027898311615e-08 0.9999998807907104 1.9999990463256836 3.022141754627228e-07 -0.9999999403953552 7.613562047481537e-08 -1.7695128917694092e-08 0.0 0.0 0.0 1.0 1.0 3.012828528881073e-07 6.184563972055912e-09 2.486049197614193e-07 5.3958501666784286e-08 7.82310962677002e-08 1.0 1.9999995231628418 3.022141754627228e-07 -1.0 7.543712854385376e-08 -5.587935447692871e-09 0.0 0.0 0.0 1.0 1.0 3.050081431865692e-07 -1.2660166248679161e-08 -3.2654497772455215e-07 2.240994945168495e-09 7.264316082000732e-08 0.9999999403953552 1.999999761581421 3.012828528881073e-07 -0.9999999403953552 7.264316082000732e-08 1.1175870895385742e-08 0.0 0.0 0.0 1.0 1.0 3.026798367500305e-07 1.8044374883174896e-09 4.7672074288129807e-07 -4.5372871682047844e-08 6.891787052154541e-08 1.0000001192092896 2.000000238418579 3.0174851417541504e-07 -1.0 7.636845111846924e-08 0.0 0.0 0.0 0.0 1.0 1.0 3.0174851417541504e-07 -1.949956640601158e-08 -3.995373845100403e-07 -9.167706593871117e-09 7.82310962677002e-08 1.0 2.000000238418579 3.022141754627228e-07 -1.0 7.078051567077637e-08 -1.4901161193847656e-08 0.0 0.0 0.0 1.0 1.0 2.9546208679676056e-07 2.4141627363860607e-08 2.2811582311987877e-07 3.8853613659739494e-09 6.705522537231445e-08 1.0 2.000000238418579 3.0151568353176117e-07 -1.0000001192092896 7.450580596923828e-08 -1.4901161193847656e-08 0.0 0.0 0.0 1.0 1.0 3.0384398996829987e-07 -1.0943040251731873e-08 -2.1746382117271423e-07 -2.8172507882118225e-08 7.695052772760391e-08 1.000000238418579 2.000000476837158 2.9779039323329926e-07 -1.0000001192092896 7.566995918750763e-08 -1.862645149230957e-09 0.0 0.0 0.0 1.0 0.9999999403953552 3.0547380447387695e-07 -5.3551048040390015e-09 -3.5390257835388184e-08 -8.614733815193176e-09 8.009374141693115e-08 0.9999998807907104 1.9999996423721313 2.980232238769531e-07 -0.9999998807907104 8.195638656616211e-08 2.9802322387695312e-08 0.0 0.0 0.0 1.0 1.0 3.026798367500305e-07 9.19681042432785e-09 3.296881914138794e-07 -3.655441105365753e-08 7.729977369308472e-08 0.9999999403953552 1.999999761581421 3.129243850708008e-07 -0.9999999403953552 7.636845111846924e-08 1.4901161193847656e-08 0.0 0.0 0.0 1.0 1.0 2.975575625896454e-07 8.381903171539307e-09 1.1548399925231934e-07 1.1175870895385742e-08 7.636845111846924e-08 1.0 2.000000476837158 3.0314549803733826e-07 -1.0 7.636845111846924e-08 1.4901161193847656e-08 0.0 0.0 0.0 1.0 1.0 3.03611159324646e-07 -2.7939677238464355e-09 3.725290298461914e-09 8.381903171539307e-09 7.450580596923828e-08 1.0 2.000000476837158 2.905726432800293e-07 -1.0 7.450580596923828e-08 1.4901161193847656e-08 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-14-transform-output-array" count="15" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-14-interpolation-output">
<Name_array id="id-anim-14-interpolation-output-array" count="15"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-14-interpolation-output-array" count="15" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-14-sampler">
<input semantic="INPUT" source="#id-anim-14-input"/>
<input semantic="OUTPUT" source="#id-anim-14-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-14-interpolation-output"/>
</sampler>
<channel source="#id-anim-14-sampler" target="id-bone-7/transform"/>
</animation>
<animation id="id-anim-15">
<source id="id-anim-15-input">
<float_array id="id-anim-15-input-array" count="15"> 0.0 0.041666666666666664 0.08333333333333334 0.125 0.16666666666666666 0.20833333333333334 0.24999999999999997 0.29166666666666663 0.3333333333333333 0.37499999999999994 0.41666666666666663 0.4583333333333333 0.49999999999999994 0.5416666666666666 0.5833333333333334</float_array>
<technique_common>
<accessor source="#id-anim-15-input-array" count="15" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-15-transform-output">
<float_array id="id-anim-15-transform-output-array" count="240"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 2.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.99998539686203 0.005406782031059265 2.0841630504753184e-11 0.0 -0.005406782031059265 0.99998539686203 -5.684341886080802e-14 2.0 -2.0841633974200136e-11 -5.684341886080802e-14 1.0 0.0 0.0 0.0 0.0 1.0 0.9996087551116943 0.02796982228755951 1.4218640154162188e-10 0.0 -0.02796982228755951 0.9996087551116943 -1.9895196601282805e-12 2.0 -1.4218648480834872e-10 -1.9895196601282805e-12 1.0 0.0 0.0 0.0 0.0 1.0 0.998104453086853 0.06154264137148857 4.495371852542007e-10 0.0 -0.06154264137148857 0.998104453086853 -1.3848477919964353e-11 2.0 -4.495372962765032e-10 -1.3848477919964353e-11 1.0 3.552713678800501e-15 0.0 0.0 0.0 1.0 0.9950810074806213 0.09906430542469025 1.1069893890436333e-09 0.0 -0.09906430542469025 0.9950810074806213 -5.496758603840135e-11 2.0 -1.1069891669990284e-09 -5.496758603840135e-11 1.0 1.1546319456101628e-14 0.0 0.0 0.0 1.0 0.9903477430343628 0.1386050283908844 2.387212427734653e-09 0.0 -0.1386050283908844 0.9903477430343628 -1.6624568388579064e-10 1.9999998807907104 -2.387212205690048e-09 -1.6623857845843304e-10 1.0 -1.4210854715202004e-14 0.0 0.0 0.0 1.0 0.9839622974395752 0.1783764809370041 4.3626333656732186e-09 0.0 -0.1783764809370041 0.9839622974395752 -3.922409064216481e-10 2.000000238418579 -4.362632921584009e-09 -3.922409064216481e-10 1.0 1.4210854715202004e-14 0.0 0.0 0.0 1.0 0.9762129187583923 0.21681401133537292 7.393061718374838e-09 0.0 -0.21681401133537292 0.9762129187583923 -8.111058491522272e-10 2.0 -7.393062162464048e-09 -8.111058491522272e-10 1.0 0.0 0.0 0.0 0.0 1.0 0.9676145911216736 0.2524321675300598 1.2406852434310167e-08 0.0 -0.2524321675300598 0.9676145911216736 -1.5917152040856308e-09 2.0 -1.2406852434310167e-08 -1.5917152040856308e-09 1.0 -1.4210854715202004e-14 0.0 0.0 0.0 1.0 0.9592233300209045 0.28264933824539185 2.133943155513407e-08 0.0 -0.28264933824539185 0.9592233300209045 -3.078554300373071e-09 2.0 -2.133943155513407e-08 -3.078554300373071e-09 1.0 -1.4210854715202004e-14 0.0 0.0 0.0 1.0 0.950993537902832 0.3092101812362671 0.0005914760404266417 4.874891601502895e-09 -0.30921056866645813 0.9509932994842529 0.000737061258405447 2.000000238418579 -0.0003345829900354147 -0.0008838316425681114 0.9999995827674866 -1.0477378964424133e-09 0.0 0.0 0.0 1.0 0.9428225159645081 0.333288311958313 0.002140357159078121 6.129266694188118e-08 -0.33329325914382935 0.9428195953369141 0.002598921302706003 2.0 -0.0011517815291881561 -0.003163686953485012 0.9999943375587463 -9.313225746154785e-10 0.0 0.0 0.0 1.0 0.9348953366279602 0.3548996150493622 0.00411301851272583 3.3527612686157227e-08 -0.35491713881492615 0.9348850250244141 0.004878699779510498 2.0 -0.00211375136859715 -0.006020858883857727 0.9999796152114868 -4.6566128730773926e-09 0.0 0.0 0.0 1.0 0.9280365705490112 0.37244030833244324 0.006034713238477707 1.1874362826347351e-08 -0.3724772334098816 0.9280148148536682 0.007022818550467491 2.0 -0.0029847193509340286 -0.008765213191509247 0.9999571442604065 1.4901161193847656e-08 0.0 0.0 0.0 1.0 0.9249669909477234 0.3799836039543152 0.006962517276406288 -5.052424967288971e-08 -0.38003233075141907 0.9249383211135864 0.008036060258746147 2.0 -0.003386327065527439 -0.010079077444970608 0.9999434947967529 7.450580596923828e-09 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-15-transform-output-array" count="15" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-15-interpolation-output">
<Name_array id="id-anim-15-interpolation-output-array" count="15"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-15-interpolation-output-array" count="15" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-15-sampler">
<input semantic="INPUT" source="#id-anim-15-input"/>
<input semantic="OUTPUT" source="#id-anim-15-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-15-interpolation-output"/>
</sampler>
<channel source="#id-anim-15-sampler" target="id-bone-4/transform"/>
</animation>
<animation id="id-anim-16">
<source id="id-anim-16-input">
<float_array id="id-anim-16-input-array" count="15"> 0.0 0.041666666666666664 0.08333333333333334 0.125 0.16666666666666666 0.20833333333333334 0.24999999999999997 0.29166666666666663 0.3333333333333333 0.37499999999999994 0.41666666666666663 0.4583333333333333 0.49999999999999994 0.5416666666666666 0.5833333333333334</float_array>
<technique_common>
<accessor source="#id-anim-16-input-array" count="15" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-16-transform-output">
<float_array id="id-anim-16-transform-output-array" count="240"> 1.0 -2.2799733224976824e-14 3.019916050561733e-07 0.0 2.2799733224976824e-14 1.0 0.0 2.0 -3.019916050561733e-07 0.0 1.0 7.105427357601002e-15 0.0 0.0 0.0 1.0 0.9998303651809692 0.01841968111693859 4.1081955714616925e-05 -1.1622647289044608e-16 -0.018419725820422173 0.9998288154602051 0.0017628732603043318 2.0 -8.603356945968699e-06 -0.0017633308889344335 0.9999984502792358 -2.001030634593559e-15 0.0 0.0 0.0 1.0 0.9955697059631348 0.09402430802583694 0.0005926893791183829 -5.967448757360216e-16 -0.09402582794427872 0.9955291152000427 0.008997068740427494 2.0 0.0002559037529863417 -0.009012939408421516 0.9999593496322632 9.993741945102386e-15 0.0 0.0 0.0 1.0 0.9817259907722473 0.19028612971305847 0.0022829289082437754 7.4505792646561986e-09 -0.19029591977596283 0.9815584421157837 0.018178554251790047 1.9999998807907104 0.0012182984501123428 -0.018280791118741035 0.9998321533203125 1.5727003033205733e-14 0.0 0.0 0.0 1.0 0.957146942615509 0.2895524203777313 0.005411616992205381 -1.915134717478395e-15 -0.28958943486213684 0.9567543268203735 0.027551069855690002 1.9999998807907104 0.00279989093542099 -0.027937568724155426 0.9996057748794556 6.661338147750939e-16 0.0 0.0 0.0 1.0 0.9201236367225647 0.3914887011051178 0.010444517247378826 -2.4424906541753444e-15 -0.3915977478027344 0.9193943738937378 0.03694813698530197 1.9999996423721313 0.004862145520746708 -0.0380869023501873 0.9992626309394836 -2.248201624865942e-14 0.0 0.0 0.0 1.0 0.8738107681274414 0.48596465587615967 0.017122987657785416 -2.7200464103316335e-15 -0.4862149953842163 0.8726656436920166 0.0452730767428875 2.0 0.007058470044285059 -0.04788554832339287 0.9988278746604919 5.928590951498336e-14 0.0 0.0 0.0 1.0 0.8255134224891663 0.5638235807418823 0.025112418457865715 2.9802318834981634e-08 -0.5643211603164673 0.8239501118659973 0.05145721137523651 2.000000238418579 0.008321406319737434 -0.05665009096264839 0.9983594417572021 2.6423307986078726e-14 0.0 0.0 0.0 1.0 0.7873582243919373 0.6155419945716858 0.03428023308515549 -2.980232594040899e-08 -0.616461992263794 0.7855148911476135 0.054230671375989914 1.999999761581421 0.0064536212012171745 -0.06383142620325089 0.9979398250579834 4.4853010194856324e-14 0.0 0.0 0.0 1.0 0.7748236656188965 0.6305439472198486 0.04541659727692604 -1.1920928955078125e-07 -0.6321731805801392 0.7730801701545715 0.05200223997235298 2.000000238418579 -0.0023209722712635994 -0.06900371611118317 0.9976137280464172 1.9539925233402755e-14 0.0 0.0 0.0 1.0 0.8074691891670227 0.5863681435585022 0.06454403698444366 6.511982064694166e-08 -0.5886243581771851 0.8080913424491882 0.022573528811335564 1.999999761581421 -0.03892108052968979 -0.05621962994337082 0.9976595044136047 -1.3969838619232178e-09 0.0 0.0 0.0 1.0 0.8808358907699585 0.4656791687011719 0.08527038991451263 1.8748687580227852e-07 -0.46402132511138916 0.8849409818649292 -0.039543673396110535 1.9999998807907104 -0.09387392550706863 -0.0047357818111777306 0.9955728650093079 -1.30385160446167e-08 0.0 0.0 0.0 1.0 0.9460473656654358 0.3024177849292755 0.11635156720876694 7.392372936010361e-08 -0.29019874334335327 0.950512170791626 -0.11095613986253738 1.9999995231628418 -0.14414867758750916 0.07120470702648163 0.9869908094406128 -1.862645149230957e-09 0.0 0.0 0.0 1.0 0.9779367446899414 0.14079925417900085 0.15432208776474 2.561137080192566e-07 -0.11382761597633362 0.9785844683647156 -0.17151015996932983 1.9999998807907104 -0.17516569793224335 0.15015996992588043 0.9730204939842224 -1.30385160446167e-08 0.0 0.0 0.0 1.0 0.9825076460838318 0.06423753499984741 0.17479248344898224 3.725290298461914e-08 -0.029007764533162117 0.9799563884735107 -0.19708888232707977 1.9999998807907104 -0.1839495152235031 0.1885710060596466 0.9646779298782349 2.2351741790771484e-08 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-16-transform-output-array" count="15" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-16-interpolation-output">
<Name_array id="id-anim-16-interpolation-output-array" count="15"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-16-interpolation-output-array" count="15" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-16-sampler">
<input semantic="INPUT" source="#id-anim-16-input"/>
<input semantic="OUTPUT" source="#id-anim-16-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-16-interpolation-output"/>
</sampler>
<channel source="#id-anim-16-sampler" target="id-bone-5/transform"/>
</animation>
<animation id="id-anim-17">
<source id="id-anim-17-input">
<float_array id="id-anim-17-input-array" count="15"> 0.0 0.041666666666666664 0.08333333333333334 0.125 0.16666666666666666 0.20833333333333334 0.24999999999999997 0.29166666666666663 0.3333333333333333 0.37499999999999994 0.41666666666666663 0.4583333333333333 0.49999999999999994 0.5416666666666666 0.5833333333333334</float_array>
<technique_common>
<accessor source="#id-anim-17-input-array" count="15" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-17-transform-output">
<float_array id="id-anim-17-transform-output-array" count="240"> 1.0 2.2799733224976824e-14 -3.019916050561733e-07 -3.3881317890172014e-21 -2.2799733224976824e-14 1.0 0.0 2.0 3.019916050561733e-07 0.0 1.0 -2.8421722982931164e-14 0.0 0.0 0.0 1.0 0.9998536109924316 0.01711064949631691 0.00039659717003814876 4.261721642251359e-09 -0.0171112772077322 0.9998522400856018 0.0016349750803783536 1.9999998807907104 -0.00036856307997368276 -0.001641521812416613 0.9999986290931702 4.5565684558823705e-10 0.0 0.0 0.0 1.0 0.99617999792099 0.08729173988103867 0.0023786951787769794 -2.3610937205376104e-08 -0.08730863034725189 0.9961469769477844 0.008274005725979805 2.000000238418579 -0.0016472784336656332 -0.00845007598400116 0.9999629259109497 7.712515071034431e-09 0.0 0.0 0.0 1.0 0.9842609167098999 0.17661483585834503 0.00612880103290081 4.011599230580032e-08 -0.17669369280338287 0.984127402305603 0.01651296205818653 2.000000238418579 -0.0031150872819125652 -0.017335979267954826 0.9998448491096497 -1.6298145055770874e-09 0.0 0.0 0.0 1.0 0.9631130695343018 0.2688666880130768 0.011120881885290146 1.9393337424844503e-07 -0.2690659761428833 0.9628040194511414 0.02473120391368866 1.9999990463256836 -0.0040578339248895645 -0.026811204850673676 0.9996322393417358 -1.7695128917694092e-08 0.0 0.0 0.0 1.0 0.931238055229187 0.36400336027145386 0.017243409529328346 2.486049197614193e-07 -0.36438867449760437 0.9306660890579224 0.032886967062950134 1.9999995231628418 -0.004076894372701645 -0.036908891052007675 0.999310314655304 -5.587935447692871e-09 0.0 0.0 0.0 1.0 0.8912754058837891 0.4528215229511261 0.02409932389855385 -3.2654497772455215e-07 -0.45345044136047363 0.8903771638870239 0.04014023765921593 1.999999761581421 -0.003281119279563427 -0.04670385271310806 0.9989033341407776 1.1175870895385742e-08 0.0 0.0 0.0 1.0 0.8494575619697571 0.5267446041107178 0.031019873917102814 4.7672074288129807e-07 -0.5276526808738708 0.8482257723808289 0.045782655477523804 2.000000238418579 -0.002196100540459156 -0.0552581250667572 0.9984697103500366 0.0 0.0 0.0 0.0 1.0 0.8163167238235474 0.5764156579971313 0.037040553987026215 -3.995373845100403e-07 -0.5776014924049377 0.8148404955863953 0.0491071380674839 2.000000238418579 -0.00187602115329355 -0.06148165464401245 0.9981064200401306 -1.4901161193847656e-08 0.0 0.0 0.0 1.0 0.8055055141448975 0.5911691188812256 0.040987249463796616 2.2811582311987877e-07 -0.592576265335083 0.8039996027946472 0.04937676340341568 2.000000238418579 -0.0037637173663824797 -0.06406132876873016 0.9979389309883118 -1.4901161193847656e-08 0.0 0.0 0.0 1.0 0.8542895317077637 0.5183570981025696 0.038668498396873474 -2.1746382117271423e-07 -0.5196048021316528 0.8536322116851807 0.03637533634901047 2.000000476837158 -0.014153261668980122 -0.05116738751530647 0.9985899329185486 -1.862645149230957e-09 0.0 0.0 0.0 1.0 0.9508073925971985 0.30806994438171387 0.03252604231238365 -3.5390257835388184e-08 -0.3083057403564453 0.9512842297554016 0.002376377582550049 1.9999996423721313 -0.030209438875317574 -0.012287446297705173 0.9994679689407349 2.9802322387695312e-08 0.0 0.0 0.0 1.0 0.9992246031761169 0.01764739491045475 0.03519628569483757 3.296881914138794e-07 -0.016185099259018898 0.999011218547821 -0.041407715529203415 1.999999761581421 -0.03589221462607384 0.04080595448613167 0.9985222220420837 1.4901161193847656e-08 0.0 0.0 0.0 1.0 0.9651545882225037 -0.25707417726516724 0.04888274520635605 1.1548399925231934e-07 0.26034310460090637 0.9621813893318176 -0.08017843961715698 2.000000476837158 -0.026422247290611267 0.09011086821556091 0.9955812096595764 1.4901161193847656e-08 0.0 0.0 0.0 1.0 0.9240012168884277 -0.37787526845932007 0.05858353525400162 3.725290298461914e-09 0.38199254870414734 0.919124186038971 -0.09639789164066315 2.000000476837158 -0.01741916500031948 0.11145025491714478 0.9936173558235168 1.4901161193847656e-08 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-17-transform-output-array" count="15" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-17-interpolation-output">
<Name_array id="id-anim-17-interpolation-output-array" count="15"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-17-interpolation-output-array" count="15" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-17-sampler">
<input semantic="INPUT" source="#id-anim-17-input"/>
<input semantic="OUTPUT" source="#id-anim-17-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-17-interpolation-output"/>
</sampler>
<channel source="#id-anim-17-sampler" target="id-bone-6/transform"/>
</animation>
<animation id="id-anim-18">
<source id="id-anim-18-input">
<float_array id="id-anim-18-input-array" count="15"> 0.0 0.041666666666666664 0.08333333333333334 0.125 0.16666666666666666 0.20833333333333334 0.24999999999999997 0.29166666666666663 0.3333333333333333 0.37499999999999994 0.41666666666666663 0.4583333333333333 0.49999999999999994 0.5416666666666666 0.5833333333333334</float_array>
<technique_common>
<accessor source="#id-anim-18-input-array" count="15" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-18-transform-output">
<float_array id="id-anim-18-transform-output-array" count="240"> 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 0.0 0.0 1.0 7.549790126404332e-08 -1.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 0.0 0.0 1.0 7.549790126404332e-08 -0.9340413808822632 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 1.7763568394002505e-15 0.0 1.0 7.549790126404332e-08 -0.6646065711975098 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 -7.105427357601002e-15 0.0 1.0 7.549790126404332e-08 -0.3219858407974243 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 -7.105427357601002e-15 0.0 1.0 7.549790126404332e-08 0.03573417663574219 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 -1.4210854715202004e-14 0.0 1.0 7.549790126404332e-08 0.41436636447906494 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 -1.4210854715202004e-14 0.0 1.0 7.549790126404332e-08 0.7831066846847534 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 -2.842170943040401e-14 0.0 1.0 7.549790126404332e-08 1.107043743133545 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 0.0 0.0 1.0 7.549790126404332e-08 1.336852788925171 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 0.0 0.0 1.0 7.549790126404332e-08 1.407799482345581 0.0 0.0 0.0 1.0 0.9968345761299133 0.07932797819375992 0.005282554775476456 0.0 0.004770305939018726 0.006645471788942814 -0.999966561794281 -1.4210854715202004e-14 -0.07936043292284012 0.9968264102935791 0.006246017292141914 1.193772792816162 0.0 0.0 0.0 1.0 0.9586331844329834 0.2838432192802429 0.021341901272535324 0.0 0.014647725969552994 0.02568591572344303 -0.9995627403259277 0.0 -0.2842673063278198 0.958526611328125 0.02046571485698223 0.6453161239624023 0.0 0.0 0.0 1.0 0.8506482243537903 0.5237787365913391 0.04531409963965416 0.0 0.02114533632993698 0.05203593522310257 -0.998421311378479 -7.105427357601002e-15 -0.5253098607063293 0.8502635359764099 0.033188797533512115 -0.037257254123687744 0.0 0.0 0.0 1.0 0.6941251158714294 0.7164199352264404 0.0702333077788353 0.0 0.020735301077365875 0.07762672752141953 -0.9967668652534485 3.552713678800501e-15 -0.7195556163787842 0.6933372616767883 0.03902747482061386 -0.6890351176261902 0.0 0.0 0.0 1.0 0.6061614155769348 0.7910918593406677 0.08210963010787964 0.0 0.018376974388957024 0.08927963674068451 -0.9958370327949524 0.0 -0.7951292991638184 0.6051469445228577 0.039580002427101135 -1.0 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-18-transform-output-array" count="15" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-18-interpolation-output">
<Name_array id="id-anim-18-interpolation-output-array" count="15"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-18-interpolation-output-array" count="15" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-18-sampler">
<input semantic="INPUT" source="#id-anim-18-input"/>
<input semantic="OUTPUT" source="#id-anim-18-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-18-interpolation-output"/>
</sampler>
<channel source="#id-anim-18-sampler" target="id-bone-3/transform"/>
</animation>
<animation id="id-anim-19">
<source id="id-anim-19-input">
<float_array id="id-anim-19-input-array" count="21"> 0.0 0.041666666666666664 0.08333333333333333 0.125 0.16666666666666666 0.20833333333333331 0.25 0.29166666666666663 0.3333333333333333 0.375 0.41666666666666663 0.4583333333333333 0.5 0.5416666666666666 0.5833333333333333 0.625 0.6666666666666666 0.7083333333333333 0.75 0.7916666666666666 0.8333333333333333</float_array>
<technique_common>
<accessor source="#id-anim-19-input-array" count="21" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-19-transform-output">
<float_array id="id-anim-19-transform-output-array" count="336"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-19-transform-output-array" count="21" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-19-interpolation-output">
<Name_array id="id-anim-19-interpolation-output-array" count="21"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-19-interpolation-output-array" count="21" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-19-sampler">
<input semantic="INPUT" source="#id-anim-19-input"/>
<input semantic="OUTPUT" source="#id-anim-19-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-19-interpolation-output"/>
</sampler>
<channel source="#id-anim-19-sampler" target="Armature/transform"/>
</animation>
<animation id="id-anim-20">
<source id="id-anim-20-input">
<float_array id="id-anim-20-input-array" count="21"> 0.0 0.041666666666666664 0.08333333333333333 0.125 0.16666666666666666 0.20833333333333331 0.25 0.29166666666666663 0.3333333333333333 0.375 0.41666666666666663 0.4583333333333333 0.5 0.5416666666666666 0.5833333333333333 0.625 0.6666666666666666 0.7083333333333333 0.75 0.7916666666666666 0.8333333333333333</float_array>
<technique_common>
<accessor source="#id-anim-20-input-array" count="21" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-20-transform-output">
<float_array id="id-anim-20-transform-output-array" count="336"> 1.0 3.019916050561733e-07 -1.6940658945086007e-21 -3.3881317890172014e-21 -2.8421682325349695e-14 7.549790126404332e-08 1.0 2.0 3.019916050561733e-07 -1.0 7.549790126404332e-08 -2.8421722982931164e-14 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 2.740863092043355e-16 4.542739340078483e-15 -2.787898662197797e-14 7.549790126404332e-08 1.0 1.999999761581421 2.980232238769531e-07 -1.0 7.549790126404332e-08 -6.111760132276184e-14 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 -4.440892098500626e-16 -3.693798874626966e-15 -2.509833839240208e-14 7.549790836947068e-08 1.0 2.0 2.980232238769531e-07 -1.0 7.549790836947068e-08 1.9710300828545274e-14 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 0.0 -2.5217366850282044e-14 -2.7558835272970157e-14 7.549790126404332e-08 1.0 1.999999761581421 2.980232238769531e-07 -1.0 7.549790126404332e-08 1.2755667358412166e-14 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 -1.7763568394002505e-15 -5.464224111704184e-14 -2.4811610963492922e-14 7.549790126404332e-08 1.0 2.0 2.980232238769531e-07 -1.0 7.549790126404332e-08 -8.798196444667356e-15 0.0 0.0 0.0 1.0 1.0 3.0199157663446385e-07 -7.111923615526905e-22 -2.0328790734103208e-20 -2.84216806312838e-14 7.549789415861596e-08 1.0 1.999999761581421 3.019916050561733e-07 -1.0 7.549789415861596e-08 -1.4210912313442417e-14 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 -4.440892098500626e-16 1.5987211554602254e-14 -3.019806626980426e-14 7.549790126404332e-08 1.0 1.999999761581421 2.980232238769531e-07 -1.0 7.549790836947068e-08 -3.552713678800501e-15 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 -8.881784197001252e-16 -4.440892098500626e-15 -2.842170943040401e-14 7.549789415861596e-08 1.0 2.000000238418579 2.980232238769531e-07 -0.9999999403953552 7.549789415861596e-08 2.1316282072803006e-14 0.0 0.0 0.0 1.0 1.0000001192092896 2.980232238769531e-07 -1.7763568394002505e-15 1.3322676295501878e-14 -2.842170943040401e-14 7.549790836947068e-08 1.0 1.999999761581421 2.980232238769531e-07 -1.0000001192092896 7.549790126404332e-08 -1.0658141036401503e-14 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 -4.440892098500626e-16 1.3322676295501878e-15 -2.7977620220553945e-14 7.549790126404332e-08 1.0 2.000000238418579 2.980232238769531e-07 -1.0 7.549789415861596e-08 -2.3092638912203256e-14 0.0 0.0 0.0 1.0 1.0 3.019916050561733e-07 -7.9063885886186065e-22 -1.0164395367051604e-20 -2.8421682325349695e-14 7.549790126404332e-08 1.0 2.0 3.019916050561733e-07 -1.0 7.549790126404332e-08 2.842169587787685e-14 0.0 0.0 0.0 1.0 1.0 3.2782554626464844e-07 1.3322676295501878e-15 5.6066262743570405e-15 -2.693678613496786e-14 7.549790836947068e-08 1.0 2.0 3.2782554626464844e-07 -1.0 7.549789415861596e-08 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 2.980232238769531e-07 -1.6653345369377348e-15 9.325873406851315e-15 -2.3314683517128287e-14 7.549790836947068e-08 1.0 2.000000238418579 2.980232238769531e-07 -1.0000001192092896 7.549789415861596e-08 -7.105427357601002e-14 0.0 0.0 0.0 1.0 1.0 2.682209014892578e-07 1.3322676295501878e-15 -5.329070518200751e-15 -3.019806626980426e-14 7.549791547489804e-08 1.0 1.999999761581421 2.682209014892578e-07 -1.0000001192092896 7.549790126404332e-08 -3.552713678800501e-14 0.0 0.0 0.0 1.0 0.9999999403953552 2.980232238769531e-07 -3.1086244689504383e-15 3.552713678800501e-15 -2.842170943040401e-14 7.549789415861596e-08 1.0 2.0 2.980232238769531e-07 -0.9999999403953552 7.549789415861596e-08 -4.263256414560601e-14 0.0 0.0 0.0 1.0 1.0 3.0199157663446385e-07 -2.117582368135751e-21 -1.6940658945086007e-21 -2.84216806312838e-14 7.549789415861596e-08 1.0 1.999999761581421 3.0199157663446385e-07 -1.0 7.549789415861596e-08 -2.842170265414043e-14 0.0 0.0 0.0 1.0 0.9999999403953552 2.980232238769531e-07 -1.7763568394002505e-15 -1.4210854715202004e-14 -3.108624468950438e-14 7.549789415861596e-08 1.0 2.000000238418579 2.980232238769531e-07 -0.9999999403953552 7.549789415861596e-08 1.2434497875801753e-14 0.0 0.0 0.0 1.0 1.0000001192092896 2.980232238769531e-07 2.6645352591003757e-15 2.1316282072803006e-14 -3.197442310920451e-14 7.549790836947068e-08 1.0 2.0 2.980232238769531e-07 -1.0000001192092896 7.549790126404332e-08 -7.105427357601002e-14 0.0 0.0 0.0 1.0 0.9999999403953552 2.980232238769531e-07 4.884981308350689e-15 0.0 -2.4868995751603507e-14 7.549790126404332e-08 1.0 2.000000238418579 2.980232238769531e-07 -0.9999999403953552 7.549790126404332e-08 0.0 0.0 0.0 0.0 1.0 1.0 2.905726432800293e-07 -2.831068712794149e-15 7.105427357601002e-14 -2.9753977059954195e-14 7.549790836947068e-08 1.0 1.999999761581421 2.905726432800293e-07 -1.0 7.549790126404332e-08 2.1316282072803006e-14 0.0 0.0 0.0 1.0 1.0 3.019916050561733e-07 -4.5171351782337e-22 8.470329472543003e-21 -2.8421682325349695e-14 7.549790126404332e-08 1.0 2.0 3.019916050561733e-07 -1.0 7.549790126404332e-08 -4.658681209898652e-21 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-20-transform-output-array" count="21" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-20-interpolation-output">
<Name_array id="id-anim-20-interpolation-output-array" count="21"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-20-interpolation-output-array" count="21" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-20-sampler">
<input semantic="INPUT" source="#id-anim-20-input"/>
<input semantic="OUTPUT" source="#id-anim-20-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-20-interpolation-output"/>
</sampler>
<channel source="#id-anim-20-sampler" target="id-bone-7/transform"/>
</animation>
<animation id="id-anim-21">
<source id="id-anim-21-input">
<float_array id="id-anim-21-input-array" count="21"> 0.0 0.041666666666666664 0.08333333333333333 0.125 0.16666666666666666 0.20833333333333331 0.25 0.29166666666666663 0.3333333333333333 0.375 0.41666666666666663 0.4583333333333333 0.5 0.5416666666666666 0.5833333333333333 0.625 0.6666666666666666 0.7083333333333333 0.75 0.7916666666666666 0.8333333333333333</float_array>
<technique_common>
<accessor source="#id-anim-21-input-array" count="21" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-21-transform-output">
<float_array id="id-anim-21-transform-output-array" count="336"> 1.0 0.0 0.0 0.0 0.0 1.0 0.0 2.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 -5.342710077992151e-16 0.0 8.862057858450884e-16 1.0 -7.0636156937421615e-15 2.0 -5.342710607387743e-16 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0000001192092896 0.0 -1.9771030126248092e-15 0.0 3.552713678800501e-15 1.0 -7.105427357601002e-15 2.0 -1.9771030126248092e-15 0.0 1.0000001192092896 0.0 0.0 0.0 0.0 1.0 1.0 0.0 -2.8464326199079213e-15 0.0 0.0 1.0 0.0 2.0 -2.8464326199079213e-15 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 -1.7659080527211582e-15 0.0 -5.825547445289072e-16 1.0 9.824089292580348e-17 2.0 -1.7659079468420398e-15 -1.7763568394002505e-15 1.0 -3.552713678800501e-15 0.0 0.0 0.0 1.0 1.0 8.470329472543003e-22 3.070531895223506e-22 1.6940658945086007e-21 0.0 1.0 7.105425240018634e-15 2.0 5.364448530829927e-22 -7.105429051666896e-15 1.0 -1.4210858103333793e-14 0.0 0.0 0.0 1.0 0.9999999403953552 -8.881784197001252e-16 -5.579573312571159e-16 -1.7763568394002505e-15 -8.881784197001252e-16 1.0 3.1086244689504383e-15 2.0 -5.579571194988791e-16 -3.774758283725532e-15 0.9999999403953552 -7.549516567451064e-15 0.0 0.0 0.0 1.0 0.9999999403953552 8.881784197001252e-16 -6.462154115039354e-16 1.7763568394002505e-15 1.7763568394002505e-15 1.0 1.7763568394002505e-15 2.0 -6.462157291412906e-16 8.881784197001252e-16 0.9999999403953552 1.7763568394002505e-15 0.0 0.0 0.0 1.0 1.0 8.881784197001252e-16 2.9802322387695312e-08 1.7763568394002505e-15 1.7763568394002505e-15 1.0 -3.552713678800501e-15 2.0 -2.9802322387695312e-08 -5.329070518200751e-15 1.0 -1.0658141036401503e-14 0.0 0.0 0.0 1.0 1.0 -8.881784197001252e-16 -2.101767204219329e-16 -1.7763568394002505e-15 0.0 1.0 4.440892098500626e-16 2.0 -2.101765748381451e-16 -4.440892098500626e-16 1.0 -8.881784197001252e-16 0.0 0.0 0.0 1.0 1.0 0.0 -3.81167065240496e-36 0.0 0.0 1.0 0.0 2.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 2.7755575615628914e-17 -1.699426852058557e-17 5.551115123125783e-17 0.0 1.0 -6.661338147750939e-15 2.0 -1.699427182930802e-17 7.549516567451064e-15 1.0 1.509903313490213e-14 0.0 0.0 0.0 1.0 1.0 3.9968028886505635e-15 -2.9802322387695312e-08 7.993605777301127e-15 3.552713678800501e-15 1.0 -7.105427357601002e-15 2.0 2.9802322387695312e-08 -5.329070518200751e-15 1.0 -1.0658141036401503e-14 0.0 0.0 0.0 1.0 1.0 -1.7763568394002505e-15 -6.745567104025907e-16 -3.552713678800501e-15 0.0 1.0 -7.105427357601002e-15 2.0 -6.745576103750971e-16 -3.552713678800501e-15 1.0000001192092896 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 -1.7763568394002505e-15 -1.7359223452345271e-15 -3.552713678800501e-15 -1.7763568394002505e-15 1.0 -1.7763568394002505e-15 2.0 -1.7359214982015799e-15 -2.6645352591003757e-15 1.0 -5.329070518200751e-15 0.0 0.0 0.0 1.0 1.0 -8.470329472543003e-22 -3.0705321476589955e-22 -1.6940658945086007e-21 8.470329472543003e-22 1.0 7.105425240018634e-15 2.0 -5.364448025958947e-22 -7.105429051666896e-15 1.0 -1.4210858103333793e-14 0.0 0.0 0.0 1.0 0.9999999403953552 -1.7763568394002505e-15 -1.4652425907858116e-15 -3.552713678800501e-15 8.881784197001252e-16 1.0 1.7763568394002505e-15 2.0 -1.4652424849066932e-15 2.220446049250313e-15 0.9999999403953552 4.440892098500626e-15 0.0 0.0 0.0 1.0 1.0 1.7763568394002505e-15 -4.434845130290178e-15 3.552713678800501e-15 1.7763568394002505e-15 1.0 1.7763568394002505e-15 2.0 -4.434845553806651e-15 -7.105427357601002e-15 1.0 -1.4210854715202004e-14 0.0 0.0 0.0 1.0 1.0 0.0 2.9802315282267955e-08 0.0 -1.7763568394002505e-15 1.0 0.0 2.0 -2.980232949312267e-08 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 -8.881784197001252e-16 -8.063171746226176e-15 -1.7763568394002505e-15 -1.3322676295501878e-15 1.0 -6.217248937900877e-15 2.0 -8.063172593259123e-15 7.105427357601002e-15 1.0 1.4210854715202004e-14 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 2.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-21-transform-output-array" count="21" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-21-interpolation-output">
<Name_array id="id-anim-21-interpolation-output-array" count="21"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-21-interpolation-output-array" count="21" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-21-sampler">
<input semantic="INPUT" source="#id-anim-21-input"/>
<input semantic="OUTPUT" source="#id-anim-21-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-21-interpolation-output"/>
</sampler>
<channel source="#id-anim-21-sampler" target="id-bone-4/transform"/>
</animation>
<animation id="id-anim-22">
<source id="id-anim-22-input">
<float_array id="id-anim-22-input-array" count="21"> 0.0 0.041666666666666664 0.08333333333333333 0.125 0.16666666666666666 0.20833333333333331 0.25 0.29166666666666663 0.3333333333333333 0.375 0.41666666666666663 0.4583333333333333 0.5 0.5416666666666666 0.5833333333333333 0.625 0.6666666666666666 0.7083333333333333 0.75 0.7916666666666666 0.8333333333333333</float_array>
<technique_common>
<accessor source="#id-anim-22-input-array" count="21" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-22-transform-output">
<float_array id="id-anim-22-transform-output-array" count="336"> 1.0 -2.2799733224976824e-14 3.019916050561733e-07 0.0 2.2799733224976824e-14 1.0 0.0 2.0 -3.019916050561733e-07 0.0 1.0 7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 -2.259762777563016e-14 2.980232238769531e-07 -4.440892098500626e-16 2.353475622935211e-14 1.0 -7.0636156937421615e-15 2.0 -2.980232238769531e-07 -2.137084242955097e-15 1.0 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 -2.1386826364782133e-14 2.980232238769531e-07 -3.552713678800501e-15 2.4868995751603507e-14 1.0 -7.105427357601002e-15 2.0 -2.980232238769531e-07 -8.02984692898235e-16 1.0 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 -2.149046931620817e-14 2.980232238769531e-07 -7.105427357601002e-15 2.1316282072803006e-14 1.0 0.0 2.0 -2.980232238769531e-07 -7.275902902631297e-16 1.0 -3.552713678800501e-15 0.0 0.0 0.0 1.0 1.0 -2.3768408573786315e-14 3.2782554626464844e-07 7.105427357601002e-15 2.0733728387065282e-14 1.0 1.8745974146886987e-15 2.0 -3.2782554626464844e-07 -1.7345621162003552e-15 1.0 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 -2.279973153091093e-14 3.019916050561733e-07 3.3881317890172014e-21 2.2799733224976824e-14 1.0 7.1054197343044766e-15 2.0 -3.0199157663446385e-07 -7.105432439798685e-15 1.0 -2.1316288849066584e-14 0.0 0.0 0.0 1.0 1.0 -2.398081733190338e-14 2.980232238769531e-07 -2.6645352591003757e-15 2.220446049250313e-14 1.0 0.0 2.0 -2.980232238769531e-07 -3.1086244689504383e-15 1.0 -1.509903313490213e-14 0.0 0.0 0.0 1.0 1.0 -2.398081733190338e-14 2.980232238769531e-07 2.6645352591003757e-15 2.220446049250313e-14 1.0 4.440892098500626e-15 2.0 -2.980232238769531e-07 1.7763568394002505e-15 1.0 0.0 0.0 0.0 0.0 1.0 1.0000001192092896 -2.042810365310288e-14 2.980232238769531e-07 2.6645352591003757e-15 2.3092638912203256e-14 1.0 -3.552713678800501e-15 2.0 -2.980232238769531e-07 -3.552713678800501e-15 1.0000001192092896 -1.7763568394002505e-14 0.0 0.0 0.0 1.0 0.9999999403953552 -2.220446049250313e-14 2.980232238769531e-07 -3.552713678800501e-15 2.1316282072803006e-14 1.0 0.0 2.0 -2.980232238769531e-07 8.881784197001252e-16 0.9999999403953552 -5.329070518200751e-15 0.0 0.0 0.0 1.0 1.0 -2.2799733224976824e-14 3.019916050561733e-07 0.0 2.2799733224976824e-14 1.0 0.0 2.0 -3.019916050561733e-07 0.0 1.0 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0000001192092896 -2.1288526497187377e-14 2.980232238769531e-07 1.3877787807814457e-16 2.4424906541753444e-14 1.0 -6.217248937900877e-15 2.0 -2.980232238769531e-07 8.43769498715119e-15 1.0000001192092896 3.730349362740526e-14 0.0 0.0 0.0 1.0 1.0 -1.7319479184152442e-14 2.980232238769531e-07 1.5987211554602254e-14 2.3092638912203256e-14 1.0 -3.552713678800501e-15 2.0 -2.980232238769531e-07 -1.7763568394002505e-15 1.0000001192092896 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 -2.3092638912203256e-14 3.2782554626464844e-07 -7.105427357601002e-15 2.042810365310288e-14 1.0 -3.552713678800501e-15 2.0 -3.2782554626464844e-07 -3.552713678800501e-15 1.0000001192092896 -2.1316282072803006e-14 0.0 0.0 0.0 1.0 0.9999999403953552 -2.1316282072803006e-14 2.980232238769531e-07 -7.105427357601002e-15 1.7763568394002505e-14 1.0 -1.7763568394002505e-15 2.0 -2.980232238769531e-07 -3.552713678800501e-15 0.9999999403953552 -3.552713678800501e-15 0.0 0.0 0.0 1.0 1.0 -2.279973491904272e-14 3.019916050561733e-07 -3.3881317890172014e-21 2.279973153091093e-14 1.0 7.105429898699844e-15 2.0 -3.019916050561733e-07 -7.105426087051581e-15 1.0 -2.8421716206667585e-14 0.0 0.0 0.0 1.0 0.9999999403953552 -2.5757174171303632e-14 3.2782554626464844e-07 -7.105427357601002e-15 2.398081733190338e-14 1.0 -1.7763568394002505e-15 2.0 -3.2782554626464844e-07 2.220446049250313e-15 0.9999999403953552 1.5987211554602254e-14 0.0 0.0 0.0 1.0 1.0000001192092896 -1.7763568394002505e-14 2.980232238769531e-07 1.0658141036401503e-14 2.1316282072803006e-14 1.0 1.7763568394002505e-15 2.0 -2.980232238769531e-07 -5.329070518200751e-15 1.0000001192092896 -2.1316282072803006e-14 0.0 0.0 0.0 1.0 1.0 -1.7763568394002505e-14 2.980232238769531e-07 7.105427357601002e-15 1.9539925233402755e-14 1.0 0.0 2.0 -2.980232238769531e-07 0.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 -2.220446049250313e-14 2.980232238769531e-07 -3.552713678800501e-15 1.9984014443252818e-14 1.0 -2.6645352591003757e-15 2.0 -2.980232238769531e-07 8.881784197001252e-15 1.0 2.1316282072803006e-14 0.0 0.0 0.0 1.0 1.0 -2.2799733224976824e-14 3.019916050561733e-07 -4.235164736271502e-22 2.2799733224976824e-14 1.0 1.522012327097571e-21 2.0 -3.019916050561733e-07 0.0 1.0 0.0 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-22-transform-output-array" count="21" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-22-interpolation-output">
<Name_array id="id-anim-22-interpolation-output-array" count="21"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-22-interpolation-output-array" count="21" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-22-sampler">
<input semantic="INPUT" source="#id-anim-22-input"/>
<input semantic="OUTPUT" source="#id-anim-22-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-22-interpolation-output"/>
</sampler>
<channel source="#id-anim-22-sampler" target="id-bone-5/transform"/>
</animation>
<animation id="id-anim-23">
<source id="id-anim-23-input">
<float_array id="id-anim-23-input-array" count="21"> 0.0 0.041666666666666664 0.08333333333333333 0.125 0.16666666666666666 0.20833333333333331 0.25 0.29166666666666663 0.3333333333333333 0.375 0.41666666666666663 0.4583333333333333 0.5 0.5416666666666666 0.5833333333333333 0.625 0.6666666666666666 0.7083333333333333 0.75 0.7916666666666666 0.8333333333333333</float_array>
<technique_common>
<accessor source="#id-anim-23-input-array" count="21" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-23-transform-output">
<float_array id="id-anim-23-transform-output-array" count="336"> 1.0 2.2799733224976824e-14 -3.019916050561733e-07 -3.3881317890172014e-21 -2.2799733224976824e-14 1.0 0.0 2.0 3.019916050561733e-07 0.0 1.0 -2.8421722982931164e-14 0.0 0.0 0.0 1.0 1.0 2.2648549702353193e-14 -2.980232238769531e-07 4.542739340078483e-15 -2.2105826893927157e-14 1.0 -2.0905738755796002e-15 1.999999761581421 2.980232238769531e-07 0.0 1.0 -6.111760132276184e-14 0.0 0.0 0.0 1.0 1.0 2.309263721813736e-14 -2.980232238769531e-07 -3.693798874626966e-15 -1.976926787420133e-14 1.0 -7.972451129443451e-15 2.0 2.980232238769531e-07 -6.352747104407253e-22 1.0 1.9710300828545274e-14 0.0 0.0 0.0 1.0 1.0 2.1316276990605322e-14 -2.980232238769531e-07 -2.5217366850282044e-14 -2.0453407915369155e-14 1.0 3.6245386845958766e-16 1.999999761581421 2.980232238769531e-07 -4.910144116114772e-21 1.0 1.2755667358412166e-14 0.0 0.0 0.0 1.0 1.0 1.4210852174103162e-14 -2.980232238769531e-07 -5.464224111704184e-14 -1.770618360589192e-14 1.0 -2.963268533003917e-15 2.0 2.980232238769531e-07 -1.776363192147355e-15 1.0 -8.798196444667356e-15 0.0 0.0 0.0 1.0 1.0 2.279973491904272e-14 -3.0199157663446385e-07 -2.0328790734103208e-20 -2.279973153091093e-14 1.0 7.105421851886845e-15 1.999999761581421 3.019916050561733e-07 -7.105433286831633e-15 1.0 -1.4210912313442417e-14 0.0 0.0 0.0 1.0 1.0 2.4868995751603507e-14 -2.980232238769531e-07 1.5987211554602254e-14 -2.4868995751603507e-14 1.0 3.3306690738754696e-15 1.999999761581421 2.980232238769531e-07 4.440892098500626e-16 1.0 -3.552713678800501e-15 0.0 0.0 0.0 1.0 1.0 2.220446049250313e-14 -2.980232238769531e-07 -4.440892098500626e-15 -2.3092638912203256e-14 1.0 8.881784197001252e-16 2.000000238418579 2.980232238769531e-07 -3.552713678800501e-15 1.0 2.1316282072803006e-14 0.0 0.0 0.0 1.0 1.0000001192092896 2.220446049250313e-14 -2.980232238769531e-07 1.3322676295501878e-14 -2.3092638912203256e-14 1.0 0.0 1.999999761581421 2.980232238769531e-07 -1.7763568394002505e-15 1.0000001192092896 -1.0658141036401503e-14 0.0 0.0 0.0 1.0 1.0 2.0872192862952943e-14 -2.980232238769531e-07 1.3322676295501878e-15 -2.220446049250313e-14 1.0 3.552713678800501e-15 2.000000238418579 2.980232238769531e-07 -3.1086244689504383e-15 1.0 -2.3092638912203256e-14 0.0 0.0 0.0 1.0 1.0 2.2799733224976824e-14 -3.019916050561733e-07 -1.0164395367051604e-20 -2.2799733224976824e-14 1.0 0.0 2.0 3.019916050561733e-07 0.0 1.0 2.842169587787685e-14 0.0 0.0 0.0 1.0 1.0 2.3148150063434514e-14 -3.2782554626464844e-07 5.6066262743570405e-15 -2.1316282072803006e-14 1.0 -5.329070518200751e-15 2.0 3.2782554626464844e-07 -5.329070518200751e-15 1.0 -7.105427357601002e-15 0.0 0.0 0.0 1.0 1.0 2.1760371282653068e-14 -2.980232238769531e-07 9.325873406851315e-15 -1.7763568394002505e-14 1.0 -7.105427357601002e-15 2.000000238418579 2.980232238769531e-07 -8.881784197001252e-15 1.0000001192092896 -7.105427357601002e-14 0.0 0.0 0.0 1.0 1.0 2.3092638912203256e-14 -2.682209014892578e-07 -5.329070518200751e-15 -2.4868995751603507e-14 1.0 -1.4210854715202004e-14 1.999999761581421 2.682209014892578e-07 0.0 1.0000001192092896 -3.552713678800501e-14 0.0 0.0 0.0 1.0 0.9999999403953552 2.1316282072803006e-14 -2.980232238769531e-07 3.552713678800501e-15 -2.3092638912203256e-14 1.0 4.440892098500626e-15 2.0 2.980232238769531e-07 -4.440892098500626e-15 0.9999999403953552 -4.263256414560601e-14 0.0 0.0 0.0 1.0 1.0 2.2799733224976824e-14 -3.019916050561733e-07 -1.6940658945086007e-21 -2.2799733224976824e-14 1.0 7.105428204633949e-15 1.999999761581421 3.0199157663446385e-07 -7.10542481650216e-15 1.0 -2.842170265414043e-14 0.0 0.0 0.0 1.0 0.9999999403953552 1.9539925233402755e-14 -2.980232238769531e-07 -1.4210854715202004e-14 -2.5757174171303632e-14 1.0 9.325873406851315e-15 2.000000238418579 2.980232238769531e-07 -1.7763568394002505e-15 0.9999999403953552 1.2434497875801753e-14 0.0 0.0 0.0 1.0 1.0000001192092896 2.842170943040401e-14 -2.980232238769531e-07 2.1316282072803006e-14 -2.4868995751603507e-14 1.0 -3.552713678800501e-15 2.0 2.980232238769531e-07 -1.7763568394002505e-15 1.0000001192092896 -7.105427357601002e-14 0.0 0.0 0.0 1.0 0.9999999403953552 2.3092638912203256e-14 -2.980232238769531e-07 0.0 -1.7763568394002505e-14 1.0 0.0 2.000000238418579 2.980232238769531e-07 0.0 0.9999999403953552 0.0 0.0 0.0 0.0 1.0 1.0 1.9984014443252818e-14 -2.905726432800293e-07 7.105427357601002e-14 -2.2648549702353193e-14 1.0 -4.440892098500626e-15 1.999999761581421 2.905726432800293e-07 3.552713678800501e-15 1.0 2.1316282072803006e-14 0.0 0.0 0.0 1.0 1.0 2.2799733224976824e-14 -3.019916050561733e-07 8.470329472543003e-21 -2.2799733224976824e-14 1.0 0.0 2.0 3.019916050561733e-07 1.522012327097571e-21 1.0 -4.658681209898652e-21 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-23-transform-output-array" count="21" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-23-interpolation-output">
<Name_array id="id-anim-23-interpolation-output-array" count="21"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-23-interpolation-output-array" count="21" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-23-sampler">
<input semantic="INPUT" source="#id-anim-23-input"/>
<input semantic="OUTPUT" source="#id-anim-23-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-23-interpolation-output"/>
</sampler>
<channel source="#id-anim-23-sampler" target="id-bone-6/transform"/>
</animation>
<animation id="id-anim-24">
<source id="id-anim-24-input">
<float_array id="id-anim-24-input-array" count="21"> 0.0 0.041666666666666664 0.08333333333333333 0.125 0.16666666666666666 0.20833333333333331 0.25 0.29166666666666663 0.3333333333333333 0.375 0.41666666666666663 0.4583333333333333 0.5 0.5416666666666666 0.5833333333333333 0.625 0.6666666666666666 0.7083333333333333 0.75 0.7916666666666666 0.8333333333333333</float_array>
<technique_common>
<accessor source="#id-anim-24-input-array" count="21" stride="1">
<param name="TIME" type="float"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-24-transform-output">
<float_array id="id-anim-24-transform-output-array" count="336"> 1.0 0.0 0.0 0.0 0.0 7.549790126404332e-08 -1.0 0.0 0.0 1.0 7.549790126404332e-08 -1.0 0.0 0.0 0.0 1.0 0.9955579042434692 0.0 0.0941510796546936 0.0 0.0941510796546936 7.549790126404332e-08 -0.9955579042434692 0.0 -7.108209132411503e-09 1.0 7.516253219819191e-08 -1.0 0.0 0.0 0.0 1.0 0.9274256825447083 0.0 0.37400758266448975 0.0 0.37400758266448975 7.549790126404332e-08 -0.9274256825447083 0.0 -2.8236787130708763e-08 1.0 7.001869306577646e-08 -1.0 0.0 0.0 0.0 1.0 0.6892805695533752 0.0 0.7244945168495178 0.0 0.7244945168495178 7.549790126404332e-08 -0.6892805695533752 0.0 -5.469781427791531e-08 1.0 5.2039236919654286e-08 -1.0 0.0 0.0 0.0 1.0 0.327949196100235 0.0 0.9446954131126404 0.0 0.9446954131126404 7.549790126404332e-08 -0.327949196100235 0.0 -7.132251766961417e-08 1.0 2.4759476247027123e-08 -1.0 0.0 0.0 0.0 1.0 -1.3435885648505064e-07 -7.549791547489804e-08 1.0000001192092896 0.0 1.0000001192092896 -1.4210854715202004e-14 1.3435885648505064e-07 0.0 7.105427357601002e-15 1.0 7.549790836947068e-08 -1.0 0.0 0.0 0.0 1.0 -0.2926259934902191 -6.342676073245457e-08 0.9562267661094666 0.0 0.9562267661094666 -1.0242303005725262e-08 0.2926259934902191 0.0 -8.766356529577024e-09 1.0 6.364755478216466e-08 -1.0 0.0 0.0 0.0 1.0 -0.580210268497467 -4.877818682302859e-08 0.8144668340682983 0.0 0.8144668340682983 -1.914044389650371e-08 0.580210268497467 0.0 -1.2712352059907062e-08 1.0 5.0833687481599554e-08 -1.0 0.0 0.0 0.0 1.0 -0.8144670128822327 -3.242801938085904e-08 0.5802100896835327 0.0 0.5802100896835327 -2.5912903822700173e-08 0.8144670128822327 0.0 -1.1376624087233722e-08 1.0 3.9920251992953126e-08 -1.0 0.0 0.0 0.0 1.0 -0.9562267661094666 -1.5777985140630335e-08 0.29262611269950867 0.0 0.29262611269950867 -2.997906989321564e-08 0.9562267661094666 0.0 -6.314671452400944e-09 1.0 3.3283853895227367e-08 -1.0 0.0 0.0 0.0 1.0 -1.0 4.303330901289246e-22 -5.699934153277153e-15 0.0 -5.699934153277153e-15 -7.549791547489804e-08 1.0 0.0 0.0 1.0 7.549791547489804e-08 -1.0 0.0 0.0 0.0 1.0 -0.9562270045280457 2.2313441760957176e-08 -0.29262617230415344 0.0 -0.29262617230415344 -7.366906373817983e-08 0.9562270045280457 0.0 -2.2077983885537833e-10 1.0 7.697383352933684e-08 -1.0 0.0 0.0 0.0 1.0 -0.8144670128822327 4.5860144126663727e-08 -0.5802100896835327 0.0 -0.5802100896835327 -6.791864137767334e-08 0.8144670128822327 0.0 -2.0555006585709634e-09 1.0 8.192598954792629e-08 -1.0 0.0 0.0 0.0 1.0 -0.580210268497467 6.89827786004571e-08 -0.8144668936729431 0.0 -0.8144668936729431 -5.8340923203559214e-08 0.580210268497467 0.0 -7.492239717521443e-09 1.0 9.003416323594138e-08 -1.0 0.0 0.0 0.0 1.0 -0.29262620210647583 8.969897891120127e-08 -0.9562268257141113 0.0 -0.9562268257141113 -4.575706924470069e-08 0.29262620210647583 0.0 -1.7505861649169674e-08 1.0 9.916230681028537e-08 -1.0 0.0 0.0 0.0 1.0 -1.3435885648505064e-07 7.549790836947068e-08 -1.0000001192092896 0.0 -1.0000001192092896 -1.4210854715202004e-14 1.3435885648505064e-07 0.0 -7.105427357601002e-15 1.0 7.549790126404332e-08 -1.0 0.0 0.0 0.0 1.0 0.327949196100235 8.808321183551016e-08 -0.9446954727172852 0.0 -0.9446954727172852 1.283601136492507e-08 -0.327949196100235 0.0 -1.6760694165895984e-08 1.0 8.742135548800434e-08 -1.0 0.0 0.0 0.0 1.0 0.68928062915802 1.0117053506064622e-07 -0.7244945168495178 0.0 -0.7244945168495178 3.2108129488506165e-08 -0.68928062915802 0.0 -4.647272788815826e-08 1.0 9.542900158976408e-08 -1.0 0.0 0.0 0.0 1.0 0.9274256229400635 1.0772405545367292e-07 -0.37400758266448975 0.0 -0.37400758266448975 5.4594561760268334e-08 -0.9274256229400635 0.0 -7.948726477025048e-08 1.0 9.092201480598305e-08 -1.0 0.0 0.0 0.0 1.0 0.9955579042434692 1.0759762147927177e-07 -0.0941511020064354 0.0 -0.0941511020064354 7.042140026669585e-08 -0.9955579042434692 0.0 -1.0048940879414658e-07 1.0 8.023901898468466e-08 -1.0 0.0 0.0 0.0 1.0 1.0 5.024294934767972e-15 3.7932372841020008e-22 0.0 5.048709793414476e-29 7.549789415861596e-08 -1.0 0.0 -5.024294934767972e-15 1.0 7.549789415861596e-08 -1.0 0.0 0.0 0.0 1.0 </float_array>
<technique_common>
<accessor source="#id-anim-24-transform-output-array" count="21" stride="16">
<param name="TRANSFORM" type="float4x4"/>
</accessor>
</technique_common>
</source>
<source id="id-anim-24-interpolation-output">
<Name_array id="id-anim-24-interpolation-output-array" count="21"> LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
<technique_common>
<accessor source="#id-anim-24-interpolation-output-array" count="21" stride="1">
<param name="INTERPOLATION" type="Name"/>
</accessor>
</technique_common>
</source>
<sampler id="id-anim-24-sampler">
<input semantic="INPUT" source="#id-anim-24-input"/>
<input semantic="OUTPUT" source="#id-anim-24-transform-output"/>
<input semantic="INTERPOLATION" source="#id-anim-24-interpolation-output"/>
</sampler>
<channel source="#id-anim-24-sampler" target="id-bone-3/transform"/>
</animation>
</library_animations>
<scene>
<instance_visual_scene url="#id-scene-1" />
</scene>
</COLLADA>

View File

@ -0,0 +1,28 @@
# Vertices: 8
# Points: 0
# Lines: 0
# Faces: 6
# Materials: 1
o 1
# Vertex list
v -0.5 -0.5 0.5
v -0.5 -0.5 -0.5
v -0.5 0.5 -0.5
v -0.5 0.5 0.5
v 0.5 -0.5 0.5
v 0.5 -0.5 -0.5
v 0.5 0.5 -0.5
v 0.5 0.5 0.5
# Point/Line/Face list
usemtl Default
f 4 3 2 1
f 2 6 5 1
f 3 7 6 2
f 8 7 3 4
f 5 8 4 1
f 6 7 8 5

View File

@ -0,0 +1,109 @@
/*
---------------------------------------------------------------------------
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
Copyright (c) 2006-2016, 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 "UnitTestPCH.h"
#include <assimp/scene.h>
#include <assimp/Importer.hpp>
#include <assimp/Exporter.hpp>
using namespace Assimp;
class utIssues : public ::testing::Test {
};
#ifndef ASSIMP_BUILD_NO_EXPORT
TEST_F( utIssues, OpacityBugWhenExporting_727 ) {
aiScene *scene( new aiScene );
scene->mNumMaterials = 1;
scene->mMaterials = new aiMaterial*;
scene->mMaterials[ 0 ] = new aiMaterial;
aiColor3D color( 1, 0, 0 );
EXPECT_EQ( AI_SUCCESS, scene->mMaterials[ 0 ]->AddProperty( &color, 1, AI_MATKEY_COLOR_DIFFUSE ) );
::srand( static_cast<unsigned int>( ::time( NULL ) ) );
float opacity( float( rand() ) / float( RAND_MAX ) );
EXPECT_EQ( AI_SUCCESS, scene->mMaterials[ 0 ]->AddProperty( &opacity, 1, AI_MATKEY_OPACITY ) );
scene->mNumMeshes = 1;
scene->mMeshes = new aiMesh*;
scene->mMeshes[ 0 ] = new aiMesh;
scene->mMeshes[ 0 ]->mMaterialIndex = 0;
scene->mMeshes[ 0 ]->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
scene->mMeshes[ 0 ]->mNumVertices = 3;
scene->mMeshes[ 0 ]->mVertices = new aiVector3D[ 3 ];
scene->mMeshes[ 0 ]->mVertices[ 0 ] = aiVector3D( 1, 0, 0 );
scene->mMeshes[ 0 ]->mVertices[ 1 ] = aiVector3D( 0, 1, 0 );
scene->mMeshes[ 0 ]->mVertices[ 2 ] = aiVector3D( 0, 0, 1 );
scene->mMeshes[ 0 ]->mNumFaces = 1;
scene->mMeshes[ 0 ]->mFaces = new aiFace;
scene->mMeshes[ 0 ]->mFaces[ 0 ].mNumIndices = 3;
scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices = new unsigned int[ 3 ];
scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 0 ] = 0;
scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 1 ] = 1;
scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 2 ] = 2;
scene->mRootNode = new aiNode;
scene->mRootNode->mNumMeshes = 1;
scene->mRootNode->mMeshes = new unsigned int( 0 );
Assimp::Importer importer;
Assimp::Exporter exporter;
for ( std::size_t i( 0 ); i < exporter.GetExportFormatCount(); ++i ) {
/*const aiExportFormatDesc *desc( exporter.GetExportFormatDescription( i ) );
std::cout << "[" << desc->id << "] ";
std::string path( "scene." );
path.append( desc->fileExtension );
ASSERT_EQ( AI_SUCCESS, exporter.Export( scene, desc->id, path ) );
const aiScene *newScene( importer.ReadFile( path, 0 ) );
ASSERT_TRUE( NULL != newScene );
float newOpacity;
if ( newScene->mNumMaterials > 0 ) {
//ASSERT_EQ( AI_SUCCESS, newScene->mMaterials[ 0 ]->Get( AI_MATKEY_OPACITY, newOpacity ) );
//EXPECT_EQ( opacity, newOpacity );
}*/
}
}
#endif // ASSIMP_BUILD_NO_EXPORT