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 8/kUj4yM2Mxibm7O3kn5888/1YiCb775xmY6Ztri9/sVDwwMaBKkoLq6Go/gEUgfj4iXL1/W1tZm
bQAAwLYBAADbBgDAtgEAANsGAABsGwAA2wYAAGwbAACwbQAAbBsAALBtAADAtgEAsG0AAMC2AQAA HeL1evXQlC8vLyv1MLMY/W1ubl5fX1f55uammafYj4Glj4aGBo/Ho4RFcx+jofHxcTVolKFsxXxe
2wYAwLYBAADbBgAAbBsAANsGAABsGwAAsG0AAGwbAACwbQAAwLYBALDtg2R7e/uoxBCXUA/D9fJ+ o5K6ujrVxyNn0SPff/+9uTcG6eGRY6O5ydbWVklJibbBfoiTQv0ZjyTmuGvmbK4Pjx8/5uDgkdzc
AMC2AQAg/ra9R+12nv6Wg13ofnFxsbneu3fvNjU17WsTRY3BkC3WVo1LIYqJiYns7OxQKDQyMuK/ XOUUmrkMDw+nYn/GI6d93Ofn57/88ks9bGpq4rDgkfS4LuKRUz3ura2tJg15+/YtxwSP4BE48nE3
E5395ecdIl0wPDycgLerz74AwLYBAOBY2HYcw3MlHA7n5eWtrq4mpol2kS3WRojjvxpEtaenp2dm BAIBjgYewSNwZB4/fszXeVMC+ioeSY185P79+xwN8hE8Asc/7ubbiuL9+/ccEzyCR+CYx938C7n4
ZrKysuJSu+FV6YKCggLpjoS9XQGOo20DACQYPojjbtuLi4vFxcVVVVUrKyvqoCSqq6uTk5PloJZa xz/+wWHBI3gEjn/c+/r6jE2WlpY4OHgEj8BxjrvY2dkpPoSDg0fwCBzTI4BH8AjgETxCf8YjeATw
14M+bbumpmZycjKyM/J65swZa7axsTEpMykpqaio6NGjR9avFtdXhYGBgc8//9xWxdLSUmFhYTAY SCp6JGzBFTwCeCTdPOL8Vp/H46murj7Sz2rEcibKy8tP/4weqamxsbGfDhkfH8cjeASO4xFbaXd3
vH//vjngnp6enJwcOf7gwQM/MWjM2aQ6qSg1NfX27duGEWJzISq83Nxc27nOmOWKKisrQ6HQ9evX NxgMVlZWJuo8JcQje3t7paWlG4dcuHDBrOKPR/AIHNMjZg5ilo08OFypqa6uTg99Pp9iU6jBVlNT
rXGmpKRsb2+/evVKtNu130dHRwOBgJyru9t8w6ATa2trtbW1EoP0pqTVwY6ODumOhPUFnwBwTG2b k5+f39vbG9nI1NSU6mdkZJSVlT158sSZ73ysQfOjHmaFW9czur6+Xltbq1d5vV69uymcm5u7dOmS
RgGAxDsixNG2W1paxM/Ehpubm9VBSQwODkri1q1bFy5cMBz0aduzs7Pl5eVSS2lp6YsXL6zZRK2k Cs+dOzc0NGRrmp8yGx4etk198k37+/vtuphtbW16iEfwCMTlkYGBgStXrpi4paVlZWVFwcTERGtr
QEmMj48ry4z6qjifNm+NSLx4p1Sks3kF3NnZKZGI3knhfmLQmLNJMw4NDUnJ7e3thjequRBJqEJs qym8fft2d3e3dKMgshENVzOqZ2ZmzCh1PuvaoJ4dGRkx91Bcz+jNmzcHBwcVqOWff/7ZFCpxmJ2d
B50xt7W19fb2ykFJWKtramrq7u6W2ycp37XfpSnkLGkZCTgm25b8qu9GRkbkGtVB6Yi6urrE9wUA PThcby43N9e2b5oy/6cf45vKMkZ5QsHVq1fxCB6B498fkQWuXbtmRp1Q0mFfX1BQYAOzrL6u7ZEe
tg0AgG0fGdvWY43p6ek6oYRva2srGAwaDvqft3327Nn6+vpLly7ZThRXE0EUtbJOSDC/GggEJAZb 0SD86aefJBHn7MA+69qgc+Vr1zOal5dnKuh9rTJc+4FyE1Nza2sr9jfNzs52/lCA/ZUAPIJH4Mj5
vWlpabYpDV4B62w+Y9CYs2VkZKjq1tfXDW9UcyGS0E8EWg86Y87MzFSNsLa2pg8uLy8XFRVlZ2cv iKYkmoyY386JVIz9KR0763G+1gaad5g5iEaj+SnTsGqRDTrPousZdRbad9cbBYPB69evm98Wir5t
Li569fvLly+dbeIcy3fadigU0q9K7Soh5UjLJ74vALBtAABs+8jYtj6oxxd3d9DcR9PT03LW5uam 0d807FeCnI3gETwCR57XaFKjkWkful78dc03V28ZJ8pNFjVVWFgY9mz0bOJjZ1SvMrmDchybLFRU
LZu4vppjIIo2MzPj59WkpCQ/742oAfuMQWPOpquIRJvrbCjE7LtRqzt58uTw8PDDhw9Pnz797Nmz VHR1dU1OTr579875ux4mD3Ju2yffVG2Sj+AROMn7I8omJiYm7J2F5eXlg8Mf+LIf4rS2tpqfI21r
zs7OWNvEULtVyq1dYI0kYX0BgG0DACTiMwjiYttzc3ORnUXW9OBlMBhUI5HhcFiPXLoe9G/b7e3t a4u8vCs7ML/QMT09bS/sCkya49rgJz3S3NxsfujYeX/E4/GEQiENe+etEMXmLmlHR4fz/kj0N62v
FRUV165dc80mJd+8eVM/2Gd+VWr3M7YdNeCYYoiaLTMzUwWwsbER9cvRqxD/tp2RkaEawVqdSKq6 r3f+cJEe4hE8AnF5RENOsxtzfdbcwefzyQIqsf+furm56fV6dZHv6enRYA5rZG5u7uLFi/KLXmWE
5N7e3nfeeUeqcPbO+vp6ZGeMWUqIybb1mLQVn2Pb+9QXANg2AAC2fQRsu6qqShKPHz/Wk3HPnz8/ IhoaGrKysj7WYJhHIheqMp/C6FVynP28RrKTs8xmhH00o6xkcHDQOdWK/qZSz61bt0ysgM9r8Agc
Ojoa+essW9eDPm17YWGhtLRUzKyoqMg2b7ugoGBsbEwStsm7IpFer9bX1+uH6jQNDQ2Dg4Pz8/N6 2SPHRpd38/vGqY6mQiUlJauHKOD7I3gEPrtHNE3IyclRflFVVWXmC2mA+T5rY2Mj32c9m2MDYof/
sm/UgH3GoDFnk9ZTzwt++eWXhi9HcyH+bVuqE6WO7DynqEea5X7mu+++k8TQ0FBqampZWZl+nFGf 00u8vyHJeQUxg0fwCOARPIJHAI/gETwCkCa3lpJna9J4gRI8AmfCI5FC+RyKObMLlOARwCOntzXJ
rh4wlbaSE2Oy7ZaWluXlZUncuXOnvLxcHRwfH5fuSHxfAGDbAADY9pGx7cXFxcLCwtraWjXqGfnP 7JF4FijBI3DWPWIW6SguLs7MzLTfHHeu3MECJXgE8MinPeL3+/f3953/LONcuYMFSvAI4JFPe8Tm
8hqiONXV1dY1SZwHfc7bFiF78uSJkrNTp05ZT5yampLaxRelZKVZStdSUlK8XhWpbW1ttdW7tLSU 8M5Ce1uUBUrwCOCRvxOEsOecqYerXP6nFRYowSOARyorK53/JqPYrqv4SY+wQAkeATzy94S/vr5+
n58fCoW0iEcN2GcMGnM2tWRHZmamiKZhTRJzIf5tW6qTqwsGg319fSLWuhHkrkZKlp/T09NXr17V dXVV8crKSkNDw9OnT2P0CAuU4BHAI38zPj6u1EAlRUVFY2Nj0RMBZyELlOARwCOfFxYowSOAR44J
Sq1Pl9aTuqQXdHf7tG1pw5qaGilcbpmePn2qDkpHuK5Jsk99gXUAtg0AgG0fMds+ioTD4dzcXPW0 C5TgEcAjcMIHGo8AHgE8AoBH8AgAHsEjAHgEj+ARSHePOL+L4fF4qqurQ6FQnE1Hthz59ZNPiuzY
H9y5c6eysvJA+l26QDoiAetta/S4OAC2DQCAbWPb+0gC9pI85LS0tKSlpaWkpJw4cUJN8PCDbbR+ S37gEYAEeMSW7u7uBoNB+53O+D0SSzVX4lnyA48AJNIjB4f/+WK/ru66MEfs63pE/5+66Mt/xLPk
j5w7dy4xe0lquru7+eMFbBsAANvGtgEAANsGAGwb2wYAAGwbAADbxrYBALBtAABsG9sGAABsGwCw Bx4BSLBHBgYG7P/puS7MEfu6HjF6xPVd4lnyA48AJPL+iJKCa9eumVF98JGFOVyl4LquR+TNEVeP
bVrycH96693Lj3kMRwIaCgDbBgBsGzxte48f4z7X245V94uLi831JmBNkqgx7KX1AoGA/xZ2Nqaf uL5LPEt+4BGAhOUjU1NTZWVl5v9uI0Vg/3P3SOt6xJKPuL5LPEt+4BGARM5rNKmRIOxD14U5Yl/X
7pP2ScyCIX4aCgCwbQDAtrHtuNl2HMNzJRwO5+Xl6U1S9ruJ4mvbtbW17e3toVBIftbU1OyxCsOr I0aPuL5LPEt+4BGABN8fqa2tnZiYsHcuIhfmiH1dj9jvj0S+SzxLfuARgAR7RENasxuTC7guzBH7
0j4FBQUJWAwbEwA4GNt+9uyZvhGfn5/fRTUJ+Ov1OQCzFyYnJ/1vOgAA2PaB2Pbi4mJxcXFVVdXK uh4xesT1XeJZ8gOPAJy2R5KTeJb8wCMAeORvjr3kBx4BwCPpdqDxCOARwCMAeASPAOARPAKAR/AI
yoo6KInq6urk5GQ5aN1L0nnQp22LVsrnoSQmJibOnDljzTY2NiZlJiUlFRUVPXr0yPrh7PpqZGcv HgE8AngEAI/gEQA8gkcA8AgewSOARwCPAOARPAKAR/AIAB7BI3gE8AjgEQA8gkcA8AgeAcAjJ8Dj
SbX9uJWlpaXCwsJgMHj//n1zwD09PTk5OXJc73RojsFQhWS4e/duenq6tbSpqamSkhI5kpGRcevW x4/xCEByeQROBzzCYEgn/ufQOR+8SgUih2XKwYhNWo9wEI53rFLMI+Y3Lgw//PADHgE8gkeOxvz8
LWu9ubm5Gxsbra2tmZmZLS0tthsGyTM6OhoIBOSLQ/eFz40e1U6WUqk0td6tvaOjw3Wjx31qKLQb vLY+EAjob19fn/7+61//wiOAR5LLI0nOl19+abbe/LUPAfDI6R8r53UxZQ7c9PS0Nv3t27f2fO/s
IKG2PTQ0pP8CBwcHD+3F7PdHQ2JuGwCwbdiLbYv2bW9viw03Nzerg5JQH90ii3r3PteDPm17dna2 7JjEhJMKeASPxLrdTU1NYef7n//8p2IJhfMKeASPfILvv//eeY7D4uLiYs4r4BE88glkCvtr4WHn
vLxcaiktLX3x4oU1m9ibUtLx8XGRUVshrq+KVmrz1ojEX79+XSrS2bwC7uzslEjEIKVwPzEYqnAt WzMdPAJ4BI9wvoF+hUc434BH8AjnG4B+hUcA6Fd4hPMN9Cs8wvkGPIJHON8A9Cs8ApCIfvX8+XOv
raCg4OHDh5IYHh4WqdU55ZtRci4vL1dUVMhPaZBnz57Zmk7ilDwStnRKTLYt+VXDjoyMtLe3q4PS 1+s5pLa2dmFhwTYV2ZotdH32ZHn27FlNTQ0ewSOQ7P1qaWlJ+rh8+fL6IRUVFTk5OYuLi580xSl4
SnV1dYlvKABIhG2fP39eXqqvr5efZ8+eVQenp6flI0b+VlNTU+XGXe195XrQeqMsyN+2fCqlpaVd 5HO/BR4BOJl+1djYqJc8evTIPJydndVDFdph/NtvvxUVFVVWVq6trbnmIyYYGhpSHTkoGAz29vbm
uXJFPiPS09OzsrJGR0d1hrt378onmuR59eqVquvzzz+X/IFAQD4sbOLrTGjm5+fllr2kpCSy89hH 5eUVFhZOTk7aCmNjY7m5ubYd0d7ervrZ2dl+v98pDp/PJ69lZWU5Vy3b399va2vLPkTB3t5eWH08
cXGx/CoHY62lpqZGvlFSUlKsN/1SYEdHR2AHSaj/7lnz8/YCwLYPxLb1cKZ8uuqEevRta2tL+6Lr ApCwfqWxrZdolJqHCvRQw9uOUg3a4eFh+y+mH/OIXPDmzRsTSxChUEiBBGQr3L59W65R0NzcrMK7
Qf/ztuW7QL4ULl26ZDtRdLCpqUnszTrnwfyqfIpKDLZ65dPYNmvCK2CdzWcMhipcS/Nq56hPE0oe d++a/3R/8OCBAtnH1pR9NjY2wvIRs2SPtkQ+UtDZ2RlZH48AJKZfZWRkhC/n88UXmZmZdpTqyr+7
tR29LWDnQLvTtkOhkH41MzNTJaQciTnxDQUAibDtoqIieUluiOVnXl6eOpiTkyO/rq2tzczMSKKs uxsml8jA/MO6ibe3t02sxp0VnO1IMYp3D1Gg5MX5jpHzGlUw9Y3pzP+jhdXHIwCJ6Vca1WZ8moeu
rMzroE2IxWWXlpZUWgR3YWFBEtnZ2TpDW1ubGLkkxPLl4OXLlyXd399/48YNSYij+7RtoaurSw4O yoiUy8FHbri6xq7t6G+UxiNbM76zOA3F/RGApLg/Yv8TfWZmRg9v3LhhR6lNGTQDiscjW1tbpp38
DAx8++23krh48eIuapE7AfXtZa1ClXz79m2xdkmo7Wdt+QEA2068beuDeghzdwfN7jU9PS1nbW5u /HxnfmEKnfmFq0cKCgqc86/ICngEIGH9anFxUdlHWVnZ6urq2tqaguzsbOfnNR0dHSMjIwpu3rwZ
2rLJp5+axiAWKF8Efl5NSkoyXJHrEdeAfcbgswprafKN0NjYWFBQENP8eJ8t7Np9Vim3to8uJ5EN j0daW1tHR0cVtLS0qLCzs1Nxf3+/uT/S1dUV6QWTK5kZk9/vVzwwMLCwsKCguroaj+ARSKJ+9fLl
BQD7btuvX7+W4+qBa7ljVjKt7qclXVxcLHqqP3BdD9qEWB1X6Y2NDZVWnyY6g9yRS0LdxIuIS3pr y9ra2qxDvF6vHjpF8PDhQ2UQFRUV6+vr0Sc40T3S09Pj8XjUvrknure3J0OZz18CgYBrfjE+Pq5N
B0lkZWV5XYxzAEZOkduDjIwMiT8/P18Nn/ivReW0jgfoJpIMKv/29rYk5DbDmR8AsO3E2/bc3Fxk MspQffN5jUrq6upkPTyCRyAl+5WZg5SWlh51k5Kzt+MRgAT0K2UTmmtMTU0d6VUm08EjeAToV+l5
5/9venw0GAyqwU75dNKDo64H/dt2e3t7RUXFtWvXXLNJyTdv3tQf1+ZXpXY/Y9tRA44phojH2LYz rPAIAP0Kj3C+gX6FRzjfQL/CI5xvwCN4BI8A0K/wCCcS6Fd4hPMN9Cs8wvkGPIJH8AgA/QqPANCv
XVZWdvXq1dHRUfUIU0y2vb6+rr6J5GsoJtvWY9JWfI5tx72hAGDfbXtkZESONzQ0SFp+Slo9inHn 8AjnG+hXeITzDXgEj+ARgPB+BbGDRwDoV+QjnG+gX+ERzjfQr/AI5xvwCB7BIwD0KzzCiQT6FR7h
zh35k1Z+KZ/pd+/e9TroOvzsmrYdVDfl8tN50Mu2ncflU1KPqbtWbajF+c8+/avcHjjHHpjYDYBt fAP9Co9wvgGP4BE8AkC/wiMA9Cs8wvkG+hUe4XwDHsEjeASAfoVHAOhXeITzDfQrPML5BjyCR/AI
H7htV1VVSeLx48d6vu/58+fVbD3rRF7Xgz5te2FhobS0VOSvqKjINm+7oKBgbGxMErb5wWpsxfXV AP0KjwDQr/AI5xvoV2feIyxReSTSrycB67OejEcQ85k9VuwR+QgeoY+yR/RnPEIfZY/YIzxyxo87
+vp6/dyeRr5uBgcH5+fn9XziqAH7jMFQhWtpqampcr1ysdKesdq2evpTauno6IjJtltaWtRUTPlW o449wiMcdzyCR+jPeASPMOroz3gEjzDq2CM8gkcYdewRHuG44xE8Qn/GI3iEUUd/xiN4hFHHHuER
LS8vVwfHx8elrRLfUACw77YtkmobM9YPj8t9s7j4J598okeIXQ/Gatvr6+tqgFkNzOhRZHVQjSL7 PMKoY4/wCMcdj+AR+jMewSOMOvozHsEjjDr26Cx4xC5VkJGRkZWVVVVVFQqFTmQfPvcpf/bsWU1N
tO21tbWMjAw5JT09PRAIqCl0/msx2HZmZqZz3h62DYBtH7htLy4uFhYW1tbWqoHVyM4iFaLgYlHV DR7BI5AsHjHx06dPFV+6dCklPHLib4FH2CM8cgIeMQ89Ho+Cd+/e6WqvODMzs7y8fGZmRoXPnz+/
1dXWNUmcB33O2xbne/LkifK/U6dOWU+cmpqS2pOSkqRkZXLKCFNSUrxeHRgYaG1ttdW7tLSUn58v cuWKSlSuZ5eXl1W4v7/f1taWfYiCvb09Z7MmGBoaqqyszMnJCQaDvb29eXl5hYWFk5OTtsLY2Fhu
n89axKMG7DMGQxWupck3mlhpMBjs6+uL1bbl0qRSaSLdFz5tWy6wpqZG4pf7madPn6qD0kqua5Ls bq7qrK2tmS1pb29XfbXp9/udm+rz+S5fvqzUybmIWZRtMPXxSPrt0dzcnOmira2tq6urx74UGdRO
U0PxdQaQONuurKzU49lqjvLJkyclLXfbkv71119FYSUhf+1eB2O17fb2drmbV0/Wy8Hu7m71maVm dXV1nMm4c/PUpX86ZHx8/Gx55NGjR4p/+eUXxRp7ExMTCt68eaNCDXvFxcXFijc3N1+8eKGgoqJC
VF+9ejXie952W1ubenK8v79fEnIPsLtaFGqejJoJo25Cbt68OTc3p9sE2wbAtg/Wto8i4XA4NzdX hYFAQPHw8LAOnILOzs5Ij8gFph0hQehsKSgqKrIVbt++LdcoaG5uVuHdu3cV9/X1PXjwQIHsY2vK
jYbQKV5I+0grJXKmoh4XB4D9te3t7W01xUKtFfrixQs1y0KOy1++3AGnpqbKrydOnFDrcLsejNW2 PhsbG2FbHmUbbH08kk57tLi4eP78+enpaV1C1tfX6+rq+vv74zk+u7u76ma6kp3I5ulKVlpaunHI
+/r6pAS9UKh8uHz55Zdq9Y+uri7XU1wHYNTyI+pJTaGkpER+VY9vxlqLYnh4WO74lVhLfrUmiRyp hQsXzIXtTNwfMeg4vn792jyl7KOjo0PTHHP3RCVKEBQrPdHw3tnZMdWkGBXqNOiMKpBrIj1iKpt4
ra21jprzxgLAtrHtmEjAXpKJxzaUvkfOnTuXmL0kNerpfwDYd9tOfEAJ2weH7gfAtrFtAAA4Xrad e3vbxKZNW0EtKNBbqFCKMW2aQmMxU9OeEqdHomxD7KcQj6TQHl2/fn1gYMCWKzU2VyCTp6jTKms+
ssObUQsAYNvYNgAAn8+Hy7YBANsGbBsAANsGAMC2sW0AAMC2AQDbxrb/StQtxw85Ry7+wxzwUX8z d+6cLk72hffu3VPHULns43p81Hn0rIl1sZSb9FD5rOIoLctiXq9X6YwuY7ZBSU3XSxMrQT6G41I4
AGDbAADY9kHatuvx4uLi/bD5hH2DWON/8OBBUVFRcnKyHHz48KH5xOXl5ZqampSUlEAg0NramrA9 H5mamlJcUlKiWLMPxfX19X/++aetMzo6qtmHeZifn6+LvwqlA6eJnHYIa981Dis0J1J/Iwsjp2D2
XGJqcLU8i5CYFUh28WYAAGwbALBtbDvOWnyobFtXNDMzk52d/fjxY0mLamdlZc3OzhpOLC8v7+/v YfRtwCPp5xFdbz58+OBaR9f/2dlZBZpQqLvaFyoplikkESuLsOMjMWnabuKWlpaVlRUFyso1b4rS
397e3tra6urqamtrO2y9Ew6H8/LyVncoKChIwOrafO8DYNsAgG2DX2fKz89X232/ePGiqKgo8tdN smqOjIyoZVWzDcpBT548MbGCq1evnrn7I+YomxsQ+4c46+jyriPb1NRkc4eCggJT07XZGD2ytbVl
Cnt6enJzc61bQnrtL1hSUpKcnJyRkXHr1i0vJ1taWiosLAwGg2rvM5Xn7t276enpcq7e19CrNBWM Ug/pyZlfmMKwHCeytejbgEfSzyPWBTHWD8tkI5NxNXjt2jXjDmH6oe1dUVpWbmI6nvqwLczOzlbX
tUDxy8rKylAodP36dV3d2tpabW2tnF5TUyPpiGVrBUk3Njbevn1bl3Dz5k29aPfY2JiclZSUJO3w tTMmM1LOikf+/e9/KzZKNiP55cuXSslsHc16FChDWV1dVfDNN9+oUJpXLJcvLCwoqK6uPoZH5HIl
6NEjdVBtFqHz6y2QnbWoikZHRwOBgESldpzwcznODNaApZzq6mp5VW/1YDt9YGBA79bc0dHhunOk OwpkdxV2dnYq1lub+yNdXV2RXjCTLDNjir4NeCT9PKJxbibIFvtwY2MjGAxq4qP0wdnfXOViM/Gy
rdkNZebk5Fj7wtkmXm8GAMC2AQDbBhfb1n4m3nnx4kWbbQ8NDSnXdN1+XKcLCgrUlIzh4WGxOi/b sjJng5Hp7cdadhrNmSA7ty1G66XD/RHtubll/e7dO5U/fPhQp0pjVbM7OyClj4aGBvMhTlVV1eLi
PnPmjGjx7OyslmbJ09nZKVWI3onVmUvTwWja2tp6e3vloNoDWB1saWmRO4fIzvbp7e3ttmCkQLW5 oslQzGclSmGUzpk750f1SE9Pj5rVPNPcE1WbHR0d5vOXQCDgml8ot9Q7GmVE3wY8kn4eaWxsdN4f
r+L169daoCUAJbvj4+M6wtOnT0uzSNV6L3RzLRcuXJB4BgcH1ZbDfi7H3HrNzc1SmiQkNr1To/V0 efHiRWlpqYkrKip04ZmcnFRPjtEjZlIjQdiHdtrixLVlZSsm05GGnNOus5WPJEPPSJKNxCMptEfK
kX59byCJurq6qM3uVaazL1zbhO99AGwbALBt8GvbExMTjY2NkZ1B36mpKZtYa7s127azWNdXxWtt lDWAzdcRlpaWlE309fWZp3RBCoVCGr3OGxaf9Iiora01n1Gaux7maw1Kk+2HOK4tKza3UXXls4X1
8xwkjz4StTTnw3mZmZlbW1uRnZFmnTMUClkzRI1Km6V4alNTk2ilNUgpWXz05MmTSUlJosV62olX 9fX2bq42Ug/xyOcl6xA8gkeOukcan+Xl5UqNNQfv7u625XKB5h1KKJTkHskjEod8ZPII5cU+n0+N
LWqTYIlKe7P/y3GNMz09XeW0lmk9PRAIqEZQefTNg6HZvcp09oVrm/C9D4BtAwC2DX5tW6xLiWNe q0SeitKy+WRHUhscHHR+XnPr1i0TK0j/z2sAj7BHJ45mOiUlJauHKEj/748AHmGPPgfm+6yNjY1n
Xp4fsXY9uLq6euXKFfF18VGD15qPxFqaVZRtEWpEkW2vilxqNxU2Nze1nkq9an6FHJmZmbHVJWf1 4vusgEfYo7PQn/EIHuHs05/xCB5h1LFHeASPMOrYIzwCeORseSTsPyToz3gk8R75z3/+g0eSbY+i
9vYWFhb6qcUaW9TLMWdwLdN6UNfubBM/ze5aprUvnG3C9z4Atg0A2Db4te3Izqj2t99+e/78+Zhs 71p5eXmc75IG65LgkSTyyO+//566x/DMeiTOHU+PdUnwSFJ45PXr17W1tT/++CMeSWaPRC4s4lwo
W+xTp8vKyq5evTo6Ovrs2bNYx7adaZ+lCRkZGUqdNzY2rD5tuNimpiY9eVoYHBzU87YVcvtx8+bN z3UZEfMSsz5GGq9LgkcS75Fff/31q6++evjwYUofwzPikSgLi7guI6JnzYohB2m9LgkeSVgfXVhY
rKwsHbN1EFpvKuxVy/r6umocic3n5ZgzSEUqAGk6fWNgPV0Oxjq2HbVMW2vb2oTvfQBsGwCwbYjB +OOPPy5evHjnzp3379+n+jE8Ix5xXVjEBK7LiDiXqknjdUnwSGKoqqpqamrSTHh+fj49juEZ8Uj0
tm/cuCFp65OLTqlKTk5Wi9+pR+hEvzo6OnSG1NTUhYUFUb329naDHzc0NIjdzs/Pu84AjrU0QTL0 ZyOXEXF9yUHarUtywh6B2Pn666/turPpcQzPuEdclxGJ3SMHqbwuCflIwvqo1+tVn/jrr784hint
9vZGdmaf6yHelpYW9dznnTt3ysvLbfHPzc2JNT558kTS8lPSesi2oKBgbGwssrNEoB7xbWtru3z5 EV3nTRLhuozIkTxykLLrkuCRhPVRHfH79++fP38+EAjYxIRjmHIeaWhoMIvauC4jclSPpOi6JHgk
sji0XPK1a9eqq6sNtUiQ6oFFuUwJyefluGbQActdkIh4xDHHWp9eX1+vH2ocHx+XX6M2e9QyrTPy kR4Rc3Nzd+7c+fbbbx89esQx5I7PCXKa65LgkQR7xBz3+fn577777saNGxxDPHKCnNq6JHgkKTxi
nW2iYwMAbBsAsG2IbtuvXr0Sf3LO2bV+vIuxqWFdZV1paWnK0dWrIyMjomXBYLCvr8/gx0tLS/n5 rh7d3d0cQzySBv0ZjyTMI4bU/f8aPEJ/xiPJ4hHAI3iE445H8Aj9GY/gEaA/4xE8AngEj+ARwCN4
+aFQSNuhq+H5LC2yM6m6qqpK5RRnVQdXV1dramokyKKiIv1oo44/svMoYXFxsWQoKSnRzxdGdtYG BPAIHsEjHHc8AvRnPIJHAI/gETwCeASPAB7BI3iE445HgP6MR/AI4BE8gkcAj5xpj0Ds4JHkHxtw
KSwsFGuXl5RiRnYeoxThDgQCcnpdXZ2alu1ViwQ5MDAgOU+dOqUGuf1cjmsGHfDKyopco1Qkom9d vP5MPkI+Ai68gpjBI3gE8AgewSOAR/AIHgFIh+6NR/AIAB7BIwB4BI8A4BHAI4BH8AgeAcAjeAQA
P0SfLjW2traqtCRc1ySxNXvUMq2rzTjbRMeGAABg2wCAbUN0234DuHPnTmVl5fFsUrlNys3NfbmD j+ARADwCeATwCB7BIwB4JHU9wu/7Ah7BI3F55Pfff+cYAh5hDBzTI69fv66trf3xxx85hoBHGAPH
JBKw3rZGj4sDwL7bNgBAIsG2sW1FS0tLWlpaSkrKiRMn1LyOg0UPnycYtZfkuXPnErOXpKa7u5u/ 8civv/761VdfPXz4kGMIeOR/xsDc3FxNTY3H42ltbV1dXT1eaxa1U11dHQqFTmrzxsbGfjpkfHw8
I4AE2TaNAgAH9RkEx9m2AQCwbQAAbBvbBgAAbBsAsG1sGwAAsG0A4DMI28a2AQCwbQAAbPvNsW3X UR5ZWFj4448/Ll68eOfOnffv3+NiwCP/MwYWFxfPnz8/PT29v7+/vr5eV1fX398fz7Df3d0NBoOV
bcYTyYEHcLSguQCwbQAAbPuQ2rbr8eLi4r2Xbz3y4MGDoqKi5ORkKfnhw4f6+PLyck1NTUpKSiAQ lZUnsnl7e3ulpaUbh1y4cEEPT/9AV1VVNTU1aY/m5+fJ6QCPuIyB69evDwwM2PLl5eXm5mabp1y6
aG1t1buo7CKAWJEaXY97hbp31Foi+3Etfppr11/fXg3lWoUVW734AwC2DQDY9nG07XiZmcG2Z2Zm dCkzM/PcuXNDQ0P2hffu3SsuLla57OM6oqQkPWvizc1NuUkPfT6f4igty2Jer1fpzPDwsG1QUmtv
srOzHz9+LGnx16ysrNnZWfVSeXl5f3//9vb21tZWV1dXW1tbAsystra2vb09FArJT3F960uGUPdI bzdxW1vbMRwXJ2/fvtXGfP311zs7O1GysJSD8QMn6ZGcnJwPHz641tH1f3Z2VoEmFLm5ufaFfr9f
OBzOy8vTm8skvnN30aSGhtpFFfgDALYNANj2m2/b+fn5aqXqFy9eFBUVRf469NjT05Obm2sdm/Ta ppBErCzC+qXEdOXKFRO3tLSsrKwomJiY0LwpSsuqOTIyopZVzTYoBz158sTECq5evZqQeY0EV1FR
cbCkpCQ5OTkjI+PWrVtRbbuxsfH27dv6+M2bN/UQrxRinQWRlpYWsQyRWqOK7OwlKf4np4j5Sdoc 8ddff6VHPoJH4IQ9Yl0QY30FdnLhLLSowWvXrhl3iPz8fNtIQUFBlJaVm0giCra2tmxhdna2Jkp2
jEh8MBhMT0+/f//+xMSEOLTahV5e3djYaG1tzczMbGlpsemvIVQpc3R0NBAIVFZWrqysqIOuIamY xiTrJWTUvXr16v79+5oABgIBm5jgEcAjX9hxvr297XzKPtzY2AgGg5r4KH1wKsNVLiaYmpoqKytz
c3JydI2RnT0g1TbvkZ3tHgsLCyU8iU0dkQKrq6slf1VVlXW7R2c5Y2Nj8mtSUpJ0n9oa0zaW7FWF NuhUTEZGRpSWnUazhfYlR7Le5/CI0HTszp0733777aNHj/AI4JH/70mNjY3O+yMvXrwoLS01sTL5
ZLh79640iLU0r9ZTbW5oKNfWcDUE59i2a6MB8E2HbQMAtv0m2HZHR4fa61s88uLFizYZGhoaUu7r rq6uycnJd+/exegRM6mRIOxDO21x4tqyshWT6UhDzmlXkuQj9vsj8/Pz33333Y0bN/AI4JG/X/7y
+t9/nS4oKFBTLIaHh8Xnotq25Nnc3NTHX79+raxaOH36tIQh9ert0J2KpqMS55ObhMjO5uft7e3m 5UsN4JmZGcVLS0vKJvr6+sxTHo8nFApp9DpvWHzSI6K2tnZiYsLe9VheXlYwOjpqP8RxbVmxuY3a
YNra2sLhsHh2eXn51atXpQS1C31kZ/pKRUWF/JSXnj17Zq3XEKqUeeHCBSlncHBQIlEHXUOSnJ2d 0dFhC+vr6+3dXG2kHibcIweHnyJ1d3fjEcAj//9yjc/y8nJNGQoLCzU8bLlcoHmHEoqenp4jeUTi
ndYaIzvjxHrf+DNnzly/fn12dlbdRQjNzc1SrCREefWWja7lSEJp8fj4uD7d2fjOKlxL82o91eaG kI9MHqEpjM/nU+MqkaeitGw+2ZHUBgcHnZ/X3Lp1y8QKTv/zmoN0/P8aPAIn75FkRlf+kpKS1UMU
hnJtDZ+27dpoAHzTYdsAcGCfQe+8805VVdWnn35Ka+zdtsU+GxsbIzuDuFNTUzYZ0sPMZts2u5Sf JOT7I+n3/754BM6WRw7++33WxsbGBH6fFY8AHqEn4RHOPuARPIJHAI/gETwCeASP4BHAI8ftSeaL
l7Ttra2tibSdPHkyKSlJzE9P23CNKhQK6RIyMzPNwegp4JLW25tH/QozhCovvXz5UhJbW1taTF1D 6ngEjwAeidaTonep8vLyON8lDdYlwSOAR+LySJwdLj3WJcEjgEdi9UjkwiLOtSpclxExLykpKTlI
cq0xEAjIiSotBm/bcT09PV1dprVw13Lq6uqamppEta0lOMN2VhG1HVzb3NBQztZwTtp2fRtE7UcA 63VJ8AjgkSN4JMrCIq7LiOhZs2LIQVqvS4JHAI8cwSOuC4uYwHUZET1rb8Sm8bokeATwyBE8Ev3Z
bBvbBoCEfgbdvXv3v//7v9UY2J9//pmTk/PRRx998cUX9+7do31itW2xKOU6eXl5fsTa9eDq6uqV yGVEXF9ykHbrkuARwCMn4xHXZURi98hBKq9LgkdSYo/geKvznoZHdJ03SYTrMiJH8shByq5LgkfY
K1fE18WP/di22JgWTWFzc1MPGGskQ29vb2FhoTkAjdi5z2Ci3jBYMYRqPdeq4M6QXGvUr0aiPVFq ozQ+VqfhkYaGhqysrIOPLCNyVI+k6LokeIQ9wiPpedxPc10SPMIe4ZG0Pe6nti4JHmGP0uxYOfsz
Ldy18dWcEwlsZmbGT4F770rzbYlrwIb3kmujAWDb2DYAHIrPIOG33367f//+119//c9//lN+ff78 /6eXmOPOqGOP8AjHHY/gEfozHsEjjDr6Mx7BI4w69giP4BFGHXuERzjueASP0J/xCB5h1NGf8Qge
+fvvv//JJ5/09/dr+QCD9Ihaffvtt+fPn4/JtsVBdbqsrOzq1aujo6PPnj3zY9tNTU16TrAwODio YdSxR3gEjzDq2CM8wnHHI3iE/oxH8Aijjv6MR/AIoy6Z9siuyuG6VMfHSj7rHj179qympgaP4BE8
J0OLMlqHUVNSUgxR6TFUK1GDicm2DaHKuevr66opMjIyDCG51ihXahjblnJUO8hxV7+3RS6Zb968 knoeieXh6Xjk870FHsEjeCTePVpfX9d1vqioqLe392P5ReweMcHQ0FBlZWVOTk4wGFSzeXl5hYWF
mZWV5XVdrmPbzrTPrnS9Rmdr+LRt10YD4JsO2waAw2LbTubm5u7du9fV1SUKLr/+8ssvH3744Rdf k5OTtsLY2Fhubq7qrK2tmRba29tVPzs72+/3O9v0+XyXL1/Oyspypj/7+/ttbW3Zhygwq2Q46+MR
fPH999+LmtOGNte5ceOGpK0PzzlVKTk5Wc3EUE/Uidt1dHToDKmpqQsLC6JZ7e3tfmxbOki88MmT PIJHTnWPfv75Z1UeHBxsbGw8KY/IBW/evDGxBBEKhRRIVbbC7du35RoFzc3NKrx7967ivr6+Bw8e
J5KWn5LW90VtbW2XL18Wb5Mqrl27Vl1dbQvAWmxLS4t6xPPOnTvl5eU+g4nJtg2hyrnqMUdRcGkN KJB9bE3ZZ2NjI+xNA4GA4uHhYflIQWdnZ2T9hHkEYgePpM0eKS9Q5d3dXbPcb+wecb0/YoKdnR0b
Q0iuNdbX1+tnExsaGqSQ+fl5Palabn5EeSOOedvOcgoKCsbGxiI7KxVaJ3PrmTNeVbiW5rMrXd9O m3VI7erltoLeUYFZSFiKMdtgCpW82JrOH12w26AKpr4SEwXFxcWR9RPjESevIGbwSKrvkYZ32K8g
ztbwP2/b2WgAfNNh2wBweG3bRjgcFnH55ptvzp49q/x7YmLio48+kiM//fTTn3/+ecxt+9WrVyJn xJ+PRFb7WAXzwwb6G1kY5U3NNof9vsKxb6DgETyCR+Ldo/z8fHNt//Dhw6l5ZGtry6Qe5mebbH5h
zim81o93cTU1zKyULi0tTTm6enVkZEScLxgM9vX1+bFt4dGjR8XFxVJUSUmJflgwsvMYogh3IBCQ Cp35heubFhQUOH8rKs4bsXgEj+CRePeopaXF3Bk1wel4pLW1dXR0VIHeVIWdnZ2K+/v7zf2Rrq6u
6urq6tRUYGsA1kJWV1dramqkkKKiIv1UZdRgYrJtQ6hy7sDAgER16tQpNazrFZJrjXJua2urSi8t yHfRDMjOmPx+v+KBgYGFhQUF1dXVyegROIN3js/sHm1sbNTU1CgFML9J4PF4TsEjei+9kdfrNfdE
LeXn54dCIe3fKysrVVVVUo7cb1jXJHGWMzU1VVhYmJSUJJmVdlubS+OswrU0n13p+nZytoZP247a 9/b2Ojo6zOcvgUDA9V3Gx8ezsrKMMlTffF6jkrq6utXVVTwCeCTB91nv3bunkbm8vGyv7Z91w5Lt
aADYNn8PAHCobdvJH3/8ce/evQsXLnzwwQc9PT3Kvz/99NPvv//+559/tq5BcRxsGw6kAeX2Jjc3 aOMRwCPx7tHk5GR5ebku7EoQlJi8fv36s25Y1iF4BPAIe5RuxwqPAKMOj+ARYNSxR3gEGHXsER4B
V99O8HayoUf0Afime8vn2vVe24PtB/63ubKSyAgB4GBt28ni4uI333zzySefiH//7//+rxwZHR3t wCN4BI8Aow6P4BFg1LFHeAQYdewRHgF6Eh7BI3gEGHV4BI8Ao449wiPAqGOP8AjQk9gjPIJHgFEX
6+v78ccfRc2RRXBiGzzeBfu3l+RRbA0b3d3dvMeAb7rYxra9tgeLL7Fuc5X4CAHgcNq2k59//vnr vkdwvPWG8QjgEfIR8hFg1LFHeAQYdewRHgE8wh7hEQBGHR7BI8CoY4/wCDDq2CM8AniEPcIjAIw6
r7+urKz829/+9sMPPyj/lk+JN2byCbYNAHDEbNu8l5jr9mARt92t/G/E5cxp3ubKsJFYwiLkGw7g PIJHgFHHHuERYNSxR3gE8Ah7hEcAGHV4BI8Ao449wiPAqGOP8AjgEfYIjwDgETyCR4BRxx7hEWDU
qNi2k3v37qnBb/HvH3/8UY7Ix4L8vT9//hzbBgCAfbdt815iXtuDOXe38r8RlzOneZsrw0ZiCYsQ sUd4BM5eTwLWZ8UjAOQj5CMAeASPAOARPAKAR/AIHgHAI3gEAI/gEQA8gkcA8AgewSMAeASPAOAR
AI6ubWvCO0iir6/vxIkTb7/9digUUqudyCfMTz/9ZFtqDdsGAIA42Lbrh7hOeG0P5lwB1P9GXDHt PAKAR/AIAB7BIxw4ADyCRwDwCB4BwCN4BACP4BEAwCN4BODEPTI3N1dTU+PxeFpbW1dXV4/XmkXt
PhV1I7EDjxAAjoptO/n999/VJ8BXX3313nvv/e1vf5O7ejXh5Jdffjmcg9/YNgDAEbNtnxtQeW0P VFdXh0Khk9q8sbGxnw4ZHx/HIwDJ6JHFxcXz589PT0/v7++vr6/X1dX19/fHM+x3d3eDwWBlZeWJ
Zq3A50ZcMe0+5X/5p4OKEACOrm3b+OOPP0SyVfrjjz+WG++3335bLx19SNb8Pvy2HXW3cACA42Xb bN7e3l5paenGIRcuXNBDPAKQdB65fv36wMCALV9eXm5ubrZ5yqVLlzIzM8+dOzc0NGRfeO/eveLi
5g2ovLYHc91Ay6crx7T7VFTbPvAIAeCNsW2Df8vnyYkTJzIzMz/44IPPPvtMv4ptOykuLt6/q/C/ YpXLPq6zJClJz5p4c3NTbtJDn8+nOErLspjX61U6Mzw8bBuU1Nrb203c1tZ2DMfhEYDP7pGcnJwP
elVJSUl/f7/+dWBgoLS0NGGNrEow/xvZNXNTU9Pw8DCfGABvlG2bN6Dy2h7MubuV/424Ytp9Kqpt Hz641tH1f3Z2VoEmFLm5ufaFfr9fppBErCzCPCIxXblyxcQtLS0rKysKJiYmNG+K0rJqjoyMqGVV
H3iEAPAG27aNzc3Nn376ST17/dtvv6nBb/mU+Oabb1SGBMz8Pvy27XNTlViLjXX1KqkiLy9P9Yj8 sw3KQU+ePDGxgqtXr+IRgKTziHVBjPUV2MmFs9CiBq9du2bcIfLz820jBQUFUVpWbiKJKNja2rKF
zM7O9l/p3htZvlv1z6iFWzOvrq4WFBQciUcIAMCvbZs3oPLaHsy5u5X/jbhcc+7athMWIXMlAbBt 2dnZmijZGZOsh0cAks4jGufb29vOp+zDjY2NYDCoiY/SB6cyXOVigqmpqbKyMmeDTsVkZGREadlp
J3/88cePP/6oNuuemZn529/+9ve///3s2bNq8cEjYdvOFZxWVlaqq6vlM7Cqqsq6IaJzBaexsTH5 NFtoX3Ik6+ERgFP1SGNjo/P+yIsXL0pLS01cUVHR1dU1OTn57t27GD1iJjUShH1opy1OXFtWtmIy
NSkpST4t1X6NehqeuQrJcPfu3fT0dGtpXmtkSb25ubnm1aukC+SLoLKyUoLXB6UjVNdInE1NTToq HWnIOe0iHwFIdo+8fPlSA3hmZkbx0tKSsom+vj7zlMfjCYVCGr3OGxaf9Iiora2dmJiwdz2Wl5cV
1wtU20CK8t6+fdv6aJBziSo/nDlzRn42NjbarkKlFxcXi4uLpToVrS1zR0fHwMAAXz0Ab45tg0/Y jI6O2g9xXFtWbG6jdnR02ML6+np7N1cbqYd4BCDpPGLGZ3l5uaYMhYWF3d3dtlwu0LxDCUVPT8+R
HwsA247Kn3/++fPPP//v//7vvXv3IjtLfYt/f/jhh11dXXL8cNq2cwWn5ubmwcFBSYjy6o8+1xWc PCJxyEcmj9AUxufzqXGVyFNRWjaf7Ehqg4ODzs9rbt26ZWIFfF4DkKQeSWY00ykpKVk9RAHfHwHA
JKG0eHx8XJ/ujNBZhWtpXmtkDQ0NSU7z6lUSp+SRsMXF9UGJ7csvv5S01CX+qgNzvUA5UVVk/U+v I8fBfJ+1sbGR77MC4JEUPlZ4BACP4BEAPIJHAPAIHgE4ux4xX1TnWOERgGgeiS6U8vLyON8lDdYl
YYmqtxyYe00VrtJSrKQnJyclEmdmuW+pq6vjQwMA2z52sD8WALa9C9Tgd19fnxpkFRF///33Gxsb wSMAcXkkzulPeqxLgkcAYvVI5MIiNpU4+MgyIuYlJSUlB2m9LgkeATiCR6IsLOK6jIieNSuGHKT1
v/7668XFxcNg286nXNLT05UXbm1tWa3XuYKTSGFTU5OotrUEZ4TOKlxLc71MSUR97FLyqH9s2gJe uiR4BOAIHnFdWMQErsuI6Fl7IzaN1yXBIwBH8Ej0ZyOXEXF9yUHarUuCRwBOxiOuy4jE7pGDVF6X
WFgoKyuL7OyDJq6vy3S9wIyMDHVwfX097ktUWa9C0npAXSJxZpao9N4RAIBtAwBg2zEgivnLL7/8 BI8AxOURXedNEuG6jMiRPHKQsuuS4BGAuDzS0NCQlZV18JFlRI7qkRRdlwSPAHzCIynKaa5LgkcA
61//+uyzz5R/i4h/8MEHXV1d9+7d+/333xNv214P7Sn0wLPXvDs1JUPscGZmxk+B5tL8rJFlvgRb 0tMjB6e4LgkeAUhbj5zmscIjAHgEjwDgETwCgEfwCAAewSN4BACP4BEAPIJHAPAIHgHAI3gEjwDg
wOLQr169Us9WupZpHad3df24LFHlNSvSWqkVr+MAgG0DAGDbsbGxsSGe/fXXX3/88cdqBnNvb+8/ ETwCgEfwCAAewSMAeASP4BEAPIJHAPAIHgFItrEBsYNHAD7BK4gZPAKAR/AIAB7BIwCQBvwfU/j0
/vEP8e/79+/rDQf2z7ZdV3BSA7FyXA+yGtZglcw3b97MysryitB1bNuZNq+RZX53ra+vR3ZGhUWv 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
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
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
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
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
@ -40,6 +41,8 @@ elif os.name=='nt':
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
@ -210,7 +362,29 @@ void main(void)
} }
""" """
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()

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 );