pull/1252/head
Galen Cochrane 2017-04-29 15:10:35 -06:00
commit 3e5e3a54b9
31 changed files with 6001 additions and 3924 deletions

View File

@ -1,7 +1,6 @@
# Open Asset Import Library (assimp) # Open Asset Import Library (assimp)
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# # Copyright (c) 2006-2017, assimp team
# Copyright (c) 2006-2016, assimp team
# All rights reserved. # All rights reserved.
# #
# Redistribution and use of this software in source and binary forms, # Redistribution and use of this software in source and binary forms,
@ -33,7 +32,6 @@
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#---------------------------------------------------------------------- #----------------------------------------------------------------------
SET(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required SET(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
cmake_minimum_required( VERSION 2.8 ) cmake_minimum_required( VERSION 2.8 )
@ -81,6 +79,11 @@ OPTION ( ASSIMP_COVERALLS
OFF OFF
) )
OPTION ( BUILD_DOCS
"Build documentation using Doxygen."
OFF
)
IF(MSVC) IF(MSVC)
set (CMAKE_PREFIX_PATH "D:\\libs\\devil") set (CMAKE_PREFIX_PATH "D:\\libs\\devil")
OPTION( ASSIMP_INSTALL_PDB OPTION( ASSIMP_INSTALL_PDB
@ -155,12 +158,16 @@ SET(LIBASSIMP-DEV_COMPONENT "libassimp${ASSIMP_VERSION_MAJOR}.${ASSIMP_VERSION_M
SET(CPACK_COMPONENTS_ALL assimp-bin ${LIBASSIMP_COMPONENT} ${LIBASSIMP-DEV_COMPONENT} assimp-dev) SET(CPACK_COMPONENTS_ALL assimp-bin ${LIBASSIMP_COMPONENT} ${LIBASSIMP-DEV_COMPONENT} assimp-dev)
SET(ASSIMP_LIBRARY_SUFFIX "" CACHE STRING "Suffix to append to library names") SET(ASSIMP_LIBRARY_SUFFIX "" CACHE STRING "Suffix to append to library names")
# Ensure that we do not run into issues like http://www.tcm.phy.cam.ac.uk/sw/inodes64.html on 32 bit linux
IF( UNIX ) IF( UNIX )
# Ensure that we do not run into issues like http://www.tcm.phy.cam.ac.uk/sw/inodes64.html on 32 bit linux
IF ( CMAKE_SIZEOF_VOID_P EQUAL 4) # only necessary for 32-bit linux IF ( CMAKE_SIZEOF_VOID_P EQUAL 4) # only necessary for 32-bit linux
ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64 ) ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64 )
ENDIF() ENDIF()
ENDIF()
# Use GNUInstallDirs for Unix predefined directories
include(GNUInstallDirs)
ENDIF( UNIX )
IF((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT CMAKE_COMPILER_IS_MINGW) IF((CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) AND NOT CMAKE_COMPILER_IS_MINGW)
IF (BUILD_SHARED_LIBS AND CMAKE_SIZEOF_VOID_P EQUAL 8) # -fPIC is only required for shared libs on 64 bit IF (BUILD_SHARED_LIBS AND CMAKE_SIZEOF_VOID_P EQUAL 8) # -fPIC is only required for shared libs on 64 bit
@ -232,6 +239,10 @@ IF( CMAKE_COMPILER_IS_GNUCXX )
SET(LIBSTDC++_LIBRARIES -lstdc++) SET(LIBSTDC++_LIBRARIES -lstdc++)
ENDIF( CMAKE_COMPILER_IS_GNUCXX ) ENDIF( CMAKE_COMPILER_IS_GNUCXX )
IF( BUILD_DOCS )
add_subdirectory(doc)
ENDIF( BUILD_DOCS )
# Search for external dependencies, and build them from source if not found # Search for external dependencies, and build them from source if not found
# Search for zlib # Search for zlib
IF ( NOT ASSIMP_BUILD_ZLIB ) IF ( NOT ASSIMP_BUILD_ZLIB )
@ -429,29 +440,29 @@ IF(CMAKE_CPACK_COMMAND AND UNIX AND ASSIMP_OPT_BUILD_PACKAGES)
ENDIF() ENDIF()
if(WIN32) if(WIN32)
if (CMAKE_SIZEOF_VOID_P EQUAL 8) if (CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin64/") SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin64/")
SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib64/") SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib64/")
elseif() elseif()
SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin32/") SET(BIN_DIR "${PROJECT_SOURCE_DIR}/bin32/")
SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib32/") SET(LIB_DIR "${PROJECT_SOURCE_DIR}/lib32/")
ENDIF() ENDIF()
if(MSVC12) if(MSVC12)
SET(ASSIMP_MSVC_VERSION "vc120") SET(ASSIMP_MSVC_VERSION "vc120")
elseif(MSVC14) elseif(MSVC14)
SET(ASSIMP_MSVC_VERSION "vc140") SET(ASSIMP_MSVC_VERSION "vc140")
ENDIF(MSVC12) ENDIF(MSVC12)
if(MSVC12 OR MSVC14) if(MSVC12 OR MSVC14)
add_custom_target(UpdateAssimpLibsDebugSymbolsAndDLLs COMMENT "Copying Assimp Libraries ..." VERBATIM) add_custom_target(UpdateAssimpLibsDebugSymbolsAndDLLs COMMENT "Copying Assimp Libraries ..." VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.dll ${BIN_DIR}assimp-${ASSIMP_MSVC_VERSION}-mt.dll VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.dll ${BIN_DIR}assimp-${ASSIMP_MSVC_VERSION}-mt.dll VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.exp ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mt.exp VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.exp ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mt.exp VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.lib ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mt.lib VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Release/assimp-${ASSIMP_MSVC_VERSION}-mt.lib ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mt.lib VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.dll ${BIN_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.dll VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.dll ${BIN_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.dll VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.exp ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.exp VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.exp ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.exp VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.ilk ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.ilk VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.ilk ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.ilk VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.lib ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.lib VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.lib ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.lib VERBATIM)
add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.pdb ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.pdb VERBATIM) add_custom_command(TARGET UpdateAssimpLibsDebugSymbolsAndDLLs COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/code/Debug/assimp-${ASSIMP_MSVC_VERSION}-mtd.pdb ${LIB_DIR}assimp-${ASSIMP_MSVC_VERSION}-mtd.pdb VERBATIM)
ENDIF(MSVC12 OR MSVC14) ENDIF(MSVC12 OR MSVC14)
ENDIF (WIN32) ENDIF (WIN32)

View File

@ -7,6 +7,7 @@ Open Asset Import Library (assimp)
<img alt="Coverity Scan Build Status" <img alt="Coverity Scan Build Status"
src="https://scan.coverity.com/projects/5607/badge.svg"/> src="https://scan.coverity.com/projects/5607/badge.svg"/>
</a> </a>
<span class="badge-patreon"><a href="https://www.patreon.com/assimp" title="Donate to this project using Patreon"><img src="https://img.shields.io/badge/patreon-donate-yellow.svg" alt="Patreon donate button" /></a></span>
[![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master) [![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master)
<br> <br>
@ -133,10 +134,6 @@ And we also have a Gitter-channel:Gitter [![Join the chat at https://gitter.im/a
Contributions to assimp are highly appreciated. The easiest way to get involved is to submit 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. a pull request with your changes against the main repository's `master` branch.
### Donate ###
You can get a patron of Asset-Importer-Lib:
<a href="https://www.patreon.com/bePatron?u=2790590" data-patreon-widget-type="become-patron-button">Become a Patron!</a><script async src="https://cdn6.patreon.com/becomePatronButton.bundle.js"></script>
### License ### ### License ###
Our license is based on the modified, __3-clause BSD__-License. Our license is based on the modified, __3-clause BSD__-License.

View File

@ -1,8 +1,43 @@
# Open Asset Import Library (assimp)
# ----------------------------------------------------------------------
# Copyright (c) 2006-2017, 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.
#----------------------------------------------------------------------
set( PACKAGE_VERSION "@ASSIMP_VERSION@" ) set( PACKAGE_VERSION "@ASSIMP_VERSION@" )
if( "${PACKAGE_FIND_VERSION}" VERSION_EQUAL "@ASSIMP_VERSION@") if( "${PACKAGE_FIND_VERSION}" VERSION_EQUAL "@ASSIMP_VERSION@")
set(PACKAGE_VERSION_EXACT 1) set(PACKAGE_VERSION_EXACT 1)
endif() endif()
if( "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" EQUAL "@ASSIMP_SOVERSION@" ) if( "${PACKAGE_FIND_VERSION_MAJOR}.${PACKAGE_FIND_VERSION_MINOR}" EQUAL "@ASSIMP_VERSION@" )
set(PACKAGE_VERSION_COMPATIBLE 1) set(PACKAGE_VERSION_COMPATIBLE 1)
elseif( "${PACKAGE_FIND_VERSION_MAJOR}" EQUAL "@ASSIMP_VERSION_MAJOR@" ) elseif( "${PACKAGE_FIND_VERSION_MAJOR}" EQUAL "@ASSIMP_VERSION_MAJOR@" )
# for now backward compatible if minor version is less # for now backward compatible if minor version is less

View File

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

View File

@ -614,9 +614,12 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
mat->AddProperty( &pCurrentMaterial->ior, 1, AI_MATKEY_REFRACTI ); mat->AddProperty( &pCurrentMaterial->ior, 1, AI_MATKEY_REFRACTI );
// Adding textures // Adding textures
const int uvwIndex = 0;
if ( 0 != pCurrentMaterial->texture.length ) if ( 0 != pCurrentMaterial->texture.length )
{ {
mat->AddProperty( &pCurrentMaterial->texture, AI_MATKEY_TEXTURE_DIFFUSE(0)); mat->AddProperty( &pCurrentMaterial->texture, AI_MATKEY_TEXTURE_DIFFUSE(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_DIFFUSE(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureDiffuseType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureDiffuseType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_DIFFUSE); addTextureMappingModeProperty(mat, aiTextureType_DIFFUSE);
@ -626,6 +629,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
if ( 0 != pCurrentMaterial->textureAmbient.length ) if ( 0 != pCurrentMaterial->textureAmbient.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureAmbient, AI_MATKEY_TEXTURE_AMBIENT(0)); mat->AddProperty( &pCurrentMaterial->textureAmbient, AI_MATKEY_TEXTURE_AMBIENT(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_AMBIENT(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureAmbientType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureAmbientType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_AMBIENT); addTextureMappingModeProperty(mat, aiTextureType_AMBIENT);
@ -633,11 +637,15 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
} }
if ( 0 != pCurrentMaterial->textureEmissive.length ) if ( 0 != pCurrentMaterial->textureEmissive.length )
{
mat->AddProperty( &pCurrentMaterial->textureEmissive, AI_MATKEY_TEXTURE_EMISSIVE(0)); mat->AddProperty( &pCurrentMaterial->textureEmissive, AI_MATKEY_TEXTURE_EMISSIVE(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_EMISSIVE(0) );
}
if ( 0 != pCurrentMaterial->textureSpecular.length ) if ( 0 != pCurrentMaterial->textureSpecular.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureSpecular, AI_MATKEY_TEXTURE_SPECULAR(0)); mat->AddProperty( &pCurrentMaterial->textureSpecular, AI_MATKEY_TEXTURE_SPECULAR(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_SPECULAR(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureSpecularType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureSpecularType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_SPECULAR); addTextureMappingModeProperty(mat, aiTextureType_SPECULAR);
@ -647,6 +655,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
if ( 0 != pCurrentMaterial->textureBump.length ) if ( 0 != pCurrentMaterial->textureBump.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureBump, AI_MATKEY_TEXTURE_HEIGHT(0)); mat->AddProperty( &pCurrentMaterial->textureBump, AI_MATKEY_TEXTURE_HEIGHT(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_HEIGHT(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureBumpType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureBumpType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_HEIGHT); addTextureMappingModeProperty(mat, aiTextureType_HEIGHT);
@ -656,6 +665,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
if ( 0 != pCurrentMaterial->textureNormal.length ) if ( 0 != pCurrentMaterial->textureNormal.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureNormal, AI_MATKEY_TEXTURE_NORMALS(0)); mat->AddProperty( &pCurrentMaterial->textureNormal, AI_MATKEY_TEXTURE_NORMALS(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_NORMALS(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureNormalType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureNormalType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_NORMALS); addTextureMappingModeProperty(mat, aiTextureType_NORMALS);
@ -672,6 +682,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
for( unsigned i = 0; i < count; i++ ) for( unsigned i = 0; i < count; i++ )
{ {
mat->AddProperty(&pCurrentMaterial->textureReflection[i], AI_MATKEY_TEXTURE_REFLECTION(i)); mat->AddProperty(&pCurrentMaterial->textureReflection[i], AI_MATKEY_TEXTURE_REFLECTION(i));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_REFLECTION(i) );
if(pCurrentMaterial->clamp[type]) if(pCurrentMaterial->clamp[type])
addTextureMappingModeProperty(mat, aiTextureType_REFLECTION, 1, i); addTextureMappingModeProperty(mat, aiTextureType_REFLECTION, 1, i);
@ -681,6 +692,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
if ( 0 != pCurrentMaterial->textureDisp.length ) if ( 0 != pCurrentMaterial->textureDisp.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureDisp, AI_MATKEY_TEXTURE_DISPLACEMENT(0) ); mat->AddProperty( &pCurrentMaterial->textureDisp, AI_MATKEY_TEXTURE_DISPLACEMENT(0) );
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_DISPLACEMENT(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureDispType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureDispType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_DISPLACEMENT); addTextureMappingModeProperty(mat, aiTextureType_DISPLACEMENT);
@ -690,6 +702,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
if ( 0 != pCurrentMaterial->textureOpacity.length ) if ( 0 != pCurrentMaterial->textureOpacity.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureOpacity, AI_MATKEY_TEXTURE_OPACITY(0)); mat->AddProperty( &pCurrentMaterial->textureOpacity, AI_MATKEY_TEXTURE_OPACITY(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_OPACITY(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureOpacityType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureOpacityType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_OPACITY); addTextureMappingModeProperty(mat, aiTextureType_OPACITY);
@ -699,6 +712,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc
if ( 0 != pCurrentMaterial->textureSpecularity.length ) if ( 0 != pCurrentMaterial->textureSpecularity.length )
{ {
mat->AddProperty( &pCurrentMaterial->textureSpecularity, AI_MATKEY_TEXTURE_SHININESS(0)); mat->AddProperty( &pCurrentMaterial->textureSpecularity, AI_MATKEY_TEXTURE_SHININESS(0));
mat->AddProperty( &uvwIndex, 1, AI_MATKEY_UVWSRC_SHININESS(0) );
if (pCurrentMaterial->clamp[ObjFile::Material::TextureSpecularityType]) if (pCurrentMaterial->clamp[ObjFile::Material::TextureSpecularityType])
{ {
addTextureMappingModeProperty(mat, aiTextureType_SHININESS); addTextureMappingModeProperty(mat, aiTextureType_SHININESS);

View File

@ -97,7 +97,30 @@ ObjFileParser::~ObjFileParser() {
ObjFile::Model *ObjFileParser::GetModel() const { ObjFile::Model *ObjFileParser::GetModel() const {
return m_pModel; return m_pModel;
} }
void ignoreNewLines(IOStreamBuffer<char> &streamBuffer, std::vector<char> &buffer)
{
std::vector<char> buf(buffer);
auto copyPosition = buffer.begin();
auto curPosition = buf.cbegin();
do
{
while (*curPosition != '\n'&&*curPosition != '\\')
{
++curPosition;
}
if (*curPosition == '\\')
{
copyPosition = std::copy(buf.cbegin(), curPosition, copyPosition);
*(copyPosition++) = ' ';
do
{
streamBuffer.getNextLine(buf);
} while (buf[0] == '\n');
curPosition = buf.cbegin();
}
} while (*curPosition != '\n');
std::copy(buf.cbegin(), curPosition, copyPosition);
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// File parsing method. // File parsing method.
void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) { void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) {
@ -123,7 +146,7 @@ void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) {
progressCounter++; progressCounter++;
m_progress->UpdateFileRead( progressOffset + processed * 2, progressTotal ); m_progress->UpdateFileRead( progressOffset + processed * 2, progressTotal );
} }
ignoreNewLines(streamBuffer, buffer);
// parse line // parse line
switch (*m_DataIt) { switch (*m_DataIt) {
case 'v': // Parse a vertex texture coordinate case 'v': // Parse a vertex texture coordinate

View File

@ -627,10 +627,10 @@ void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeEle
} }
else else
{ {
for(size_t i = 0; i < (size_t)tne_group.Choice; i++) chit_begin++;// forward iterator to choosen node. for(size_t i = 0; i < (size_t)tne_group.Choice; i++) chit_begin++;// forward iterator to chosen node.
chit_end = chit_begin; chit_end = chit_begin;
chit_end++;// point end iterator to next element after choosen. chit_end++;// point end iterator to next element after chosen node.
} }
}// if(tne_group.UseChoice) }// if(tne_group.UseChoice)
}// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_Group) }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_Group)

View File

@ -582,7 +582,7 @@ void glTFExporter::ExportMeshes()
if (v) p.attributes.position.push_back(v); if (v) p.attributes.position.push_back(v);
/******************** Normals ********************/ /******************** Normals ********************/
if(comp_allow && (aim->mNormals > 0)) idx_srcdata_normal = b->byteLength;// Store index of normals array. if(comp_allow && (aim->mNormals != 0)) idx_srcdata_normal = b->byteLength;// Store index of normals array.
Ref<Accessor> n = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mNormals, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); Ref<Accessor> n = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mNormals, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);
if (n) p.attributes.normal.push_back(n); if (n) p.attributes.normal.push_back(n);

42
doc/CMakeLists.txt 100644
View File

@ -0,0 +1,42 @@
find_package( Doxygen REQUIRED )
set( HTML_OUTPUT "AssimpDoc_Html" CACHE STRING "Output directory for generated HTML documentation. Defaults to AssimpDoc_Html." )
# Enable Microsoft CHM help style only on Windows
set( MICROSOFT_HELP_WORKSHOP "NO")
if( MSVC )
set( MICROSOFT_HELP_WORKSHOP "YES" )
endif( MSVC )
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
@ONLY
)
add_custom_target(
docs ALL
DEPENDS docs.done
)
add_custom_command(
OUTPUT docs.done
COMMAND ${DOXYGEN_EXECUTABLE}
COMMAND ${CMAKE_COMMAND} -E touch docs.done
COMMENT "Generating assimp documentation"
VERBATIM
)
if( DEFINED CMAKE_INSTALL_DOCDIR )
install(
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${HTML_OUTPUT}
DESTINATION ${CMAKE_INSTALL_DOCDIR}
)
install(FILES
${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/AnimationOverview.png
${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/AnimationOverview.svg
${CMAKE_CURRENT_SOURCE_DIR}/AssimpDoc_Html/dragonsplash.png
DESTINATION ${CMAKE_INSTALL_DOCDIR}/${HTML_OUTPUT}
)
endif( DEFINED CMAKE_INSTALL_DOCDIR )

View File

@ -140,7 +140,8 @@ FULL_PATH_NAMES = NO
# relative paths, which will be relative from the directory where doxygen is # relative paths, which will be relative from the directory where doxygen is
# started. # started.
STRIP_FROM_PATH = STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ \
@PROJECT_BINARY_DIR@
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
# the path mentioned in the documentation of a class, which tells # the path mentioned in the documentation of a class, which tells
@ -339,22 +340,6 @@ INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = YES TYPEDEF_HIDES_STRUCT = YES
# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
# determine which symbols to keep in memory and which to flush to disk.
# When the cache is full, less often used symbols will be written to disk.
# For small to medium size projects (<1000 input files) the default value is
# probably good enough. For larger projects a too small cache size can cause
# doxygen to be busy swapping symbols to and from disk most of the time
# causing a significant performance penalty.
# If the system has enough physical memory increasing the cache will improve the
# performance by keeping more symbols in memory. Note that the value works on
# a logarithmic scale so increasing the size by one will roughly double the
# memory usage. The cache size is given by this formula:
# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
# corresponding to a cache size of 2^16 = 65536 symbols.
SYMBOL_CACHE_SIZE = 0
# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be
# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given
# their name and scope. Since this can be an expensive process and often the # their name and scope. Since this can be an expensive process and often the
@ -677,9 +662,12 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories # directories like "/usr/src/myproject". Separate the files or directories
# with spaces. # with spaces.
INPUT = ../include/ \ INPUT = @doxy_main_page@ \
../doc/dox.h \ @PROJECT_SOURCE_DIR@ \
../code/BaseImporter.h @PROJECT_BINARY_DIR@ \
@PROJECT_SOURCE_DIR@/include/ \
@PROJECT_SOURCE_DIR@/doc/dox.h \
@PROJECT_SOURCE_DIR@/code/BaseImporter.h
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@ -919,7 +907,7 @@ GENERATE_HTML = YES
# If a relative path is entered the value of OUTPUT_DIRECTORY will be # If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path. # put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = AssimpDoc_Html HTML_OUTPUT = @HTML_OUTPUT@
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for # The HTML_FILE_EXTENSION tag can be used to specify the file extension for
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank # each generated HTML page (for example: .htm,.php,.asp). If it is left blank
@ -953,7 +941,7 @@ HTML_FOOTER =
# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this # HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
# tag will in the future become obsolete. # tag will in the future become obsolete.
HTML_STYLESHEET = style.css # HTML_STYLESHEET = @CMAKE_CURRENT_SOURCE_DIR@/style.css
# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
# user-defined cascading style sheet that is included after the standard # user-defined cascading style sheet that is included after the standard
@ -1064,7 +1052,7 @@ DOCSET_PUBLISHER_NAME = Publisher
# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
# of the generated HTML documentation. # of the generated HTML documentation.
GENERATE_HTMLHELP = YES GENERATE_HTMLHELP = @MICROSOFT_HELP_WORKSHOP@
# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
# be used to specify the file name of the resulting .chm file. You # be used to specify the file name of the resulting .chm file. You
@ -1504,18 +1492,6 @@ GENERATE_XML = NO
XML_OUTPUT = xml XML_OUTPUT = xml
# The XML_SCHEMA tag can be used to specify an XML schema,
# which can be used by a validating XML parser to check the
# syntax of the XML files.
XML_SCHEMA =
# The XML_DTD tag can be used to specify an XML DTD,
# which can be used by a validating XML parser to check the
# syntax of the XML files.
XML_DTD =
# If the XML_PROGRAMLISTING tag is set to YES Doxygen will # If the XML_PROGRAMLISTING tag is set to YES Doxygen will
# dump the program listings (including syntax highlighting # dump the program listings (including syntax highlighting
# and cross-referencing information) to the XML output. Note that # and cross-referencing information) to the XML output. Note that

View File

@ -20,8 +20,8 @@
<nodes id="2"> <nodes id="2">
<ClassNode id="3"> <ClassNode id="3">
<children id="4"/> <children id="4"/>
<location class="Point2D.Double" id="5" x="270.0" y="200.0"/> <location class="Point2D.Double" id="5" x="50.0" y="30.0"/>
<id id="6" value="8ccad607-14e2-4eec-836e-b25f61cfa2ea"/> <id id="6" value="7c26c2df-f2ca-4cb2-bf1b-2784bd216bef"/>
<revision>1</revision> <revision>1</revision>
<backgroundColor id="7"> <backgroundColor id="7">
<red>255</red> <red>255</red>
@ -37,620 +37,318 @@
</borderColor> </borderColor>
<textColor reference="8"/> <textColor reference="8"/>
<name id="9" justification="1" size="3" underlined="false"> <name id="9" justification="1" size="3" underlined="false">
<text>Assimpo::Exporter</text> <text>Importer</text>
</name> </name>
<attributes id="10" justification="0" size="4" underlined="false"> <attributes id="10" justification="0" size="4" underlined="false">
<text>aiScene* mScene; <text></text>
IOSystem* mIOHandler;
struct ExportFormatEntry {
aiExportFormatDesc mDescription;
fpExportFunc mExportFunction;
};
</text>
</attributes> </attributes>
<methods id="11" justification="0" size="4" underlined="false"> <methods id="11" justification="0" size="4" underlined="false">
<text>const aiExportDataBlob* ExportToBlob( const aiScene* pScene, ... ); <text>RegisterLoader()
const aiExportDataBlob* ExportToBlob( const aiScene* pScene, ...); UnregisterLoader()
aiReturn Export( const aiScene* pScene, ... ); ReadFile()</text>
aiReturn Export( const aiScene* pScene, ...);
</text>
</methods> </methods>
</ClassNode> </ClassNode>
<ClassNode id="12"> <ClassNode id="12">
<children id="13"/> <children id="13"/>
<location class="Point2D.Double" id="14" x="760.0" y="120.0"/> <location class="Point2D.Double" id="14" x="310.0" y="60.0"/>
<id id="15" value="c2ac589d-2d10-4a82-b77f-df3c3232086a"/> <id id="15" value="ec5caa24-0fc9-494d-9594-c9fd6c8a7938"/>
<revision>1</revision>
<backgroundColor id="16">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="17">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="17"/>
<name id="18" justification="1" size="3" underlined="false">
<text>IOSystem</text>
</name>
<attributes id="19" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="20" justification="0" size="4" underlined="false">
<text>bool Exists( const std::string&amp; pFile) const;
bool Exists( const char* pFile) const;
virtual char getOsSeparator() const;
virtual IOStream* Open(const char* pFile,
const char* pMode = &quot;rb&quot;);
IOStream* Open(const std::string&amp; pFile, const std::string&amp; pMode = std::string(&quot;rb&quot;));
void Close( IOStream* pFile);
</text>
</methods>
</ClassNode>
<ClassNode id="21">
<children id="22"/>
<location class="Point2D.Double" id="23" x="760.0" y="450.0"/>
<id id="24" value="543d8402-9358-46ed-abd8-77935414c423"/>
<revision>1</revision> <revision>1</revision>
<backgroundColor reference="7"/> <backgroundColor reference="7"/>
<borderColor reference="8"/> <borderColor reference="8"/>
<textColor reference="8"/> <textColor reference="8"/>
<name id="25" justification="1" size="3" underlined="false"> <name id="16" justification="1" size="3" underlined="false">
<text>ObjExporter</text> <text>IOSystem</text>
</name> </name>
<attributes id="26" justification="0" size="4" underlined="false"> <attributes id="17" justification="0" size="4" underlined="false">
<text>File contains function pointer: <text></text>
ExportSceneObj</text>
</attributes> </attributes>
<methods id="27" justification="0" size="4" underlined="false"> <methods id="18" justification="0" size="4" underlined="false">
<text></text> <text></text>
</methods> </methods>
</ClassNode> </ClassNode>
<ClassNode id="19">
<children id="20"/>
<location class="Point2D.Double" id="21" x="70.0" y="230.0"/>
<id id="22" value="3cae5d2e-e369-4671-b727-453c141279d3"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="23" justification="1" size="3" underlined="false">
<text>BaseImporter</text>
</name>
<attributes id="24" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="25" justification="0" size="4" underlined="false">
<text>CanRead()
InternRead()</text>
</methods>
</ClassNode>
<ClassNode id="26">
<children id="27"/>
<location class="Point2D.Double" id="28" x="310.0" y="170.0"/>
<id id="29" value="760c6c44-b4d1-4cca-a3ba-56674ae418f4"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="30" justification="1" size="3" underlined="false">
<text>ObjImporter</text>
</name>
<attributes id="31" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="32" justification="0" size="4" underlined="false">
<text>CanRead()
InternRead()</text>
</methods>
</ClassNode>
<ClassNode id="33">
<children id="34"/>
<location class="Point2D.Double" id="35" x="310.0" y="330.0"/>
<id id="36" value="2db664a4-0d36-4c0a-9371-eac19639744a"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="37" justification="1" size="3" underlined="false">
<text>glTFImporter</text>
</name>
<attributes id="38" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="39" justification="0" size="4" underlined="false">
<text>CanRead()
InternRead()</text>
</methods>
</ClassNode>
</nodes> </nodes>
<edges id="28"> <edges id="40">
<NoteEdge id="29"> <InheritanceEdge id="41">
<start class="ClassNode" reference="3"/> <start class="ClassNode" reference="26"/>
<end class="ClassNode" reference="12"/> <end class="ClassNode" reference="19"/>
<startLocation class="Point2D.Double" id="30" x="130.0" y="70.0"/> <startLocation class="Point2D.Double" id="42" x="80.0" y="30.0"/>
<endLocation class="Point2D.Double" id="31" x="120.0" y="70.0"/> <endLocation class="Point2D.Double" id="43" x="70.0" y="50.0"/>
<transitionPoints id="32"/>
<id id="33" value="32e48b3f-86c7-427a-9d3b-9fa3af2a79f7"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="34">
<start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="35" x="20.0" y="70.0"/>
<endLocation class="Point2D.Double" reference="35"/>
<transitionPoints id="36"/>
<id id="37" value="8b7d1b44-5b84-4bdc-b723-096126d300a4"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="38">
<start class="ClassNode" reference="3"/>
<end class="ClassNode" reference="3"/>
<startLocation class="Point2D.Double" id="39" x="190.0" y="80.0"/>
<endLocation class="Point2D.Double" reference="39"/>
<transitionPoints id="40"/>
<id id="41" value="ac092bcb-c3bb-4ac7-bc77-879556396f91"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="42">
<start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="43" x="370.0" y="80.0"/>
<endLocation class="Point2D.Double" reference="43"/>
<transitionPoints id="44"/> <transitionPoints id="44"/>
<id id="45" value="3d0ad2f3-6f05-491d-b8c8-961212d7a0c9"/> <id id="45" value="8dae8cbd-d22c-4eef-958f-e53ad15fa12a"/>
<revision>1</revision> <revision>1</revision>
</NoteEdge> <bentStyle name="AUTO"/>
<NoteEdge id="46"> <startLabel></startLabel>
<start class="ClassNode" reference="3"/> <middleLabel></middleLabel>
<end class="ClassNode" reference="3"/> <endLabel></endLabel>
<startLocation class="Point2D.Double" id="47" x="50.0" y="40.0"/> </InheritanceEdge>
<endLocation class="Point2D.Double" reference="47"/> <InheritanceEdge id="46">
<transitionPoints id="48"/> <start class="ClassNode" reference="33"/>
<id id="49" value="e8d16ba4-8036-4f77-81ad-aee4e11adbfe"/> <end class="ClassNode" reference="19"/>
<startLocation class="Point2D.Double" id="47" x="10.0" y="40.0"/>
<endLocation class="Point2D.Double" id="48" x="50.0" y="100.0"/>
<transitionPoints id="49"/>
<id id="50" value="cc174e4d-3146-44ad-95b6-de040a4f1c04"/>
<revision>1</revision> <revision>1</revision>
</NoteEdge> <bentStyle name="AUTO"/>
<NoteEdge id="50"> <startLabel></startLabel>
<start class="ClassNode" reference="3"/> <middleLabel></middleLabel>
<end class="ClassNode" reference="21"/> <endLabel></endLabel>
<startLocation class="Point2D.Double" id="51" x="300.0" y="250.0"/> </InheritanceEdge>
<endLocation class="Point2D.Double" id="52" x="20.0" y="40.0"/> <NoteEdge id="51">
<start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="52" x="80.0" y="50.0"/>
<endLocation class="Point2D.Double" reference="52"/>
<transitionPoints id="53"/> <transitionPoints id="53"/>
<id id="54" value="c9fa9dbf-f219-4363-9f26-aeea21492a1f"/> <id id="54" value="8d646a10-5869-47e4-8a59-dd05ff712f85"/>
<revision>1</revision> <revision>1</revision>
</NoteEdge> </NoteEdge>
<NoteEdge id="55"> <AssociationEdge id="55">
<start class="ClassNode" reference="21"/> <start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="21"/> <end class="ClassNode" reference="3"/>
<startLocation class="Point2D.Double" id="56" x="60.0" y="90.0"/> <startLocation class="Point2D.Double" id="56" x="20.0" y="40.0"/>
<endLocation class="Point2D.Double" reference="56"/> <endLocation class="Point2D.Double" id="57" x="20.0" y="80.0"/>
<transitionPoints id="57"/> <transitionPoints id="58"/>
<id id="58" value="a1addbce-8d05-4a56-9289-d885dedc75c2"/> <id id="59" value="8486c83a-57e2-4747-86ea-e93b3a2d7aed"/>
<revision>1</revision> <revision>1</revision>
</NoteEdge> <bentStyle name="AUTO"/>
<NoteEdge id="59"> <startLabel></startLabel>
<start class="ClassNode" reference="21"/> <middleLabel></middleLabel>
<end class="ClassNode" reference="21"/> <endLabel></endLabel>
<startLocation class="Point2D.Double" id="60" x="60.0" y="70.0"/> </AssociationEdge>
<endLocation class="Point2D.Double" reference="60"/> <AssociationEdge id="60">
<transitionPoints id="61"/> <start class="ClassNode" reference="19"/>
<id id="62" value="2155dc70-7a87-4d23-a8f3-7798f7931872"/> <end class="ClassNode" reference="3"/>
<startLocation class="Point2D.Double" id="61" x="40.0" y="10.0"/>
<endLocation class="Point2D.Double" id="62" x="60.0" y="130.0"/>
<transitionPoints id="63"/>
<id id="64" value="806bd5af-014e-4047-8219-8e70428cd238"/>
<revision>1</revision> <revision>1</revision>
</NoteEdge> <bentStyle name="AUTO"/>
<NoteEdge id="63"> <startLabel></startLabel>
<start class="ClassNode" reference="21"/> <middleLabel></middleLabel>
<end class="ClassNode" reference="21"/> <endLabel></endLabel>
<startLocation class="Point2D.Double" id="64" x="80.0" y="60.0"/> </AssociationEdge>
<endLocation class="Point2D.Double" id="65" x="140.0" y="40.0"/>
<transitionPoints id="66"/>
<id id="67" value="5473f8fb-4b83-475c-bb59-6c60b45f5948"/>
<revision>1</revision>
</NoteEdge>
</edges> </edges>
</ClassDiagramGraph>]]></SCRIPT> </ClassDiagramGraph>]]></SCRIPT>
<BR /> <BR />
<BR /> <BR />
<IMG alt="embedded diagram image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA88AAAHHCAIAAAAOJf3QAABkOklEQVR42uydf0hcx964CyIie2Ur <IMG alt="embedded diagram image" src="data:image/png;base64,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 6qn6+nrVefHiheLZ2VnFpaWlx1MVHsEjkM4eaWxsVPDo0SNTbnyhQsVKQxTfu3fP+cLy8nIVvn79
dqiqqpJf1fHl5eXGxkY1b0R+nj9/fmVlRY6vra2pmSF6QUCR7IaGhtTU1OTk5BMnTihZHx4elgKV WvGbN28Uq0QZzZUrV1RfSlIOsry8nJWV5fx53f39/ba2tuxDFOzt7dltGBoaqqyslLyCwWBvb29e
WIfDYbUmiRypra2V/Ng2AGDbAADwxtr2rtne3l5fX8/NzZUY9EIlAACAbQMAYNtxIBgMpqSk5Ofn Xl5hYeHk5CQewSOQMh7Jzc1VoHFuyhXooUa1Yg1vU02mePr0qanwyy+/qKS7u1ux/iru7OwsLi5W
3759m44AAMC2AQCwbQAAwLYBAADbBgDAtgEAANsGAABsGwAA2wYAAGwbAACwbQAAbBsAALBtAADA sLm5qeRFgZKasHwkEAgoHh4eHhsbMy+xFfx+v/GRaG9v19RJQVFR0Wf0CLA+K5ysRzIyMiJ/uVKZ
tgEAsG0AAMC2AQAA2wYAwLYBAADbBgAAbBsAANsGAABsGwAAsG0AAGwbAACwbQAAwLYBALBtAADA hQKlFRcuXLC94ocfflhbW3vy5Ilic+PD6/UqXlhYkHeMbh48eLCzsxM5r1GKoXh3d9d4St6xFUx9
tgEAIB6f5gAAcDjBtgEA3gTbphEAAA7n5zO2DQCAbQMAALYNAADYNgAAtg0AANg2AABg2wAA2DYA E29vb5tYW0U+Qj4CKeMRowCNcFOuwOYjJj357bffzp8/b+pXVVWZl2icr6ys6G9JSYlKRkdHTV4j
AGDbAACAbQMAYNsAAIBtAwAAtg0AgG0DAAC2DQAA2DYAALYNAADYNgAAYNsAANg2AABg2wAAgG0D 8vPzlXSEecTYymI04azwsRiP4BFImfsj09PTpnxmZkYPb9y44ay8t7fX09Nj85Tr16+b9MTMRGyd
AGDbAACAbQMAALYNAIBtAwAAtg0AANg2AAC2DQAA2DYAAGDbAADYNgAAYNsAAIBtAwBg2wAAgG0D iYmJpqYmqyGnDgoKCpyzp+juwCN4BFLMI4uLixr2ZWVlq6urmrYoyM7ONp/XKFadqakpxU+fPlXs
AAC2DQBwXD7NAQDgcIJtAwC8CbZNIwAAHM7PZ2wbAADbBgAAbBsAALBtAABsGwAAsG0AAMC2AQCw 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 jy2hMWgAAAAASUVORK5C" />
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
F4lyXafVvJiVfjUSbZ9g57YMkb9O/zMsrqUxZ3Ndq8pJ1IW8DJ0etTq5xRoeHn748OHp06efPXum
tsWIqU3MN3jOfvFzc0VHxNQRIrWvXr1SDxy7Vm39V4BrkH66aRdtchga1uuKvD6RrIW43vAb8mDb
AIBtH3fb3sWKUq7fba5rKPlfoMmPbZsXiVpfX1c3BiIZhpBca5QrNYxt65Vq5bir39si91pcy4ZX
Nte1qrzwKsS/i0hzqWu3Vqen7Mtd1jvvvCNVOJvR2eA+bdu1X5zQEXvsiDNnzpw/f76hocHW+M42
dL1SQzf52WzkkDes9U/e8PkwNzenYrCO9FuHIRjbBgBsG6Krzy5WlNKrRVm/C1zXUPK/QJMf2zYv
EqWeeRIF7+joMITkWmN9fb1+pkrsRAqZn5/XU0VFWdS8R9t0YWc55sW1NOZsrmtVOTEX4t9FpDox
ucjOY156wK+iouK7776TxNDQkHSi3DXZnpNzbXD/87ad/eKEjthjR/T19Ykj9vT0WGtxbUPXK/XZ
Tbtok8PQsNY/eYNtV1VVSeLx48euDxiMj49LOc40tg0A2Da2bf9SiXVFKb1alLUQ1zWU/C/QFPH3
IL9hkSj5/paoTp06pYb6IrEs6yTntra2qvTS0lJ+fr5oiv4yVksoSDlyv2FdCsNZjnlxLY05m3mt
Kp91+XcRqU6uTvWRXgdNGqG0tFRKlp/T09NXr17VJmdocJ+2HbVf6Ii4dMSvv/4qCbVipnVNEmcb
ul6pazf55PA3rPVP3mDbi4uLEoNEq9vWipSg1yGxphO0JsledvpJ8C5BB7Ip0e4qZWMqwLax7Tja
NtdlJRwO5+bm6tuJ48mdO3cqKysP6o3EEluHpCOOScPu/U9ezpUS1JQYa3ovb+bYbHsv24w5z/U5
PWiP1e1fFf4rjWOr3rhxY++z9QGwbaz0qGAbs9wF+7eX5CGnpaUlLS1NGvDEiRNq5kBiGtwGS2wd
ko44Pg27xz/5c+fO6f0jrem9vJljs+29fJqbn0Hevy+eRH4D7a7SmDLLuyrWtegBsG1sGwAADsk3
3Vt72enHmrbtFOU6xOv63VBTUzM5OSmJiYkJtbWP63ZKhn2nJCpbqM5azKdHou2IFnHbRy1qpRG3
zZBcW1WaTq08Lz9tI9+xLtYDgG1j2wAAcBhtexc7/VjTzp2ifI5tyynl5eVScmlpqTJO1+2UvPad
ct1/yFmLn9MNO6JFvPdRM3/tuW6G5GzV7u5ucf3IzmR/2xqc/GsJsG3AtgEA3gTb3sVOP5G/LnFq
W03T1bZdJzefPXu2vr7+0qVLOptzOyWvfadc9x9yjqz7Od3/jmjmFf6tVbsW5WzV6elptU1oQ0OD
6L6uaHJy8sSJE7xrAdsGbBsA4Mjb9i52+okYB3f9z9sW15R6Nzc3ndlct5gy7ztl9uOop0e8t7My
7KNmGNs2O7p+NTs7W90JWFcsCQQC0ji8awHbBmzbC1Z5AoAjY9v6Y8v/Tj9ih7GObbvG1N7eXlFR
ce3aNZ3NdSMxn/tOudYS07ZVrmnzPmp7t+3m5mZpB7F56+lPnjyJdSF6AGwb2/aZ2fXg1NRUZWVl
amqqfCJZF9WKo9w7FxCwFv7gwYOioqLk5OTi4mI1f0+xvLxcU1OTkpISCARaW1v1fyP3snaWT9SO
2T7b2fWfnFHbUBrEuhICALyZtu1/px/1wJ/Ia0dHhz7u3CnKudWT6wfNwsJCaWmpiLV8vOp5287t
lKLuO+Uaqsb/tlVeadd91MyVehXlepY0aXp6+o0bN2wlMG8bsG3Yu237LEE+w9955x31Cb+yslJb
W7v3XR5shMPhvLw8/bS6rfCZmZns7Gy1i4eodlZW1uzsrHqpvLy8v79fApPP4a6urra2trjfBjiR
FpDP/FAoJD/F9ffYKYZXpUHkW9g2aAUAb5pt+9/pR+l4WlqaqKF1TRLbTlHOrZ5cJzfX19erzXvH
x8dPnToV8dhOKeq+U66havxvW+WVdt1HzVqpeUjDmnYNVT5k9YR1K6xJAtg2GNRNPnjVurMvXrwo
KiqKeC/BZP0wTE1NvX37tvPTsrGx8ebNm/pXKfn8+fPOEpzlO1e1ivxnnzk5Lp6qVzKVj3c1nuKq
oRKABKaPSzB6FFzKsU4aUf+l9Fo7y7Vq59JSkWgLUm1sbLS2tmZmZra0tDjvEJzLZ/l81Mc1vI6O
jrjf2wDA4bLtN2nA5igyOTlZVlbmPC5fpa67jAJg27SkVdFETC9evBjxXoJJJcQa1VJI1n/TWRX2
9evX5k9m1/JdV7WSutR/LEdGRqQ6dVAs07pPu61wsV79DE9kZ8N5Pffv9OnTcoESvG3rade1s1yr
9lpayrAgldxvVFRUyE956dmzZ7Z6nctn+bRt1/CkWdTj8gCAbe87x3PuRCAQUHNdbPT39zOZBLBt
8HI4cUT1vIf8nJqaingvwaQSGRkZ6lW5jXd+/ht2rtWZXct3XdUqFArpdGZmpv6skxOj+qgzpLW1
NbHbkydPJiUliTfrGSaua2e5Vu1Vo/8FqWwlOJfPcl0Uy3l1ruFJOfrWAgCwbQAAbPtQ2Lb4pVK3
vLw8pyY6l2Cy+rTz81+Ksj1vYzVRQ/leq1pp9KQ419lx1rFtq4tvbm46BVQy9Pb2FhYWGgJzrdq8
tJQhbb79iHgsdWWwbdfwzHc7AIBtAwBg2wdg25GdUe1vv/1WT7A2L8GUmZmphm9Fo52f/+fOnbPO
2xZvdkq8a/kK26pWesTXipxiGNtuamrSM6ojO8/K63nbcqJ13rb+p5+rN7tWbV5aahe27Vw+y6dt
u4bH2DYAtg0AgG0fRttWD6zfv39f/Wpegqm9vV3N8/7yyy+dn/+zs7Oi4+Pj45J++vRpUVGR2ubW
WoJr+a6rWrW0tKgnOO/cuaMXM62vr9cP0zuvZW5uTmRdPTovPyWtR8rb2touX74sgivOfe3aterq
anXcdZUn16pdl5bai207l8/yP2/bGZ40uzQOb2wAbBsAANs+XLb96tUrMU494di8BJNaDUOUWhzR
9fNfnK+4uFhOF9Pt7e11VudavuuqVvJqTU2NHBFr1482iuu3trZ6XUtk52FBFUBJSYn1ecrXr1+L
cAcCgZSUlLq6Or2Ck+sqT65Vuy4ttRfbdi6f5dO2XcOTZmFNEgBs+7BzIDuKsY0ZTQHY9sHa9tFC
7gpyc3Odq50e8/aXBpFm0bdM+p8GAIBtx/yp5LUudVzQO4rtXxU+K9VrtSa4a/c7AHNjWpuCvzTA
trFtL5x7SR5F4rta1Llz56x7SXZ3d/MOB8C2D+PXg5/dcRNTqZhuampqgoX7UAUAgG3zFwcAwDfd
vti212Zdhq+HmpqaycnJyM7CsWfOnIl47NHltUGa2jzMtqOYsxbz6ZFoO4q5XpqhUuujQq7bhrlu
vba0tFRYWCgx6AeerD1nDm+fArA1kT5o6yDXpjC0eU5OjiF4wLYB2wYAwLbd8dqsy/D1MDs7W15e
vr29XVpaqrbXct2jy2uDNL15mLkWP6cbdhTbxaWZtw1z3XpNbjauX78uDaKPWEszh7dPAXi1sGET
NfOec/JqZ2enLXjAtgHbBgDAtnf/ZRB13vbZs2fr6+svXbqkszn36PLaIE0/nOdaiw7Gz+n+dxRz
vTSvPK7bhrluvZaWlmb91VaaObx9CsCrhV03UbMlvNrc/25tgG0Dtg0AgG3/BfNmXV7VTU9PJycn
b25uOrO5jt26HjTX4v90r3Ssl2beNsxr6zU/36w+rzouAUSty9mYPrOhC3wG0RrYNgAAth0z5s26
vKprb2+vqKi4du2azubco8u8QVrUWvyf7pWO6dKs0yRctw1T2LZeM49tx2Tb8QrAqy7DJmrmPeew
bT6DsG1sGwAA29495s26XKuT/KWlpXJKUVGRnrft3KPLvEFaxGNHMU3U06OmXS/NtdKxsTHJrLd4
cN02zHXrtYaGBrnk+fl513nb/m07jgF41eXsIGdTxNTmgG0Dtg0AgG1Hx7xZl+u87fr6erVP7/j4
+KlTpyIee3SZN0iLeOwopol6etS066VZK/Va7tp12zDXrdeWlpby8/NDoZBhZ2ODAe9HAF51OTvI
2f7+2xxvwLYB2wYAwLb5FoH96iA2TsO2gc9JAABsO3HEd48uOPwdxMZp2DZg2wAA2DYAALaNbQMA
ALYNANg2tg0AANg2AGDbgG0DAGDbAADYNrYNAADH27b1BuNvKvt3gW980wG2jW0DAMAbYttjY2Mp
KSmtra1e1TvX244XxcXFrrUkuH2P4gVaS+aPBLDto9KSAABwONlf27btq5LIwZjDsFXKEb1AJBuw
7SPNvwEA4FASf9u2jrbKz9HR0UAgUFlZubKyYrC6mpqayclJSUxMTJw5c8brXElUV1eLzVdVVVk3
Juzp6cnNzbVVbRZKq7bK6Tk5OdabhKWlpcLCwmAweP/+fWch/f398lJ6erq8KgFnZ2dbzz2KF+ha
siEYW2mYOmDb2DYAACTItm2ed+HChe3t7cHBwZaWFoOZzc7OlpeXS87S0tIXL154ndvc3Cy/SuLW
rVt660HJOTQ0pKYdm4d+vWS0s7NTThd3FINUB0WIr1+/LlGJ4zoLaWtrC4fD4s0S89WrV23nHtEL
dJbsFYyzNABsG9sGAICDse2XL19KYmtrKxgMek00VMfPnj1bX19/6dIlw7np6elKOm0F6if8rFU7
5zR7yaios+1gWlqaPui8uo2NDcO5R/QCnbbtFYyzNABsGwAAwPDFt4+2rQ+ah36F6elpybO5uenz
XNeDuxv69Xm6Ib+fcw/5BTpf8h8MALYNAABwMLa9vr4e2RkczcjIMCtae3t7RUXFtWvXDOcGg0E1
2hoOh9PS0nYto1KmWUbNY9u7s+1DfoHO/P6DAcC2AQAADsa2P//8c0kMDg52dHQYFG1hYaG0tFQc
saioSE9rdp57/vz50dHRiGMmsS4nOTlZTfNwrUU92CcGKQWaZbShoUHqnZ+fd523vQvbPvwX6Cw5
ajDYNmDbAAAAB2zbAwMDKSkpp06dUuO4EY9pzfX19U+ePJHE+Pi4ZPY6d2VlpaqqSrywurraukqG
rlokUk7xEkH1YF9aWtqNGzfMMrq0tJSfnx8KhZxLGfqx7aN4gc6SowZzGNZbBGwbAADg2Nm2q4wm
8tyj0u5vzLXokW8AbBsAACBxtq3GShN/7pHgTbrA7u5u/pAA2wYAAEi0bQMAYNsAAMAXH7YNANg2
AAAAtg0A2DYAAAC2DQCAbQMAAGDbAIBtAwAAJMS2k5OTb926RYsAALYNAAAQf9ve2NgoKSmhRQAA
2wYAAIi/bUd2hrf1UZoGALBtAACAeNp2UlISLQIA2DYAAMC+2HZ5efmTJ09oFADAtgEAAOJv27/+
+mtaWhqNAgDYNgAAQPxtu7i4mLFtAMC2AQAA9sW2eTgSALBtAACAfbdttBsAsG0AAIB42vbq6mpq
aqpKX7hwgaYBAGwbAAAgbradkpJy/fp1le7u7qZpAADbBgAAiJttAwBg2wAAANg2AGDbAAAA2DYA
ALYNAADYNq0AANg2AAAAtg0A2DYAAAC2DQCAbQMAAGDbAIBtAwAAYNsAgG0DAABg2wAA2DYAAAC2
DQDYNgAAALYNANg2AAAAtg0AgG0DAABg2wCAbQMAACTOtgEAEgm2DQAAx8u2aQUASOSHDrYNAADY
NgAAtg0AAIBtAwC2DQAAgG0DAGDbAACAbQMAYNsAAADYNgBg2wAAANg2AAC2DQAA2DYAALYNAACA
bQMAtg0AAIBtAwBg2wAAgG0DAGDbAAAA2DYAYNsAAADYNgAAtg0AAIBtAwC2DQAAgG0DALYNAACA
bQMAYNsAAADYNgBg2wAAANg2AGDbAAAA2DYAALYNAACAbQMAtg0AAHDEbXt7e/vwXOeugzlUV/Fm
9xEXi20DAABg2zFQXFzsM4L/C+Wv7Ecw1vKTk5MfPHiwl6uwFlVSUjI9PW27KPMl2wgEAoYq9q9Z
3nIjMZd89+7dpqamxLzXY31DLi8v19TUpKSkSL+0trZubGzsX2yuXe9KIqOKFenK4eFhbBsAACBB
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
e/asdlk9/BwMBqPa9traWkZGRk5OTnp6eiAQePnypc65vr6uygmFQhHLWLU6aB2rdrXtzMxM64wX
ZwbAtgGwbQAAOHS2PT8/n5aWVlRUJGb86tUrSYglW9ck+fLLL4eGhiTR3Nwc1bbb2trkoOTv7++3
TfVub2+/c+eOJFpaWuRgd3e3muGt5m1fvXrVWaYad1dLr3R2dkr65s2bc3Nzkjh58iS2jW0DYNsA
AHDYbVuYnZ2trq5O2aGqqkp+1UUJ9+/fD4VCZWVlKysrEcesDytq+RHJqU4vKSmRX2dmZtSrfX19
qampUr56ojEcDovHqzVGurq6rDXqwIaHhyUkJdaSX61JIkdqa2uto+Z0OrYNgG0DAMDhtW3/qFkf
eXl5sYaEE2PbAIBtAwBg21GoqqpKS0sbGxuL6Sw1ak7XYNsAgG0DAGDbgG0DALYNAADYNmDbANg2
AABg24BtAwC2DQCAbQO2DQDYNgAAYNuAbQNg2wAAgG0Dtg0A2DYAALYN2DYAYNsAAIBtA7YNgG0D
AAC2Ddg2AGDbAADYNmDbAIBtAwAAtg3YNgC2DQAA2DZg2wCAbQMAYNuAbQMAtg0AALEbFYAX2DYA
tg0AAHu1bRoBvN4b2DYAtg0AANg2YNsA2DYAAGDbgG0DALYNAIBtA2DbANg2AABg24BtA2DbAACA
bQO2DQDYNgAAtg2AbQNg2wAAgG0Dtg2AbQMAALYN2DYAYNsAANg2ALYNgG0DAAC2Ddg2ALYNAADY
NmDbAIBtAwBgVDQCYNsA2DYAAGDbgG0DYNsAAIBtA7YNANg2AABg24BtA2DbAABwLGx7e3v7MDfU
oQovMcFg2wDYNgAAxM223/orzlf3O5Li4uJ9uisYGxtLSUlpbW2NS3iJuT8x12JuK2wbANsGAIDD
aNv7JLtx8cu9kJyc/ODBg0Mb3qENBtsGwLYBAGB/bdv56traWm1trfhrTU2NpG35l5aWCgsLg8Hg
/fv31ZGVlZXq6mrJX1VVtbq6qkvr6enJycnRHmwdU///7d1RZJX/H8DxPzPHzGTMZLr46SZzzExk
usjMmMkkMzJdJWOSmS4iXSRJdNFFkkhmMt0kmUkiSZJuZv8kMyOTLiaRTGZm/48evh7nnJ3f+Wmt
+v1fr4uf757zPd/nec7Zj3ePZ+e8evWqq6srHmptbZ2amio/kpLnbn6/eh0/1tXVdXR0PHv2rOQU
0sr5c6y+YMmJVFykxlMrOZiZmZnGxsaenp54evV1anmtKr4d2VP27t37g12utkFtA7DTtT02Nvbh
w4cYPHz4cHx8vGT+8PDwjRs35ufns9QLo6Ojk5OTMYhuPnnyZFrt7NmzGxsbkY9RiiW7aG9vf/r0
aQzu378fvVt+JOXPjUHW5Y8fP067rn6O1RcsP5HyRWo/tfxOY2Y8Gk+MV7L6OrW8VhXfjnh0enr6
x+/tVtugtgHYztouuWm7YmK2tLSkR3fv3l2yWlNT0/r6en5Lc3Nzln1ra2v5dE7T/mnuV3zu4cOH
R0ZGIrVL9l5jbZcvWH4i5YvUfmr5RT5+/FjylK3WqeW1qvh2xKPb8meUahvUNgDbWds1xm5SV1e3
1fyKW8ovzVbcxadPny5dunTs2LH29vbqf6+Zf0p2M0ZU8tzc3D+t7VpejepHUv3Uan81yjdWP7yK
b8d23dWttkFtA7DTtZ0uvlZUfkk45mfXWWN7PFpLQR44cODy5cszMzPv37+vsbYzsaM7d+60tbX9
7Vmsra1VX7CWa9u1n1p+y5cvX7IDaG1trWWd6q9VxbdDbYPaBuBPre2xsbHl5eUY3Lt3r7u7u2T+
0NDQ5OTk27dv0+3OJ06ciG7e3OKm5Py4vr7+69evMWhoaFhYWIgeHR8fr7G229vbZ2dnY7DV3dJp
FzEh0nZiYqL6guUnkg4vzan91PJbzpw5E4NYPI6hlnWqv1YV3w61DWobgD+1tj99+tTf3x+119HR
8e7du5L5S0tL+/bta2lpSR/HsbKy0tvbG/P7+vrKP3CjJHALhcLm9z/4i3retWvX9evXa6ztV69e
FYvFurq62FGW3RXPImvxpqam27dvV1+w/ETS4eU/k6TGU8tvuXXrVqxz5MiR7CL3365T/bWq+HZU
Pwa1DWobgF9Q23i11TaobQDU9h8suyCttgG1DaC28buhtkFtA6C2UdugtgFQ26htQG0DqG1Q26C2
AfhzantbvkgctQ1qG4A/tbb/U2Yb99LZ2ZkNlpeX+/v7C4VCY2PjqVOnsq9o+UkePXrU0dFRX18f
e3/69Gn1f2C4xq+2QW0D8HNrewf20t3dffPmzY2NjbW1tfPnz58+ffon7XFubm7Pnj3Pnz+PcaR2
W1vb/Py8sFbboLYB+I1qu7+//+XLlzF48uTJ8PBwNm1mZqaxsbGnp2dlZSWbFoO+vr76+vre3t78
tyFevXp17969+YvlMSd/V0lTU1M2WFpaKhaLu3btevDgQbbl8+fPAwMDMT+OIcb5Nf/666/sO9ir
zDx27Njdu3fTju7cuTMyMpIWWVxc7OzsjKNNpyDB1TaobQB2urbn5+e7u7ujj/fv3//hw4ds2smT
J2PL5OTk2NhYNm10dDR+jMHU1FQ8mhacnp7O2jotfvTo0XPnzsX2km99j5S/ceNG7C7qPNsSi2d7
fPjw4fj4eFrz7NmzsWb2HexVZka4f/v2La2/urqayj4WiafEIvEPiThyta22QW0DsBO1XfG+7ePH
jw8ODl64cCFN+/jxYwzW1taiaLONzc3NWVXnN8bMdBk7rfb58+fI8UOHDtXV1bW3t6e7OyKF19fX
8wfW0tKSxrt3707rpGlpza1mlpxpqvN4KF2AjyNX22ob1DYAO1HbFSe8fv06OjVdJ85Py/dr9Y3l
i0eXX7t2rVgsbjUh3/2R5lXWrDgzoj92kSbH8eevbVc/WtQ2qG0Adqi2x8fHDx48eOXKlTTty5cv
WS63tramtM0uY6+vr1eM2jSOR/P3bRcKhbS95Np2ukZe8Wjz44ozR0ZGpqam0o+Tk5P5+7bfvHmz
+f1zCdN1cbWttkFtA7DTtb2wsLB///4I646OjnTf9pkzZ7J+nZiYyKadOHFiZmZms+y+7bROfX19
9mF/p0+fvnjxYvR6lG4UfF9fXzZhaGgoFnz79m3+vu3l5eUY3Lt3r7u7u0ptV5wZPd3W1vbixYsY
x39jPDc3l57Y29sbg+fPn+fvCPfLoLZBbQPwE2u7/L7twcHBLFgfP3585MiRbNqtW7cKhUL8mF3k
3vz+mSTRr5HUUc/5zyRJe4mYzi5jr66uRnA3NjbGj4cPH85uAd/8/pkk+/bta2lpSZ80Euv09/fH
mhH66U8qK9Z2xZnh2bNnnZ2dsb2rqyvG+ScuLi4Wi8WBgYF0CmpbbYPaBuAn1vZPmv/7W19fn52d
TTdwo7ZBbQPwy2o73Wn9r3H37t2GhoZ0TR21DWobgF9W26htQG0DoLZR26C2AVDbqG1AbQOobdQ2
oLYBUNuobVDbAKht1DagtgHUNmrbqwFqGwC1jdoGtQ2A2kZtA2obQG2jttU2qG0A1DZqG9Q2AGob
tQ2obQC1DWob1DYAahu1DWobALWN2gbUNsD/YVHBVtQ2qG0AfrS2vQhs9buhtkFtA6C2UdugtgFQ
26htQG0DqG1Q26C2AVDbqG1Q2wCobdQ2oLYB1DaobVDbAKht1DaobQDUNmobUNsAahvUNqhtANQ2
ahvUNgBqG7UNqG0AReVFQG2D2gZAbaO2QW0DoLZR24DaBkBto7ZBbQOgtlHboLYBUNuobUBtA6C2
UdugtgHYiaKCrahtUNsAbJv/whb83wFqGwC1jdoGtQ2A2kZtA2obAAB+E/8DOiU+nN21u+YAAAAA
SUVORK5C" />
</BODY> </BODY>
</HTML> </HTML>

View File

@ -0,0 +1,648 @@
<HTML>
<HEAD>
<META name="description"
content="Violet UML Editor cross format document" />
<META name="keywords" content="Violet, UML" />
<META charset="UTF-8" />
<SCRIPT type="text/javascript">
function switchVisibility() {
var obj = document.getElementById("content");
obj.style.display = (obj.style.display == "block") ? "none" : "block";
}
</SCRIPT>
</HEAD>
<BODY>
This file was generated with Violet UML Editor 2.1.0.
&nbsp;&nbsp;(&nbsp;<A href=# onclick="switchVisibility()">View Source</A>&nbsp;/&nbsp;<A href="http://sourceforge.net/projects/violet/files/violetumleditor/" target="_blank">Download Violet</A>&nbsp;)
<BR />
<BR />
<SCRIPT id="content" type="text/xml"><![CDATA[<ClassDiagramGraph id="1">
<nodes id="2">
<ClassNode id="3">
<children id="4"/>
<location class="Point2D.Double" id="5" x="270.0" y="200.0"/>
<id id="6" value="8ccad607-14e2-4eec-836e-b25f61cfa2ea"/>
<revision>1</revision>
<backgroundColor id="7">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="8">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="8"/>
<name id="9" justification="1" size="3" underlined="false">
<text>Assimpo::Exporter</text>
</name>
<attributes id="10" justification="0" size="4" underlined="false">
<text>aiScene* mScene;
IOSystem* mIOHandler;
struct ExportFormatEntry {
aiExportFormatDesc mDescription;
fpExportFunc mExportFunction;
};
</text>
</attributes>
<methods id="11" justification="0" size="4" underlined="false">
<text>const aiExportDataBlob* ExportToBlob( const aiScene* pScene, ... );
const aiExportDataBlob* ExportToBlob( const aiScene* pScene, ...);
aiReturn Export( const aiScene* pScene, ... );
aiReturn Export( const aiScene* pScene, ...);
</text>
</methods>
</ClassNode>
<ClassNode id="12">
<children id="13"/>
<location class="Point2D.Double" id="14" x="760.0" y="100.0"/>
<id id="15" value="c2ac589d-2d10-4a82-b77f-df3c3232086a"/>
<revision>1</revision>
<backgroundColor id="16">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="17">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="17"/>
<name id="18" justification="1" size="3" underlined="false">
<text>IOSystem</text>
</name>
<attributes id="19" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="20" justification="0" size="4" underlined="false">
<text>bool Exists( const std::string&amp; pFile) const;
bool Exists( const char* pFile) const;
virtual char getOsSeparator() const;
virtual IOStream* Open(const char* pFile,
const char* pMode = &quot;rb&quot;);
IOStream* Open(const std::string&amp; pFile, const std::string&amp; pMode = std::string(&quot;rb&quot;));
void Close( IOStream* pFile);
</text>
</methods>
</ClassNode>
<ClassNode id="21">
<children id="22"/>
<location class="Point2D.Double" id="23" x="780.0" y="390.0"/>
<id id="24" value="543d8402-9358-46ed-abd8-77935414c423"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="25" justification="1" size="3" underlined="false">
<text>ObjExporter</text>
</name>
<attributes id="26" justification="0" size="4" underlined="false">
<text>File contains function pointer:
ExportSceneObj</text>
</attributes>
<methods id="27" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
</nodes>
<edges id="28">
<NoteEdge id="29">
<start class="ClassNode" reference="3"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="30" x="130.0" y="70.0"/>
<endLocation class="Point2D.Double" id="31" x="120.0" y="70.0"/>
<transitionPoints id="32"/>
<id id="33" value="32e48b3f-86c7-427a-9d3b-9fa3af2a79f7"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="34">
<start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="35" x="20.0" y="70.0"/>
<endLocation class="Point2D.Double" reference="35"/>
<transitionPoints id="36"/>
<id id="37" value="8b7d1b44-5b84-4bdc-b723-096126d300a4"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="38">
<start class="ClassNode" reference="3"/>
<end class="ClassNode" reference="3"/>
<startLocation class="Point2D.Double" id="39" x="190.0" y="80.0"/>
<endLocation class="Point2D.Double" reference="39"/>
<transitionPoints id="40"/>
<id id="41" value="ac092bcb-c3bb-4ac7-bc77-879556396f91"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="42">
<start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="43" x="370.0" y="80.0"/>
<endLocation class="Point2D.Double" reference="43"/>
<transitionPoints id="44"/>
<id id="45" value="3d0ad2f3-6f05-491d-b8c8-961212d7a0c9"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="46">
<start class="ClassNode" reference="3"/>
<end class="ClassNode" reference="3"/>
<startLocation class="Point2D.Double" id="47" x="50.0" y="40.0"/>
<endLocation class="Point2D.Double" reference="47"/>
<transitionPoints id="48"/>
<id id="49" value="e8d16ba4-8036-4f77-81ad-aee4e11adbfe"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="50">
<start class="ClassNode" reference="3"/>
<end class="ClassNode" reference="21"/>
<startLocation class="Point2D.Double" id="51" x="300.0" y="250.0"/>
<endLocation class="Point2D.Double" id="52" x="20.0" y="40.0"/>
<transitionPoints id="53"/>
<id id="54" value="c9fa9dbf-f219-4363-9f26-aeea21492a1f"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="55">
<start class="ClassNode" reference="21"/>
<end class="ClassNode" reference="21"/>
<startLocation class="Point2D.Double" id="56" x="60.0" y="90.0"/>
<endLocation class="Point2D.Double" reference="56"/>
<transitionPoints id="57"/>
<id id="58" value="a1addbce-8d05-4a56-9289-d885dedc75c2"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="59">
<start class="ClassNode" reference="21"/>
<end class="ClassNode" reference="21"/>
<startLocation class="Point2D.Double" id="60" x="60.0" y="70.0"/>
<endLocation class="Point2D.Double" reference="60"/>
<transitionPoints id="61"/>
<id id="62" value="2155dc70-7a87-4d23-a8f3-7798f7931872"/>
<revision>1</revision>
</NoteEdge>
<NoteEdge id="63">
<start class="ClassNode" reference="21"/>
<end class="ClassNode" reference="21"/>
<startLocation class="Point2D.Double" id="64" x="80.0" y="60.0"/>
<endLocation class="Point2D.Double" id="65" x="140.0" y="40.0"/>
<transitionPoints id="66"/>
<id id="67" value="5473f8fb-4b83-475c-bb59-6c60b45f5948"/>
<revision>1</revision>
</NoteEdge>
</edges>
</ClassDiagramGraph>]]></SCRIPT>
<BR />
<BR />
<IMG alt="embedded diagram image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA88AAAGfCAIAAADu+HdKAABikklEQVR42uy9f0Rk7f/4/2JkZGRe
McZIbolkjJFERm4riSRZK5Gs9ZIVSUbWLdbKWsmS23pJEivJSpasJCtL1kqSm/RZuWVFkrWSSFYy
Mt/ndy6v633u82vO9GP6sY/HH7k6c53rep7rzJzzONe5zrn+lQYAgDvIvwAA4Lbyj8M1ZywAgDtq
2zQCAMDtPz5zsAYAwLYBAADbBgAAbBsAANsGAABsGwDgVz4+/7//gW0DAGDbAACAbQMAALYNAIBt
AwAAtg0AgG1j2wAA2DYAAGDbAACAbQMAYNsAAIBtAwAAtg0AgG0DAAC2DQAA2DYAALYNAADYNgAA
YNsAANg2AABg2wAAgG0DAGDbAABwd237XxlUen19vaGhoTBDY2Pj169f1fLDw8Pu7u6ioqKCggL5
29bWtr297b2K1dXV+vp6dhYAYNsAAPDr2vbff/8tkl1TU3OQoba2VsR6a2tLPmptbZU8Gxsbkl5e
XpZ0RUXFxYQeAADbBgCAX9G2nzx5IolPnz6p5cqqZaGkCwoKJD0yMmJcsaqqShZ++/ZN0js7O5KW
Jevr63V1dZJfxL2+vn5vb8/v9//rf0jO8/Pz/v7+QAZJpFIpHcP09HQikRDFHxoaGhsbKy4uLikp
WVhYYC8DALYNAAB33raDwaAkxIbVcknIv+K+khYJVtnEp1dWVlSG58+fy5I3b95IWv5KenBwsKys
TBJHR0cbGxuSqK2tTf+zb/vFixeSfvfu3fv379UqOsPAwICyduHZs2fb29uSKC0tZS8DALYNAAB3
3rZ9Pp+pNPm3oKBAEnt7e9FoVHdRP3z48MePH58/f5a0GpDd0NAg6a9fv4qdKyl/+/bt6empqQqh
pKRE0mdnZ8rmxc51BpVfpU9OTlRaomIvAwC2DQAAd962lSiLB6vlktB92+lMV/d///vf3377TeX/
/fff1Spiw/v7+/K3vLxclszOzqo+ciEUCr1//95k28rpNUqmjRmc0gAA2DYAANxh21bjtj9+/KiW
Ly0tyb+PHz82Zk6lUqOjo7rPu6OjQ3V1q7EfOs/8/Px//vMfLetGaY5EIsbxKu6GjW0DALYNAAD3
xLa3trZEjuPx+Pfv33/8+CGJQCCg3kkiacmzuLgo6ZWVFUk3NTVJemZmRvdSr62tpf83wvuvv/6S
QiRRWVmZ/l+vuRooMjAwIOnJycmvX79K4sGDB9g2AGDbAABw/21b2NzcbGxs9GdoaGiQf9Xyvb29
jo4ONW5E/nZ1dR0cHMjyo6MjNTJEvxBQJLutra2wsLCgoOD3339Xsj43NycFKrFOpVLqnSSypLm5
WfJj2wCAbQMAwL217Qtzfn5+fHxcXl4uMegXlQAAALYNAIBtXwHBYNDv91dWVr57944dAQCAbQMA
YNsAAIBtAwAAtg0AgG0DAAC2DQAA2DYAALYNAADYNgAAYNsAANg2AABg2wAAgG0DAGDbAACAbQMA
ALYNAIBtAwAAtg0AANg2AAC2DQAA2DYAAGDbAADYNgAAYNsAAIBtAwBg2wAAgG0DAMBVHM0BAOB2
gm0DANwH26YRAABu5/EZ2wYAwLYBAADbBgAAbBsAANsGAABsGwAAsG0AAGwbAACwbQAAwLYBALBt
AADAtgEAANsGAMC2AQAA2wYAAGwbAADbBgAAbBsAALBtAABsGwAAsG0AAMC2AQCwbQAAwLYBAADb
BgDAtgEAANsGAABsGwAA2wYAAGwbAACwbQAAbBsAALBtAADAtgEAsG0AAMC2AQAA2wYA+FWO5gAA
cDvBtgEA7oNt0wgAALfz+IxtAwBg2wAAgG0DAAC2DQCAbQMAALYNAADYNgAAtg0AANg2AABg2wAA
2DYAAGDbAACAbQMAYNsAAIBtAwAAtg0AgG0DAAC2DQAA2DYAALYNAADYNgAAYNsAANg2AABg2wAA
gG0DAGDbAACAbQMAALYNAIBtAwAAtg0AANg2AAC2fZOcn5/flRiuJNTbsL18HwCwbQAAuHrbvqR2
W1f/l4UL6H5VVZV7ve/fv+/s7LzWJsoag0u2XFv1SgpRfPr0qbS0NBQKzc/Pe9+J1v3l5Rsiu2Bu
bi4PX1eP+wIA2wYAgF/Ctq8wPFtSqVRFRcXh4WF+mugC2XJthCu81SCqvb6+vrGxUVJSciW1u3wq
uyAajcruyNvXFQDbBgCAu2fb3759q6qqamhoODg4UAsl0djYWFBQIAu11Nou9GjbTU1Nq6ur6UzP
a3t7uzHb4uKilOnz+eLx+OfPn9OGrlbbT4WJiYlnz56ZqtjZ2YnFYsFg8MOHD+4Bj4yMlJWVyfKP
Hz96iUHjnk2qk4oKCwvfvXvn0kPsXogKr7y83LSuNWbZovr6+lAoNDY2ZozT7/efn5//+PFDtNt2
vy8sLAQCAVlX7273CwadODo6am5ulhhkb0paLezv75fdkbd9gXYDtg0AAHfPtnt6esTPxIa7u7vV
QklMTU1JYnp6+unTpy4LPdr25uZmIpGQWmpqavb3943ZRK2kQEksLS0py8z6qTifNm+NSLx4p1Sk
szkFPDAwIJGI3knhXmLQuGeTZpyZmZGSk8mkixS6FyIJVYhpoTXmvr6+N2/eyEJJGKvr7OwcHByU
yycp33a/S1PIWtIyEnBOti351b6bn5+XbVQLZUe0tLTkf18AYNsAAHBnbFv3NRYXF+uEEr6zs7Ng
MOiy0Pu47cePH7e2tr58+dK0oriaCKKolXFAgvungUBAYjDVW1RUZBrS4BSwzuYxBo17tnA4rKo7
Pj52sUP3QiShnwg0LrTGHIlEVCMcHR3phXt7e/F4vLS09Nu3b077/fv379Y2sfblW207FArpT6V2
lZBypOXzvy8AsG0AALgztq0X6v7Fiy10F6P19XVZ6/T01JRNXF+NMRBF29jY8PKpz+dz2SLbJbYB
e4xB455NV5HONtbZpRB3381a3YMHD+bm5paXlx89erS7uzswMJBrm7jUbpRy4y4wRpK3fQGAbQMA
wJ2x7a9fv6YzL1nTnZfBYFD1RKZSKd1zabvQu20nk8m6urrXr1/bZpOSJycn9YN97p9K7V76trMG
nFMMWbNFIhEVwMnJSVY7dCrEu22Hw2HVCMbqRFLVJr958+a3336TKqx75/j4OJ3pY5YScrJt3Sdt
xGPf9jXtCwBsGwAA7oBtNzQ0SOLLly96MG5XV9fCwkL6n6NsbRd6tO3t7e2amhoxs3g8bhq3HY1G
FxcXJWEavCsS6fRpa2urfqhO09bWNjU1tbW1pQf7Zg3YYwwa92zSeup5wT/++MPFDt0L8W7bUp0o
dTrznKLuaZbrmf/+97+SmJmZKSwsrK2t1Y8z6tXVA6bSVrJiTrbd09Ozt7cnidnZ2UQioRYuLS3J
7sj/vgDAtgEA4M7Y9rdv32KxWHNzs+r1TP/v9RqiOI2NjcZ3klgXehy3LUK2srKi5Ozhw4fGFdfW
1qR28UUpWWmW0jW/3+/0qUhtb2+vqd6dnZ3KyspQKKRFPGvAHmPQuGdTr+yIRCIimi7vJHEvxLtt
S3WydcFgcHR0VMRaN4Jc1UjJ8nd9fX14eFgrtV5dWk/qkr2gd7dH25Y2bGpqksLlkunvv/9WC2VH
2L6T5Jr2BZ3cgG0DAMAds+27SCqVKi8vV0/7wezsbH19/Y3sd9kFsiPy8L5tje4XB8C2AQAA275G
8jCX5C2np6enqKjI7/f//vvvaoCHF0y99ZfkyZMn+ZlLUjM4OMiPF7BtAADAtgEAANsGAMC2AQAA
2wYAAGwbAADbBgAAbBsAALBtAACO5rfbtvXs5b94DHcCGgoA2wYAAEfbvqR2e3zfdq66X1VV5V5v
Ht5JkjWGy7ReIBDw3sLWxvSy+6R98vPCEC8NBQDYNgAAtn1ltn2F4dmSSqUqKir0JCnX3URXa9vN
zc3JZDIUCsnfpqamS1bh8qm0TzQazcPLsBmVBIBtAwCAm21/+/atqqqqoaHh4OBALZREY2NjQUGB
LDTOJWld6NG2RStXV1cl8enTp/b2dmO2xcVFKdPn88Xj8c+fP6cNvbm2n6Yzc0mq6ceN7OzsxGKx
YDD44cMH94BHRkbKyspkuZ7p0D0Glyokw/v374uLi42lra2tVVdXy5JwODw9PW2st7y8/OTkpLe3
NxKJ9PT0mC4YJM/CwkIgEKivr9f7wuNEj2omS6lUmlrP1t7f32870eM1NRTaDYBtAwCAja6J9p2f
n4sNd3d3q4WSmJqakoTIop69z3ahR9ve3NxMJBJSS01Nzf7+vjGb2JtS0qWlJZFRUyG2n4pWavPW
iMSPjY1JRTqbU8ADAwMSiRikFO4lBpcqbEuLRqPLy8uSmJubE6nVOWdmZiTn3t5eXV2d/JUG2d3d
NTWdxCl5JGzZKTnZtuRXDTs/P59MJtVCaaWWlpb8NxQAYNsAABzN/0/XdHdmcXGxTqhH387OzrQv
2i70Pm778ePHra2tL1++NK0oOtjZ2Sn2Zhzz4P5pIBCQGEz1FhUVmUZNOAWss3mMwaUK29Kc2jnr
04SSR01HbwrY2tFute1QKKQ/jUQiKiHlSMz5bygAwLYBADia24zb1l2YF1vo7l7r6+uy1unpqSmb
uL4axiAWuLGx4eVTn8/nskW2S2wD9hiDxyqMpQ0NDXV0dESj0ZzGx3tsYdvdZ5RyY/vocvLZUABw
lbYNAJBnOBBfuW1//fo1nXmPm+4fDQaDqrMzlUrpzlHbhd5tO5lM1tXVvX792jablDw5OVlSUuLl
U6ndS9921oBzisGpb9uarq2tHR4eXlhY2N3dzdW2j4+PVR9zOBzOybZ1n7QRj33bV95QAHDFtk2j
AED+HRGu0LYbGhok8eXLFz3et6urS2Qx/c+BvLYLPdr29vZ2TU2NyF88HjeN245Go4uLi5IwjQ8+
OTlx+rS1tVU/t6dpa2ubmpra2trS44mzBuwxBpcqbEsrLCyU7ZWNlfbM1bbV059SS39/f0623dPT
s7e3J4nZ2dlEIqEWLi0tSVvlv6EAANsGAGyblvzHO0lisVhzc7PqWE1nXlIhCi4W1djYaHwniXWh
x3Hb4nwrKyvK/x4+fGhccW1tTWr3+XxSsjI5ZYR+v9/p04mJid7eXlO9Ozs7lZWVoVBIi3jWgD3G
4FKFbWnz8/NipcFgcHR0NFfblk2TSqWJ9L7waNuygU1NTRK/XM/8/fffaqG0ku07Sa6pofh5AmDb
AIBtw31oyVQqVV5erh4oZKc4Ie0jrZSH921rdL84AGDbAHBPjkHwy1635GEuyfxj6kq/JE+ePMnP
XJKawcFBflkA2DYAYNtwH2wbAADbBgDAtrFtAADAtgEA28a2AQAA2wYAwLaxbQAAbBsAANu+V7ad
dcrxW86di/82B3zXvwwA2DYAALZ9k7Ztu7yqquo6bD5vZxBj/B8/fozH4wUFBbJweXnZfcW9vb2m
pia/3x8IBHp7e/M2h0tODa5ezyLk5w0kF/gyAAC2DQDYNrZ9xVp8q2xbV7SxsVFaWvrlyxdJi2qX
lJRsbm66rJhIJMbHx8/Pz8/Ozl68eNHX13fb9k4qlaqoqDjMEI1G8/B2bc77ANg2AGDb4NWZKisr
1XTf+/v78Xg8/c9JCkdGRsrLy41TQjrNL1hdXV1QUBAOh6enp52cbGdnJxaLBYPBDx8+6Dzv378v
Li6WdfW8hk6lqWCMBYpf1tfXh0KhsbExXd3R0VFzc7Os3tTUJOm0YW5LSXd0dLx7906XMDk5qV/a
vbi4KGv5fD5ph8+fP6uFssQ4cKKoqMipFlXRwsJCIBCQqA4ODjxujjWDMWApp7GxUT5taGgwzvKo
V5+YmFCTvQv9/f22M0eamt2lzLKyMuO+sLaJ05cBALBtAMC2wca2tZ+Jdz5//txk2zMzM8o1bacf
1+loNKqGZMzNzYnVOdl2e3u7aPHm5qaWZskzMDAgVYjeidW5l6aD0fT19b1580YWSkJX19PTI1cO
6cz06clk0hSMFHh6eqpL+PnzpxZoCUDJ7tLSko7w0aNH0ixStZ4L3b2Wp0+fSjxTU1OSwePmuLde
d3e3lCYJiU3P1GhcXaRfXxtIoqWlJWuzO5Vp3Re2bcJ5HwDbBgBsG7za9qdPnzo6OtKZTt+1tTWT
WGu7dbdta7G2n4rXmsY5SB69JGtp1ofzIpHI2dlZOtPTrHOGQiFjhqxRabMUT+3s7BStNAYpJYuP
PnjwwOfziRbrYSdOtajJ5CUq7c3eN8c2zuLiYpXTWKZx9UAgoBpB5dEXDy7N7lSmdV/YtgnnfQBs
GwCwbfBq22JdShwrKiq8iLXtwsPDw6GhIfF18VEXr3VfkmtpRlE2RagRRTZ9KnKp3VQ4PT3Veir1
qvEVsmRjY8NUl6z15s2bWCzmpRZjbFk3xz2DbZnGhbp2a5t4aXbbMo37wtomnPcBbott7+7u6iPR
1tbWBarJw+/5XxauvIrV1dX6+nq+NwDY9u207XSmV/vPP//s6urKybbFPnW6trZ2eHh4YWFBHfmd
nMy2b9ua9liaEA6HlTqfnJwYfdplYzs7O/XgaWFqakqP21bI5cfk5GRJSYmO2dgJ7ff73Ws5Pj5W
jSOxedwc9wxSkQpAmk5fGBhXl4W59m1nLdPU2qY2wbYBbottz8zMaIVV48Nu58Zc91EjP5cNANg2
XNi23759K2njk4tWqSooKFAvv1OP0Il+9ff36wyFhYXb29uieslk0sWP29ra5HSwtbVlOwI419IE
yfDmzZt0ZvS57uLt6elRz33Ozs4mEglT/F+/fhVrXFlZkbT8lbTuso1Go4uLi+nMKwJ1j29fX9+r
V6/EoWWTX79+3djY6FKLBKkeWJTNlJA8bo5tBh2wXAWJiKctY6z16q2trfqhxqWlJfk3a7NnLdM4
It/aJjo2ALhh25Yfs3wkP3v5+/jxY7VwfX29rq5OfqhycKmvr1eHKtuFxkeeBTkiyOFMLsGHhobG
xsaKi4vlEKkOFirD+/fv5WJd8vz48UPVJYc8yR8IBAYGBkzia01o5Hgkh+zq6mp1NV9VVSX/ysJc
a2lqaqqpqfH7/cZec3V+CmSQhOpsMObn6wWAbefftuWAJkdg65hd4+FRjE116yrrkuOecnT16fz8
vGiZHB5HR0dd/HhnZ6eysjIUCmk7tDU8j6WlM4OqGxoaVE45g6iFh4eHckSVIOPxuH60UcefzjxK
KMd2ySCHev18YTrzbpBYLCbHfPlIKWY68xilCLcctGX1lpYWNSzbqRYJcmJiQnI+fPhQdXJ72Rzb
DDrgg4MD2UapSETf+P4QvbrU2Nvbq9KSsH0nianZs5ZpfNuMtU10bPQlAdywbcsBSD6S37b81cMB
y8rK5F85Pm5sbEiitrbWaaFJiMVl5Xih0iK429vbkigtLdUZ5GgoRi4JdTP01atXkh4fH1fnA3F0
j7YtvHjxQh0x//zzT0noh/RzqkWuBNQhzFiFKvndu3di7ZIYHBy05gcAbDvPtn0PmJ2dvQ1j9m6k
SeUyqby8/HsGSeThfdsa3S8OADdg2z9//pTlgUAgnXn2Wcl0OjN6TNJVVVWip/odTLYLTUKslqu0
uoGlH0zRGdQgQjUETURc0mcZJKFHm1k3xjpuW1aRy4NwOCzxV1ZWqvFw3mtROY29RLqJJIPKf35+
Lgm5zLDmBwBsG9v2SE9PjxyN/X7/77//ru6L3iy6+zzPqLkknzx5kp+5JDWqzwgAbsa25+fnZXlb
W1s6c8tJjwicnZ0NBoPKL0OhkBwgnBbadj/bpk0L1cAy+Wtd6GTb1uXDw8O6T922apdaTGUa/5XL
A+tj7AzsBsC2sW0AAMjNtkVSTX3GeqarVColLv6f//xH9xDbLszVto+Pj1UHs3qVle5FVgtVL7JH
2z46OgqHw7JKcXFxIBBQo/S81+Ji25FIxPqOVWwbANvGtgEAIDfbrq+v1/3ZaozygwcPJJ1IJCT9
119/icJKorKy0mlhrradTCZnZ2cloabvGhwcVGOv1Yjq4eHhtOdx22pOspmZmfHxcUnINcDFalGo
cTJqJIy6CJmcnPz69atuE2wbANvGtgEAIAfbPj8/V0MsDg4O5N/9/X01ykKWi0+3tbUVFhbKv7//
/rt6D7ftwlxtWz2Q3tDQoJ41TKVSf/zxh3r7x4sXL2xXSduN21avH1FPagrV1dXyr3p8M9daFHNz
c36/X4m15FfvJJElzc3Nxl5zvlgA2Da2DQAA6Vs4l2Q+58Fh9wNg27+mbdtOM55PbjyAuwXNBYBt
XyX+DPejFgDAtm/ctm2XV1VVXb5845KPHz/G4/GCggIpeXl5WS/f29tramqS420gEOjt7dWzqFwg
gFxR79Gy4hTq5VHvErmObfHSXBc+fTs1lG0V1tma3d+hDgC30bYBANuGK7TtqzIzF9ve2NgoLS39
8uWLpMVfS0pKNjc31UeJRGJ8fPz8/Pzs7OzFixd9fX15MLPm5uZkMhkKheSvuL7xI5dQL0kqlaqo
qLimmRa8NNcFmtSloS5QBf4AgG0DALZ9/227srJSval6f38/Ho+n/9n1ODIyUl5ebuybdJpxsLq6
uqCgIBwOT09PZ7Xtjo6Od+/e6eWTk5O6i1c95KM/Mr6lSgegokpnXiEl/ieriPmpWR1cghGJDwaD
xcXFHz58+PTpkzi0moVePj05Oent7Y1EIj09PSb9dQlVTUwWCATq6+vVc0pOIamYy8rKdI3pzByQ
+m1dOzs7sVhMwlNvF0hnpntsbGyU/PpJIadyFhcX5V+fzye7T02NaepLdqpCTZAsDWIszan1VJu7
NJRta9gagrVv27bRADjTYdsAgG3fB9vu7+9Xc32LR+qpc3WGmZkZ5b62d/91OhqNqiEWc3Nz4nNZ
bVvy6LnM0pkJ0fQLYR89eiRhSL16OnSroumoxPnkIiGdmeQhmUy6B9PX15dKpcSzE4nE8PCwlKBm
oU9nhq/U1dXJX/lod3fXWK9LqFLm06dPpZypqSn1oiqnkNTsDcYa05l+Yj1vfHt7+9jY2ObmprqK
ELq7u6VYSYjy6ikbbcuRhNLipaUlvbq18a1V2Jbm1HqqzV0ayrY1PNq2baMBcKbDtgEA274Pti32
2dHRkc504q6trZlkSHczu9u2u0t5+Ujb3tHRkUjbgwcPfD6fmJ8etmEblZr6QBGJRNyD0UPATdP9
emkl21DlI/VqqbOzMy2mtiHZ1hgIBNRcxelMF75pRuHi4mK1mcbCbctpaWnp7OwU1TaWYA3bWkXW
drBtc5eGsraGddC27dcg634EwLaxbQDAtu+qbYtFKdepqKjwIta2Cw8PD4eGhsTXxY+92LbYmBZN
4fT0VHcYayTDmzdvYrGYewCm2Xm9BJP1gsGIS6jGdY0Kbg3Jtkb9aTrbE6XGwm0bX405kcA2Nja8
FHj5Xel+WWIbsMt3ybbRADjTYdsAgG3fB9tOZ3q1//zzz66urpxsW82hq9K1tbXDw8MLCwu7u7te
bLuzs1OPCRampqb0YGhRRmM3qn4ZlG2xug/VSNZgcrJtl1DVBMOqKcLhsEtItjXKlrr0bUs5qh1k
ua3fmyKXzJOTkyUlJU7bZdu3bU173JW222htDY+2bdtoAJzpsG0AwLbviW2r2XCND89ZVamgoECN
xFBP1Inb9ff36wyFhYXb29uiWclk0ottf/36VbxwZWVF0vJX0rpTtq+v79WrV+JtUsXr168bGxtN
ARiL7enpUY94zs7OJhIJj8HkZNsuocq66jFHUXBpDZeQbGtsbW3Vzya2tbVJIVtbW3pQtVz8iPKm
LeO2reVEo9HFxcV05k2FxsHceuSMUxW2pXnclbZfJ2treB+3bW00AM502DYAYNv3xLZ//PghcmYd
wms8vIurqW5mpXRFRUXK0dWn8/Pz4nzBYHB0dNSLbQufP3+uqqqSoqqrq/XDgunMY4gi3GrO3ZaW
FjUU2BiAsZDDw8OmpiYpJB6P66cqswaTk227hCrrTkxMSFQPHz5U3bpOIdnWKOv29vaq9M7OTmVl
ZSgU0v59cHDQ0NAg5cj1hvGdJNZy1tbWYrGYz+eTzEq7jc2lsVZhW5rHXWn7dbK2hkfbztpoANg2
vwcAwLbvsG3DjTSgXN6Ul5frywm+TiZ0jz4AZzpsGwCwbfToV+TyEwxf31ySd7E1TAwODvIdA850
2DYAYNvYNgAAYNsAgG0Dtg0AgG0DAGDb2DYAAMdns20DAOQTbBvbBgD4tWybRgGAmzoGwT227ayz
hQMAYNsAANg2tn1Bqqqqrm8rAoGAx5zV1dXj4+P634mJiZqamrw1sirB/cXVtpk7Ozvn5ub4ngNg
2wAA2Da2ffEIL7AVzc3NyWQyFArJ36amJi9VVFRUqNl/5G9paan3Si/fyIWFhfpv1sKNmQ8PD6PR
qGm2dgDAtgEAsO27ats7OzuxWCwYDOpJ4A8ODhobGwsKChoaGowTIo6MjJSVlalJ4NXCxcVF+dfn
88XjcTVfox6m716FZHj//n1xcbGxtLW1terqalkSDoenp6eN9ZaXl5+cnPT29kYikZ6eHh2VzrOw
sBAIBOrr6yV4vfDx48dqHnWJs7OzU0dlu4FqGkhR3nfv3umcR0dHYvmSU/xe0t5btb29Xf52dHSY
tkKlv337VlVVJdWpaE2Z+/v7JyYm7srFFQBg2wCAbWPbWbxwbGxsc3NTuaDQ3d09NTUlCVFePTWg
1DswMHB+fq4mgVcLJaG0eGlpSa9ujdBahW1p0Wh0eXlZEnNzc6LmOufMzIzk3Nvbq6urk7+JRGJ3
d9fUJhKn5JGwxcX1Qontjz/+kLTUJf6qA7PdQFlRVZRMJnVOWbi/v5/OTI0uy02VmnDfa6pwlZZi
Jb26uiqRWDPLdUtLSwtfdQBsGwAA274Ptl1UVGQat1BcXKy88OzszGi9OpuOQaSws7NTVNtYgjVC
axW2pdlupiSyPnYpedRU6qaAt7e3a2trJS2CLq6vy7TdwHA4rBYeHx/rnKFQSNcSiUQus9f0Vkha
d6hLJNbMEpW0GF91AGwbAADbvg+27fTQnkJ3PBsX6rRYoxqSIXa4sbHhpUD30oaGhjo6OqLRqNG2
c9oEU8Di0D9+/FDPVtqWaeynt3V9jc/nu5JGtq3dhNNyAMC2AQCw7Ttm29aO52AwqDpiZbnuZHXy
xXTmlX+Tk5MlJSVOEdr2bVvTtbW1w8PDCwsLu7u7udr28fFxOtMrLHptXLG9vb2rq6utrc1YlO0G
RiIRFeTJyYkxp0ulOY0kMaa/fv2q2s3Yd66hbxsA2wYAwLbvj22LiU5NTW1tbelB1aKn6uFC07ht
awzRaHRxcVESpsHcIqzuVdiWVlhYuL29La5pHDnt0bafPXsmCamlv7/fuOLo6KgY7cjIiLEo2w2U
StWziX/88Ydx3Pbe3p4kZmdnE4nElew1STc0NEjiy5cvprHgiqWlpdbWVr7qANg2AEBuxyCF7rT7
97//rZZIgiU5LbnaXbOzs1NZWSlKqt8Not7OIdLc2NhofCeJ1R3X1tZisZjP55PMSruVW/v9fvcq
bEubn58XfQ8Gg6LIudq2iLJU+vDhQ9XJrVf866+/JCFeayzKdgPV60cikYgou3FwS1NTk+SMx+N/
//33Vdn2t2/fpN2kOh2tkd7eXt5JAoBtAwBc6hgEV+JtcP/a5Pv37+Xl5Xrgje56BwBsGwAA28Ys
bwZTV/qd5smTJ8a5JAcHB9m/ANg2AAC2jW0DAHB8xrYBANvGtgEAANsGAGwbsG0AgPts2/rTvb29
pqYmv98fCAR6e3tNL3W6WtTsA7mSzwgBANvGtgEA4ApsW5NIJMbHx8/Pz8/Ozl68eNHX13cdwTU3
NyeTyVAoJH9FnXNaNz8RAgC2fZ9sO+tc6HCB5rqSVmXXsCPuevv/yg3raNtra2vV1dUFBQXhcHh6
etp0NJflxnbRL8rd2dmJxWLBYPDDhw9qiXpTqeQXXZa0LmdkZKSsrEyW69esWnOenJz09vZGIpGe
nh796lNdgsi0VFRcXCx1ffr0qbS01FhafiJM058EgG3fMts2HpTk8BWPx+WoVVVVtby8rJc73f2T
bNcdp9PtSqdQL8/79+87OzuvY1s8NpdttlzPHVdSiEKdMUOh0Pz8vPdvl3V2zJzefX6t/Do7QsRM
5Ef/OzExUVNTk88L8jvRsOonr9a1LcG60JhZ1tXv/zGmr8W2o9GoOt5JNXqKWv3po0ePnj9/PjMz
Y3qrf3t7+9jY2Obmpp4YTER5f38/nZmeQE+OJeUMDAyIDRunGbPmlPNBXV2d/E0kEru7u6a4+/r6
UqmUfFnl0+HhYVNp+YkQALDtW2vbGxsbci5XE7jI8bykpEQOfeojp7t/16pNLrcrXUK9JHKaqKio
MPXXXHmbXyBbrk19hbtGmnp9fV3aXNr5Smq/cdv+pXaEfJ/Va9flr5TgPZ7r2023qmH1T76wsDCd
mYnWS13GzLKuOLBqZGP6Wmzb/SB+dHT09OnTBw8e+Hw+iUMfFouKikwxyYFVpyORiC5HZ9Nl2uZ0
iVt3xtiWduMRAgC2fbO23dHR8e7dO51hcnJSd/Ha3v0z9lyq+3uqV8L2tp7T/U+Xu44utytdQpUy
FxYWAoFAfX39wcGBPsJ7vCc5MTGhJm9P293blAIbGxslf0NDg3F2TGs5i4uL8q+cUOLx+OfPn03N
pXHPpuaqlDO6bKxLD7F7IcZdY1zXGrNskTSanLnGxsaMcfr9ftn7P378kL1j+0WyNrh3N7DuFyvs
iMvsiMePH8tyFZ7uwXVqQ9st9bibbLn9Dat/8u3t7erYYixBF/vt27eqqiqJVrWtKXN/f7+et9WY
vvAlgaNtyzYMDQ1JxaKqLneLzs7O3rx5Iz8bpwzGe0/SstZsxsKtOb1cAzmlbzZCAMC2b9a2xWZO
T091hp8/f+oxdU53/4yFyKfKyG1v6znd/3S56+hyu9IlVCnz6dOnUs7U1JREohZ6vycpVqFO52m7
e5vd3d1SrCTkgkHPzmhbjiTURcXS0pJe3XpCcc8mYatWlZhdTtvuhRh3jXGhNWbZF3L6k4WSMFYn
ijY4OCiqIeXbfpGsDe7Rtj3eAWZHXGZHSEh//PGHpKUisUBdoG0b2m6py276l4U717DGn7xp04zF
SqiSXl1dlXazZpYSWlparOmr79uura2VA6VcP8kx0fqLkuOgsV9Ez9dl7TnWR+Gsrmyb88K2feMR
AgC2fbO2bXum1J1btnf/jOvqQ2jW23rGtdzvOno5pJtClY++f/+uuk70Qdj7PclAICArOh3/i4uL
1WYaC7ctR0634kYiB8YSrGG7ZwuHw6q64+NjlzZxL8S4a4wLrTFLy6htl91tfKVYPB4vLS399u2b
076wNritflm/aR7vALMjLrMjtre3xdDSmfFg8svVBdq2oe2WXuZG/e1vWONP3tSexmJ197+0mzWz
lKAv+I3pq7ftwsJC2aNSh/ECRSfkMuLVq1fSmhL669evGxsb1fK2tja5tNra2jKOipavlCRmZ2fl
m+HisrY5L2zbNx4hAGDbN963bTzrnJ6eWs8ZTnf/TMdA6229rPc/3e86mnAJ1biuUcE93pM03od0
ejTKWrg1g2yvuk0vgW1sbDgV6J5NV+HeJu6FuPtu1urkEmtubm55efnRo0e7u7sDAwO5ton7BZ6X
O8DsiEvuCJHaHz9+qAeObas23gqwDfLCN+pvf8M6bZHTEclYiO0Fv0ueK7Dt+fl5OYbKEXB0dNS6
tT9//hSdlT3t9/vlGkVdfqUzg7EqKyvlssk4qqapqUkClWs4fcvS6SdkzXlh285bhLyTBADbvp22
3dnZqUdUC1NTU3owtNPdP9tzm+1tPff7n7natkuosu7x8bG6MBDJcAnJ6T6nS9+2lKPaQZbb+r0p
csk8OTmpn2lz2i6nbJFIRAVwcnKStU2cCvHuItJcatuN1ekh+3KV9dtvv0kV1ma0NrhH2/Z4B5gd
cckd0d7e3tXV1dbWZmp8axvabqnLbso6kuT2N6zxJ+9yfPj69auKwdjTfwN92+ARPToKALDtW2Xb
cjqRM9nKyoqk5a+kdTeS090/MQA1FMR4LrC9red+/zNX23YJVdZVzzyJgvf397uEZFtja2ur7lux
3tsUZVEPnJmGC1vLiUaji4uL6cybCo0dh6ap09yzSVupx63++OMPlzZxL8S7i0h1YnLpzGNeusOv
rq7uv//9ryRmZmZkJ8pVk+k5OdsG9z5u28sdYHbEJXfE6OioOOLIyIixFts2tN3Sy9yov/0Na/zJ
u9h2Q0ODJL58+WL7gMHS0pKUY01j2zfG4OAgjQCAbd9C205nnu+pqqqS01h1dbXxySGnu3+iQaqf
21iI7W099/ufudq2S6iyrpy/JaqHDx+qrr50LvckZd3e3l6Vtt7bVK9QkHLkesP4KgxrOWtra7FY
TM7oklmJgrG5NO7Z1LsgIpGI+JPLOHv3Qry7iFQnW6f2kX4PmjRCTU2NlCx/19fXh4eHtcm5NLhH
2/Z4B5gdcckd8ddff0lCvTHT+E4SaxvabmlOQwlM3P6GNf7kXWz727dvEoNEq9vWiJSg30NiTF/9
O0kAALDtu2jbbJeRVCpVXl6uLyd+TWZnZ+vr62/qi8Qd4FuyI36Rhr38T17WlRLUkBhj+jJfZmwb
ALBtrPT2YuqzvADXN5fkLaenp6eoqEga8Pfff1cjB/LT4Ca4A3xLdsSv07CX/Mk/efJEzx9pTF/m
y4xtAwC2jW0DAECeznTYNgBg29g2AADcfds2vnwKADgGYdvYNgDAr2XbxgP3x48f4/F4QUFBVVWV
mqpXsbe319TU5Pf7A4FAb2+v6f077khRlwxdvdf9Mickp+1yf/H+ZSrldAiAbWPbAADY9j8O3Bsb
G6WlpepFM6KkJSUleo7fRCIxPj5+fn5+dnb24sWLvr6+/JwYmpubk8lkKBSSv6L7FzshuWwXtg2A
bWPbdxRunALA3bPtjo6Od+/e6RUmJyf1k556JiSFmmsnFovt7+9LQv6qDuzFxUXJ6fP54vG4eouq
cY4i9XZGySDerF/tLh+JxweDweLi4g8fPnz69EnMWPKod3OenJz09vZGIpGenh79UkkvK3rcLhfb
Xltbq66ulgLD4bCe+Uw+HRkZKSsrM1ak3nxZWFgotVhb1WmrpRz1tn9OnIBtw/XZtvvrk43IQa++
vl4OZclk0vhSrSs8RllfIHCZm6uXv3GaFe93Vm2n5fPS/yINYnwTAgDcc9sWcz09PdUr/Pz5U89g
+ejRo+fPn8/MzBjfjj44OCi+m868YHxgYEBJuRLTpaUlPXGUcU4jZefz8/N6Rh/5tK+vL5VKiS4n
Eonh4WHRej3nkBxk6+rq5K98tLu7a9oelxU9bpeLbUejUXW4l+OgnvtUPpUtNVUk2yUtIwttJ1pz
2mq1Ct9LwLbhWm3bYwlbW1u//fabHNnkuHRwcNDc3Hz5WR5MyOG6oqLC2m+iEhe4uXqtXRW53ll1
D8blU2kQOd2YpjcHgHtr29bDgRbKo6Ojp0+fPnjwwOfzyXFBHQTX19dbWlrSmWmBRHklIf/KZbqo
tvHAoYs1zlAfiUT0p7qjQtJ6xayH0awretmuf9nhcqC0rSgcDitvPj4+tlbqtNWoNmDbcBlXrqys
VO+dlev5eDyeztxna2xslONbQ0ODdZY+27twmo6OjsnJSf2vlNzV1WUtwVq+9ZZm2uGenui7mp7a
9uia681V4xHbeLfQtmqne5UXvrO6sLAQCATq6+ulTVzOWR7vdvb391/5tQ0A3FLbloPO2dmZXuH0
9FT3AWskw5s3b2KxmPpXjk2yRFZUh0I5JKljsay4sbFhPdxo9DT3F57+N+uKXrbLpW9btmVoaEhO
AHJ14T6hqHZ3J9d332oAbBsuYNta0URMnz9/Lonu7u6pqSlJiFDqidCM99msd+GMCvvz50/3g61t
+ba3NG3v6YllGudptx6oc7q5ajrM6ruFtlU73au88J1V2XzJLK0h1eVk27bhSbOorisAuP+23dnZ
qS/6BTmO6K4FOeoZuxb0vEdy8JXjhSipsSbJKUf/kpIS68H0AtJ8edt22S4X266trZWD78LCghxn
3W07EomoDu+TkxNb13cPHgDbhgvYtjiiOvbK37W1NUkUFxerA7XqBDEdbWzvwmmMvQZOxyvb8m1v
adre0wsEAsaOD6cjtjUk25urpnX1Gcq2aqcaL3xnVY1rN7Wz9Qapx7udUo61bwsA7qdtf/36VRR5
ZWVF0vJX0rp/uq+v79WrV3KMliPa69evGxsb1fKPHz/K8fft27e6/2BxcVEt1wdKSagjmlzTq/ue
s7OziUQib7btsl0utl1YWLi9vS0HQdvR2Ma0ZFA9TH/88YdtT4b7VgNg23AB25ajsVK3iooK64HF
+gSL7V04ox+bXu1qNFGX8p1uaVrv6emE7SH3AjdXnY7M1qq936vM9exjbWf3awnb8NyvdgDgXtl2
OnM/q6qqSn721dXVxlt+P3/+FOEOBAJ+v7+lpUU/rp5KpfRVfjozNk6Og3IEkRKUdqczo7pVX7gc
75qamuSjeDyubwjmwbZdtsvFtufn5+W4LCeA0dFR96OzGocXiUSmpqasOXPaagBsGzzadjrTq/3n
n3/qAdZ6UJ8cma3j5WzvwmmePHliHLct3myVeNvyFaZbmrb39GQVl77tC9xctT0y21bt/V6lx7PP
8fGxsv9wOJyTbduGR982wP237cuwuroqRzEa9zLo4Y8A2DbkZNtv376V9IcPH9S/ot0ilGmHcdu2
d+E0m5ubouNLS0uS/vvvv+PxuHrllLEE2/Jtb2na3tNrbW3VL061bssFbq7qG6fGzbGt2vu9So+2
rR73lEuC/v7+nGzbNjxpdmkcvtgA2LY9gUBAHXzhwgwODtIIgG3DBWz7x48fYpx6wLF664gsER+1
vpPE9i6cEXE+dQ9QTPfNmzfW6mzLt72laXtPT1y/t7fXaVvSud9c1TdOjYXYVu39XqVH25Ztkaof
PnyoOrm927ZteNIsvJMEANsGAMC2b51t3y3kqqC8vNw4bw7tL0iDSLPoSybudgJg2wAA2Da2fUGs
c0neRfTA8SvhyZMnxrkkudsJgG0DAGDb2DYAAGDbAIBtY9sAAHBrbfsy84rneU7yG5kC/WKVMls7
cAzCtrFtAABs+/+nqqrqwjVZ1/2XhSvcMF3d9VXhvdIrbNW3b98y3wFg24BtAwDcT9u+zNHcZcqY
az3x5PMMdLFKc8rs9/uPjo744gK2Ddg2AMDdtu3FxcWCggKfzxePx9UrTo3dtPJ3ZGSkvLw87fBG
0p2dnVgsFgwG1QwLtl28tueGpqam1dVVSXz69Km9vV1lW1hYCAQC9fX1BwcHKpsk1LTADQ0NxjfI
qqhMoVprcV9dpcfHxyX+4uJi2QQJprS0VPLrWRjW1taqq6tlSTgcVlOdZa1UV1FWVqaLsm1Vabr9
/X1ZIn9NPd+2sxwDYNuAbQMA3DHbFh1UErm0tKQENP3PvtuZmRk14NjWtkWUx8bGNjc3reu6nxtk
lUQiISXX1NQo45RsT58+lSVTU1M9PT0qW3d3t/ybtsyOZo3KthYvq/f19aVSKfFsiWd4eFiWGydF
i0ajy8vLkpibm9OT7mbt25blAwMDpqKsrTo4OKgmbJuYmJD8xhKu9iVTANg2tg0AADdj2y0tLZ2d
naLa+u36Ji/Uz/bZ2nZRUZFxRSfbth3c/Pjx49bW1pcvX+psauKDs7Mz7bXFxcUqAONC26hsB097
WV3N/avSels8TgzmtGm2RVlbdX19Xdo/nZkUTXRfV7S6uvr777/zrQVsG7BtAIA7b9uHh4dqrIV4
88bGhpMgOqW99GQ7nRvENaXe09NTazZrf7DTQvduZu+rO6WlfYaGhjo6OqLRqK03Zz0duq9VWlqq
rgSMbywJBALSOHxrAdsGbBsA4M7btkJUb3JysqSkxIttix3m2rdtG1Mymayrq3v9+rXOdnx8rMoP
h8NqodZQqUXqytW2va/ulK6trR0eHl5YWNjd3b0O2+7u7pZ2EJs3rr6yspJIJPjWArYN2DYAwJ23
7Wg0uri4KAnjCGNJqPEVpr5hySPy2t/fr5e3tbVNTU1tbW3pcdt6Xfdzw/b2dk1NjYh1PB7X47af
PXsmCSlQqlDZurq6xHTTloHXxqisoWqyrp41XVhYKKFKnOLExsHuLpU6FWW7ljRpcXHx27dvTSUw
bhuwbcC2AQDug22vra3FYjGfzycuqLRbObSyPZMXqgEnoobGd5JUVlaGQiH9Eg+9rrFu6+Dm1tbW
lZWVdObpzIcPH6psExMTsq78qzq505mXijQ0NEi9jY2NxpeK6MJtQ9VkXT1ren5+Xi5IgsHg6Oio
8RpDV+o0bttalG2oqVRKD1g3wjtJANsGbBsA4D7YNqeQm2V1dbW2tta6XK5h9CUHALYN2DYAALZ9
WX7NsROBQECNdTExPj7OYBLAtgHbBgDAtgEAsG1sGwCA4zO2DQDY9r1oSQAAuJ1g2wCAbd8r/h8A
ANxKsG0AwLaxbQAAwLa9YZyF8X5XSvsDtg3YNgAAtv2P86tO2L6X+kqoqqqyreVaN822UjUBUP4l
5roDcG9MY1NgP4BtAwAApPPft32t1WWdRz1vlYrpFhYW5lm4b1UAANg2AADAtdj22tpadXV1QUFB
OByenp724sFNTU2rq6uS+PTpU3t7u8q2sLAQCATq6+sPDg5UNkk0NjZKyQ0NDcb5IEdGRsrLy409
2U7TSbqsrtLj4+PBYLC4uPjDhw8STGlpqbGT2LppLpWqGTdV+ujoqLm5Wf6VLZW0Wri4uChLfD5f
PB7//PmzWrizsxOLxSQGCcC6q9zDu6YATE2kF5p2kG1TuLR5WVmZS/CAbQMAAGDb9kSj0eXlZUnM
zc2JtHmx7c3NzUQicX5+XlNTs7+/r7I9ffpUlkxNTfX09Khs3d3d8q8kxHTlU13gzMyMGjHsXouX
1fv6+lKplIisxDM8PCzLjc6a66bpJbIJarvm5+eTyaRaKMUqZV9aWlIuK8jFxtjYmDSIXmIszT28
awrAqYWtO8jaFE5tPjAwYAoesG0AAABs+yKlWxO2g6ofP37c2tr68uVLne379++SODs7015bXFys
nM+4UHLqh/Nsa9HBeFn95OREp8VrXdzddtOc8oRCIb0wEomoREtLS2dnp5iurkgoKioy/msqzT28
awrAqYWtO8gaiVObu7ctYNsAAADYtiOHh4dDQ0MdHR3RaNSLkirW19cLCgpOT0+t2Wz7bm0Xutfi
fXWndK6bZmv/Pp9Pl6ZGWYjgbmxsZLXPrOFdUwBZ67I2psds2Da2TWsAAAC2nTO1tbXDw8MLCwu7
u7vebTuZTNbV1b1+/VpnOz4+Tmf6RMPhsFoYDAZVR2kqlRJBzNW2va/ulM5p04zDJHS3rhUJaXJy
sqSkRP3r3redk21fVQBOdVl3kDWSnNocsG0AAABsOzuFhYXb29siYSLQHm1b8tfU1Mgq8Xhcj9t+
9uyZJKampvr7+1W2rq4uMd20ZRCwLkfkUo21sK0l6+pZ07abZlvp4uKiZJa/6t+enp69vT1JzM7O
JhIJtTAajaoMRi1ua2uTTd7a2rIdt+3dtq8wAKe6rDvI2hQ5tTlg2wAAANh2dubn50XjgsHg6Oio
x3Hbra2tKysr6czjeg8fPlTZJiYm/H6//Kv6UNOZF1w0NDSI0jU2NhpfcKGrFlOUVdLO7yRxXz1r
2nbTjJU6ve5aqmtqapKFcjnx999/q4Vra2uxWMzn88lyrcU7OzuVlZWhUMj68j4vtn0dATjVZd1B
1vb33uZoN7YNAACAbec1LPbNLf/eXG2BuucbsG0AAABs+9pRXaRwa7nyHTQ4OEirYtsAAADYNgAA
tg0AAIBtAwC2DQAAgG0DALYNAACAbQMAYNsAAAC/sG3rCcbvK9e3gfe+6QDbBgAAuCe2vbi46Pf7
e3t7HeuzvG/7qqiqqrKtJd8Negc30FgyvwrAtgEAAG6vbZvmVbHWd60bc+PKeEc3EMkGbBsAAOAO
2Laxt1X+LiwsBAKB+vr6g4MDF6trampaXV2VxKdPn9rb253WlURjY6PYfENDg3FiwpGRkfLyclPV
7kJp1FZZvayszHiRsLOzE4vFgsHghw8frIWMj4/LR8XFxfKpBFxaWmpc9y5uoG3JLsGYSsPUAdsG
AADIk22bPO/p06fn5+dTU1M9PT0uZra5uZlIJCRnTU3N/v6+07rd3d3yrySmp6f11IOSc2ZmRg07
du/6dZLRgYEBWV3cUQxSLRQhHhsbk6jEca2F9PX1pVIp8WaJeXh42LTuHd1Aa8lOwVhLA8C2AQAA
bsa2v3//Lomzs7NgMPh/9dmNOX78+HFra+vLly9d1i0uLlbSaSpQP+FnrNo6ptlJRkWdTQuLior0
QuvWnZycuKx7RzfQattOwVhLA8C2AQAAbsa29UL3rl9hfX1d8pyennpc13bhxbp+Pa7ukt/Lurd8
A60feQ8GANsGAAC4Gds+Pj5OZzpHw+Gwu6Ilk8m6urrXr1+7rBsMBlVvayqVKioqurCMSpnuMure
t30x277lG2jN7z0YAGwbAADgZmz72bNnkpiamurv73dRtO3t7ZqaGnHEeDyuhzVb1+3q6lpYWEhb
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" />
</BODY>
</HTML>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -0,0 +1,875 @@
<HTML>
<HEAD>
<META name="description"
content="Violet UML Editor cross format document" />
<META name="keywords" content="Violet, UML" />
<META charset="UTF-8" />
<SCRIPT type="text/javascript">
function switchVisibility() {
var obj = document.getElementById("content");
obj.style.display = (obj.style.display == "block") ? "none" : "block";
}
</SCRIPT>
</HEAD>
<BODY>
This file was generated with Violet UML Editor 2.1.0.
&nbsp;&nbsp;(&nbsp;<A href=# onclick="switchVisibility()">View Source</A>&nbsp;/&nbsp;<A href="http://sourceforge.net/projects/violet/files/violetumleditor/" target="_blank">Download Violet</A>&nbsp;)
<BR />
<BR />
<SCRIPT id="content" type="text/xml"><![CDATA[<UseCaseDiagramGraph id="1">
<nodes id="2">
<ActorNode id="3">
<children id="4"/>
<location class="Point2D.Double" id="5" x="50.0" y="120.0"/>
<id id="6" value="49b974cb-4ce4-4e02-b5f8-1cd7ebb37bd0"/>
<revision>1</revision>
<backgroundColor id="7">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="8">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="8"/>
<name id="9" justification="1" size="4" underlined="false">
<text>Assimp-Author
</text>
</name>
</ActorNode>
<UseCaseNode id="10">
<children id="11"/>
<location class="Point2D.Double" id="12" x="230.0" y="170.0"/>
<id id="13" value="5d6a8838-4bef-4742-ada7-6b26d78d13e6"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="14" justification="1" size="4" underlined="false">
<text>The Assimp-
Wonder</text>
</name>
</UseCaseNode>
<ActorNode id="15">
<children id="16"/>
<location class="Point2D.Double" id="17" x="530.0" y="10.0"/>
<id id="18" value="85d634da-7438-4ff1-beac-ed195904a97b"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="19" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="20">
<children id="21"/>
<location class="Point2D.Double" id="22" x="70.0" y="260.0"/>
<id id="23" value="74ca83b4-e63d-4ebc-bccf-b254cc7f948a"/>
<revision>1</revision>
<backgroundColor id="24">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="25">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="25"/>
<name id="26" justification="1" size="4" underlined="false">
<text>Assimp-Author
</text>
</name>
</ActorNode>
<ActorNode id="27">
<children id="28"/>
<location class="Point2D.Double" id="29" x="0.0" y="190.0"/>
<id id="30" value="fdcf624e-69c4-4096-8e70-31f86f85ed84"/>
<revision>1</revision>
<backgroundColor id="31">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="32">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="32"/>
<name id="33" justification="1" size="4" underlined="false">
<text>Assimp-Author
</text>
</name>
</ActorNode>
<ActorNode id="34">
<children id="35"/>
<location class="Point2D.Double" id="36" x="590.0" y="240.0"/>
<id id="37" value="cef0aee1-fadd-4f83-9282-2cab20e2e842"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="38" justification="1" size="4" underlined="false">
<text>Actor</text>
</name>
</ActorNode>
<ActorNode id="39">
<children id="40"/>
<location class="Point2D.Double" id="41" x="500.0" y="150.0"/>
<id id="42" value="a37c0622-831d-4375-903f-04cc07954100"/>
<revision>1</revision>
<backgroundColor id="43">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="44">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="44"/>
<name id="45" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="46">
<children id="47"/>
<location class="Point2D.Double" id="48" x="420.0" y="300.0"/>
<id id="49" value="f005128f-497e-4e0b-9633-fb5ac45dc63f"/>
<revision>1</revision>
<backgroundColor id="50">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="51">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="51"/>
<name id="52" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="53">
<children id="54"/>
<location class="Point2D.Double" id="55" x="410.0" y="100.0"/>
<id id="56" value="5aee4e8d-8126-40c1-8df5-72873c300bc3"/>
<revision>1</revision>
<backgroundColor id="57">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="58">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="58"/>
<name id="59" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="60">
<children id="61"/>
<location class="Point2D.Double" id="62" x="630.0" y="200.0"/>
<id id="63" value="48b4d373-f4c2-4d09-85d9-ed58900e4240"/>
<revision>1</revision>
<backgroundColor id="64">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="65">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="65"/>
<name id="66" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="67">
<children id="68"/>
<location class="Point2D.Double" id="69" x="520.0" y="320.0"/>
<id id="70" value="e73866d5-b2b0-4777-8bdc-3f404681694e"/>
<revision>1</revision>
<backgroundColor id="71">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="72">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="72"/>
<name id="73" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="74">
<children id="75"/>
<location class="Point2D.Double" id="76" x="630.0" y="20.0"/>
<id id="77" value="5553fd94-4c7b-4e24-9a64-d84fd373bc3d"/>
<revision>1</revision>
<backgroundColor id="78">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="79">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="79"/>
<name id="80" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
<ActorNode id="81">
<children id="82"/>
<location class="Point2D.Double" id="83" x="590.0" y="90.0"/>
<id id="84" value="11bac3f1-650c-49cc-98f6-b32082329452"/>
<revision>1</revision>
<backgroundColor id="85">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="86">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="86"/>
<name id="87" justification="1" size="4" underlined="false">
<text>Happy User</text>
</name>
</ActorNode>
</nodes>
<edges id="88">
<UseCaseRelationshipEdge id="89">
<start class="ActorNode" reference="27"/>
<end class="UseCaseNode" reference="10"/>
<startLocation class="Point2D.Double" id="90" x="50.0" y="40.0"/>
<endLocation class="Point2D.Double" id="91" x="60.0" y="50.0"/>
<transitionPoints id="92"/>
<id id="93" value="79ec5ac5-6c38-4713-abb8-341c214f888c"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="94">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="53"/>
<startLocation class="Point2D.Double" id="95" x="120.0" y="40.0"/>
<endLocation class="Point2D.Double" id="96" x="40.0" y="30.0"/>
<transitionPoints id="97"/>
<id id="98" value="f978cafc-4f21-4cd8-8b74-f9ae5af9a8e9"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="99">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="46"/>
<startLocation class="Point2D.Double" id="100" x="130.0" y="40.0"/>
<endLocation class="Point2D.Double" id="101" x="45.0" y="25.0"/>
<transitionPoints id="102"/>
<id id="103" value="2daa9717-724d-4d20-a33c-1eaf0358773d"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="104">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="39"/>
<startLocation class="Point2D.Double" id="105" x="120.0" y="40.0"/>
<endLocation class="Point2D.Double" id="106" x="40.0" y="50.0"/>
<transitionPoints id="107"/>
<id id="108" value="ebc17223-8ac8-4347-83fd-612563f33518"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="109">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="15"/>
<startLocation class="Point2D.Double" id="110" x="60.0" y="20.0"/>
<endLocation class="Point2D.Double" id="111" x="40.0" y="10.0"/>
<transitionPoints id="112"/>
<id id="113" value="82ffbefd-9433-47f4-b87a-92d6ccacf17a"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="114">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="34"/>
<startLocation class="Point2D.Double" id="115" x="100.0" y="60.0"/>
<endLocation class="Point2D.Double" id="116" x="30.0" y="30.0"/>
<transitionPoints id="117"/>
<id id="118" value="6bacbe4e-7c6b-4d40-82a0-bfb98afac129"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="119">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="60"/>
<startLocation class="Point2D.Double" id="120" x="130.0" y="50.0"/>
<endLocation class="Point2D.Double" id="121" x="34.0" y="33.0"/>
<transitionPoints id="122"/>
<id id="123" value="00a88cb1-b275-45bf-83c8-211834d39283"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="124">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="81"/>
<startLocation class="Point2D.Double" id="125" x="90.0" y="40.0"/>
<endLocation class="Point2D.Double" id="126" x="40.0" y="30.0"/>
<transitionPoints id="127"/>
<id id="128" value="6711187e-4364-4f6d-89af-d7d83216cca4"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="129">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="74"/>
<startLocation class="Point2D.Double" id="130" x="90.0" y="30.0"/>
<endLocation class="Point2D.Double" id="131" x="30.0" y="40.0"/>
<transitionPoints id="132"/>
<id id="133" value="b766e9ca-b8ca-4cdf-9469-e4eac7bc5609"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
<UseCaseRelationshipEdge id="134">
<start class="UseCaseNode" reference="10"/>
<end class="ActorNode" reference="67"/>
<startLocation class="Point2D.Double" id="135" x="100.0" y="60.0"/>
<endLocation class="Point2D.Double" id="136" x="70.0" y="30.0"/>
<transitionPoints id="137"/>
<id id="138" value="d0e826ee-a05e-4d58-baf9-ea85a8d2da6d"/>
<revision>1</revision>
<lineStyle name="SOLID"/>
<startArrowHead name="NONE"/>
<endArrowHead name="TRIANGLE"/>
<bentStyle name="STRAIGHT"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</UseCaseRelationshipEdge>
</edges>
</UseCaseDiagramGraph>]]></SCRIPT>
<BR />
<BR />
<IMG alt="embedded diagram image" src="data:image/png;base64,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
" />
</BODY>
</HTML>

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,337 @@
<HTML>
<HEAD>
<META name="description"
content="Violet UML Editor cross format document" />
<META name="keywords" content="Violet, UML" />
<META charset="UTF-8" />
<SCRIPT type="text/javascript">
function switchVisibility() {
var obj = document.getElementById("content");
obj.style.display = (obj.style.display == "block") ? "none" : "block";
}
</SCRIPT>
</HEAD>
<BODY>
This file was generated with Violet UML Editor 2.1.0.
&nbsp;&nbsp;(&nbsp;<A href=# onclick="switchVisibility()">View Source</A>&nbsp;/&nbsp;<A href="http://sourceforge.net/projects/violet/files/violetumleditor/" target="_blank">Download Violet</A>&nbsp;)
<BR />
<BR />
<SCRIPT id="content" type="text/xml"><![CDATA[<ClassDiagramGraph id="1">
<nodes id="2">
<ClassNode id="3">
<children id="4"/>
<location class="Point2D.Double" id="5" x="20.0" y="100.0"/>
<id id="6" value="0af10f16-f859-4c02-bdff-81c1d78d52ce"/>
<revision>1</revision>
<backgroundColor id="7">
<red>255</red>
<green>255</green>
<blue>255</blue>
<alpha>255</alpha>
</backgroundColor>
<borderColor id="8">
<red>0</red>
<green>0</green>
<blue>0</blue>
<alpha>255</alpha>
</borderColor>
<textColor reference="8"/>
<name id="9" justification="1" size="3" underlined="false">
<text>Parser</text>
</name>
<attributes id="10" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="11" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
<ClassNode id="12">
<children id="13"/>
<location class="Point2D.Double" id="14" x="150.0" y="100.0"/>
<id id="15" value="8b86eab9-eee1-4a26-addc-66e48c949789"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="16" justification="1" size="3" underlined="false">
<text>Importer</text>
</name>
<attributes id="17" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="18" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
<ClassNode id="19">
<children id="20"/>
<location class="Point2D.Double" id="21" x="280.0" y="100.0"/>
<id id="22" value="173e417b-7e49-4026-af57-ef383590b41a"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="23" justification="1" size="3" underlined="false">
<text>aiScene</text>
</name>
<attributes id="24" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="25" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
<ClassNode id="26">
<children id="27"/>
<location class="Point2D.Double" id="28" x="400.0" y="20.0"/>
<id id="29" value="ab49cbe6-18b2-414b-8ed7-cfb6397f15d2"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="30" justification="1" size="3" underlined="false">
<text>Postprocess1</text>
</name>
<attributes id="31" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="32" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
<ClassNode id="33">
<children id="34"/>
<location class="Point2D.Double" id="35" x="400.0" y="100.0"/>
<id id="36" value="90b9ce00-d2fb-4c9f-8f63-a9d93a437672"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="37" justification="1" size="3" underlined="false">
<text>PostProcess 2</text>
</name>
<attributes id="38" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="39" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
<ClassNode id="40">
<children id="41"/>
<location class="Point2D.Double" id="42" x="400.0" y="180.0"/>
<id id="43" value="7e0e804b-46c0-4bf4-a6cc-a5046b47aa37"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="44" justification="1" size="3" underlined="false">
<text>PostProcess n</text>
</name>
<attributes id="45" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="46" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
<ClassNode id="47">
<children id="48"/>
<location class="Point2D.Double" id="49" x="530.0" y="100.0"/>
<id id="50" value="43819611-3ea7-4858-9d5e-575a19a318cf"/>
<revision>1</revision>
<backgroundColor reference="7"/>
<borderColor reference="8"/>
<textColor reference="8"/>
<name id="51" justification="1" size="3" underlined="false">
<text>Proceeded
aiScene</text>
</name>
<attributes id="52" justification="0" size="4" underlined="false">
<text></text>
</attributes>
<methods id="53" justification="0" size="4" underlined="false">
<text></text>
</methods>
</ClassNode>
</nodes>
<edges id="54">
<InterfaceInheritanceEdge id="55">
<start class="ClassNode" reference="3"/>
<end class="ClassNode" reference="12"/>
<startLocation class="Point2D.Double" id="56" x="90.0" y="30.0"/>
<endLocation class="Point2D.Double" id="57" x="0.0" y="30.0"/>
<transitionPoints id="58"/>
<id id="59" value="1436ccf1-fc0c-4318-8d30-1c0058d8ae68"/>
<revision>1</revision>
<bentStyle name="AUTO"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</InterfaceInheritanceEdge>
<InterfaceInheritanceEdge id="60">
<start class="ClassNode" reference="12"/>
<end class="ClassNode" reference="19"/>
<startLocation class="Point2D.Double" id="61" x="70.0" y="30.0"/>
<endLocation class="Point2D.Double" id="62" x="70.0" y="30.0"/>
<transitionPoints id="63"/>
<id id="64" value="6a839966-1464-418f-bb0d-a3bba32e2591"/>
<revision>1</revision>
<bentStyle name="AUTO"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</InterfaceInheritanceEdge>
<InterfaceInheritanceEdge id="65">
<start class="ClassNode" reference="19"/>
<end class="ClassNode" reference="26"/>
<startLocation class="Point2D.Double" id="66" x="80.0" y="30.0"/>
<endLocation class="Point2D.Double" id="67" x="10.0" y="40.0"/>
<transitionPoints id="68"/>
<id id="69" value="6d6407e9-8d0f-4bb8-b1ff-39e1e593b4e7"/>
<revision>1</revision>
<bentStyle name="AUTO"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</InterfaceInheritanceEdge>
<InterfaceInheritanceEdge id="70">
<start class="ClassNode" reference="26"/>
<end class="ClassNode" reference="33"/>
<startLocation class="Point2D.Double" id="71" x="50.0" y="50.0"/>
<endLocation class="Point2D.Double" id="72" x="50.0" y="10.0"/>
<transitionPoints id="73"/>
<id id="74" value="ae76dc82-ec72-425e-9f70-1a35204c8cfc"/>
<revision>1</revision>
<bentStyle name="AUTO"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</InterfaceInheritanceEdge>
<InterfaceInheritanceEdge id="75">
<start class="ClassNode" reference="33"/>
<end class="ClassNode" reference="40"/>
<startLocation class="Point2D.Double" id="76" x="50.0" y="40.0"/>
<endLocation class="Point2D.Double" id="77" x="50.0" y="10.0"/>
<transitionPoints id="78"/>
<id id="79" value="867e46fe-7405-4d71-99ce-10f0a4cfa12d"/>
<revision>1</revision>
<bentStyle name="AUTO"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</InterfaceInheritanceEdge>
<InterfaceInheritanceEdge id="80">
<start class="ClassNode" reference="40"/>
<end class="ClassNode" reference="47"/>
<startLocation class="Point2D.Double" id="81" x="60.0" y="30.0"/>
<endLocation class="Point2D.Double" id="82" x="40.0" y="40.0"/>
<transitionPoints id="83"/>
<id id="84" value="3097619f-c864-463c-8ef9-b35a7327b3a0"/>
<revision>1</revision>
<bentStyle name="AUTO"/>
<startLabel></startLabel>
<middleLabel></middleLabel>
<endLabel></endLabel>
</InterfaceInheritanceEdge>
</edges>
</ClassDiagramGraph>]]></SCRIPT>
<BR />
<BR />
<IMG alt="embedded diagram image" src="data:image/png;base64,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
h9aMYr1y5Uo0/vjjj/wdyUV7fVpaWuLhs2fP4pP41Nt6il5YK9ZMfP/9962trYcOHZo7a8ZEkMY5
iIng999/j8aKFSvyBxw4cCDMGo09e/aMl9hlVTTIhZmtfFJqIguJKUo9GvFJJbVDqDdv3sy/qvw9
benl33zzTfozSWnNPLKmrZlZk5lTRKm15txtK8w8jczgZOJTbDz7/vvvz49qZ83ZnL6LtvWkz2JH
jhz55JNPim4Uzn8uTrttYjaJUs5/lZ25L6fohZUZu8IbnQt/2Wkjk/u8e/fuO++8E08NDw/PhTXT
6KX2f/7zn9QuHPM4IN1mFmM+XmKXVdEgF/5SlU9KTWQhT6lSj0YsQT788MP86X3xxRdpuV/+nrb0
wr///nu84Ob+zCPn6K972tF+PWsWzRiZNZk5RWRac063FWaeRmawiOvXr6eLDZcuXZota771amfN
Wfu7KtrWkz5hbd++/c6dO5mXU4KopKamphRctmxZfLgbL2NfTs2tNa9evbp69eoYmblba04xmxQF
05xbzi6rwoeVT0pNZKFwMTFFqcf8++2337733nsp2NbWNj6TPW3lb1+robXm5BkjsyYzp4hMhc/p
tsLM08gMFvLLL78ks0aFzJtqZ81ZvkJbSPr64eUEpayZLqpcuXIl/WOktAzK3JdTo9bM5XKffvpp
e3t7uhnkLVrzr7/+Sp+y4897vMQuqymsWfmk1EQWZlrqp06dmrxYLDxm2nGeevtazV2hzVzkFdZk
5hRRzt722d1WmHkapYKJ0dHR6Grp0qXXrl2bT9XOmnNozVSRd+/eLfy/ukUHp6984hP6o0ePorFy
5crxEvtyas6aIyMje/fuXbt27eDgYOE1z7dlzYMHD8ZH42js379/vMQuq6JBTh+T06WnyielJrJQ
Tql//PHH0fjxxx+jffPmzXSLyvhM9rRlpjXzyJq2ZmZNZk4RhZVZmW2FmaeRGcxz4MCBd999d2ho
aNbHefLvW8lqZ805tObAwEAsa6K+C/+vbtHBUW2dnZ3p5sO2trb79++Pl9iXU1vW7OnpaW1t7evr
q8B+zTKtGaucGOetW7emmyMyd1kVDXJ/f3+kIM0alU9KTWShnFJ/+PDhrl274tl0CXHPnj1p6175
e9oy05p5ZE1bM7MmM6eIwsqszLbCzNPIDOYJZWZ+KzxH1qxYtU+d0/m0O9n/BqrofP31118/f/68
/HmkMgUtCz59V4M1MRfWrJJqn0+7k1mzcvN1tf0H1PoJZMFszprz1ZqVrPaFszuZNSs3X5tHZEEW
jPN8rfaFszuZNc3XsiALrKnaZ4F5vDuZNc3XsiALrDnfxnlGA2t3Mmuar2VBFliTNd9aFhbO7mTW
NF/LgiywJmu+KQtndzJrmq9lQRZYkzXflIWzO5k1zdeyIAusqdrBmipYFmSBNVW7LLCmCpYFWWBN
4/yGAysLrGm+lgVZYE3WlAXWNF9DFljTOLMma5qvVbAssCZYkzVVsPlaFmTBOKt21oQKlgWwpmpn
TWOngmVBFlhzHoyzK7Ssab6GLLCmcWZN1jRfq2BZYE2wJmuqYPO1LMiCcWZN1oT5WhbAmqpdFlhT
BcuCLLCmagdrqmBZkAXWXGjj7Aota5qvIQusaZxZkzXN1ypYFlgTrFm71kT5zN18DVlYIFkwdHM0
zjO1Jl4vC/9vlH9D2czd5xpjKwsLJwvV81sUzoyqHVNkgTVVsCzIAmuyJlhTBcuCLLDmQhrn1/6q
0ti+vjUBALV704pBqMQ4GwIAmAfKYU3WBADKYU3WBADKAWsCAGuCNQEAxA/WBADWBGsCwBQ8fvx4
2n+iNjIywppgTQD4H6dOndq3b1/mUz0TWGuCNQHgX8bGxlatWjU0NFQUjyVmxJ8/f26IwJoA8H8M
DAx8/vnnRcG9e/f29fUZHLAmABTT1tZ27dq1/MNcLrd69epYhtbkbO4KLWsCwJzy888/r1+/Pq/J
9vb2wcHBWp3NWZM1AWCu2bVr17lz56Jx9erVsGaNLjRZkzUBoBIMDw+3tLT8+uuva9euzeVyNTyb
syZrAkAF+OqrrxobG7u6ugwFWBNA1S2JUD4KhjUBLHRrVuFZDQ8P1/pYUSxrAmBNY2VgWRMAE4A1
WRMATO6zO1a/vcLAsiYA1sSsWROsCYA1WZM1WRMAa2K2rWlgWRMAa7Ima7ImANYEa7ImAJjcWZM1
AYA1q92aYE0ArMmarMmaAFgTs21NA8uaAFiTNVmTNQGwJliTNQHA5M6arAkArFnt1gRrAmBN1mRN
1gTAmphtaxpY1gTAmqzJmqwJgDXBmqwJACZ31mRNAGDNarcmWBMAa7Ima7ImANbEbFvTwLImgAVk
zUWvWLx4cUNDQ2dn59OnT2fU861bt7Zs2TJbvbEmWBNAtVsztU+ePBntnTt3zrTnfA9v3htrgjUB
1IY1x8bGoh1rxPTw8OHDS5YsaWxsPHr0aIrcvn1706ZNdXV1cUysLx8+fFhfX59fX07RW4p3dHSs
W7euVOcvX76MYFNTU/SZOk/B7u7uxgmiEX1mnkapYNGvOTAwEMc0Nzf39/ezJmsCwKxZ89ixY9Hu
6+s7c+ZMNI4fPx7BlpaWaD979iyXy0Vjw4YNU6w1J1tzcHBwdHS0VOehz2hfvHhxaGgo33lPT08K
Xr58ORq9vb2lTiMzWPRrfvPNN+nZFStWzJY1wZoAFqI1Y1UX9op2V1dXPAyvRPufCaKxfPnyCMbq
MNpr1qwJ27148WKyKUv1luJppViq8/gZ7Xhh4emlYBwW8WiEGkudRmaw6Nf8+++/UzuWpFOPVSJZ
c1EBRQdYaLImgIVozXT/TognJBfLtYiHVwolkTRz6dKlpqamdPyyZcti/Zdpzcm9FQkms/NMCUU/
hYqKh6VOIzOYuaSe1nbWmqwJgDWnv0KbuchLy8G0yBufuO565cqV3bt3RzC8WKaQiuKZneeDhS9s
bm6evADNPI1SQdZkTQCYc2v29vZG/PTp0+mrxxMnTkRw48aN0b5z586jR4+isXLlyvFXl0bTRdEy
rZnZefpe8/z58/fu3ct/MZmCZ8+eTcHNmzeXOo3MIGuyJgBUwpqxbjty5Ei6ebWnpycFQ0idnZ0N
DQ11dXVtbW3379+PYH9/f319ffJZmdbM7DyC3d3d0Xn01tHRkW6CTcE4LILbtm2LEyh1GplB1mRN
AJhNa4I1WRMAWJM1WRMAWJM1WRMAWJM1wZoAWJM1wZoAWJM1wZoAWBOsyZoAmMC0w5qsCQCsyZqs
CQCsyZpgTQCsyZpgTQCsyZpgTQCsyZpgTQCsCdZkTQBgTdZkTQBgTdZkTQBgTdYEawJgTdYEawJg
TdYEawJgTbAmawIAa7ImawIAa7ImawIAa7ImWBMAa7ImWBMAa7ImWBPAvDIByoc1WRMA/uU3lI1q
YU0ArAnWZE0AYE3WZE0AABY4/wVVY1WTrOVxIAAAAABJRU5ErkJg" />
</BODY>
</HTML>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -55,7 +55,7 @@ extern "C" {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Limits. These values are required to match the settings Assimp was // Limits. These values are required to match the settings Assimp was
// compiled against. Therfore, do not redefine them unless you build the // compiled against. Therefore, do not redefine them unless you build the
// library from source using the same definitions. // library from source using the same definitions.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@ -87,15 +87,15 @@ Source: "..\..\include\*"; DestDir: "{app}\include"; Flags: recursesubdirs
Source: "..\..\port\dAssimp\*"; DestDir: "{app}\port\D"; Flags: recursesubdirs; Components: dassimp Source: "..\..\port\dAssimp\*"; DestDir: "{app}\port\D"; Flags: recursesubdirs; Components: dassimp
; Assimp.NET ; Assimp.NET
Source: "..\..\port\Assimp.NET\*"; DestDir: "{app}\port\C#"; Flags: recursesubdirs; Components: assimp_net ;Source: "..\..\port\Assimp.NET\*"; DestDir: "{app}\port\C#"; Flags: recursesubdirs; Components: assimp_net
; PyAssimp ; PyAssimp
Source: "..\..\port\PyAssimp\*"; DestDir: "{app}\port\Python"; Excludes: "*.pyc,*.dll"; Flags: recursesubdirs; Components: pyassimp ;Source: "..\..\port\PyAssimp\*"; DestDir: "{app}\port\Python"; Excludes: "*.pyc,*.dll"; Flags: recursesubdirs; Components: pyassimp
; Test repository ; Test repository
Source: "..\..\test\models\*"; DestDir: "{app}\test\models"; Flags: recursesubdirs; Components: test ;Source: "..\..\test\models\*"; DestDir: "{app}\test\models"; Flags: recursesubdirs; Components: test
Source: "..\..\test\regression\*"; DestDir: "{app}\test\regression"; Flags: recursesubdirs; Components: test ;Source: "..\..\test\regression\*"; DestDir: "{app}\test\regression"; Flags: recursesubdirs; Components: test
Source: "..\..\test\models-nonbsd\*"; DestDir: "{app}\test\models-nonbsd"; Flags: recursesubdirs; Components: test_nonbsd ;Source: "..\..\test\models-nonbsd\*"; DestDir: "{app}\test\models-nonbsd"; Flags: recursesubdirs; Components: test_nonbsd
; Source Code & Workspaces ; Source Code & Workspaces
;Source: "..\..\code\*"; Excludes: "*.o"; DestDir: "{app}\code"; Flags: recursesubdirs; Components: wsource ;Source: "..\..\code\*"; Excludes: "*.o"; DestDir: "{app}\code"; Flags: recursesubdirs; Components: wsource

View File

@ -8,6 +8,7 @@ import os
import ctypes import ctypes
from ctypes import POINTER from ctypes import POINTER
import operator import operator
import sys
try: import numpy try: import numpy
except: numpy = None except: numpy = None
@ -39,7 +40,9 @@ elif os.name=='nt':
for dir_candidate in path_dirs: for dir_candidate in path_dirs:
if 'assimp' in dir_candidate.lower(): if 'assimp' in dir_candidate.lower():
additional_dirs.append(dir_candidate) additional_dirs.append(dir_candidate)
additional_dirs += sys.path
#print(additional_dirs) #print(additional_dirs)
def vec2tuple(x): def vec2tuple(x):
""" Converts a VECTOR3D to a Tuple """ """ Converts a VECTOR3D to a Tuple """

View File

@ -55,7 +55,26 @@ ENTITY = "entity"
CAMERA = "camera" CAMERA = "camera"
MESH = "mesh" MESH = "mesh"
FLAT_VERTEX_SHADER = """ FLAT_VERTEX_SHADER_120 = """
#version 120
uniform mat4 u_viewProjectionMatrix;
uniform mat4 u_modelMatrix;
uniform vec4 u_materialDiffuse;
attribute vec3 a_vertex;
varying vec4 v_color;
void main(void)
{
v_color = u_materialDiffuse;
gl_Position = u_viewProjectionMatrix * u_modelMatrix * vec4(a_vertex, 1.0);
}
"""
FLAT_VERTEX_SHADER_130 = """
#version 130 #version 130
uniform mat4 u_viewProjectionMatrix; uniform mat4 u_viewProjectionMatrix;
@ -74,7 +93,46 @@ void main(void)
} }
""" """
BASIC_VERTEX_SHADER = """ BASIC_VERTEX_SHADER_120 = """
#version 120
uniform mat4 u_viewProjectionMatrix;
uniform mat4 u_modelMatrix;
uniform mat3 u_normalMatrix;
uniform vec3 u_lightPos;
uniform vec4 u_materialDiffuse;
attribute vec3 a_vertex;
attribute vec3 a_normal;
varying vec4 v_color;
void main(void)
{
// Now the normal is in world space, as we pass the light in world space.
vec3 normal = u_normalMatrix * a_normal;
float dist = distance(a_vertex, u_lightPos);
// go to https://www.desmos.com/calculator/nmnaud1hrw to play with the parameters
// att is not used for now
float att=1.0/(1.0+0.8*dist*dist);
vec3 surf2light = normalize(u_lightPos - a_vertex);
vec3 norm = normalize(normal);
float dcont=max(0.0,dot(norm,surf2light));
float ambient = 0.3;
float intensity = dcont + 0.3 + ambient;
v_color = u_materialDiffuse * intensity;
gl_Position = u_viewProjectionMatrix * u_modelMatrix * vec4(a_vertex, 1.0);
}
"""
BASIC_VERTEX_SHADER_130 = """
#version 130 #version 130
uniform mat4 u_viewProjectionMatrix; uniform mat4 u_viewProjectionMatrix;
@ -113,7 +171,17 @@ void main(void)
} }
""" """
BASIC_FRAGMENT_SHADER = """ BASIC_FRAGMENT_SHADER_120 = """
#version 120
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
"""
BASIC_FRAGMENT_SHADER_130 = """
#version 130 #version 130
in vec4 v_color; in vec4 v_color;
@ -123,7 +191,42 @@ void main() {
} }
""" """
GOOCH_VERTEX_SHADER = """ GOOCH_VERTEX_SHADER_120 = """
#version 120
// attributes
attribute vec3 a_vertex; // xyz - position
attribute vec3 a_normal; // xyz - normal
// uniforms
uniform mat4 u_modelMatrix;
uniform mat4 u_viewProjectionMatrix;
uniform mat3 u_normalMatrix;
uniform vec3 u_lightPos;
uniform vec3 u_camPos;
// output data from vertex to fragment shader
varying vec3 o_normal;
varying vec3 o_lightVector;
///////////////////////////////////////////////////////////////////
void main(void)
{
// transform position and normal to world space
vec4 positionWorld = u_modelMatrix * vec4(a_vertex, 1.0);
vec3 normalWorld = u_normalMatrix * a_normal;
// calculate and pass vectors required for lighting
o_lightVector = u_lightPos - positionWorld.xyz;
o_normal = normalWorld;
// project world space position to the screen and output it
gl_Position = u_viewProjectionMatrix * positionWorld;
}
"""
GOOCH_VERTEX_SHADER_130 = """
#version 130 #version 130
// attributes // attributes
@ -158,7 +261,56 @@ void main(void)
} }
""" """
GOOCH_FRAGMENT_SHADER = """ GOOCH_FRAGMENT_SHADER_120 = """
#version 120
// data from vertex shader
varying vec3 o_normal;
varying vec3 o_lightVector;
// diffuse color of the object
uniform vec4 u_materialDiffuse;
// cool color of gooch shading
uniform vec3 u_coolColor;
// warm color of gooch shading
uniform vec3 u_warmColor;
// how much to take from object color in final cool color
uniform float u_alpha;
// how much to take from object color in final warm color
uniform float u_beta;
///////////////////////////////////////////////////////////
void main(void)
{
// normlize vectors for lighting
vec3 normalVector = normalize(o_normal);
vec3 lightVector = normalize(o_lightVector);
// intensity of diffuse lighting [-1, 1]
float diffuseLighting = dot(lightVector, normalVector);
// map intensity of lighting from range [-1; 1] to [0, 1]
float interpolationValue = (1.0 + diffuseLighting)/2;
//////////////////////////////////////////////////////////////////
// cool color mixed with color of the object
vec3 coolColorMod = u_coolColor + vec3(u_materialDiffuse) * u_alpha;
// warm color mixed with color of the object
vec3 warmColorMod = u_warmColor + vec3(u_materialDiffuse) * u_beta;
// interpolation of cool and warm colors according
// to lighting intensity. The lower the light intensity,
// the larger part of the cool color is used
vec3 colorOut = mix(coolColorMod, warmColorMod, interpolationValue);
//////////////////////////////////////////////////////////////////
// save color
gl_FragColor.rgb = colorOut;
gl_FragColor.a = 1;
}
"""
GOOCH_FRAGMENT_SHADER_130 = """
#version 130 #version 130
// data from vertex shader // data from vertex shader
@ -207,10 +359,32 @@ void main(void)
// save color // save color
resultingColor.rgb = colorOut; resultingColor.rgb = colorOut;
resultingColor.a = 1; resultingColor.a = 1;
} }
""" """
SILHOUETTE_VERTEX_SHADER = """ SILHOUETTE_VERTEX_SHADER_120 = """
#version 120
attribute vec3 a_vertex; // xyz - position
attribute vec3 a_normal; // xyz - normal
uniform mat4 u_modelMatrix;
uniform mat4 u_viewProjectionMatrix;
uniform mat4 u_modelViewMatrix;
uniform vec4 u_materialDiffuse;
uniform float u_bordersize; // width of the border
varying vec4 v_color;
void main(void){
v_color = u_materialDiffuse;
float distToCamera = -(u_modelViewMatrix * vec4(a_vertex, 1.0)).z;
vec4 tPos = vec4(a_vertex + a_normal * u_bordersize * distToCamera, 1.0);
gl_Position = u_viewProjectionMatrix * u_modelMatrix * tPos;
}
"""
SILHOUETTE_VERTEX_SHADER_130 = """
#version 130 #version 130
in vec3 a_vertex; // xyz - position in vec3 a_vertex; // xyz - position
@ -288,7 +462,17 @@ class PyAssimp3DViewer:
glClearColor(0.18, 0.18, 0.18, 1.0) glClearColor(0.18, 0.18, 0.18, 1.0)
self.prepare_shaders() shader_compilation_succeeded = False
try:
self.set_shaders_v130()
self.prepare_shaders()
except RuntimeError, message:
sys.stderr.write("%s\n" % message)
sys.stdout.write("Could not compile shaders in version 1.30, trying version 1.20\n")
if not shader_compilation_succeeded:
self.set_shaders_v120()
self.prepare_shaders()
self.scene = None self.scene = None
self.meshes = {} # stores the OpenGL vertex/faces/normals buffers pointers self.meshes = {} # stores the OpenGL vertex/faces/normals buffers pointers
@ -315,11 +499,29 @@ class PyAssimp3DViewer:
self.is_panning = False self.is_panning = False
self.is_zooming = False self.is_zooming = False
def set_shaders_v120(self):
self.BASIC_VERTEX_SHADER = BASIC_VERTEX_SHADER_120
self.FLAT_VERTEX_SHADER = FLAT_VERTEX_SHADER_120
self.SILHOUETTE_VERTEX_SHADER = SILHOUETTE_VERTEX_SHADER_120
self.GOOCH_VERTEX_SHADER = GOOCH_VERTEX_SHADER_120
self.BASIC_FRAGMENT_SHADER = BASIC_FRAGMENT_SHADER_120
self.GOOCH_FRAGMENT_SHADER = GOOCH_FRAGMENT_SHADER_120
def set_shaders_v130(self):
self.BASIC_VERTEX_SHADER = BASIC_VERTEX_SHADER_130
self.FLAT_VERTEX_SHADER = FLAT_VERTEX_SHADER_130
self.SILHOUETTE_VERTEX_SHADER = SILHOUETTE_VERTEX_SHADER_130
self.GOOCH_VERTEX_SHADER = GOOCH_VERTEX_SHADER_130
self.BASIC_FRAGMENT_SHADER = BASIC_FRAGMENT_SHADER_130
self.GOOCH_FRAGMENT_SHADER = GOOCH_FRAGMENT_SHADER_130
def prepare_shaders(self): def prepare_shaders(self):
### Base shader ### Base shader
vertex = shaders.compileShader(BASIC_VERTEX_SHADER, GL_VERTEX_SHADER) vertex = shaders.compileShader(self.BASIC_VERTEX_SHADER, GL_VERTEX_SHADER)
fragment = shaders.compileShader(BASIC_FRAGMENT_SHADER, GL_FRAGMENT_SHADER) fragment = shaders.compileShader(self.BASIC_FRAGMENT_SHADER, GL_FRAGMENT_SHADER)
self.shader = shaders.compileProgram(vertex, fragment) self.shader = shaders.compileProgram(vertex, fragment)
@ -332,7 +534,7 @@ class PyAssimp3DViewer:
'a_normal'), self.shader) 'a_normal'), self.shader)
### Flat shader ### Flat shader
flatvertex = shaders.compileShader(FLAT_VERTEX_SHADER, GL_VERTEX_SHADER) flatvertex = shaders.compileShader(self.FLAT_VERTEX_SHADER, GL_VERTEX_SHADER)
self.flatshader = shaders.compileProgram(flatvertex, fragment) self.flatshader = shaders.compileProgram(flatvertex, fragment)
self.set_shader_accessors(('u_modelMatrix', self.set_shader_accessors(('u_modelMatrix',
@ -341,7 +543,7 @@ class PyAssimp3DViewer:
('a_vertex',), self.flatshader) ('a_vertex',), self.flatshader)
### Silhouette shader ### Silhouette shader
silh_vertex = shaders.compileShader(SILHOUETTE_VERTEX_SHADER, GL_VERTEX_SHADER) silh_vertex = shaders.compileShader(self.SILHOUETTE_VERTEX_SHADER, GL_VERTEX_SHADER)
self.silhouette_shader = shaders.compileProgram(silh_vertex, fragment) self.silhouette_shader = shaders.compileProgram(silh_vertex, fragment)
self.set_shader_accessors(('u_modelMatrix', self.set_shader_accessors(('u_modelMatrix',
@ -354,8 +556,8 @@ class PyAssimp3DViewer:
'a_normal'), self.silhouette_shader) 'a_normal'), self.silhouette_shader)
### Gooch shader ### Gooch shader
gooch_vertex = shaders.compileShader(GOOCH_VERTEX_SHADER, GL_VERTEX_SHADER) gooch_vertex = shaders.compileShader(self.GOOCH_VERTEX_SHADER, GL_VERTEX_SHADER)
gooch_fragment = shaders.compileShader(GOOCH_FRAGMENT_SHADER, GL_FRAGMENT_SHADER) gooch_fragment = shaders.compileShader(self.GOOCH_FRAGMENT_SHADER, GL_FRAGMENT_SHADER)
self.gooch_shader = shaders.compileProgram(gooch_vertex, gooch_fragment) self.gooch_shader = shaders.compileProgram(gooch_vertex, gooch_fragment)
self.set_shader_accessors(('u_modelMatrix', self.set_shader_accessors(('u_modelMatrix',

View File

@ -9,5 +9,7 @@ setup(name='pyassimp',
url='https://github.com/assimp/assimp', url='https://github.com/assimp/assimp',
packages=['pyassimp'], packages=['pyassimp'],
data_files=[('share/pyassimp', ['README.md']), data_files=[('share/pyassimp', ['README.md']),
('share/examples/pyassimp', ['scripts/' + f for f in os.listdir('scripts/')])], requires=['numpy'] ('share/examples/pyassimp', ['scripts/' + f for f in os.listdir('scripts/')]),
('lib/', [f for f in os.listdir('../../lib') if os.path.isfile(f)])],
requires=['numpy']
) )

View File

@ -38,6 +38,8 @@
cmake_minimum_required( VERSION 2.6 ) cmake_minimum_required( VERSION 2.6 )
#INCLUDE( AddGTest ) #INCLUDE( AddGTest )
include( CTest )
enable_testing()
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
../contrib/gtest/include ../contrib/gtest/include
@ -152,15 +154,6 @@ ENDIF(MSVC)
target_link_libraries( unit assimp ${platform_libs} ) target_link_libraries( unit assimp ${platform_libs} )
add_subdirectory(headercheck) add_subdirectory(headercheck)
#if (ASSIMP_COVERALLS)
# include(Coveralls) add_test( unittests unit )
#
# set(COVERAGE_SRCS ${assimp_src} ${TEST_SRCS} )
#
# # Create the coveralls target.
# coveralls_setup(
# "${COVERAGE_SRCS}" # The source files.
# ON # If we should upload.
# "${PROJECT_SOURCE_DIR}/cmake-modules/") # (Optional) Alternate project cmake module path.
#endif()

View File

@ -1,38 +1,38 @@
# #
# spider.mtl # spider.mtl
# #
newmtl Skin newmtl Skin
Ka 0.200000 0.200000 0.200000 Ka 0.200000 0.200000 0.200000
Kd 0.827451 0.792157 0.772549 Kd 0.827451 0.792157 0.772549
Ks 0.000000 0.000000 0.000000 Ks 0.000000 0.000000 0.000000
Ns 0.000000 Ns 0.000000
map_Kd .\wal67ar_small.jpg map_Kd .\wal67ar_small.jpg
newmtl Brusttex newmtl Brusttex
Ka 0.200000 0.200000 0.200000 Ka 0.200000 0.200000 0.200000
Kd 0.800000 0.800000 0.800000 Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000 Ks 0.000000 0.000000 0.000000
Ns 0.000000 Ns 0.000000
map_Kd .\wal69ar_small.jpg map_Kd .\wal69ar_small.jpg
newmtl HLeibTex newmtl HLeibTex
Ka 0.200000 0.200000 0.200000 Ka 0.200000 0.200000 0.200000
Kd 0.690196 0.639216 0.615686 Kd 0.690196 0.639216 0.615686
Ks 0.000000 0.000000 0.000000 Ks 0.000000 0.000000 0.000000
Ns 0.000000 Ns 0.000000
map_Kd .\SpiderTex.jpg map_Kd .\SpiderTex.jpg
newmtl BeinTex newmtl BeinTex
Ka 0.200000 0.200000 0.200000 Ka 0.200000 0.200000 0.200000
Kd 0.800000 0.800000 0.800000 Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000 Ks 0.000000 0.000000 0.000000
Ns 0.000000 Ns 0.000000
map_Kd .\drkwood2.jpg map_Kd .\drkwood2.jpg
newmtl Augentex newmtl Augentex
Ka 0.200000 0.200000 0.200000 Ka 0.200000 0.200000 0.200000
Kd 0.800000 0.800000 0.800000 Kd 0.800000 0.800000 0.800000
Ks 0.000000 0.000000 0.000000 Ks 0.000000 0.000000 0.000000
Ns 0.000000 Ns 0.000000
map_Kd .\engineflare1.jpg map_Kd .\engineflare1.jpg

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
Open Asset Import Library (assimp) Open Asset Import Library (assimp)
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
Copyright (c) 2006-2016, assimp team Copyright (c) 2006-2017, assimp team
All rights reserved. All rights reserved.
@ -45,12 +45,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <assimp/IOSystem.hpp> #include <assimp/IOSystem.hpp>
using namespace std; using namespace std;
using namespace Assimp;
namespace Assimp {
static const string Sep = "/"; static const string Sep = "/";
class TestIOSystem : public IOSystem { class TestIOSystem : public IOSystem {
public: public:
TestIOSystem() : IOSystem() {} TestIOSystem()
: IOSystem() {
// empty
}
virtual ~TestIOSystem() {} virtual ~TestIOSystem() {}
virtual bool Exists( const char* ) const { virtual bool Exists( const char* ) const {
return true; return true;
@ -60,10 +66,14 @@ public:
} }
virtual IOStream* Open( const char* pFile, const char* pMode = "rb" ) { virtual IOStream* Open( const char* pFile, const char* pMode = "rb" ) {
EXPECT_NE( nullptr, pFile );
EXPECT_NE( nullptr, pMode );
return NULL; return NULL;
} }
virtual void Close( IOStream* pFile ) { virtual void Close( IOStream* pFile ) {
// empty EXPECT_NE( nullptr, pFile );
} }
}; };
} // Namespace Assimp

View File

@ -77,7 +77,7 @@ TEST_F(ExporterTest, testCExportInterface)
for(size_t i = 0; i < aiGetExportFormatCount(); ++i) { for(size_t i = 0; i < aiGetExportFormatCount(); ++i) {
const aiExportFormatDesc* const desc = aiGetExportFormatDescription(i); const aiExportFormatDesc* const desc = aiGetExportFormatDescription(i);
EXPECT_TRUE(desc); EXPECT_TRUE(desc);
// rest has aleady been validated by testCppExportInterface // rest has already been validated by testCppExportInterface
} }
} }

View File

@ -202,7 +202,7 @@ protected:
::Assimp::Exporter exporter; ::Assimp::Exporter exporter;
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", 0 ); const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", 0 );
EXPECT_NE( nullptr, scene ); EXPECT_NE( nullptr, scene );
EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj" ) ); EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_test.obj" ) );
return true; return true;
} }

View File

@ -61,4 +61,5 @@ TEST_F( utPLYImportExport, importTest ) {
TEST_F( utPLYImportExport, vertexColorTest ) { TEST_F( utPLYImportExport, vertexColorTest ) {
Assimp::Importer importer; Assimp::Importer importer;
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", 0 ); const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", 0 );
} EXPECT_NE( nullptr, scene );
}

View File

@ -715,7 +715,7 @@ void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath)
mHelper_Mesh_Quantity = mScene->mNumMeshes; mHelper_Mesh_Quantity = mScene->mNumMeshes;
mHelper_Mesh = new SHelper_Mesh*[mScene->mNumMeshes]; mHelper_Mesh = new SHelper_Mesh*[mScene->mNumMeshes];
// Walk thru the meshes and extract needed data and, also calculate BBox. // Walk through the meshes and extract needed data and, also calculate BBox.
for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++) for(size_t idx_mesh = 0; idx_mesh < mScene->mNumMeshes; idx_mesh++)
{ {
aiMesh& mesh_cur = *mScene->mMeshes[idx_mesh]; aiMesh& mesh_cur = *mScene->mMeshes[idx_mesh];
@ -793,7 +793,7 @@ void CGLView::SetScene(const aiScene *pScene, const QString& pScenePath)
// //
// Scene BBox // Scene BBox
// //
// For calculating right BBox we must walk thru all nodes and apply transformation to meshes BBoxes // For calculating right BBox we must walk through all nodes and apply transformation to meshes BBoxes
if(mHelper_Mesh_Quantity > 0) if(mHelper_Mesh_Quantity > 0)
{ {
bool first_assign = true; bool first_assign = true;

View File

@ -178,7 +178,7 @@ namespace AssimpView
// Convert a height map to a normal map if necessary // Convert a height map to a normal map if necessary
// //
// The function tries to detect the type of a texture automatically. // The function tries to detect the type of a texture automatically.
// However, this wont work in every case. // However, this won't work in every case.
void HMtoNMIfNecessary( IDirect3DTexture9* piTexture, void HMtoNMIfNecessary( IDirect3DTexture9* piTexture,
IDirect3DTexture9** piTextureOut, IDirect3DTexture9** piTextureOut,
bool bWasOriginallyHM = true ); bool bWasOriginallyHM = true );