Merge branch 'master' into fix_gltf2_camera_fov

pull/4886/head
shimaowo 2023-01-17 14:39:54 -08:00 committed by GitHub
commit 20acfeaf97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 62 additions and 55 deletions

View File

@ -388,14 +388,6 @@ IF (NOT TARGET uninstall AND ASSIMP_INSTALL)
ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
ENDIF() ENDIF()
# cmake configuration files
if(${BUILD_SHARED_LIBS})
set(BUILD_LIB_TYPE SHARED)
else()
set(BUILD_LIB_TYPE STATIC)
add_definitions(-DDDL_STATIC_LIBRARY=OFF)
endif()
IF( UNIX ) IF( UNIX )
# Use GNUInstallDirs for Unix predefined directories # Use GNUInstallDirs for Unix predefined directories
INCLUDE(GNUInstallDirs) INCLUDE(GNUInstallDirs)

View File

@ -76,10 +76,13 @@ The source code is organized in the following way:
code/AssetLib/<FormatName> Implementation for import and export for the format code/AssetLib/<FormatName> Implementation for import and export for the format
### Where to get help ### ### Where to get help ###
For more information, visit [our website](http://assimp.org/). Or check out the `./doc`- folder, which contains the official documentation in HTML format. To find our documentation, visit [our website](https://assimp.org/) or check out [Wiki](https://github.com/assimp/assimp/wiki)
(CHMs for Windows are included in some release packages and should be located right here in the root folder).
If the docs don't solve your problem, ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). If you think you found a bug, please open an issue on Github. If the docs don't solve your problem, you can:
- Ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest).
- Ask on [Assimp-Community on Reddit](https://www.reddit.com/r/Assimp/)
- Ask a question at [The Assimp-Discussion Board](https://github.com/assimp/assimp/discussions)
- Nothing has worked? File a question or an issue-report at [The Assimp-Issue Tracker](https://github.com/assimp/assimp/issues)
Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export. Open Asset Import Library is a library to load various 3d file formats into a shared, in-memory format. It supports more than __40 file formats__ for import and a growing selection of file formats for export.

View File

@ -448,7 +448,7 @@ void ColladaExporter::WriteLight(size_t pIndex) {
PushTag(); PushTag();
switch (light->mType) { switch (light->mType) {
case aiLightSource_AMBIENT: case aiLightSource_AMBIENT:
WriteAmbienttLight(light); WriteAmbientLight(light);
break; break;
case aiLightSource_DIRECTIONAL: case aiLightSource_DIRECTIONAL:
WriteDirectionalLight(light); WriteDirectionalLight(light);
@ -543,7 +543,7 @@ void ColladaExporter::WriteSpotLight(const aiLight *const light) {
mOutput << startstr << "</spot>" << endstr; mOutput << startstr << "</spot>" << endstr;
} }
void ColladaExporter::WriteAmbienttLight(const aiLight *const light) { void ColladaExporter::WriteAmbientLight(const aiLight *const light) {
const aiColor3D &color = light->mColorAmbient; const aiColor3D &color = light->mColorAmbient;
mOutput << startstr << "<ambient>" << endstr; mOutput << startstr << "<ambient>" << endstr;

View File

@ -101,7 +101,7 @@ protected:
void WritePointLight(const aiLight *const light); void WritePointLight(const aiLight *const light);
void WriteDirectionalLight(const aiLight *const light); void WriteDirectionalLight(const aiLight *const light);
void WriteSpotLight(const aiLight *const light); void WriteSpotLight(const aiLight *const light);
void WriteAmbienttLight(const aiLight *const light); void WriteAmbientLight(const aiLight *const light);
/// Writes the controller library /// Writes the controller library
void WriteControllerLibrary(); void WriteControllerLibrary();

View File

@ -666,7 +666,7 @@ struct ChannelEntry {
const Collada::Accessor *mTimeAccessor; ///> Collada accessor to the time values const Collada::Accessor *mTimeAccessor; ///> Collada accessor to the time values
const Collada::Data *mTimeData; ///> Source data array for the time values const Collada::Data *mTimeData; ///> Source data array for the time values
const Collada::Accessor *mValueAccessor; ///> Collada accessor to the key value values const Collada::Accessor *mValueAccessor; ///> Collada accessor to the key value values
const Collada::Data *mValueData; ///> Source datat array for the key value values const Collada::Data *mValueData; ///> Source data array for the key value values
ChannelEntry() : ChannelEntry() :
mChannel(), mChannel(),

View File

@ -762,6 +762,7 @@ void ColladaParser::ReadControllerWeights(XmlNode &node, Collada::Controller &pC
if (text == nullptr) { if (text == nullptr) {
throw DeadlyImportError("Out of data while reading <vertex_weights>"); throw DeadlyImportError("Out of data while reading <vertex_weights>");
} }
SkipSpacesAndLineEnd(&text);
it->first = strtoul10(text, &text); it->first = strtoul10(text, &text);
SkipSpacesAndLineEnd(&text); SkipSpacesAndLineEnd(&text);
if (*text == 0) { if (*text == 0) {

View File

@ -154,7 +154,6 @@ private:
const unsigned int column; const unsigned int column;
}; };
// XXX should use C++11's unique_ptr - but assimp's need to keep working with 03
typedef const Token* TokenPtr; typedef const Token* TokenPtr;
typedef std::vector< TokenPtr > TokenList; typedef std::vector< TokenPtr > TokenList;

View File

@ -162,8 +162,11 @@ void AnimResolver::UpdateAnimRangeSetup() {
const double my_last = (*it).keys.back().time; const double my_last = (*it).keys.back().time;
const double delta = my_last - my_first; const double delta = my_last - my_first;
if (delta == 0.0) {
continue;
}
const size_t old_size = (*it).keys.size(); const size_t old_size = (*it).keys.size();
const float value_delta = (*it).keys.back().value - (*it).keys.front().value; const float value_delta = (*it).keys.back().value - (*it).keys.front().value;
// NOTE: We won't handle reset, linear and constant here. // NOTE: We won't handle reset, linear and constant here.
@ -176,8 +179,7 @@ void AnimResolver::UpdateAnimRangeSetup() {
case LWO::PrePostBehaviour_Oscillate: { case LWO::PrePostBehaviour_Oscillate: {
const double start_time = delta - std::fmod(my_first - first, delta); const double start_time = delta - std::fmod(my_first - first, delta);
std::vector<LWO::Key>::iterator n = std::find_if((*it).keys.begin(), (*it).keys.end(), std::vector<LWO::Key>::iterator n = std::find_if((*it).keys.begin(), (*it).keys.end(),
[start_time](double t) { return start_time > t; }), [start_time](double t) { return start_time > t; }), m;
m;
size_t ofs = 0; size_t ofs = 0;
if (n != (*it).keys.end()) { if (n != (*it).keys.end()) {

View File

@ -39,8 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------- ----------------------------------------------------------------------
*/ */
#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER #if !defined ASSIMP_BUILD_NO_M3D_IMPORTER || !(defined ASSIMP_BUILD_NO_EXPORT || defined ASSIMP_BUILD_NO_M3D_EXPORTER)
#if !(ASSIMP_BUILD_NO_EXPORT || ASSIMP_BUILD_NO_M3D_EXPORTER)
#include "M3DWrapper.h" #include "M3DWrapper.h"
@ -149,4 +148,3 @@ void M3DWrapper::ClearSave() {
} // namespace Assimp } // namespace Assimp
#endif #endif
#endif

View File

@ -47,8 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef AI_M3DWRAPPER_H_INC #ifndef AI_M3DWRAPPER_H_INC
#define AI_M3DWRAPPER_H_INC #define AI_M3DWRAPPER_H_INC
#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER #if !defined ASSIMP_BUILD_NO_M3D_IMPORTER || !(defined ASSIMP_BUILD_NO_EXPORT || defined ASSIMP_BUILD_NO_M3D_EXPORTER)
#if !(ASSIMP_BUILD_NO_EXPORT || ASSIMP_BUILD_NO_M3D_EXPORTER)
#include <memory> #include <memory>
#include <vector> #include <vector>
@ -126,7 +125,6 @@ inline m3d_t *M3DWrapper::M3D() const {
} // namespace Assimp } // namespace Assimp
#endif
#endif // ASSIMP_BUILD_NO_M3D_IMPORTER #endif // ASSIMP_BUILD_NO_M3D_IMPORTER
#endif // AI_M3DWRAPPER_H_INC #endif // AI_M3DWRAPPER_H_INC

View File

@ -270,8 +270,8 @@ if (NOT ASSIMP_NO_EXPORT)
# ASSIMP_BUILD_XXX_EXPORTER to TRUE for each exporter # ASSIMP_BUILD_XXX_EXPORTER to TRUE for each exporter
OPTION(ASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT "default value of all ASSIMP_BUILD_XXX_EXPORTER values" TRUE) OPTION(ASSIMP_BUILD_ALL_EXPORTERS_BY_DEFAULT "default value of all ASSIMP_BUILD_XXX_EXPORTER values" TRUE)
# macro to add the CMake Option ADD_ASSIMP_IMPORTER_<name> which enables compile of loader # macro to add the CMake Option ADD_ASSIMP_EXPORTER_<name> which enables compilation of an exporter
# this way selective loaders can be compiled (reduces filesize + compile time) # this way selective exporters can be compiled (reduces filesize + compile time)
MACRO(ADD_ASSIMP_EXPORTER name) MACRO(ADD_ASSIMP_EXPORTER name)
IF (ASSIMP_NO_EXPORT) IF (ASSIMP_NO_EXPORT)
set(ASSIMP_EXPORTER_ENABLED FALSE) set(ASSIMP_EXPORTER_ENABLED FALSE)

View File

@ -105,7 +105,11 @@ void JoinVerticesProcess::Execute( aiScene* pScene) {
namespace { namespace {
bool areVerticesEqual(const Vertex &lhs, const Vertex &rhs, bool complex) { bool areVerticesEqual(
const Vertex &lhs,
const Vertex &rhs,
unsigned numUVChannels,
unsigned numColorChannels) {
// A little helper to find locally close vertices faster. // A little helper to find locally close vertices faster.
// Try to reuse the lookup table from the last step. // Try to reuse the lookup table from the last step.
const static float epsilon = 1e-5f; const static float epsilon = 1e-5f;
@ -124,10 +128,6 @@ bool areVerticesEqual(const Vertex &lhs, const Vertex &rhs, bool complex) {
return false; return false;
} }
if ((lhs.texcoords[0] - rhs.texcoords[0]).SquareLength() > squareEpsilon) {
return false;
}
if ((lhs.tangent - rhs.tangent).SquareLength() > squareEpsilon) { if ((lhs.tangent - rhs.tangent).SquareLength() > squareEpsilon) {
return false; return false;
} }
@ -136,19 +136,18 @@ bool areVerticesEqual(const Vertex &lhs, const Vertex &rhs, bool complex) {
return false; return false;
} }
// Usually we won't have vertex colors or multiple UVs, so we can skip from here for (unsigned i = 0; i < numUVChannels; i++) {
// Actually this increases runtime performance slightly, at least if branch if ((lhs.texcoords[i] - rhs.texcoords[i]).SquareLength() > squareEpsilon) {
// prediction is on our side. return false;
if (complex) {
for (int i = 0; i < 8; i++) {
if (i > 0 && (lhs.texcoords[i] - rhs.texcoords[i]).SquareLength() > squareEpsilon) {
return false;
}
if (GetColorDifference(lhs.colors[i], rhs.colors[i]) > squareEpsilon) {
return false;
}
} }
} }
for (unsigned i = 0; i < numColorChannels; i++) {
if (GetColorDifference(lhs.colors[i], rhs.colors[i]) > squareEpsilon) {
return false;
}
}
return true; return true;
} }
@ -241,9 +240,16 @@ struct std::hash<Vertex> {
//template specialization for std::equal_to for Vertex //template specialization for std::equal_to for Vertex
template<> template<>
struct std::equal_to<Vertex> { struct std::equal_to<Vertex> {
equal_to(unsigned numUVChannels, unsigned numColorChannels) :
mNumUVChannels(numUVChannels),
mNumColorChannels(numColorChannels) {}
bool operator()(const Vertex &lhs, const Vertex &rhs) const { bool operator()(const Vertex &lhs, const Vertex &rhs) const {
return areVerticesEqual(lhs, rhs, false); return areVerticesEqual(lhs, rhs, mNumUVChannels, mNumColorChannels);
} }
private:
unsigned mNumUVChannels;
unsigned mNumColorChannels;
}; };
// now start the JoinVerticesProcess // now start the JoinVerticesProcess
int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) { int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
@ -316,8 +322,13 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
uniqueAnimatedVertices[animMeshIndex].reserve(pMesh->mNumVertices); uniqueAnimatedVertices[animMeshIndex].reserve(pMesh->mNumVertices);
} }
} }
// a map that maps a vertix to its new index // a map that maps a vertex to its new index
std::unordered_map<Vertex,int> vertex2Index; const auto numBuckets = pMesh->mNumVertices;
const auto hasher = std::hash<Vertex>();
const auto comparator = std::equal_to<Vertex>(
pMesh->GetNumUVChannels(),
pMesh->GetNumColorChannels());
std::unordered_map<Vertex, int> vertex2Index(numBuckets, hasher, comparator);
// we can not end up with more vertices than we started with // we can not end up with more vertices than we started with
vertex2Index.reserve(pMesh->mNumVertices); vertex2Index.reserve(pMesh->mNumVertices);
// Now check each vertex if it brings something new to the table // Now check each vertex if it brings something new to the table

View File

@ -113,7 +113,7 @@ namespace Assimp {
* If you need the Importer to do custom file handling to access the files, * If you need the Importer to do custom file handling to access the files,
* implement IOSystem and IOStream and supply an instance of your custom * implement IOSystem and IOStream and supply an instance of your custom
* IOSystem implementation by calling SetIOHandler() before calling ReadFile(). * IOSystem implementation by calling SetIOHandler() before calling ReadFile().
* If you do not assign a custion IO handler, a default handler using the * If you do not assign a custom IO handler, a default handler using the
* standard C++ IO logic will be used. * standard C++ IO logic will be used.
* *
* @note One Importer instance is not thread-safe. If you use multiple * @note One Importer instance is not thread-safe. If you use multiple

View File

@ -241,7 +241,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** /**
* @brief Configures the #aiProcess_FindDegenerates to check the area of a * @brief Configures the #aiProcess_FindDegenerates to check the area of a
* trinagle to be greates than e-6. If this is not the case the triangle will * triangle to be greater than e-6. If this is not the case the triangle will
* be removed if #AI_CONFIG_PP_FD_REMOVE is set to true. * be removed if #AI_CONFIG_PP_FD_REMOVE is set to true.
*/ */
#define AI_CONFIG_PP_FD_CHECKAREA \ #define AI_CONFIG_PP_FD_CHECKAREA \
@ -662,7 +662,7 @@ enum aiComponent
"AI_CONFIG_FBX_CONVERT_TO_M" "AI_CONFIG_FBX_CONVERT_TO_M"
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** @brief Will enable the skeleton structo to store bone data. /** @brief Will enable the skeleton struct to store bone data.
* *
* This will decouple the bone coupling to the mesh. This feature is * This will decouple the bone coupling to the mesh. This feature is
* experimental. * experimental.
@ -1083,7 +1083,7 @@ enum aiComponent
#define AI_CONFIG_EXPORT_BLOB_NAME "EXPORT_BLOB_NAME" #define AI_CONFIG_EXPORT_BLOB_NAME "EXPORT_BLOB_NAME"
/** /**
* @brief Specifies a gobal key factor for scale, float value * @brief Specifies a global key factor for scale, float value
*/ */
#define AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY "GLOBAL_SCALE_FACTOR" #define AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY "GLOBAL_SCALE_FACTOR"

View File

@ -306,7 +306,7 @@ enum aiTextureType {
aiTextureType_SHEEN = 19, aiTextureType_SHEEN = 19,
/** Clearcoat /** Clearcoat
* Simulates a layer of 'polish' or 'laquer' layered on top of a PBR substrate * Simulates a layer of 'polish' or 'lacquer' layered on top of a PBR substrate
* https://autodesk.github.io/standard-surface/#closures/coating * https://autodesk.github.io/standard-surface/#closures/coating
* https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat
*/ */

View File

@ -566,6 +566,9 @@ struct aiAnimMesh {
/** @brief Enumerates the methods of mesh morphing supported by Assimp. /** @brief Enumerates the methods of mesh morphing supported by Assimp.
*/ */
enum aiMorphingMethod { enum aiMorphingMethod {
/** Morphing method to be determined */
aiMorphingMethod_UNKNOWN = 0x0,
/** Interpolation between morph targets */ /** Interpolation between morph targets */
aiMorphingMethod_VERTEX_BLEND = 0x1, aiMorphingMethod_VERTEX_BLEND = 0x1,
@ -747,7 +750,7 @@ struct aiMesh {
* Method of morphing when anim-meshes are specified. * Method of morphing when anim-meshes are specified.
* @see aiMorphingMethod to learn more about the provided morphing targets. * @see aiMorphingMethod to learn more about the provided morphing targets.
*/ */
unsigned int mMethod; enum aiMorphingMethod mMethod;
/** /**
* The bounding box. * The bounding box.
@ -778,7 +781,7 @@ struct aiMesh {
mMaterialIndex(0), mMaterialIndex(0),
mNumAnimMeshes(0), mNumAnimMeshes(0),
mAnimMeshes(nullptr), mAnimMeshes(nullptr),
mMethod(0), mMethod(aiMorphingMethod_UNKNOWN),
mAABB(), mAABB(),
mTextureCoordsNames(nullptr) { mTextureCoordsNames(nullptr) {
for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) { for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) {
@ -1002,7 +1005,7 @@ struct aiSkeletonBone {
#endif // __cplusplus #endif // __cplusplus
}; };
/** /**
* @brief * @brief
*/ */
struct aiSkeleton { struct aiSkeleton {
/** /**

View File

@ -433,7 +433,7 @@ struct aiScene
for (unsigned int i = 0; i < mNumTextures; i++) { for (unsigned int i = 0; i < mNumTextures; i++) {
const char* shortTextureFilename = GetShortFilename(mTextures[i]->mFilename.C_Str()); const char* shortTextureFilename = GetShortFilename(mTextures[i]->mFilename.C_Str());
if (strcmp(shortTextureFilename, shortFilename) == 0) { if (strcmp(shortTextureFilename, shortFilename) == 0) {
return std::make_pair(mTextures[i], i); return std::make_pair(mTextures[i], static_cast<int>(i));
} }
} }
return std::make_pair(nullptr, -1); return std::make_pair(nullptr, -1);