mirror of
https://github.com/godotengine/godot.git
synced 2024-11-10 22:23:07 +00:00
Updated assimp to 308db73 from https://github.com/assimp/assimp/
This commit is contained in:
parent
0bd877780f
commit
5fb160c7c6
@ -72,6 +72,9 @@ env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_X3D_IMPORTER'])
|
||||
env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF_IMPORTER'])
|
||||
env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_GLTF2_IMPORTER'])
|
||||
env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_SINGLETHREADED'])
|
||||
env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_M3D_IMPORTER'])
|
||||
env_assimp.Append(CPPDEFINES=['ASSIMP_BUILD_NO_MMD_IMPORTER'])
|
||||
|
||||
|
||||
if(env['platform'] == 'windows'):
|
||||
env_assimp.Append(CPPDEFINES=['PLATFORM_WINDOWS'])
|
||||
|
@ -76,12 +76,6 @@ void EditorSceneImporterAssimp::get_extensions(List<String> *r_extensions) const
|
||||
ImportFormat import = { exts, true };
|
||||
import_format.insert("fbx", import);
|
||||
}
|
||||
{
|
||||
Vector<String> exts;
|
||||
exts.push_back("pmx");
|
||||
ImportFormat import = { exts, true };
|
||||
import_format.insert("mmd", import);
|
||||
}
|
||||
for (Map<String, ImportFormat>::Element *E = import_format.front(); E; E = E->next()) {
|
||||
_register_project_setting_import(E->key(), import_setting_string, E->get().extensions, r_extensions,
|
||||
E->get().is_default);
|
||||
@ -145,8 +139,9 @@ Node *EditorSceneImporterAssimp::import_scene(const String &p_path, uint32_t p_f
|
||||
aiProcess_TransformUVCoords |
|
||||
aiProcess_FindInstances |
|
||||
//aiProcess_FixInfacingNormals |
|
||||
aiProcess_ValidateDataStructure |
|
||||
//aiProcess_ValidateDataStructure |
|
||||
aiProcess_OptimizeMeshes |
|
||||
aiProcess_PopulateArmatureData |
|
||||
//aiProcess_OptimizeGraph |
|
||||
//aiProcess_Debone |
|
||||
// aiProcess_EmbedTextures |
|
||||
|
2
thirdparty/README.md
vendored
2
thirdparty/README.md
vendored
@ -4,7 +4,7 @@
|
||||
## assimp
|
||||
|
||||
- Upstream: http://github.com/assimp/assimp
|
||||
- Version: git (1d565b0aab5a2ee00462f18c5b8a81f6a5454a48)
|
||||
- Version: git (308db73d0b3c2d1870cd3e465eaa283692a4cf23)
|
||||
- License: BSD-3-Clause
|
||||
|
||||
|
||||
|
15
thirdparty/assimp/code/Common/BaseImporter.cpp
vendored
15
thirdparty/assimp/code/Common/BaseImporter.cpp
vendored
@ -67,7 +67,20 @@ using namespace Assimp;
|
||||
// Constructor to be privately used by Importer
|
||||
BaseImporter::BaseImporter() AI_NO_EXCEPT
|
||||
: m_progress() {
|
||||
// nothing to do here
|
||||
/**
|
||||
* Assimp Importer
|
||||
* unit conversions available
|
||||
* if you need another measurment unit add it below.
|
||||
* it's currently defined in assimp that we prefer meters.
|
||||
*
|
||||
* NOTE: Initialised here rather than in the header file
|
||||
* to workaround a VS2013 bug with brace initialisers
|
||||
* */
|
||||
importerUnits[ImporterUnits::M] = 1.0;
|
||||
importerUnits[ImporterUnits::CM] = 0.01;
|
||||
importerUnits[ImporterUnits::MM] = 0.001;
|
||||
importerUnits[ImporterUnits::INCHES] = 0.0254;
|
||||
importerUnits[ImporterUnits::FEET] = 0.3048;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
7
thirdparty/assimp/code/Common/Exporter.cpp
vendored
7
thirdparty/assimp/code/Common/Exporter.cpp
vendored
@ -102,6 +102,8 @@ void ExportSceneX3D(const char*, IOSystem*, const aiScene*, const ExportProperti
|
||||
void ExportSceneFBX(const char*, IOSystem*, const aiScene*, const ExportProperties*);
|
||||
void ExportSceneFBXA(const char*, IOSystem*, const aiScene*, const ExportProperties*);
|
||||
void ExportScene3MF( const char*, IOSystem*, const aiScene*, const ExportProperties* );
|
||||
void ExportSceneM3D(const char*, IOSystem*, const aiScene*, const ExportProperties*);
|
||||
void ExportSceneA3D(const char*, IOSystem*, const aiScene*, const ExportProperties*);
|
||||
void ExportAssimp2Json(const char* , IOSystem*, const aiScene* , const Assimp::ExportProperties*);
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -179,6 +181,11 @@ Exporter::ExportFormatEntry gExporters[] =
|
||||
Exporter::ExportFormatEntry( "fbxa", "Autodesk FBX (ascii)", "fbx", &ExportSceneFBXA, 0 ),
|
||||
#endif
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_M3D_EXPORTER
|
||||
Exporter::ExportFormatEntry( "m3d", "Model 3D (binary)", "m3d", &ExportSceneM3D, 0 ),
|
||||
Exporter::ExportFormatEntry( "a3d", "Model 3D (ascii)", "m3d", &ExportSceneA3D, 0 ),
|
||||
#endif
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_3MF_EXPORTER
|
||||
Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ),
|
||||
#endif
|
||||
|
@ -197,6 +197,9 @@ corresponding preprocessor flag to selectively disable formats.
|
||||
#ifndef ASSIMP_BUILD_NO_MMD_IMPORTER
|
||||
# include "MMD/MMDImporter.h"
|
||||
#endif
|
||||
#ifndef ASSIMP_BUILD_NO_M3D_IMPORTER
|
||||
# include "M3D/M3DImporter.h"
|
||||
#endif
|
||||
#ifndef ASSIMP_BUILD_NO_STEP_IMPORTER
|
||||
# include "Importer/StepFile/StepFileImporter.h"
|
||||
#endif
|
||||
@ -223,6 +226,9 @@ void GetImporterInstanceList(std::vector< BaseImporter* >& out)
|
||||
#if (!defined ASSIMP_BUILD_NO_3DS_IMPORTER)
|
||||
out.push_back( new Discreet3DSImporter());
|
||||
#endif
|
||||
#if (!defined ASSIMP_BUILD_NO_M3D_IMPORTER)
|
||||
out.push_back( new M3DImporter());
|
||||
#endif
|
||||
#if (!defined ASSIMP_BUILD_NO_MD3_IMPORTER)
|
||||
out.push_back( new MD3Importer());
|
||||
#endif
|
||||
|
@ -131,11 +131,15 @@ corresponding preprocessor flag to selectively disable steps.
|
||||
#if (!defined ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS)
|
||||
# include "PostProcessing/ScaleProcess.h"
|
||||
#endif
|
||||
#if (!defined ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS)
|
||||
# include "PostProcessing/ArmaturePopulate.h"
|
||||
#endif
|
||||
#if (!defined ASSIMP_BUILD_NO_GENBOUNDINGBOXES_PROCESS)
|
||||
# include "PostProcessing/GenBoundingBoxesProcess.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -180,6 +184,9 @@ void GetPostProcessingStepInstanceList(std::vector< BaseProcess* >& out)
|
||||
#if (!defined ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS)
|
||||
out.push_back( new ScaleProcess());
|
||||
#endif
|
||||
#if (!defined ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS)
|
||||
out.push_back( new ArmaturePopulate());
|
||||
#endif
|
||||
#if (!defined ASSIMP_BUILD_NO_PRETRANSFORMVERTICES_PROCESS)
|
||||
out.push_back( new PretransformVertices());
|
||||
#endif
|
||||
|
21
thirdparty/assimp/code/Common/SceneCombiner.cpp
vendored
21
thirdparty/assimp/code/Common/SceneCombiner.cpp
vendored
@ -1196,6 +1196,7 @@ void SceneCombiner::Copy( aiAnimation** _dest, const aiAnimation* src ) {
|
||||
|
||||
// and reallocate all arrays
|
||||
CopyPtrArray( dest->mChannels, src->mChannels, dest->mNumChannels );
|
||||
CopyPtrArray( dest->mMorphMeshChannels, src->mMorphMeshChannels, dest->mNumMorphMeshChannels );
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -1215,6 +1216,26 @@ void SceneCombiner::Copy(aiNodeAnim** _dest, const aiNodeAnim* src) {
|
||||
GetArrayCopy( dest->mRotationKeys, dest->mNumRotationKeys );
|
||||
}
|
||||
|
||||
void SceneCombiner::Copy(aiMeshMorphAnim** _dest, const aiMeshMorphAnim* src) {
|
||||
if ( nullptr == _dest || nullptr == src ) {
|
||||
return;
|
||||
}
|
||||
|
||||
aiMeshMorphAnim* dest = *_dest = new aiMeshMorphAnim();
|
||||
|
||||
// get a flat copy
|
||||
::memcpy(dest,src,sizeof(aiMeshMorphAnim));
|
||||
|
||||
// and reallocate all arrays
|
||||
GetArrayCopy( dest->mKeys, dest->mNumKeys );
|
||||
for (ai_uint i = 0; i < dest->mNumKeys;++i) {
|
||||
dest->mKeys[i].mValues = new unsigned int[dest->mKeys[i].mNumValuesAndWeights];
|
||||
dest->mKeys[i].mWeights = new double[dest->mKeys[i].mNumValuesAndWeights];
|
||||
::memcpy(dest->mKeys[i].mValues, src->mKeys[i].mValues, dest->mKeys[i].mNumValuesAndWeights * sizeof(unsigned int));
|
||||
::memcpy(dest->mKeys[i].mWeights, src->mKeys[i].mWeights, dest->mKeys[i].mNumValuesAndWeights * sizeof(double));
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void SceneCombiner::Copy( aiCamera** _dest,const aiCamera* src) {
|
||||
if ( nullptr == _dest || nullptr == src ) {
|
||||
|
14
thirdparty/assimp/code/Common/Version.cpp
vendored
14
thirdparty/assimp/code/Common/Version.cpp
vendored
@ -46,8 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <assimp/scene.h>
|
||||
#include "ScenePrivate.h"
|
||||
|
||||
static const unsigned int MajorVersion = 4;
|
||||
static const unsigned int MinorVersion = 1;
|
||||
#include "revision.h"
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// Legal information string - don't remove this.
|
||||
@ -56,9 +55,9 @@ static const char* LEGAL_INFORMATION =
|
||||
"Open Asset Import Library (Assimp).\n"
|
||||
"A free C/C++ library to import various 3D file formats into applications\n\n"
|
||||
|
||||
"(c) 2008-2017, assimp team\n"
|
||||
"(c) 2006-2019, assimp team\n"
|
||||
"License under the terms and conditions of the 3-clause BSD license\n"
|
||||
"http://assimp.sourceforge.net\n"
|
||||
"http://assimp.org\n"
|
||||
;
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -70,13 +69,13 @@ ASSIMP_API const char* aiGetLegalString () {
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Get Assimp minor version
|
||||
ASSIMP_API unsigned int aiGetVersionMinor () {
|
||||
return MinorVersion;
|
||||
return VER_MINOR;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Get Assimp major version
|
||||
ASSIMP_API unsigned int aiGetVersionMajor () {
|
||||
return MajorVersion;
|
||||
return VER_MAJOR;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -104,9 +103,6 @@ ASSIMP_API unsigned int aiGetCompileFlags () {
|
||||
return flags;
|
||||
}
|
||||
|
||||
// include current build revision, which is even updated from time to time -- :-)
|
||||
#include "revision.h"
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
ASSIMP_API unsigned int aiGetVersionRevision() {
|
||||
return GitVersion;
|
||||
|
18
thirdparty/assimp/code/Common/scene.cpp
vendored
18
thirdparty/assimp/code/Common/scene.cpp
vendored
@ -44,23 +44,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
aiNode::aiNode()
|
||||
: mName("")
|
||||
, mParent(NULL)
|
||||
, mParent(nullptr)
|
||||
, mNumChildren(0)
|
||||
, mChildren(NULL)
|
||||
, mChildren(nullptr)
|
||||
, mNumMeshes(0)
|
||||
, mMeshes(NULL)
|
||||
, mMetaData(NULL) {
|
||||
, mMeshes(nullptr)
|
||||
, mMetaData(nullptr) {
|
||||
// empty
|
||||
}
|
||||
|
||||
aiNode::aiNode(const std::string& name)
|
||||
: mName(name)
|
||||
, mParent(NULL)
|
||||
, mParent(nullptr)
|
||||
, mNumChildren(0)
|
||||
, mChildren(NULL)
|
||||
, mChildren(nullptr)
|
||||
, mNumMeshes(0)
|
||||
, mMeshes(NULL)
|
||||
, mMetaData(NULL) {
|
||||
, mMeshes(nullptr)
|
||||
, mMetaData(nullptr) {
|
||||
// empty
|
||||
}
|
||||
|
||||
@ -68,7 +68,7 @@ aiNode::aiNode(const std::string& name)
|
||||
aiNode::~aiNode() {
|
||||
// delete all children recursively
|
||||
// to make sure we won't crash if the data is invalid ...
|
||||
if (mChildren && mNumChildren)
|
||||
if (mNumChildren && mChildren)
|
||||
{
|
||||
for (unsigned int a = 0; a < mNumChildren; a++)
|
||||
delete mChildren[a];
|
||||
|
@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define INCLUDED_AI_FBX_COMPILECONFIG_H
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
||||
//
|
||||
#if _MSC_VER > 1500 || (defined __GNUC___)
|
||||
@ -54,16 +55,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
# else
|
||||
# define fbx_unordered_map map
|
||||
# define fbx_unordered_multimap multimap
|
||||
# define fbx_unordered_set set
|
||||
# define fbx_unordered_multiset multiset
|
||||
#endif
|
||||
|
||||
#ifdef ASSIMP_FBX_USE_UNORDERED_MULTIMAP
|
||||
# include <unordered_map>
|
||||
# include <unordered_set>
|
||||
# if _MSC_VER > 1600
|
||||
# define fbx_unordered_map unordered_map
|
||||
# define fbx_unordered_multimap unordered_multimap
|
||||
# define fbx_unordered_set unordered_set
|
||||
# define fbx_unordered_multiset unordered_multiset
|
||||
# else
|
||||
# define fbx_unordered_map tr1::unordered_map
|
||||
# define fbx_unordered_multimap tr1::unordered_multimap
|
||||
# define fbx_unordered_set tr1::unordered_set
|
||||
# define fbx_unordered_multiset tr1::unordered_multiset
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
288
thirdparty/assimp/code/FBX/FBXConverter.cpp
vendored
288
thirdparty/assimp/code/FBX/FBXConverter.cpp
vendored
@ -78,7 +78,7 @@ namespace Assimp {
|
||||
|
||||
#define MAGIC_NODE_TAG "_$AssimpFbx$"
|
||||
|
||||
#define CONVERT_FBX_TIME(time) static_cast<double>(time) / 46186158000L
|
||||
#define CONVERT_FBX_TIME(time) static_cast<double>(time) / 46186158000LL
|
||||
|
||||
FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones )
|
||||
: defaultMaterialIndex()
|
||||
@ -97,6 +97,14 @@ namespace Assimp {
|
||||
// populate the node_anim_chain_bits map, which is needed
|
||||
// to determine which nodes need to be generated.
|
||||
ConvertAnimations();
|
||||
// Embedded textures in FBX could be connected to nothing but to itself,
|
||||
// for instance Texture -> Video connection only but not to the main graph,
|
||||
// The idea here is to traverse all objects to find these Textures and convert them,
|
||||
// so later during material conversion it will find converted texture in the textures_converted array.
|
||||
if (doc.Settings().readTextures)
|
||||
{
|
||||
ConvertOrphantEmbeddedTextures();
|
||||
}
|
||||
ConvertRootNode();
|
||||
|
||||
if (doc.Settings().readAllMaterials) {
|
||||
@ -121,46 +129,6 @@ namespace Assimp {
|
||||
ConvertGlobalSettings();
|
||||
TransferDataToScene();
|
||||
|
||||
// Now convert all bone positions to the correct mOffsetMatrix
|
||||
std::vector<aiBone*> bones;
|
||||
std::vector<aiNode*> nodes;
|
||||
std::map<aiBone*, aiNode*> bone_stack;
|
||||
BuildBoneList(out->mRootNode, out->mRootNode, out, bones);
|
||||
BuildNodeList(out->mRootNode, nodes );
|
||||
|
||||
|
||||
BuildBoneStack(out->mRootNode, out->mRootNode, out, bones, bone_stack, nodes);
|
||||
|
||||
std::cout << "Bone stack size: " << bone_stack.size() << std::endl;
|
||||
|
||||
for( std::pair<aiBone*, aiNode*> kvp : bone_stack )
|
||||
{
|
||||
aiBone *bone = kvp.first;
|
||||
aiNode *bone_node = kvp.second;
|
||||
std::cout << "active node lookup: " << bone->mName.C_Str() << std::endl;
|
||||
// lcl transform grab - done in generate_nodes :)
|
||||
|
||||
//bone->mOffsetMatrix = bone_node->mTransformation;
|
||||
aiNode * armature = GetArmatureRoot(bone_node, bones);
|
||||
|
||||
ai_assert(armature);
|
||||
|
||||
// set up bone armature id
|
||||
bone->mArmature = armature;
|
||||
|
||||
// set this bone node to be referenced properly
|
||||
ai_assert(bone_node);
|
||||
bone->mNode = bone_node;
|
||||
|
||||
// apply full hierarchy to transform for basic offset
|
||||
while( bone_node->mParent )
|
||||
{
|
||||
bone->mRestMatrix = bone_node->mTransformation * bone->mRestMatrix;
|
||||
bone_node = bone_node->mParent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE
|
||||
// to make sure the scene passes assimp's validation. FBX files
|
||||
// need not contain geometry (i.e. camera animations, raw armatures).
|
||||
@ -179,167 +147,6 @@ namespace Assimp {
|
||||
std::for_each(textures.begin(), textures.end(), Util::delete_fun<aiTexture>());
|
||||
}
|
||||
|
||||
/* Returns the armature root node */
|
||||
/* This is required to be detected for a bone initially, it will recurse up until it cannot find another
|
||||
* bone and return the node
|
||||
* No known failure points. (yet)
|
||||
*/
|
||||
aiNode * FBXConverter::GetArmatureRoot(aiNode *bone_node, std::vector<aiBone*> &bone_list)
|
||||
{
|
||||
while(bone_node)
|
||||
{
|
||||
if(!IsBoneNode(bone_node->mName, bone_list))
|
||||
{
|
||||
std::cout << "Found valid armature: " << bone_node->mName.C_Str() << std::endl;
|
||||
return bone_node;
|
||||
}
|
||||
|
||||
bone_node = bone_node->mParent;
|
||||
}
|
||||
|
||||
std::cout << "can't find armature! node: " << bone_node << std::endl;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Simple IsBoneNode check if this could be a bone */
|
||||
bool FBXConverter::IsBoneNode(const aiString &bone_name, std::vector<aiBone*>& bones )
|
||||
{
|
||||
for( aiBone *bone : bones)
|
||||
{
|
||||
if(bone->mName == bone_name)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* Pop this node by name from the stack if found */
|
||||
/* Used in multiple armature situations with duplicate node / bone names */
|
||||
/* Known flaw: cannot have nodes with bone names, will be fixed in later release */
|
||||
/* (serious to be fixed) Known flaw: nodes which have more than one bone could be prematurely dropped from stack */
|
||||
aiNode* FBXConverter::GetNodeFromStack(const aiString &node_name, std::vector<aiNode*> &nodes)
|
||||
{
|
||||
std::vector<aiNode*>::iterator iter;
|
||||
aiNode *found = NULL;
|
||||
for( iter = nodes.begin(); iter < nodes.end(); ++iter )
|
||||
{
|
||||
aiNode *element = *iter;
|
||||
ai_assert(element);
|
||||
// node valid and node name matches
|
||||
if(element->mName == node_name)
|
||||
{
|
||||
found = element;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(found != NULL) {
|
||||
// now pop the element from the node list
|
||||
nodes.erase(iter);
|
||||
|
||||
return found;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Prepare flat node list which can be used for non recursive lookups later */
|
||||
void FBXConverter::BuildNodeList(aiNode *current_node, std::vector<aiNode *> &nodes)
|
||||
{
|
||||
assert(current_node);
|
||||
|
||||
for( unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId)
|
||||
{
|
||||
aiNode *child = current_node->mChildren[nodeId];
|
||||
assert(child);
|
||||
|
||||
nodes.push_back(child);
|
||||
|
||||
BuildNodeList(child, nodes);
|
||||
}
|
||||
}
|
||||
|
||||
/* Reprocess all nodes to calculate bone transforms properly based on the REAL mOffsetMatrix not the local. */
|
||||
/* Before this would use mesh transforms which is wrong for bone transforms */
|
||||
/* Before this would work for simple character skeletons but not complex meshes with multiple origins */
|
||||
/* Source: sketch fab log cutter fbx */
|
||||
void FBXConverter::BuildBoneList(aiNode *current_node, const aiNode * root_node, const aiScene *scene, std::vector<aiBone*> &bones )
|
||||
{
|
||||
assert(scene);
|
||||
for( unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId)
|
||||
{
|
||||
aiNode *child = current_node->mChildren[nodeId];
|
||||
assert(child);
|
||||
|
||||
// check for bones
|
||||
for( unsigned int meshId = 0; meshId < child->mNumMeshes; ++meshId)
|
||||
{
|
||||
assert(child->mMeshes);
|
||||
unsigned int mesh_index = child->mMeshes[meshId];
|
||||
aiMesh *mesh = scene->mMeshes[ mesh_index ];
|
||||
assert(mesh);
|
||||
|
||||
for( unsigned int boneId = 0; boneId < mesh->mNumBones; ++boneId)
|
||||
{
|
||||
aiBone *bone = mesh->mBones[boneId];
|
||||
ai_assert(bone);
|
||||
|
||||
// duplicate meshes exist with the same bones sometimes :)
|
||||
// so this must be detected
|
||||
if( std::find(bones.begin(), bones.end(), bone) == bones.end() )
|
||||
{
|
||||
// add the element once
|
||||
bones.push_back(bone);
|
||||
}
|
||||
}
|
||||
|
||||
// find mesh and get bones
|
||||
// then do recursive lookup for bones in root node hierarchy
|
||||
}
|
||||
|
||||
BuildBoneList(child, root_node, scene, bones);
|
||||
}
|
||||
}
|
||||
|
||||
/* A bone stack allows us to have multiple armatures, with the same bone names
|
||||
* A bone stack allows us also to retrieve bones true transform even with duplicate names :)
|
||||
*/
|
||||
void FBXConverter::BuildBoneStack(aiNode *current_node, const aiNode *root_node, const aiScene *scene,
|
||||
const std::vector<aiBone *> &bones,
|
||||
std::map<aiBone *, aiNode *> &bone_stack,
|
||||
std::vector<aiNode*> &node_stack )
|
||||
{
|
||||
ai_assert(scene);
|
||||
ai_assert(root_node);
|
||||
ai_assert(!node_stack.empty());
|
||||
|
||||
for( aiBone * bone : bones)
|
||||
{
|
||||
ai_assert(bone);
|
||||
aiNode* node = GetNodeFromStack(bone->mName, node_stack);
|
||||
if(node == NULL)
|
||||
{
|
||||
node_stack.clear();
|
||||
BuildNodeList(out->mRootNode, node_stack );
|
||||
std::cout << "Resetting bone stack: null element " << bone->mName.C_Str() << std::endl;
|
||||
|
||||
node = GetNodeFromStack(bone->mName, node_stack);
|
||||
|
||||
if(!node) {
|
||||
std::cout << "serious import issue armature failed to be detected?" << std::endl;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Successfully added bone to stack and have valid armature: " << bone->mName.C_Str() << std::endl;
|
||||
|
||||
bone_stack.insert(std::pair<aiBone*, aiNode*>(bone, node));
|
||||
}
|
||||
}
|
||||
|
||||
void FBXConverter::ConvertRootNode() {
|
||||
out->mRootNode = new aiNode();
|
||||
std::string unique_name;
|
||||
@ -514,6 +321,12 @@ namespace Assimp {
|
||||
|
||||
std::swap_ranges(nodes.begin(), nodes.end(), parent->mChildren);
|
||||
}
|
||||
else
|
||||
{
|
||||
parent->mNumChildren = 0;
|
||||
parent->mChildren = nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
catch (std::exception&) {
|
||||
Util::delete_fun<aiNode> deleter;
|
||||
@ -1329,7 +1142,7 @@ namespace Assimp {
|
||||
binormals = &tempBinormals;
|
||||
}
|
||||
else {
|
||||
binormals = NULL;
|
||||
binormals = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1379,7 +1192,7 @@ namespace Assimp {
|
||||
ConvertMaterialForMesh(out_mesh, model, mesh, mindices[0]);
|
||||
}
|
||||
|
||||
if (doc.Settings().readWeights && mesh.DeformerSkin() != NULL) {
|
||||
if (doc.Settings().readWeights && mesh.DeformerSkin() != nullptr) {
|
||||
ConvertWeights(out_mesh, model, mesh, absolute_transform, parent, root_node, NO_MATERIAL_SEPARATION,
|
||||
nullptr);
|
||||
}
|
||||
@ -1459,7 +1272,7 @@ namespace Assimp {
|
||||
const std::vector<aiVector3D>& vertices = mesh.GetVertices();
|
||||
const std::vector<unsigned int>& faces = mesh.GetFaceIndexCounts();
|
||||
|
||||
const bool process_weights = doc.Settings().readWeights && mesh.DeformerSkin() != NULL;
|
||||
const bool process_weights = doc.Settings().readWeights && mesh.DeformerSkin() != nullptr;
|
||||
|
||||
unsigned int count_faces = 0;
|
||||
unsigned int count_vertices = 0;
|
||||
@ -1519,7 +1332,7 @@ namespace Assimp {
|
||||
binormals = &tempBinormals;
|
||||
}
|
||||
else {
|
||||
binormals = NULL;
|
||||
binormals = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1708,9 +1521,9 @@ namespace Assimp {
|
||||
|
||||
unsigned int count = 0;
|
||||
const unsigned int* const out_idx = geo.ToOutputVertexIndex(index, count);
|
||||
// ToOutputVertexIndex only returns NULL if index is out of bounds
|
||||
// ToOutputVertexIndex only returns nullptr if index is out of bounds
|
||||
// which should never happen
|
||||
ai_assert(out_idx != NULL);
|
||||
ai_assert(out_idx != nullptr);
|
||||
|
||||
index_out_indices.push_back(no_index_sentinel);
|
||||
count_out_indices.push_back(0);
|
||||
@ -1777,11 +1590,11 @@ namespace Assimp {
|
||||
std::vector<size_t> &out_indices, std::vector<size_t> &index_out_indices,
|
||||
std::vector<size_t> &count_out_indices, const aiMatrix4x4 &absolute_transform,
|
||||
aiNode *parent, aiNode *root_node) {
|
||||
assert(cl); // make sure cluster valid
|
||||
ai_assert(cl); // make sure cluster valid
|
||||
std::string deformer_name = cl->TargetNode()->Name();
|
||||
aiString bone_name = aiString(FixNodeName(deformer_name));
|
||||
|
||||
aiBone *bone = NULL;
|
||||
aiBone *bone = nullptr;
|
||||
|
||||
if (bone_map.count(deformer_name)) {
|
||||
std::cout << "retrieved bone from lookup " << bone_name.C_Str() << ". Deformer: " << deformer_name
|
||||
@ -1969,7 +1782,7 @@ namespace Assimp {
|
||||
bool textureReady = false; //tells if our texture is ready (if it was loaded or if it was found)
|
||||
unsigned int index;
|
||||
|
||||
VideoMap::const_iterator it = textures_converted.find(media);
|
||||
VideoMap::const_iterator it = textures_converted.find(*media);
|
||||
if (it != textures_converted.end()) {
|
||||
index = (*it).second;
|
||||
textureReady = true;
|
||||
@ -1977,7 +1790,7 @@ namespace Assimp {
|
||||
else {
|
||||
if (media->ContentLength() > 0) {
|
||||
index = ConvertVideo(*media);
|
||||
textures_converted[media] = index;
|
||||
textures_converted[*media] = index;
|
||||
textureReady = true;
|
||||
}
|
||||
}
|
||||
@ -2501,13 +2314,13 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa
|
||||
if (media != nullptr && media->ContentLength() > 0) {
|
||||
unsigned int index;
|
||||
|
||||
VideoMap::const_iterator it = textures_converted.find(media);
|
||||
VideoMap::const_iterator it = textures_converted.find(*media);
|
||||
if (it != textures_converted.end()) {
|
||||
index = (*it).second;
|
||||
}
|
||||
else {
|
||||
index = ConvertVideo(*media);
|
||||
textures_converted[media] = index;
|
||||
textures_converted[*media] = index;
|
||||
}
|
||||
|
||||
// setup texture reference string (copied from ColladaLoader::FindFilenameForEffectTexture)
|
||||
@ -2935,7 +2748,7 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa
|
||||
// sanity check whether the input is ok
|
||||
static void validateAnimCurveNodes(const std::vector<const AnimationCurveNode*>& curves,
|
||||
bool strictMode) {
|
||||
const Object* target(NULL);
|
||||
const Object* target(nullptr);
|
||||
for (const AnimationCurveNode* node : curves) {
|
||||
if (!target) {
|
||||
target = node->Target();
|
||||
@ -2966,7 +2779,7 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa
|
||||
#ifdef ASSIMP_BUILD_DEBUG
|
||||
validateAnimCurveNodes(curves, doc.Settings().strictMode);
|
||||
#endif
|
||||
const AnimationCurveNode* curve_node = NULL;
|
||||
const AnimationCurveNode* curve_node = nullptr;
|
||||
for (const AnimationCurveNode* node : curves) {
|
||||
ai_assert(node);
|
||||
|
||||
@ -3814,7 +3627,7 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa
|
||||
ai_assert(!out->mMeshes);
|
||||
ai_assert(!out->mNumMeshes);
|
||||
|
||||
// note: the trailing () ensures initialization with NULL - not
|
||||
// note: the trailing () ensures initialization with nullptr - not
|
||||
// many C++ users seem to know this, so pointing it out to avoid
|
||||
// confusion why this code works.
|
||||
|
||||
@ -3861,6 +3674,47 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa
|
||||
}
|
||||
}
|
||||
|
||||
void FBXConverter::ConvertOrphantEmbeddedTextures()
|
||||
{
|
||||
// in C++14 it could be:
|
||||
// for (auto&& [id, object] : objects)
|
||||
for (auto&& id_and_object : doc.Objects())
|
||||
{
|
||||
auto&& id = std::get<0>(id_and_object);
|
||||
auto&& object = std::get<1>(id_and_object);
|
||||
// If an object doesn't have parent
|
||||
if (doc.ConnectionsBySource().count(id) == 0)
|
||||
{
|
||||
const Texture* realTexture = nullptr;
|
||||
try
|
||||
{
|
||||
const auto& element = object->GetElement();
|
||||
const Token& key = element.KeyToken();
|
||||
const char* obtype = key.begin();
|
||||
const size_t length = static_cast<size_t>(key.end() - key.begin());
|
||||
if (strncmp(obtype, "Texture", length) == 0)
|
||||
{
|
||||
const Texture* texture = static_cast<const Texture*>(object->Get());
|
||||
if (texture->Media() && texture->Media()->ContentLength() > 0)
|
||||
{
|
||||
realTexture = texture;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
if (realTexture)
|
||||
{
|
||||
const Video* media = realTexture->Media();
|
||||
unsigned int index = ConvertVideo(*media);
|
||||
textures_converted[*media] = index;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones)
|
||||
{
|
||||
|
14
thirdparty/assimp/code/FBX/FBXConverter.h
vendored
14
thirdparty/assimp/code/FBX/FBXConverter.h
vendored
@ -427,6 +427,10 @@ private:
|
||||
// copy generated meshes, animations, lights, cameras and textures to the output scene
|
||||
void TransferDataToScene();
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// FBX file could have embedded textures not connected to anything
|
||||
void ConvertOrphantEmbeddedTextures();
|
||||
|
||||
private:
|
||||
// 0: not assigned yet, others: index is value - 1
|
||||
unsigned int defaultMaterialIndex;
|
||||
@ -438,21 +442,21 @@ private:
|
||||
std::vector<aiCamera*> cameras;
|
||||
std::vector<aiTexture*> textures;
|
||||
|
||||
using MaterialMap = std::map<const Material*, unsigned int>;
|
||||
using MaterialMap = std::fbx_unordered_map<const Material*, unsigned int>;
|
||||
MaterialMap materials_converted;
|
||||
|
||||
using VideoMap = std::map<const Video*, unsigned int>;
|
||||
using VideoMap = std::fbx_unordered_map<const Video, unsigned int>;
|
||||
VideoMap textures_converted;
|
||||
|
||||
using MeshMap = std::map<const Geometry*, std::vector<unsigned int> >;
|
||||
using MeshMap = std::fbx_unordered_map<const Geometry*, std::vector<unsigned int> >;
|
||||
MeshMap meshes_converted;
|
||||
|
||||
// fixed node name -> which trafo chain components have animations?
|
||||
using NodeAnimBitMap = std::map<std::string, unsigned int> ;
|
||||
using NodeAnimBitMap = std::fbx_unordered_map<std::string, unsigned int> ;
|
||||
NodeAnimBitMap node_anim_chain_bits;
|
||||
|
||||
// number of nodes with the same name
|
||||
using NodeNameCache = std::unordered_map<std::string, unsigned int>;
|
||||
using NodeNameCache = std::fbx_unordered_map<std::string, unsigned int>;
|
||||
NodeNameCache mNodeNames;
|
||||
|
||||
// Deformer name is not the same as a bone name - it does contain the bone name though :)
|
||||
|
39
thirdparty/assimp/code/FBX/FBXDocument.h
vendored
39
thirdparty/assimp/code/FBX/FBXDocument.h
vendored
@ -637,6 +637,20 @@ public:
|
||||
return ptr;
|
||||
}
|
||||
|
||||
bool operator==(const Video& other) const
|
||||
{
|
||||
return (
|
||||
type == other.type
|
||||
&& relativeFileName == other.relativeFileName
|
||||
&& fileName == other.fileName
|
||||
);
|
||||
}
|
||||
|
||||
bool operator<(const Video& other) const
|
||||
{
|
||||
return std::tie(type, relativeFileName, fileName) < std::tie(other.type, other.relativeFileName, other.fileName);
|
||||
}
|
||||
|
||||
private:
|
||||
std::string type;
|
||||
std::string relativeFileName;
|
||||
@ -1005,10 +1019,10 @@ public:
|
||||
// during their entire lifetime (Document). FBX files have
|
||||
// up to many thousands of objects (most of which we never use),
|
||||
// so the memory overhead for them should be kept at a minimum.
|
||||
typedef std::map<uint64_t, LazyObject*> ObjectMap;
|
||||
typedef std::fbx_unordered_map<uint64_t, LazyObject*> ObjectMap;
|
||||
typedef std::fbx_unordered_map<std::string, std::shared_ptr<const PropertyTable> > PropertyTemplateMap;
|
||||
|
||||
typedef std::multimap<uint64_t, const Connection*> ConnectionMap;
|
||||
typedef std::fbx_unordered_multimap<uint64_t, const Connection*> ConnectionMap;
|
||||
|
||||
/** DOM class for global document settings, a single instance per document can
|
||||
* be accessed via Document.Globals(). */
|
||||
@ -1177,4 +1191,25 @@ private:
|
||||
} // Namespace FBX
|
||||
} // Namespace Assimp
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <>
|
||||
struct hash<const Assimp::FBX::Video>
|
||||
{
|
||||
std::size_t operator()(const Assimp::FBX::Video& video) const
|
||||
{
|
||||
using std::size_t;
|
||||
using std::hash;
|
||||
using std::string;
|
||||
|
||||
size_t res = 17;
|
||||
res = res * 31 + hash<string>()(video.Name());
|
||||
res = res * 31 + hash<string>()(video.RelativeFilename());
|
||||
res = res * 31 + hash<string>()(video.Type());
|
||||
|
||||
return res;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // INCLUDED_AI_FBX_DOCUMENT_H
|
||||
|
2
thirdparty/assimp/code/FBX/FBXExporter.cpp
vendored
2
thirdparty/assimp/code/FBX/FBXExporter.cpp
vendored
@ -1289,7 +1289,7 @@ void FBXExporter::WriteObjects ()
|
||||
|
||||
for(unsigned int lr = 1; lr < m->GetNumUVChannels(); ++ lr)
|
||||
{
|
||||
FBX::Node layerExtra("Layer", int32_t(1));
|
||||
FBX::Node layerExtra("Layer", int32_t(lr));
|
||||
layerExtra.AddChild("Version", int32_t(100));
|
||||
FBX::Node leExtra("LayerElement");
|
||||
leExtra.AddChild("Type", "LayerElementUV");
|
||||
|
83
thirdparty/assimp/code/MMD/MMDCpp14.h
vendored
83
thirdparty/assimp/code/MMD/MMDCpp14.h
vendored
@ -1,83 +0,0 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, 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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifndef MMD_CPP14_H
|
||||
#define MMD_CPP14_H
|
||||
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace mmd {
|
||||
template<class T> struct _Unique_if {
|
||||
typedef std::unique_ptr<T> _Single_object;
|
||||
};
|
||||
|
||||
template<class T> struct _Unique_if<T[]> {
|
||||
typedef std::unique_ptr<T[]> _Unknown_bound;
|
||||
};
|
||||
|
||||
template<class T, size_t N> struct _Unique_if<T[N]> {
|
||||
typedef void _Known_bound;
|
||||
};
|
||||
|
||||
template<class T, class... Args>
|
||||
typename _Unique_if<T>::_Single_object
|
||||
make_unique(Args&&... args) {
|
||||
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
template<class T>
|
||||
typename _Unique_if<T>::_Unknown_bound
|
||||
make_unique(size_t n) {
|
||||
typedef typename std::remove_extent<T>::type U;
|
||||
return std::unique_ptr<T>(new U[n]());
|
||||
}
|
||||
|
||||
template<class T, class... Args>
|
||||
typename _Unique_if<T>::_Known_bound
|
||||
make_unique(Args&&...) = delete;
|
||||
}
|
||||
|
||||
#endif
|
372
thirdparty/assimp/code/MMD/MMDImporter.cpp
vendored
372
thirdparty/assimp/code/MMD/MMDImporter.cpp
vendored
@ -1,372 +0,0 @@
|
||||
/*
|
||||
---------------------------------------------------------------------------
|
||||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2016, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the following
|
||||
conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_MMD_IMPORTER
|
||||
|
||||
#include "MMD/MMDImporter.h"
|
||||
#include "MMD/MMDPmdParser.h"
|
||||
#include "MMD/MMDPmxParser.h"
|
||||
#include "MMD/MMDVmdParser.h"
|
||||
#include "PostProcessing/ConvertToLHProcess.h"
|
||||
|
||||
#include <assimp/DefaultIOSystem.h>
|
||||
#include <assimp/Importer.hpp>
|
||||
#include <assimp/ai_assert.h>
|
||||
#include <assimp/scene.h>
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <memory>
|
||||
|
||||
static const aiImporterDesc desc = {"MMD Importer",
|
||||
"",
|
||||
"",
|
||||
"surfaces supported?",
|
||||
aiImporterFlags_SupportTextFlavour,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
"pmx"};
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
using namespace std;
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Default constructor
|
||||
MMDImporter::MMDImporter()
|
||||
: m_Buffer()
|
||||
, m_strAbsPath("") {
|
||||
DefaultIOSystem io;
|
||||
m_strAbsPath = io.getOsSeparator();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Destructor.
|
||||
MMDImporter::~MMDImporter() {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Returns true, if file is an pmx file.
|
||||
bool MMDImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler,
|
||||
bool checkSig) const {
|
||||
if (!checkSig) // Check File Extension
|
||||
{
|
||||
return SimpleExtensionCheck(pFile, "pmx");
|
||||
} else // Check file Header
|
||||
{
|
||||
static const char *pTokens[] = {"PMX "};
|
||||
return BaseImporter::SearchFileHeaderForToken(pIOHandler, pFile, pTokens, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
const aiImporterDesc *MMDImporter::GetInfo() const { return &desc; }
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// MMD import implementation
|
||||
void MMDImporter::InternReadFile(const std::string &file, aiScene *pScene,
|
||||
IOSystem * /*pIOHandler*/) {
|
||||
// Read file by istream
|
||||
std::filebuf fb;
|
||||
if (!fb.open(file, std::ios::in | std::ios::binary)) {
|
||||
throw DeadlyImportError("Failed to open file " + file + ".");
|
||||
}
|
||||
|
||||
std::istream fileStream(&fb);
|
||||
|
||||
// Get the file-size and validate it, throwing an exception when fails
|
||||
fileStream.seekg(0, fileStream.end);
|
||||
size_t fileSize = static_cast<size_t>(fileStream.tellg());
|
||||
fileStream.seekg(0, fileStream.beg);
|
||||
|
||||
if (fileSize < sizeof(pmx::PmxModel)) {
|
||||
throw DeadlyImportError(file + " is too small.");
|
||||
}
|
||||
|
||||
pmx::PmxModel model;
|
||||
model.Read(&fileStream);
|
||||
|
||||
CreateDataFromImport(&model, pScene);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void MMDImporter::CreateDataFromImport(const pmx::PmxModel *pModel,
|
||||
aiScene *pScene) {
|
||||
if (pModel == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
aiNode *pNode = new aiNode;
|
||||
if (!pModel->model_name.empty()) {
|
||||
pNode->mName.Set(pModel->model_name);
|
||||
}
|
||||
|
||||
pScene->mRootNode = pNode;
|
||||
|
||||
pNode = new aiNode;
|
||||
pScene->mRootNode->addChildren(1, &pNode);
|
||||
pNode->mName.Set(string(pModel->model_name) + string("_mesh"));
|
||||
|
||||
// split mesh by materials
|
||||
pNode->mNumMeshes = pModel->material_count;
|
||||
pNode->mMeshes = new unsigned int[pNode->mNumMeshes];
|
||||
for (unsigned int index = 0; index < pNode->mNumMeshes; index++) {
|
||||
pNode->mMeshes[index] = index;
|
||||
}
|
||||
|
||||
pScene->mNumMeshes = pModel->material_count;
|
||||
pScene->mMeshes = new aiMesh *[pScene->mNumMeshes];
|
||||
for (unsigned int i = 0, indexStart = 0; i < pScene->mNumMeshes; i++) {
|
||||
const int indexCount = pModel->materials[i].index_count;
|
||||
|
||||
pScene->mMeshes[i] = CreateMesh(pModel, indexStart, indexCount);
|
||||
pScene->mMeshes[i]->mName = pModel->materials[i].material_name;
|
||||
pScene->mMeshes[i]->mMaterialIndex = i;
|
||||
indexStart += indexCount;
|
||||
}
|
||||
|
||||
// create node hierarchy for bone position
|
||||
std::unique_ptr<aiNode *[]> ppNode(new aiNode *[pModel->bone_count]);
|
||||
for (auto i = 0; i < pModel->bone_count; i++) {
|
||||
ppNode[i] = new aiNode(pModel->bones[i].bone_name);
|
||||
}
|
||||
|
||||
for (auto i = 0; i < pModel->bone_count; i++) {
|
||||
const pmx::PmxBone &bone = pModel->bones[i];
|
||||
|
||||
if (bone.parent_index < 0) {
|
||||
pScene->mRootNode->addChildren(1, ppNode.get() + i);
|
||||
} else {
|
||||
ppNode[bone.parent_index]->addChildren(1, ppNode.get() + i);
|
||||
|
||||
aiVector3D v3 = aiVector3D(
|
||||
bone.position[0] - pModel->bones[bone.parent_index].position[0],
|
||||
bone.position[1] - pModel->bones[bone.parent_index].position[1],
|
||||
bone.position[2] - pModel->bones[bone.parent_index].position[2]);
|
||||
aiMatrix4x4::Translation(v3, ppNode[i]->mTransformation);
|
||||
}
|
||||
}
|
||||
|
||||
// create materials
|
||||
pScene->mNumMaterials = pModel->material_count;
|
||||
pScene->mMaterials = new aiMaterial *[pScene->mNumMaterials];
|
||||
for (unsigned int i = 0; i < pScene->mNumMaterials; i++) {
|
||||
pScene->mMaterials[i] = CreateMaterial(&pModel->materials[i], pModel);
|
||||
}
|
||||
|
||||
// Convert everything to OpenGL space
|
||||
MakeLeftHandedProcess convertProcess;
|
||||
convertProcess.Execute(pScene);
|
||||
|
||||
FlipUVsProcess uvFlipper;
|
||||
uvFlipper.Execute(pScene);
|
||||
|
||||
FlipWindingOrderProcess windingFlipper;
|
||||
windingFlipper.Execute(pScene);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
aiMesh *MMDImporter::CreateMesh(const pmx::PmxModel *pModel,
|
||||
const int indexStart, const int indexCount) {
|
||||
aiMesh *pMesh = new aiMesh;
|
||||
|
||||
pMesh->mNumVertices = indexCount;
|
||||
|
||||
pMesh->mNumFaces = indexCount / 3;
|
||||
pMesh->mFaces = new aiFace[pMesh->mNumFaces];
|
||||
|
||||
const int numIndices = 3; // triangular face
|
||||
for (unsigned int index = 0; index < pMesh->mNumFaces; index++) {
|
||||
pMesh->mFaces[index].mNumIndices = numIndices;
|
||||
unsigned int *indices = new unsigned int[numIndices];
|
||||
indices[0] = numIndices * index;
|
||||
indices[1] = numIndices * index + 1;
|
||||
indices[2] = numIndices * index + 2;
|
||||
pMesh->mFaces[index].mIndices = indices;
|
||||
}
|
||||
|
||||
pMesh->mVertices = new aiVector3D[pMesh->mNumVertices];
|
||||
pMesh->mNormals = new aiVector3D[pMesh->mNumVertices];
|
||||
pMesh->mTextureCoords[0] = new aiVector3D[pMesh->mNumVertices];
|
||||
pMesh->mNumUVComponents[0] = 2;
|
||||
|
||||
// additional UVs
|
||||
for (int i = 1; i <= pModel->setting.uv; i++) {
|
||||
pMesh->mTextureCoords[i] = new aiVector3D[pMesh->mNumVertices];
|
||||
pMesh->mNumUVComponents[i] = 4;
|
||||
}
|
||||
|
||||
map<int, vector<aiVertexWeight>> bone_vertex_map;
|
||||
|
||||
// fill in contents and create bones
|
||||
for (int index = 0; index < indexCount; index++) {
|
||||
const pmx::PmxVertex *v =
|
||||
&pModel->vertices[pModel->indices[indexStart + index]];
|
||||
const float *position = v->position;
|
||||
pMesh->mVertices[index].Set(position[0], position[1], position[2]);
|
||||
const float *normal = v->normal;
|
||||
|
||||
pMesh->mNormals[index].Set(normal[0], normal[1], normal[2]);
|
||||
pMesh->mTextureCoords[0][index].x = v->uv[0];
|
||||
pMesh->mTextureCoords[0][index].y = v->uv[1];
|
||||
|
||||
for (int i = 1; i <= pModel->setting.uv; i++) {
|
||||
// TODO: wrong here? use quaternion transform?
|
||||
pMesh->mTextureCoords[i][index].x = v->uva[i][0];
|
||||
pMesh->mTextureCoords[i][index].y = v->uva[i][1];
|
||||
}
|
||||
|
||||
// handle bone map
|
||||
const auto vsBDEF1_ptr =
|
||||
dynamic_cast<pmx::PmxVertexSkinningBDEF1 *>(v->skinning.get());
|
||||
const auto vsBDEF2_ptr =
|
||||
dynamic_cast<pmx::PmxVertexSkinningBDEF2 *>(v->skinning.get());
|
||||
const auto vsBDEF4_ptr =
|
||||
dynamic_cast<pmx::PmxVertexSkinningBDEF4 *>(v->skinning.get());
|
||||
const auto vsSDEF_ptr =
|
||||
dynamic_cast<pmx::PmxVertexSkinningSDEF *>(v->skinning.get());
|
||||
switch (v->skinning_type) {
|
||||
case pmx::PmxVertexSkinningType::BDEF1:
|
||||
bone_vertex_map[vsBDEF1_ptr->bone_index].push_back(
|
||||
aiVertexWeight(index, 1.0));
|
||||
break;
|
||||
case pmx::PmxVertexSkinningType::BDEF2:
|
||||
bone_vertex_map[vsBDEF2_ptr->bone_index1].push_back(
|
||||
aiVertexWeight(index, vsBDEF2_ptr->bone_weight));
|
||||
bone_vertex_map[vsBDEF2_ptr->bone_index2].push_back(
|
||||
aiVertexWeight(index, 1.0f - vsBDEF2_ptr->bone_weight));
|
||||
break;
|
||||
case pmx::PmxVertexSkinningType::BDEF4:
|
||||
bone_vertex_map[vsBDEF4_ptr->bone_index1].push_back(
|
||||
aiVertexWeight(index, vsBDEF4_ptr->bone_weight1));
|
||||
bone_vertex_map[vsBDEF4_ptr->bone_index2].push_back(
|
||||
aiVertexWeight(index, vsBDEF4_ptr->bone_weight2));
|
||||
bone_vertex_map[vsBDEF4_ptr->bone_index3].push_back(
|
||||
aiVertexWeight(index, vsBDEF4_ptr->bone_weight3));
|
||||
bone_vertex_map[vsBDEF4_ptr->bone_index4].push_back(
|
||||
aiVertexWeight(index, vsBDEF4_ptr->bone_weight4));
|
||||
break;
|
||||
case pmx::PmxVertexSkinningType::SDEF: // TODO: how to use sdef_c, sdef_r0,
|
||||
// sdef_r1?
|
||||
bone_vertex_map[vsSDEF_ptr->bone_index1].push_back(
|
||||
aiVertexWeight(index, vsSDEF_ptr->bone_weight));
|
||||
bone_vertex_map[vsSDEF_ptr->bone_index2].push_back(
|
||||
aiVertexWeight(index, 1.0f - vsSDEF_ptr->bone_weight));
|
||||
break;
|
||||
case pmx::PmxVertexSkinningType::QDEF:
|
||||
const auto vsQDEF_ptr =
|
||||
dynamic_cast<pmx::PmxVertexSkinningQDEF *>(v->skinning.get());
|
||||
bone_vertex_map[vsQDEF_ptr->bone_index1].push_back(
|
||||
aiVertexWeight(index, vsQDEF_ptr->bone_weight1));
|
||||
bone_vertex_map[vsQDEF_ptr->bone_index2].push_back(
|
||||
aiVertexWeight(index, vsQDEF_ptr->bone_weight2));
|
||||
bone_vertex_map[vsQDEF_ptr->bone_index3].push_back(
|
||||
aiVertexWeight(index, vsQDEF_ptr->bone_weight3));
|
||||
bone_vertex_map[vsQDEF_ptr->bone_index4].push_back(
|
||||
aiVertexWeight(index, vsQDEF_ptr->bone_weight4));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// make all bones for each mesh
|
||||
// assign bone weights to skinned bones (otherwise just initialize)
|
||||
auto bone_ptr_ptr = new aiBone *[pModel->bone_count];
|
||||
pMesh->mNumBones = pModel->bone_count;
|
||||
pMesh->mBones = bone_ptr_ptr;
|
||||
for (auto ii = 0; ii < pModel->bone_count; ++ii) {
|
||||
auto pBone = new aiBone;
|
||||
const auto &pmxBone = pModel->bones[ii];
|
||||
pBone->mName = pmxBone.bone_name;
|
||||
aiVector3D pos(pmxBone.position[0], pmxBone.position[1], pmxBone.position[2]);
|
||||
aiMatrix4x4::Translation(-pos, pBone->mOffsetMatrix);
|
||||
auto it = bone_vertex_map.find(ii);
|
||||
if (it != bone_vertex_map.end()) {
|
||||
pBone->mNumWeights = static_cast<unsigned int>(it->second.size());
|
||||
pBone->mWeights = new aiVertexWeight[pBone->mNumWeights];
|
||||
for (unsigned int j = 0; j < pBone->mNumWeights; j++) {
|
||||
pBone->mWeights[j] = it->second[j];
|
||||
}
|
||||
}
|
||||
bone_ptr_ptr[ii] = pBone;
|
||||
}
|
||||
|
||||
return pMesh;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
aiMaterial *MMDImporter::CreateMaterial(const pmx::PmxMaterial *pMat,
|
||||
const pmx::PmxModel *pModel) {
|
||||
aiMaterial *mat = new aiMaterial();
|
||||
aiString name(pMat->material_english_name);
|
||||
mat->AddProperty(&name, AI_MATKEY_NAME);
|
||||
|
||||
aiColor3D diffuse(pMat->diffuse[0], pMat->diffuse[1], pMat->diffuse[2]);
|
||||
mat->AddProperty(&diffuse, 1, AI_MATKEY_COLOR_DIFFUSE);
|
||||
aiColor3D specular(pMat->specular[0], pMat->specular[1], pMat->specular[2]);
|
||||
mat->AddProperty(&specular, 1, AI_MATKEY_COLOR_SPECULAR);
|
||||
aiColor3D ambient(pMat->ambient[0], pMat->ambient[1], pMat->ambient[2]);
|
||||
mat->AddProperty(&ambient, 1, AI_MATKEY_COLOR_AMBIENT);
|
||||
|
||||
float opacity = pMat->diffuse[3];
|
||||
mat->AddProperty(&opacity, 1, AI_MATKEY_OPACITY);
|
||||
float shininess = pMat->specularlity;
|
||||
mat->AddProperty(&shininess, 1, AI_MATKEY_SHININESS_STRENGTH);
|
||||
|
||||
if(pMat->diffuse_texture_index >= 0) {
|
||||
aiString texture_path(pModel->textures[pMat->diffuse_texture_index]);
|
||||
mat->AddProperty(&texture_path, AI_MATKEY_TEXTURE(aiTextureType_DIFFUSE, 0));
|
||||
}
|
||||
|
||||
int mapping_uvwsrc = 0;
|
||||
mat->AddProperty(&mapping_uvwsrc, 1,
|
||||
AI_MATKEY_UVWSRC(aiTextureType_DIFFUSE, 0));
|
||||
|
||||
return mat;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
} // Namespace Assimp
|
||||
|
||||
#endif // !! ASSIMP_BUILD_NO_MMD_IMPORTER
|
96
thirdparty/assimp/code/MMD/MMDImporter.h
vendored
96
thirdparty/assimp/code/MMD/MMDImporter.h
vendored
@ -1,96 +0,0 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2016, assimp team
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef MMD_FILE_IMPORTER_H_INC
|
||||
#define MMD_FILE_IMPORTER_H_INC
|
||||
|
||||
#include <assimp/BaseImporter.h>
|
||||
#include "MMDPmxParser.h"
|
||||
#include <assimp/material.h>
|
||||
#include <vector>
|
||||
|
||||
struct aiMesh;
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
/// \class MMDImporter
|
||||
/// \brief Imports MMD a pmx/pmd/vmd file
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
class MMDImporter : public BaseImporter {
|
||||
public:
|
||||
/// \brief Default constructor
|
||||
MMDImporter();
|
||||
|
||||
/// \brief Destructor
|
||||
~MMDImporter();
|
||||
|
||||
public:
|
||||
/// \brief Returns whether the class can handle the format of the given file.
|
||||
/// \remark See BaseImporter::CanRead() for details.
|
||||
bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const;
|
||||
|
||||
private:
|
||||
//! \brief Appends the supported extension.
|
||||
const aiImporterDesc* GetInfo () const;
|
||||
|
||||
//! \brief File import implementation.
|
||||
void InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler);
|
||||
|
||||
//! \brief Create the data from imported content.
|
||||
void CreateDataFromImport(const pmx::PmxModel* pModel, aiScene* pScene);
|
||||
|
||||
//! \brief Create the mesh
|
||||
aiMesh* CreateMesh(const pmx::PmxModel* pModel, const int indexStart, const int indexCount);
|
||||
|
||||
//! \brief Create the material
|
||||
aiMaterial* CreateMaterial(const pmx::PmxMaterial* pMat, const pmx::PmxModel* pModel);
|
||||
|
||||
private:
|
||||
//! Data buffer
|
||||
std::vector<char> m_Buffer;
|
||||
//! Absolute pathname of model in file system
|
||||
std::string m_strAbsPath;
|
||||
};
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
|
||||
} // Namespace Assimp
|
||||
|
||||
#endif
|
597
thirdparty/assimp/code/MMD/MMDPmdParser.h
vendored
597
thirdparty/assimp/code/MMD/MMDPmdParser.h
vendored
@ -1,597 +0,0 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, 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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include "MMDCpp14.h"
|
||||
|
||||
namespace pmd
|
||||
{
|
||||
class PmdHeader
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
std::string name_english;
|
||||
std::string comment;
|
||||
std::string comment_english;
|
||||
|
||||
bool Read(std::ifstream* stream)
|
||||
{
|
||||
char buffer[256];
|
||||
stream->read(buffer, 20);
|
||||
name = std::string(buffer);
|
||||
stream->read(buffer, 256);
|
||||
comment = std::string(buffer);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ReadExtension(std::ifstream* stream)
|
||||
{
|
||||
char buffer[256];
|
||||
stream->read(buffer, 20);
|
||||
name_english = std::string(buffer);
|
||||
stream->read(buffer, 256);
|
||||
comment_english = std::string(buffer);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class PmdVertex
|
||||
{
|
||||
public:
|
||||
float position[3];
|
||||
|
||||
float normal[3];
|
||||
|
||||
float uv[2];
|
||||
|
||||
uint16_t bone_index[2];
|
||||
|
||||
uint8_t bone_weight;
|
||||
|
||||
bool edge_invisible;
|
||||
|
||||
bool Read(std::ifstream* stream)
|
||||
{
|
||||
stream->read((char*) position, sizeof(float) * 3);
|
||||
stream->read((char*) normal, sizeof(float) * 3);
|
||||
stream->read((char*) uv, sizeof(float) * 2);
|
||||
stream->read((char*) bone_index, sizeof(uint16_t) * 2);
|
||||
stream->read((char*) &bone_weight, sizeof(uint8_t));
|
||||
stream->read((char*) &edge_invisible, sizeof(uint8_t));
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class PmdMaterial
|
||||
{
|
||||
public:
|
||||
float diffuse[4];
|
||||
float power;
|
||||
float specular[3];
|
||||
float ambient[3];
|
||||
uint8_t toon_index;
|
||||
uint8_t edge_flag;
|
||||
uint32_t index_count;
|
||||
std::string texture_filename;
|
||||
std::string sphere_filename;
|
||||
|
||||
bool Read(std::ifstream* stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read((char*) &diffuse, sizeof(float) * 4);
|
||||
stream->read((char*) &power, sizeof(float));
|
||||
stream->read((char*) &specular, sizeof(float) * 3);
|
||||
stream->read((char*) &ambient, sizeof(float) * 3);
|
||||
stream->read((char*) &toon_index, sizeof(uint8_t));
|
||||
stream->read((char*) &edge_flag, sizeof(uint8_t));
|
||||
stream->read((char*) &index_count, sizeof(uint32_t));
|
||||
stream->read((char*) &buffer, sizeof(char) * 20);
|
||||
char* pstar = strchr(buffer, '*');
|
||||
if (NULL == pstar)
|
||||
{
|
||||
texture_filename = std::string(buffer);
|
||||
sphere_filename.clear();
|
||||
}
|
||||
else {
|
||||
*pstar = 0;
|
||||
texture_filename = std::string(buffer);
|
||||
sphere_filename = std::string(pstar+1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
enum class BoneType : uint8_t
|
||||
{
|
||||
Rotation,
|
||||
RotationAndMove,
|
||||
IkEffector,
|
||||
Unknown,
|
||||
IkEffectable,
|
||||
RotationEffectable,
|
||||
IkTarget,
|
||||
Invisible,
|
||||
Twist,
|
||||
RotationMovement
|
||||
};
|
||||
|
||||
class PmdBone
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
std::string name_english;
|
||||
uint16_t parent_bone_index;
|
||||
uint16_t tail_pos_bone_index;
|
||||
BoneType bone_type;
|
||||
uint16_t ik_parent_bone_index;
|
||||
float bone_head_pos[3];
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read(buffer, 20);
|
||||
name = std::string(buffer);
|
||||
stream->read((char*) &parent_bone_index, sizeof(uint16_t));
|
||||
stream->read((char*) &tail_pos_bone_index, sizeof(uint16_t));
|
||||
stream->read((char*) &bone_type, sizeof(uint8_t));
|
||||
stream->read((char*) &ik_parent_bone_index, sizeof(uint16_t));
|
||||
stream->read((char*) &bone_head_pos, sizeof(float) * 3);
|
||||
}
|
||||
|
||||
void ReadExpantion(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read(buffer, 20);
|
||||
name_english = std::string(buffer);
|
||||
}
|
||||
};
|
||||
|
||||
class PmdIk
|
||||
{
|
||||
public:
|
||||
uint16_t ik_bone_index;
|
||||
uint16_t target_bone_index;
|
||||
uint16_t interations;
|
||||
float angle_limit;
|
||||
std::vector<uint16_t> ik_child_bone_index;
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
stream->read((char *) &ik_bone_index, sizeof(uint16_t));
|
||||
stream->read((char *) &target_bone_index, sizeof(uint16_t));
|
||||
uint8_t ik_chain_length;
|
||||
stream->read((char*) &ik_chain_length, sizeof(uint8_t));
|
||||
stream->read((char *) &interations, sizeof(uint16_t));
|
||||
stream->read((char *) &angle_limit, sizeof(float));
|
||||
ik_child_bone_index.resize(ik_chain_length);
|
||||
for (int i = 0; i < ik_chain_length; i++)
|
||||
{
|
||||
stream->read((char *) &ik_child_bone_index[i], sizeof(uint16_t));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class PmdFaceVertex
|
||||
{
|
||||
public:
|
||||
int vertex_index;
|
||||
float position[3];
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
stream->read((char *) &vertex_index, sizeof(int));
|
||||
stream->read((char *) position, sizeof(float) * 3);
|
||||
}
|
||||
};
|
||||
|
||||
enum class FaceCategory : uint8_t
|
||||
{
|
||||
Base,
|
||||
Eyebrow,
|
||||
Eye,
|
||||
Mouth,
|
||||
Other
|
||||
};
|
||||
|
||||
class PmdFace
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
FaceCategory type;
|
||||
std::vector<PmdFaceVertex> vertices;
|
||||
std::string name_english;
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read(buffer, 20);
|
||||
name = std::string(buffer);
|
||||
int vertex_count;
|
||||
stream->read((char*) &vertex_count, sizeof(int));
|
||||
stream->read((char*) &type, sizeof(uint8_t));
|
||||
vertices.resize(vertex_count);
|
||||
for (int i = 0; i < vertex_count; i++)
|
||||
{
|
||||
vertices[i].Read(stream);
|
||||
}
|
||||
}
|
||||
|
||||
void ReadExpantion(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read(buffer, 20);
|
||||
name_english = std::string(buffer);
|
||||
}
|
||||
};
|
||||
|
||||
class PmdBoneDispName
|
||||
{
|
||||
public:
|
||||
std::string bone_disp_name;
|
||||
std::string bone_disp_name_english;
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
char buffer[50];
|
||||
stream->read(buffer, 50);
|
||||
bone_disp_name = std::string(buffer);
|
||||
bone_disp_name_english.clear();
|
||||
}
|
||||
void ReadExpantion(std::istream *stream)
|
||||
{
|
||||
char buffer[50];
|
||||
stream->read(buffer, 50);
|
||||
bone_disp_name_english = std::string(buffer);
|
||||
}
|
||||
};
|
||||
|
||||
class PmdBoneDisp
|
||||
{
|
||||
public:
|
||||
uint16_t bone_index;
|
||||
uint8_t bone_disp_index;
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
stream->read((char*) &bone_index, sizeof(uint16_t));
|
||||
stream->read((char*) &bone_disp_index, sizeof(uint8_t));
|
||||
}
|
||||
};
|
||||
|
||||
enum class RigidBodyShape : uint8_t
|
||||
{
|
||||
Sphere = 0,
|
||||
Box = 1,
|
||||
Cpusel = 2
|
||||
};
|
||||
|
||||
enum class RigidBodyType : uint8_t
|
||||
{
|
||||
BoneConnected = 0,
|
||||
Physics = 1,
|
||||
ConnectedPhysics = 2
|
||||
};
|
||||
|
||||
class PmdRigidBody
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
uint16_t related_bone_index;
|
||||
uint8_t group_index;
|
||||
uint16_t mask;
|
||||
RigidBodyShape shape;
|
||||
float size[3];
|
||||
float position[3];
|
||||
float orientation[3];
|
||||
float weight;
|
||||
float linear_damping;
|
||||
float anglar_damping;
|
||||
float restitution;
|
||||
float friction;
|
||||
RigidBodyType rigid_type;
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read(buffer, sizeof(char) * 20);
|
||||
name = (std::string(buffer));
|
||||
stream->read((char*) &related_bone_index, sizeof(uint16_t));
|
||||
stream->read((char*) &group_index, sizeof(uint8_t));
|
||||
stream->read((char*) &mask, sizeof(uint16_t));
|
||||
stream->read((char*) &shape, sizeof(uint8_t));
|
||||
stream->read((char*) size, sizeof(float) * 3);
|
||||
stream->read((char*) position, sizeof(float) * 3);
|
||||
stream->read((char*) orientation, sizeof(float) * 3);
|
||||
stream->read((char*) &weight, sizeof(float));
|
||||
stream->read((char*) &linear_damping, sizeof(float));
|
||||
stream->read((char*) &anglar_damping, sizeof(float));
|
||||
stream->read((char*) &restitution, sizeof(float));
|
||||
stream->read((char*) &friction, sizeof(float));
|
||||
stream->read((char*) &rigid_type, sizeof(char));
|
||||
}
|
||||
};
|
||||
|
||||
class PmdConstraint
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
uint32_t rigid_body_index_a;
|
||||
uint32_t rigid_body_index_b;
|
||||
float position[3];
|
||||
float orientation[3];
|
||||
float linear_lower_limit[3];
|
||||
float linear_upper_limit[3];
|
||||
float angular_lower_limit[3];
|
||||
float angular_upper_limit[3];
|
||||
float linear_stiffness[3];
|
||||
float angular_stiffness[3];
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read(buffer, 20);
|
||||
name = std::string(buffer);
|
||||
stream->read((char *) &rigid_body_index_a, sizeof(uint32_t));
|
||||
stream->read((char *) &rigid_body_index_b, sizeof(uint32_t));
|
||||
stream->read((char *) position, sizeof(float) * 3);
|
||||
stream->read((char *) orientation, sizeof(float) * 3);
|
||||
stream->read((char *) linear_lower_limit, sizeof(float) * 3);
|
||||
stream->read((char *) linear_upper_limit, sizeof(float) * 3);
|
||||
stream->read((char *) angular_lower_limit, sizeof(float) * 3);
|
||||
stream->read((char *) angular_upper_limit, sizeof(float) * 3);
|
||||
stream->read((char *) linear_stiffness, sizeof(float) * 3);
|
||||
stream->read((char *) angular_stiffness, sizeof(float) * 3);
|
||||
}
|
||||
};
|
||||
|
||||
class PmdModel
|
||||
{
|
||||
public:
|
||||
float version;
|
||||
PmdHeader header;
|
||||
std::vector<PmdVertex> vertices;
|
||||
std::vector<uint16_t> indices;
|
||||
std::vector<PmdMaterial> materials;
|
||||
std::vector<PmdBone> bones;
|
||||
std::vector<PmdIk> iks;
|
||||
std::vector<PmdFace> faces;
|
||||
std::vector<uint16_t> faces_indices;
|
||||
std::vector<PmdBoneDispName> bone_disp_name;
|
||||
std::vector<PmdBoneDisp> bone_disp;
|
||||
std::vector<std::string> toon_filenames;
|
||||
std::vector<PmdRigidBody> rigid_bodies;
|
||||
std::vector<PmdConstraint> constraints;
|
||||
|
||||
static std::unique_ptr<PmdModel> LoadFromFile(const char *filename)
|
||||
{
|
||||
std::ifstream stream(filename, std::ios::binary);
|
||||
if (stream.fail())
|
||||
{
|
||||
std::cerr << "could not open \"" << filename << "\"" << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
auto result = LoadFromStream(&stream);
|
||||
stream.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
static std::unique_ptr<PmdModel> LoadFromStream(std::ifstream *stream)
|
||||
{
|
||||
auto result = mmd::make_unique<PmdModel>();
|
||||
char buffer[100];
|
||||
|
||||
// magic
|
||||
char magic[3];
|
||||
stream->read(magic, 3);
|
||||
if (magic[0] != 'P' || magic[1] != 'm' || magic[2] != 'd')
|
||||
{
|
||||
std::cerr << "invalid file" << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// version
|
||||
stream->read((char*) &(result->version), sizeof(float));
|
||||
if (result ->version != 1.0f)
|
||||
{
|
||||
std::cerr << "invalid version" << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// header
|
||||
result->header.Read(stream);
|
||||
|
||||
// vertices
|
||||
uint32_t vertex_num;
|
||||
stream->read((char*) &vertex_num, sizeof(uint32_t));
|
||||
result->vertices.resize(vertex_num);
|
||||
for (uint32_t i = 0; i < vertex_num; i++)
|
||||
{
|
||||
result->vertices[i].Read(stream);
|
||||
}
|
||||
|
||||
// indices
|
||||
uint32_t index_num;
|
||||
stream->read((char*) &index_num, sizeof(uint32_t));
|
||||
result->indices.resize(index_num);
|
||||
for (uint32_t i = 0; i < index_num; i++)
|
||||
{
|
||||
stream->read((char*) &result->indices[i], sizeof(uint16_t));
|
||||
}
|
||||
|
||||
// materials
|
||||
uint32_t material_num;
|
||||
stream->read((char*) &material_num, sizeof(uint32_t));
|
||||
result->materials.resize(material_num);
|
||||
for (uint32_t i = 0; i < material_num; i++)
|
||||
{
|
||||
result->materials[i].Read(stream);
|
||||
}
|
||||
|
||||
// bones
|
||||
uint16_t bone_num;
|
||||
stream->read((char*) &bone_num, sizeof(uint16_t));
|
||||
result->bones.resize(bone_num);
|
||||
for (uint32_t i = 0; i < bone_num; i++)
|
||||
{
|
||||
result->bones[i].Read(stream);
|
||||
}
|
||||
|
||||
// iks
|
||||
uint16_t ik_num;
|
||||
stream->read((char*) &ik_num, sizeof(uint16_t));
|
||||
result->iks.resize(ik_num);
|
||||
for (uint32_t i = 0; i < ik_num; i++)
|
||||
{
|
||||
result->iks[i].Read(stream);
|
||||
}
|
||||
|
||||
// faces
|
||||
uint16_t face_num;
|
||||
stream->read((char*) &face_num, sizeof(uint16_t));
|
||||
result->faces.resize(face_num);
|
||||
for (uint32_t i = 0; i < face_num; i++)
|
||||
{
|
||||
result->faces[i].Read(stream);
|
||||
}
|
||||
|
||||
// face frames
|
||||
uint8_t face_frame_num;
|
||||
stream->read((char*) &face_frame_num, sizeof(uint8_t));
|
||||
result->faces_indices.resize(face_frame_num);
|
||||
for (uint32_t i = 0; i < face_frame_num; i++)
|
||||
{
|
||||
stream->read((char*) &result->faces_indices[i], sizeof(uint16_t));
|
||||
}
|
||||
|
||||
// bone names
|
||||
uint8_t bone_disp_num;
|
||||
stream->read((char*) &bone_disp_num, sizeof(uint8_t));
|
||||
result->bone_disp_name.resize(bone_disp_num);
|
||||
for (uint32_t i = 0; i < bone_disp_num; i++)
|
||||
{
|
||||
result->bone_disp_name[i].Read(stream);
|
||||
}
|
||||
|
||||
// bone frame
|
||||
uint32_t bone_frame_num;
|
||||
stream->read((char*) &bone_frame_num, sizeof(uint32_t));
|
||||
result->bone_disp.resize(bone_frame_num);
|
||||
for (uint32_t i = 0; i < bone_frame_num; i++)
|
||||
{
|
||||
result->bone_disp[i].Read(stream);
|
||||
}
|
||||
|
||||
// english name
|
||||
bool english;
|
||||
stream->read((char*) &english, sizeof(char));
|
||||
if (english)
|
||||
{
|
||||
result->header.ReadExtension(stream);
|
||||
for (uint32_t i = 0; i < bone_num; i++)
|
||||
{
|
||||
result->bones[i].ReadExpantion(stream);
|
||||
}
|
||||
for (uint32_t i = 0; i < face_num; i++)
|
||||
{
|
||||
if (result->faces[i].type == pmd::FaceCategory::Base)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
result->faces[i].ReadExpantion(stream);
|
||||
}
|
||||
for (uint32_t i = 0; i < result->bone_disp_name.size(); i++)
|
||||
{
|
||||
result->bone_disp_name[i].ReadExpantion(stream);
|
||||
}
|
||||
}
|
||||
|
||||
// toon textures
|
||||
if (stream->peek() == std::ios::traits_type::eof())
|
||||
{
|
||||
result->toon_filenames.clear();
|
||||
}
|
||||
else {
|
||||
result->toon_filenames.resize(10);
|
||||
for (uint32_t i = 0; i < 10; i++)
|
||||
{
|
||||
stream->read(buffer, 100);
|
||||
result->toon_filenames[i] = std::string(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
// physics
|
||||
if (stream->peek() == std::ios::traits_type::eof())
|
||||
{
|
||||
result->rigid_bodies.clear();
|
||||
result->constraints.clear();
|
||||
}
|
||||
else {
|
||||
uint32_t rigid_body_num;
|
||||
stream->read((char*) &rigid_body_num, sizeof(uint32_t));
|
||||
result->rigid_bodies.resize(rigid_body_num);
|
||||
for (uint32_t i = 0; i < rigid_body_num; i++)
|
||||
{
|
||||
result->rigid_bodies[i].Read(stream);
|
||||
}
|
||||
uint32_t constraint_num;
|
||||
stream->read((char*) &constraint_num, sizeof(uint32_t));
|
||||
result->constraints.resize(constraint_num);
|
||||
for (uint32_t i = 0; i < constraint_num; i++)
|
||||
{
|
||||
result->constraints[i].Read(stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (stream->peek() != std::ios::traits_type::eof())
|
||||
{
|
||||
std::cerr << "there is unknown data" << std::endl;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
}
|
608
thirdparty/assimp/code/MMD/MMDPmxParser.cpp
vendored
608
thirdparty/assimp/code/MMD/MMDPmxParser.cpp
vendored
@ -1,608 +0,0 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#include <utility>
|
||||
#include "MMDPmxParser.h"
|
||||
#include <assimp/StringUtils.h>
|
||||
#ifdef ASSIMP_USE_HUNTER
|
||||
# include <utf8/utf8.h>
|
||||
#else
|
||||
# include "../contrib/utf8cpp/source/utf8.h"
|
||||
#endif
|
||||
#include <assimp/Exceptional.h>
|
||||
|
||||
namespace pmx
|
||||
{
|
||||
int ReadIndex(std::istream *stream, int size)
|
||||
{
|
||||
switch (size)
|
||||
{
|
||||
case 1:
|
||||
uint8_t tmp8;
|
||||
stream->read((char*) &tmp8, sizeof(uint8_t));
|
||||
if (255 == tmp8)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
return (int) tmp8;
|
||||
}
|
||||
case 2:
|
||||
uint16_t tmp16;
|
||||
stream->read((char*) &tmp16, sizeof(uint16_t));
|
||||
if (65535 == tmp16)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
return (int) tmp16;
|
||||
}
|
||||
case 4:
|
||||
int tmp32;
|
||||
stream->read((char*) &tmp32, sizeof(int));
|
||||
return tmp32;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
std::string ReadString(std::istream *stream, uint8_t encoding)
|
||||
{
|
||||
int size;
|
||||
stream->read((char*) &size, sizeof(int));
|
||||
std::vector<char> buffer;
|
||||
if (size == 0)
|
||||
{
|
||||
return std::string("");
|
||||
}
|
||||
buffer.reserve(size);
|
||||
stream->read((char*) buffer.data(), size);
|
||||
if (encoding == 0)
|
||||
{
|
||||
// UTF16 to UTF8
|
||||
const uint16_t* sourceStart = (uint16_t*)buffer.data();
|
||||
const unsigned int targetSize = size * 3; // enough to encode
|
||||
char *targetStart = new char[targetSize];
|
||||
std::memset(targetStart, 0, targetSize * sizeof(char));
|
||||
|
||||
utf8::utf16to8( sourceStart, sourceStart + size/2, targetStart );
|
||||
|
||||
std::string result(targetStart);
|
||||
delete [] targetStart;
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
// the name is already UTF8
|
||||
return std::string((const char*)buffer.data(), size);
|
||||
}
|
||||
}
|
||||
|
||||
void PmxSetting::Read(std::istream *stream)
|
||||
{
|
||||
uint8_t count;
|
||||
stream->read((char*) &count, sizeof(uint8_t));
|
||||
if (count < 8)
|
||||
{
|
||||
throw DeadlyImportError("MMD: invalid size");
|
||||
}
|
||||
stream->read((char*) &encoding, sizeof(uint8_t));
|
||||
stream->read((char*) &uv, sizeof(uint8_t));
|
||||
stream->read((char*) &vertex_index_size, sizeof(uint8_t));
|
||||
stream->read((char*) &texture_index_size, sizeof(uint8_t));
|
||||
stream->read((char*) &material_index_size, sizeof(uint8_t));
|
||||
stream->read((char*) &bone_index_size, sizeof(uint8_t));
|
||||
stream->read((char*) &morph_index_size, sizeof(uint8_t));
|
||||
stream->read((char*) &rigidbody_index_size, sizeof(uint8_t));
|
||||
uint8_t temp;
|
||||
for (int i = 8; i < count; i++)
|
||||
{
|
||||
stream->read((char*)&temp, sizeof(uint8_t));
|
||||
}
|
||||
}
|
||||
|
||||
void PmxVertexSkinningBDEF1::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_index = ReadIndex(stream, setting->bone_index_size);
|
||||
}
|
||||
|
||||
void PmxVertexSkinningBDEF2::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_index1 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index2 = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->bone_weight, sizeof(float));
|
||||
}
|
||||
|
||||
void PmxVertexSkinningBDEF4::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_index1 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index2 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index3 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index4 = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->bone_weight1, sizeof(float));
|
||||
stream->read((char*) &this->bone_weight2, sizeof(float));
|
||||
stream->read((char*) &this->bone_weight3, sizeof(float));
|
||||
stream->read((char*) &this->bone_weight4, sizeof(float));
|
||||
}
|
||||
|
||||
void PmxVertexSkinningSDEF::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_index1 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index2 = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->bone_weight, sizeof(float));
|
||||
stream->read((char*) this->sdef_c, sizeof(float) * 3);
|
||||
stream->read((char*) this->sdef_r0, sizeof(float) * 3);
|
||||
stream->read((char*) this->sdef_r1, sizeof(float) * 3);
|
||||
}
|
||||
|
||||
void PmxVertexSkinningQDEF::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_index1 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index2 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index3 = ReadIndex(stream, setting->bone_index_size);
|
||||
this->bone_index4 = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->bone_weight1, sizeof(float));
|
||||
stream->read((char*) &this->bone_weight2, sizeof(float));
|
||||
stream->read((char*) &this->bone_weight3, sizeof(float));
|
||||
stream->read((char*) &this->bone_weight4, sizeof(float));
|
||||
}
|
||||
|
||||
void PmxVertex::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
stream->read((char*) this->position, sizeof(float) * 3);
|
||||
stream->read((char*) this->normal, sizeof(float) * 3);
|
||||
stream->read((char*) this->uv, sizeof(float) * 2);
|
||||
for (int i = 0; i < setting->uv; ++i)
|
||||
{
|
||||
stream->read((char*) this->uva[i], sizeof(float) * 4);
|
||||
}
|
||||
stream->read((char*) &this->skinning_type, sizeof(PmxVertexSkinningType));
|
||||
switch (this->skinning_type)
|
||||
{
|
||||
case PmxVertexSkinningType::BDEF1:
|
||||
this->skinning = mmd::make_unique<PmxVertexSkinningBDEF1>();
|
||||
break;
|
||||
case PmxVertexSkinningType::BDEF2:
|
||||
this->skinning = mmd::make_unique<PmxVertexSkinningBDEF2>();
|
||||
break;
|
||||
case PmxVertexSkinningType::BDEF4:
|
||||
this->skinning = mmd::make_unique<PmxVertexSkinningBDEF4>();
|
||||
break;
|
||||
case PmxVertexSkinningType::SDEF:
|
||||
this->skinning = mmd::make_unique<PmxVertexSkinningSDEF>();
|
||||
break;
|
||||
case PmxVertexSkinningType::QDEF:
|
||||
this->skinning = mmd::make_unique<PmxVertexSkinningQDEF>();
|
||||
break;
|
||||
default:
|
||||
throw "invalid skinning type";
|
||||
}
|
||||
this->skinning->Read(stream, setting);
|
||||
stream->read((char*) &this->edge, sizeof(float));
|
||||
}
|
||||
|
||||
void PmxMaterial::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->material_name = ReadString(stream, setting->encoding);
|
||||
this->material_english_name = ReadString(stream, setting->encoding);
|
||||
stream->read((char*) this->diffuse, sizeof(float) * 4);
|
||||
stream->read((char*) this->specular, sizeof(float) * 3);
|
||||
stream->read((char*) &this->specularlity, sizeof(float));
|
||||
stream->read((char*) this->ambient, sizeof(float) * 3);
|
||||
stream->read((char*) &this->flag, sizeof(uint8_t));
|
||||
stream->read((char*) this->edge_color, sizeof(float) * 4);
|
||||
stream->read((char*) &this->edge_size, sizeof(float));
|
||||
this->diffuse_texture_index = ReadIndex(stream, setting->texture_index_size);
|
||||
this->sphere_texture_index = ReadIndex(stream, setting->texture_index_size);
|
||||
stream->read((char*) &this->sphere_op_mode, sizeof(uint8_t));
|
||||
stream->read((char*) &this->common_toon_flag, sizeof(uint8_t));
|
||||
if (this->common_toon_flag)
|
||||
{
|
||||
stream->read((char*) &this->toon_texture_index, sizeof(uint8_t));
|
||||
}
|
||||
else {
|
||||
this->toon_texture_index = ReadIndex(stream, setting->texture_index_size);
|
||||
}
|
||||
this->memo = ReadString(stream, setting->encoding);
|
||||
stream->read((char*) &this->index_count, sizeof(int));
|
||||
}
|
||||
|
||||
void PmxIkLink::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->link_target = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->angle_lock, sizeof(uint8_t));
|
||||
if (angle_lock == 1)
|
||||
{
|
||||
stream->read((char*) this->max_radian, sizeof(float) * 3);
|
||||
stream->read((char*) this->min_radian, sizeof(float) * 3);
|
||||
}
|
||||
}
|
||||
|
||||
void PmxBone::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_name = ReadString(stream, setting->encoding);
|
||||
this->bone_english_name = ReadString(stream, setting->encoding);
|
||||
stream->read((char*) this->position, sizeof(float) * 3);
|
||||
this->parent_index = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->level, sizeof(int));
|
||||
stream->read((char*) &this->bone_flag, sizeof(uint16_t));
|
||||
if (this->bone_flag & 0x0001) {
|
||||
this->target_index = ReadIndex(stream, setting->bone_index_size);
|
||||
}
|
||||
else {
|
||||
stream->read((char*)this->offset, sizeof(float) * 3);
|
||||
}
|
||||
if (this->bone_flag & (0x0100 | 0x0200)) {
|
||||
this->grant_parent_index = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->grant_weight, sizeof(float));
|
||||
}
|
||||
if (this->bone_flag & 0x0400) {
|
||||
stream->read((char*)this->lock_axis_orientation, sizeof(float) * 3);
|
||||
}
|
||||
if (this->bone_flag & 0x0800) {
|
||||
stream->read((char*)this->local_axis_x_orientation, sizeof(float) * 3);
|
||||
stream->read((char*)this->local_axis_y_orientation, sizeof(float) * 3);
|
||||
}
|
||||
if (this->bone_flag & 0x2000) {
|
||||
stream->read((char*) &this->key, sizeof(int));
|
||||
}
|
||||
if (this->bone_flag & 0x0020) {
|
||||
this->ik_target_bone_index = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &ik_loop, sizeof(int));
|
||||
stream->read((char*) &ik_loop_angle_limit, sizeof(float));
|
||||
stream->read((char*) &ik_link_count, sizeof(int));
|
||||
this->ik_links = mmd::make_unique<PmxIkLink []>(ik_link_count);
|
||||
for (int i = 0; i < ik_link_count; i++) {
|
||||
ik_links[i].Read(stream, setting);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PmxMorphVertexOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->vertex_index = ReadIndex(stream, setting->vertex_index_size);
|
||||
stream->read((char*)this->position_offset, sizeof(float) * 3);
|
||||
}
|
||||
|
||||
void PmxMorphUVOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->vertex_index = ReadIndex(stream, setting->vertex_index_size);
|
||||
stream->read((char*)this->uv_offset, sizeof(float) * 4);
|
||||
}
|
||||
|
||||
void PmxMorphBoneOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->bone_index = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*)this->translation, sizeof(float) * 3);
|
||||
stream->read((char*)this->rotation, sizeof(float) * 4);
|
||||
}
|
||||
|
||||
void PmxMorphMaterialOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->material_index = ReadIndex(stream, setting->material_index_size);
|
||||
stream->read((char*) &this->offset_operation, sizeof(uint8_t));
|
||||
stream->read((char*)this->diffuse, sizeof(float) * 4);
|
||||
stream->read((char*)this->specular, sizeof(float) * 3);
|
||||
stream->read((char*) &this->specularity, sizeof(float));
|
||||
stream->read((char*)this->ambient, sizeof(float) * 3);
|
||||
stream->read((char*)this->edge_color, sizeof(float) * 4);
|
||||
stream->read((char*) &this->edge_size, sizeof(float));
|
||||
stream->read((char*)this->texture_argb, sizeof(float) * 4);
|
||||
stream->read((char*)this->sphere_texture_argb, sizeof(float) * 4);
|
||||
stream->read((char*)this->toon_texture_argb, sizeof(float) * 4);
|
||||
}
|
||||
|
||||
void PmxMorphGroupOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->morph_index = ReadIndex(stream, setting->morph_index_size);
|
||||
stream->read((char*) &this->morph_weight, sizeof(float));
|
||||
}
|
||||
|
||||
void PmxMorphFlipOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->morph_index = ReadIndex(stream, setting->morph_index_size);
|
||||
stream->read((char*) &this->morph_value, sizeof(float));
|
||||
}
|
||||
|
||||
void PmxMorphImplusOffset::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->rigid_body_index = ReadIndex(stream, setting->rigidbody_index_size);
|
||||
stream->read((char*) &this->is_local, sizeof(uint8_t));
|
||||
stream->read((char*)this->velocity, sizeof(float) * 3);
|
||||
stream->read((char*)this->angular_torque, sizeof(float) * 3);
|
||||
}
|
||||
|
||||
void PmxMorph::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->morph_name = ReadString(stream, setting->encoding);
|
||||
this->morph_english_name = ReadString(stream, setting->encoding);
|
||||
stream->read((char*) &category, sizeof(MorphCategory));
|
||||
stream->read((char*) &morph_type, sizeof(MorphType));
|
||||
stream->read((char*) &this->offset_count, sizeof(int));
|
||||
switch (this->morph_type)
|
||||
{
|
||||
case MorphType::Group:
|
||||
group_offsets = mmd::make_unique<PmxMorphGroupOffset []>(this->offset_count);
|
||||
for (int i = 0; i < offset_count; i++)
|
||||
{
|
||||
group_offsets[i].Read(stream, setting);
|
||||
}
|
||||
break;
|
||||
case MorphType::Vertex:
|
||||
vertex_offsets = mmd::make_unique<PmxMorphVertexOffset []>(this->offset_count);
|
||||
for (int i = 0; i < offset_count; i++)
|
||||
{
|
||||
vertex_offsets[i].Read(stream, setting);
|
||||
}
|
||||
break;
|
||||
case MorphType::Bone:
|
||||
bone_offsets = mmd::make_unique<PmxMorphBoneOffset []>(this->offset_count);
|
||||
for (int i = 0; i < offset_count; i++)
|
||||
{
|
||||
bone_offsets[i].Read(stream, setting);
|
||||
}
|
||||
break;
|
||||
case MorphType::Matrial:
|
||||
material_offsets = mmd::make_unique<PmxMorphMaterialOffset []>(this->offset_count);
|
||||
for (int i = 0; i < offset_count; i++)
|
||||
{
|
||||
material_offsets[i].Read(stream, setting);
|
||||
}
|
||||
break;
|
||||
case MorphType::UV:
|
||||
case MorphType::AdditionalUV1:
|
||||
case MorphType::AdditionalUV2:
|
||||
case MorphType::AdditionalUV3:
|
||||
case MorphType::AdditionalUV4:
|
||||
uv_offsets = mmd::make_unique<PmxMorphUVOffset []>(this->offset_count);
|
||||
for (int i = 0; i < offset_count; i++)
|
||||
{
|
||||
uv_offsets[i].Read(stream, setting);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw DeadlyImportError("MMD: unknown morth type");
|
||||
}
|
||||
}
|
||||
|
||||
void PmxFrameElement::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
stream->read((char*) &this->element_target, sizeof(uint8_t));
|
||||
if (this->element_target == 0x00)
|
||||
{
|
||||
this->index = ReadIndex(stream, setting->bone_index_size);
|
||||
}
|
||||
else {
|
||||
this->index = ReadIndex(stream, setting->morph_index_size);
|
||||
}
|
||||
}
|
||||
|
||||
void PmxFrame::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->frame_name = ReadString(stream, setting->encoding);
|
||||
this->frame_english_name = ReadString(stream, setting->encoding);
|
||||
stream->read((char*) &this->frame_flag, sizeof(uint8_t));
|
||||
stream->read((char*) &this->element_count, sizeof(int));
|
||||
this->elements = mmd::make_unique<PmxFrameElement []>(this->element_count);
|
||||
for (int i = 0; i < this->element_count; i++)
|
||||
{
|
||||
this->elements[i].Read(stream, setting);
|
||||
}
|
||||
}
|
||||
|
||||
void PmxRigidBody::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->girid_body_name = ReadString(stream, setting->encoding);
|
||||
this->girid_body_english_name = ReadString(stream, setting->encoding);
|
||||
this->target_bone = ReadIndex(stream, setting->bone_index_size);
|
||||
stream->read((char*) &this->group, sizeof(uint8_t));
|
||||
stream->read((char*) &this->mask, sizeof(uint16_t));
|
||||
stream->read((char*) &this->shape, sizeof(uint8_t));
|
||||
stream->read((char*) this->size, sizeof(float) * 3);
|
||||
stream->read((char*) this->position, sizeof(float) * 3);
|
||||
stream->read((char*) this->orientation, sizeof(float) * 3);
|
||||
stream->read((char*) &this->mass, sizeof(float));
|
||||
stream->read((char*) &this->move_attenuation, sizeof(float));
|
||||
stream->read((char*) &this->rotation_attenuation, sizeof(float));
|
||||
stream->read((char*) &this->repulsion, sizeof(float));
|
||||
stream->read((char*) &this->friction, sizeof(float));
|
||||
stream->read((char*) &this->physics_calc_type, sizeof(uint8_t));
|
||||
}
|
||||
|
||||
void PmxJointParam::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->rigid_body1 = ReadIndex(stream, setting->rigidbody_index_size);
|
||||
this->rigid_body2 = ReadIndex(stream, setting->rigidbody_index_size);
|
||||
stream->read((char*) this->position, sizeof(float) * 3);
|
||||
stream->read((char*) this->orientaiton, sizeof(float) * 3);
|
||||
stream->read((char*) this->move_limitation_min, sizeof(float) * 3);
|
||||
stream->read((char*) this->move_limitation_max, sizeof(float) * 3);
|
||||
stream->read((char*) this->rotation_limitation_min, sizeof(float) * 3);
|
||||
stream->read((char*) this->rotation_limitation_max, sizeof(float) * 3);
|
||||
stream->read((char*) this->spring_move_coefficient, sizeof(float) * 3);
|
||||
stream->read((char*) this->spring_rotation_coefficient, sizeof(float) * 3);
|
||||
}
|
||||
|
||||
void PmxJoint::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->joint_name = ReadString(stream, setting->encoding);
|
||||
this->joint_english_name = ReadString(stream, setting->encoding);
|
||||
stream->read((char*) &this->joint_type, sizeof(uint8_t));
|
||||
this->param.Read(stream, setting);
|
||||
}
|
||||
|
||||
void PmxAncherRigidBody::Read(std::istream *stream, PmxSetting *setting)
|
||||
{
|
||||
this->related_rigid_body = ReadIndex(stream, setting->rigidbody_index_size);
|
||||
this->related_vertex = ReadIndex(stream, setting->vertex_index_size);
|
||||
stream->read((char*) &this->is_near, sizeof(uint8_t));
|
||||
}
|
||||
|
||||
void PmxSoftBody::Read(std::istream * /*stream*/, PmxSetting * /*setting*/)
|
||||
{
|
||||
std::cerr << "Not Implemented Exception" << std::endl;
|
||||
throw DeadlyImportError("MMD: Not Implemented Exception");
|
||||
}
|
||||
|
||||
void PmxModel::Init()
|
||||
{
|
||||
this->version = 0.0f;
|
||||
this->model_name.clear();
|
||||
this->model_english_name.clear();
|
||||
this->model_comment.clear();
|
||||
this->model_english_comment.clear();
|
||||
this->vertex_count = 0;
|
||||
this->vertices = nullptr;
|
||||
this->index_count = 0;
|
||||
this->indices = nullptr;
|
||||
this->texture_count = 0;
|
||||
this->textures = nullptr;
|
||||
this->material_count = 0;
|
||||
this->materials = nullptr;
|
||||
this->bone_count = 0;
|
||||
this->bones = nullptr;
|
||||
this->morph_count = 0;
|
||||
this->morphs = nullptr;
|
||||
this->frame_count = 0;
|
||||
this->frames = nullptr;
|
||||
this->rigid_body_count = 0;
|
||||
this->rigid_bodies = nullptr;
|
||||
this->joint_count = 0;
|
||||
this->joints = nullptr;
|
||||
this->soft_body_count = 0;
|
||||
this->soft_bodies = nullptr;
|
||||
}
|
||||
|
||||
void PmxModel::Read(std::istream *stream)
|
||||
{
|
||||
char magic[4];
|
||||
stream->read((char*) magic, sizeof(char) * 4);
|
||||
if (magic[0] != 0x50 || magic[1] != 0x4d || magic[2] != 0x58 || magic[3] != 0x20)
|
||||
{
|
||||
std::cerr << "invalid magic number." << std::endl;
|
||||
throw DeadlyImportError("MMD: invalid magic number.");
|
||||
}
|
||||
stream->read((char*) &version, sizeof(float));
|
||||
if (version != 2.0f && version != 2.1f)
|
||||
{
|
||||
std::cerr << "this is not ver2.0 or ver2.1 but " << version << "." << std::endl;
|
||||
throw DeadlyImportError("MMD: this is not ver2.0 or ver2.1 but " + to_string(version));
|
||||
}
|
||||
this->setting.Read(stream);
|
||||
|
||||
this->model_name = ReadString(stream, setting.encoding);
|
||||
this->model_english_name = ReadString(stream, setting.encoding);
|
||||
this->model_comment = ReadString(stream, setting.encoding);
|
||||
this->model_english_comment = ReadString(stream, setting.encoding);
|
||||
|
||||
// read vertices
|
||||
stream->read((char*) &vertex_count, sizeof(int));
|
||||
this->vertices = mmd::make_unique<PmxVertex []>(vertex_count);
|
||||
for (int i = 0; i < vertex_count; i++)
|
||||
{
|
||||
vertices[i].Read(stream, &setting);
|
||||
}
|
||||
|
||||
// read indices
|
||||
stream->read((char*) &index_count, sizeof(int));
|
||||
this->indices = mmd::make_unique<int []>(index_count);
|
||||
for (int i = 0; i < index_count; i++)
|
||||
{
|
||||
this->indices[i] = ReadIndex(stream, setting.vertex_index_size);
|
||||
}
|
||||
|
||||
// read texture names
|
||||
stream->read((char*) &texture_count, sizeof(int));
|
||||
this->textures = mmd::make_unique<std::string []>(texture_count);
|
||||
for (int i = 0; i < texture_count; i++)
|
||||
{
|
||||
this->textures[i] = ReadString(stream, setting.encoding);
|
||||
}
|
||||
|
||||
// read materials
|
||||
stream->read((char*) &material_count, sizeof(int));
|
||||
this->materials = mmd::make_unique<PmxMaterial []>(material_count);
|
||||
for (int i = 0; i < material_count; i++)
|
||||
{
|
||||
this->materials[i].Read(stream, &setting);
|
||||
}
|
||||
|
||||
// read bones
|
||||
stream->read((char*) &this->bone_count, sizeof(int));
|
||||
this->bones = mmd::make_unique<PmxBone []>(this->bone_count);
|
||||
for (int i = 0; i < this->bone_count; i++)
|
||||
{
|
||||
this->bones[i].Read(stream, &setting);
|
||||
}
|
||||
|
||||
// read morphs
|
||||
stream->read((char*) &this->morph_count, sizeof(int));
|
||||
this->morphs = mmd::make_unique<PmxMorph []>(this->morph_count);
|
||||
for (int i = 0; i < this->morph_count; i++)
|
||||
{
|
||||
this->morphs[i].Read(stream, &setting);
|
||||
}
|
||||
|
||||
// read display frames
|
||||
stream->read((char*) &this->frame_count, sizeof(int));
|
||||
this->frames = mmd::make_unique<PmxFrame []>(this->frame_count);
|
||||
for (int i = 0; i < this->frame_count; i++)
|
||||
{
|
||||
this->frames[i].Read(stream, &setting);
|
||||
}
|
||||
|
||||
// read rigid bodies
|
||||
stream->read((char*) &this->rigid_body_count, sizeof(int));
|
||||
this->rigid_bodies = mmd::make_unique<PmxRigidBody []>(this->rigid_body_count);
|
||||
for (int i = 0; i < this->rigid_body_count; i++)
|
||||
{
|
||||
this->rigid_bodies[i].Read(stream, &setting);
|
||||
}
|
||||
|
||||
// read joints
|
||||
stream->read((char*) &this->joint_count, sizeof(int));
|
||||
this->joints = mmd::make_unique<PmxJoint []>(this->joint_count);
|
||||
for (int i = 0; i < this->joint_count; i++)
|
||||
{
|
||||
this->joints[i].Read(stream, &setting);
|
||||
}
|
||||
}
|
||||
}
|
782
thirdparty/assimp/code/MMD/MMDPmxParser.h
vendored
782
thirdparty/assimp/code/MMD/MMDPmxParser.h
vendored
@ -1,782 +0,0 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, 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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
#include "MMDCpp14.h"
|
||||
|
||||
namespace pmx
|
||||
{
|
||||
class PmxSetting
|
||||
{
|
||||
public:
|
||||
PmxSetting()
|
||||
: encoding(0)
|
||||
, uv(0)
|
||||
, vertex_index_size(0)
|
||||
, texture_index_size(0)
|
||||
, material_index_size(0)
|
||||
, bone_index_size(0)
|
||||
, morph_index_size(0)
|
||||
, rigidbody_index_size(0)
|
||||
{}
|
||||
|
||||
uint8_t encoding;
|
||||
uint8_t uv;
|
||||
uint8_t vertex_index_size;
|
||||
uint8_t texture_index_size;
|
||||
uint8_t material_index_size;
|
||||
uint8_t bone_index_size;
|
||||
uint8_t morph_index_size;
|
||||
uint8_t rigidbody_index_size;
|
||||
void Read(std::istream *stream);
|
||||
};
|
||||
|
||||
enum class PmxVertexSkinningType : uint8_t
|
||||
{
|
||||
BDEF1 = 0,
|
||||
BDEF2 = 1,
|
||||
BDEF4 = 2,
|
||||
SDEF = 3,
|
||||
QDEF = 4,
|
||||
};
|
||||
|
||||
class PmxVertexSkinning
|
||||
{
|
||||
public:
|
||||
virtual void Read(std::istream *stream, PmxSetting *setting) = 0;
|
||||
virtual ~PmxVertexSkinning() {}
|
||||
};
|
||||
|
||||
class PmxVertexSkinningBDEF1 : public PmxVertexSkinning
|
||||
{
|
||||
public:
|
||||
PmxVertexSkinningBDEF1()
|
||||
: bone_index(0)
|
||||
{}
|
||||
|
||||
int bone_index;
|
||||
void Read(std::istream *stresam, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxVertexSkinningBDEF2 : public PmxVertexSkinning
|
||||
{
|
||||
public:
|
||||
PmxVertexSkinningBDEF2()
|
||||
: bone_index1(0)
|
||||
, bone_index2(0)
|
||||
, bone_weight(0.0f)
|
||||
{}
|
||||
|
||||
int bone_index1;
|
||||
int bone_index2;
|
||||
float bone_weight;
|
||||
void Read(std::istream *stresam, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxVertexSkinningBDEF4 : public PmxVertexSkinning
|
||||
{
|
||||
public:
|
||||
PmxVertexSkinningBDEF4()
|
||||
: bone_index1(0)
|
||||
, bone_index2(0)
|
||||
, bone_index3(0)
|
||||
, bone_index4(0)
|
||||
, bone_weight1(0.0f)
|
||||
, bone_weight2(0.0f)
|
||||
, bone_weight3(0.0f)
|
||||
, bone_weight4(0.0f)
|
||||
{}
|
||||
|
||||
int bone_index1;
|
||||
int bone_index2;
|
||||
int bone_index3;
|
||||
int bone_index4;
|
||||
float bone_weight1;
|
||||
float bone_weight2;
|
||||
float bone_weight3;
|
||||
float bone_weight4;
|
||||
void Read(std::istream *stresam, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxVertexSkinningSDEF : public PmxVertexSkinning
|
||||
{
|
||||
public:
|
||||
PmxVertexSkinningSDEF()
|
||||
: bone_index1(0)
|
||||
, bone_index2(0)
|
||||
, bone_weight(0.0f)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
sdef_c[i] = 0.0f;
|
||||
sdef_r0[i] = 0.0f;
|
||||
sdef_r1[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
int bone_index1;
|
||||
int bone_index2;
|
||||
float bone_weight;
|
||||
float sdef_c[3];
|
||||
float sdef_r0[3];
|
||||
float sdef_r1[3];
|
||||
void Read(std::istream *stresam, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxVertexSkinningQDEF : public PmxVertexSkinning
|
||||
{
|
||||
public:
|
||||
PmxVertexSkinningQDEF()
|
||||
: bone_index1(0)
|
||||
, bone_index2(0)
|
||||
, bone_index3(0)
|
||||
, bone_index4(0)
|
||||
, bone_weight1(0.0f)
|
||||
, bone_weight2(0.0f)
|
||||
, bone_weight3(0.0f)
|
||||
, bone_weight4(0.0f)
|
||||
{}
|
||||
|
||||
int bone_index1;
|
||||
int bone_index2;
|
||||
int bone_index3;
|
||||
int bone_index4;
|
||||
float bone_weight1;
|
||||
float bone_weight2;
|
||||
float bone_weight3;
|
||||
float bone_weight4;
|
||||
void Read(std::istream *stresam, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxVertex
|
||||
{
|
||||
public:
|
||||
PmxVertex()
|
||||
: edge(0.0f)
|
||||
{
|
||||
uv[0] = uv[1] = 0.0f;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
position[i] = 0.0f;
|
||||
normal[i] = 0.0f;
|
||||
}
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
for (int k = 0; k < 4; ++k) {
|
||||
uva[i][k] = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float position[3];
|
||||
float normal[3];
|
||||
float uv[2];
|
||||
float uva[4][4];
|
||||
PmxVertexSkinningType skinning_type;
|
||||
std::unique_ptr<PmxVertexSkinning> skinning;
|
||||
float edge;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxMaterial
|
||||
{
|
||||
public:
|
||||
PmxMaterial()
|
||||
: specularlity(0.0f)
|
||||
, flag(0)
|
||||
, edge_size(0.0f)
|
||||
, diffuse_texture_index(0)
|
||||
, sphere_texture_index(0)
|
||||
, sphere_op_mode(0)
|
||||
, common_toon_flag(0)
|
||||
, toon_texture_index(0)
|
||||
, index_count(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
specular[i] = 0.0f;
|
||||
ambient[i] = 0.0f;
|
||||
edge_color[i] = 0.0f;
|
||||
}
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
diffuse[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
std::string material_name;
|
||||
std::string material_english_name;
|
||||
float diffuse[4];
|
||||
float specular[3];
|
||||
float specularlity;
|
||||
float ambient[3];
|
||||
uint8_t flag;
|
||||
float edge_color[4];
|
||||
float edge_size;
|
||||
int diffuse_texture_index;
|
||||
int sphere_texture_index;
|
||||
uint8_t sphere_op_mode;
|
||||
uint8_t common_toon_flag;
|
||||
int toon_texture_index;
|
||||
std::string memo;
|
||||
int index_count;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxIkLink
|
||||
{
|
||||
public:
|
||||
PmxIkLink()
|
||||
: link_target(0)
|
||||
, angle_lock(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
max_radian[i] = 0.0f;
|
||||
min_radian[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
int link_target;
|
||||
uint8_t angle_lock;
|
||||
float max_radian[3];
|
||||
float min_radian[3];
|
||||
void Read(std::istream *stream, PmxSetting *settingn);
|
||||
};
|
||||
|
||||
class PmxBone
|
||||
{
|
||||
public:
|
||||
PmxBone()
|
||||
: parent_index(0)
|
||||
, level(0)
|
||||
, bone_flag(0)
|
||||
, target_index(0)
|
||||
, grant_parent_index(0)
|
||||
, grant_weight(0.0f)
|
||||
, key(0)
|
||||
, ik_target_bone_index(0)
|
||||
, ik_loop(0)
|
||||
, ik_loop_angle_limit(0.0f)
|
||||
, ik_link_count(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
position[i] = 0.0f;
|
||||
offset[i] = 0.0f;
|
||||
lock_axis_orientation[i] = 0.0f;
|
||||
local_axis_x_orientation[i] = 0.0f;
|
||||
local_axis_y_orientation[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
std::string bone_name;
|
||||
std::string bone_english_name;
|
||||
float position[3];
|
||||
int parent_index;
|
||||
int level;
|
||||
uint16_t bone_flag;
|
||||
float offset[3];
|
||||
int target_index;
|
||||
int grant_parent_index;
|
||||
float grant_weight;
|
||||
float lock_axis_orientation[3];
|
||||
float local_axis_x_orientation[3];
|
||||
float local_axis_y_orientation[3];
|
||||
int key;
|
||||
int ik_target_bone_index;
|
||||
int ik_loop;
|
||||
float ik_loop_angle_limit;
|
||||
int ik_link_count;
|
||||
std::unique_ptr<PmxIkLink []> ik_links;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
enum class MorphType : uint8_t
|
||||
{
|
||||
Group = 0,
|
||||
Vertex = 1,
|
||||
Bone = 2,
|
||||
UV = 3,
|
||||
AdditionalUV1 = 4,
|
||||
AdditionalUV2 = 5,
|
||||
AdditionalUV3 = 6,
|
||||
AdditionalUV4 = 7,
|
||||
Matrial = 8,
|
||||
Flip = 9,
|
||||
Implus = 10,
|
||||
};
|
||||
|
||||
enum class MorphCategory : uint8_t
|
||||
{
|
||||
ReservedCategory = 0,
|
||||
Eyebrow = 1,
|
||||
Eye = 2,
|
||||
Mouth = 3,
|
||||
Other = 4,
|
||||
};
|
||||
|
||||
class PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
void virtual Read(std::istream *stream, PmxSetting *setting) = 0;
|
||||
};
|
||||
|
||||
class PmxMorphVertexOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphVertexOffset()
|
||||
: vertex_index(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
position_offset[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
int vertex_index;
|
||||
float position_offset[3];
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorphUVOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphUVOffset()
|
||||
: vertex_index(0)
|
||||
{
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
uv_offset[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
int vertex_index;
|
||||
float uv_offset[4];
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorphBoneOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphBoneOffset()
|
||||
: bone_index(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
translation[i] = 0.0f;
|
||||
}
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
rotation[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
int bone_index;
|
||||
float translation[3];
|
||||
float rotation[4];
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorphMaterialOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphMaterialOffset()
|
||||
: specularity(0.0f)
|
||||
, edge_size(0.0f)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
specular[i] = 0.0f;
|
||||
ambient[i] = 0.0f;
|
||||
}
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
diffuse[i] = 0.0f;
|
||||
edge_color[i] = 0.0f;
|
||||
texture_argb[i] = 0.0f;
|
||||
sphere_texture_argb[i] = 0.0f;
|
||||
toon_texture_argb[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
int material_index;
|
||||
uint8_t offset_operation;
|
||||
float diffuse[4];
|
||||
float specular[3];
|
||||
float specularity;
|
||||
float ambient[3];
|
||||
float edge_color[4];
|
||||
float edge_size;
|
||||
float texture_argb[4];
|
||||
float sphere_texture_argb[4];
|
||||
float toon_texture_argb[4];
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorphGroupOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphGroupOffset()
|
||||
: morph_index(0)
|
||||
, morph_weight(0.0f)
|
||||
{}
|
||||
int morph_index;
|
||||
float morph_weight;
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorphFlipOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphFlipOffset()
|
||||
: morph_index(0)
|
||||
, morph_value(0.0f)
|
||||
{}
|
||||
int morph_index;
|
||||
float morph_value;
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorphImplusOffset : public PmxMorphOffset
|
||||
{
|
||||
public:
|
||||
PmxMorphImplusOffset()
|
||||
: rigid_body_index(0)
|
||||
, is_local(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
velocity[i] = 0.0f;
|
||||
angular_torque[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
int rigid_body_index;
|
||||
uint8_t is_local;
|
||||
float velocity[3];
|
||||
float angular_torque[3];
|
||||
void Read(std::istream *stream, PmxSetting *setting); //override;
|
||||
};
|
||||
|
||||
class PmxMorph
|
||||
{
|
||||
public:
|
||||
PmxMorph()
|
||||
: offset_count(0)
|
||||
{
|
||||
}
|
||||
std::string morph_name;
|
||||
std::string morph_english_name;
|
||||
MorphCategory category;
|
||||
MorphType morph_type;
|
||||
int offset_count;
|
||||
std::unique_ptr<PmxMorphVertexOffset []> vertex_offsets;
|
||||
std::unique_ptr<PmxMorphUVOffset []> uv_offsets;
|
||||
std::unique_ptr<PmxMorphBoneOffset []> bone_offsets;
|
||||
std::unique_ptr<PmxMorphMaterialOffset []> material_offsets;
|
||||
std::unique_ptr<PmxMorphGroupOffset []> group_offsets;
|
||||
std::unique_ptr<PmxMorphFlipOffset []> flip_offsets;
|
||||
std::unique_ptr<PmxMorphImplusOffset []> implus_offsets;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxFrameElement
|
||||
{
|
||||
public:
|
||||
PmxFrameElement()
|
||||
: element_target(0)
|
||||
, index(0)
|
||||
{
|
||||
}
|
||||
uint8_t element_target;
|
||||
int index;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxFrame
|
||||
{
|
||||
public:
|
||||
PmxFrame()
|
||||
: frame_flag(0)
|
||||
, element_count(0)
|
||||
{
|
||||
}
|
||||
std::string frame_name;
|
||||
std::string frame_english_name;
|
||||
uint8_t frame_flag;
|
||||
int element_count;
|
||||
std::unique_ptr<PmxFrameElement []> elements;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxRigidBody
|
||||
{
|
||||
public:
|
||||
PmxRigidBody()
|
||||
: target_bone(0)
|
||||
, group(0)
|
||||
, mask(0)
|
||||
, shape(0)
|
||||
, mass(0.0f)
|
||||
, move_attenuation(0.0f)
|
||||
, rotation_attenuation(0.0f)
|
||||
, repulsion(0.0f)
|
||||
, friction(0.0f)
|
||||
, physics_calc_type(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
size[i] = 0.0f;
|
||||
position[i] = 0.0f;
|
||||
orientation[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
std::string girid_body_name;
|
||||
std::string girid_body_english_name;
|
||||
int target_bone;
|
||||
uint8_t group;
|
||||
uint16_t mask;
|
||||
uint8_t shape;
|
||||
float size[3];
|
||||
float position[3];
|
||||
float orientation[3];
|
||||
float mass;
|
||||
float move_attenuation;
|
||||
float rotation_attenuation;
|
||||
float repulsion;
|
||||
float friction;
|
||||
uint8_t physics_calc_type;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
enum class PmxJointType : uint8_t
|
||||
{
|
||||
Generic6DofSpring = 0,
|
||||
Generic6Dof = 1,
|
||||
Point2Point = 2,
|
||||
ConeTwist = 3,
|
||||
Slider = 5,
|
||||
Hinge = 6
|
||||
};
|
||||
|
||||
class PmxJointParam
|
||||
{
|
||||
public:
|
||||
PmxJointParam()
|
||||
: rigid_body1(0)
|
||||
, rigid_body2(0)
|
||||
{
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
position[i] = 0.0f;
|
||||
orientaiton[i] = 0.0f;
|
||||
move_limitation_min[i] = 0.0f;
|
||||
move_limitation_max[i] = 0.0f;
|
||||
rotation_limitation_min[i] = 0.0f;
|
||||
rotation_limitation_max[i] = 0.0f;
|
||||
spring_move_coefficient[i] = 0.0f;
|
||||
spring_rotation_coefficient[i] = 0.0f;
|
||||
}
|
||||
}
|
||||
int rigid_body1;
|
||||
int rigid_body2;
|
||||
float position[3];
|
||||
float orientaiton[3];
|
||||
float move_limitation_min[3];
|
||||
float move_limitation_max[3];
|
||||
float rotation_limitation_min[3];
|
||||
float rotation_limitation_max[3];
|
||||
float spring_move_coefficient[3];
|
||||
float spring_rotation_coefficient[3];
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxJoint
|
||||
{
|
||||
public:
|
||||
std::string joint_name;
|
||||
std::string joint_english_name;
|
||||
PmxJointType joint_type;
|
||||
PmxJointParam param;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
enum PmxSoftBodyFlag : uint8_t
|
||||
{
|
||||
BLink = 0x01,
|
||||
Cluster = 0x02,
|
||||
Link = 0x04
|
||||
};
|
||||
|
||||
class PmxAncherRigidBody
|
||||
{
|
||||
public:
|
||||
PmxAncherRigidBody()
|
||||
: related_rigid_body(0)
|
||||
, related_vertex(0)
|
||||
, is_near(false)
|
||||
{}
|
||||
int related_rigid_body;
|
||||
int related_vertex;
|
||||
bool is_near;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxSoftBody
|
||||
{
|
||||
public:
|
||||
PmxSoftBody()
|
||||
: shape(0)
|
||||
, target_material(0)
|
||||
, group(0)
|
||||
, mask(0)
|
||||
, blink_distance(0)
|
||||
, cluster_count(0)
|
||||
, mass(0.0)
|
||||
, collisioni_margin(0.0)
|
||||
, aero_model(0)
|
||||
, VCF(0.0f)
|
||||
, DP(0.0f)
|
||||
, DG(0.0f)
|
||||
, LF(0.0f)
|
||||
, PR(0.0f)
|
||||
, VC(0.0f)
|
||||
, DF(0.0f)
|
||||
, MT(0.0f)
|
||||
, CHR(0.0f)
|
||||
, KHR(0.0f)
|
||||
, SHR(0.0f)
|
||||
, AHR(0.0f)
|
||||
, SRHR_CL(0.0f)
|
||||
, SKHR_CL(0.0f)
|
||||
, SSHR_CL(0.0f)
|
||||
, SR_SPLT_CL(0.0f)
|
||||
, SK_SPLT_CL(0.0f)
|
||||
, SS_SPLT_CL(0.0f)
|
||||
, V_IT(0)
|
||||
, P_IT(0)
|
||||
, D_IT(0)
|
||||
, C_IT(0)
|
||||
, LST(0.0f)
|
||||
, AST(0.0f)
|
||||
, VST(0.0f)
|
||||
, anchor_count(0)
|
||||
, pin_vertex_count(0)
|
||||
{}
|
||||
std::string soft_body_name;
|
||||
std::string soft_body_english_name;
|
||||
uint8_t shape;
|
||||
int target_material;
|
||||
uint8_t group;
|
||||
uint16_t mask;
|
||||
PmxSoftBodyFlag flag;
|
||||
int blink_distance;
|
||||
int cluster_count;
|
||||
float mass;
|
||||
float collisioni_margin;
|
||||
int aero_model;
|
||||
float VCF;
|
||||
float DP;
|
||||
float DG;
|
||||
float LF;
|
||||
float PR;
|
||||
float VC;
|
||||
float DF;
|
||||
float MT;
|
||||
float CHR;
|
||||
float KHR;
|
||||
float SHR;
|
||||
float AHR;
|
||||
float SRHR_CL;
|
||||
float SKHR_CL;
|
||||
float SSHR_CL;
|
||||
float SR_SPLT_CL;
|
||||
float SK_SPLT_CL;
|
||||
float SS_SPLT_CL;
|
||||
int V_IT;
|
||||
int P_IT;
|
||||
int D_IT;
|
||||
int C_IT;
|
||||
float LST;
|
||||
float AST;
|
||||
float VST;
|
||||
int anchor_count;
|
||||
std::unique_ptr<PmxAncherRigidBody []> anchers;
|
||||
int pin_vertex_count;
|
||||
std::unique_ptr<int []> pin_vertices;
|
||||
void Read(std::istream *stream, PmxSetting *setting);
|
||||
};
|
||||
|
||||
class PmxModel
|
||||
{
|
||||
public:
|
||||
PmxModel()
|
||||
: version(0.0f)
|
||||
, vertex_count(0)
|
||||
, index_count(0)
|
||||
, texture_count(0)
|
||||
, material_count(0)
|
||||
, bone_count(0)
|
||||
, morph_count(0)
|
||||
, frame_count(0)
|
||||
, rigid_body_count(0)
|
||||
, joint_count(0)
|
||||
, soft_body_count(0)
|
||||
{}
|
||||
|
||||
float version;
|
||||
PmxSetting setting;
|
||||
std::string model_name;
|
||||
std::string model_english_name;
|
||||
std::string model_comment;
|
||||
std::string model_english_comment;
|
||||
int vertex_count;
|
||||
std::unique_ptr<PmxVertex []> vertices;
|
||||
int index_count;
|
||||
std::unique_ptr<int []> indices;
|
||||
int texture_count;
|
||||
std::unique_ptr< std::string []> textures;
|
||||
int material_count;
|
||||
std::unique_ptr<PmxMaterial []> materials;
|
||||
int bone_count;
|
||||
std::unique_ptr<PmxBone []> bones;
|
||||
int morph_count;
|
||||
std::unique_ptr<PmxMorph []> morphs;
|
||||
int frame_count;
|
||||
std::unique_ptr<PmxFrame [] > frames;
|
||||
int rigid_body_count;
|
||||
std::unique_ptr<PmxRigidBody []> rigid_bodies;
|
||||
int joint_count;
|
||||
std::unique_ptr<PmxJoint []> joints;
|
||||
int soft_body_count;
|
||||
std::unique_ptr<PmxSoftBody []> soft_bodies;
|
||||
void Init();
|
||||
void Read(std::istream *stream);
|
||||
//static std::unique_ptr<PmxModel> ReadFromFile(const char *filename);
|
||||
//static std::unique_ptr<PmxModel> ReadFromStream(std::istream *stream);
|
||||
};
|
||||
}
|
376
thirdparty/assimp/code/MMD/MMDVmdParser.h
vendored
376
thirdparty/assimp/code/MMD/MMDVmdParser.h
vendored
@ -1,376 +0,0 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, 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.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <ostream>
|
||||
#include "MMDCpp14.h"
|
||||
|
||||
namespace vmd
|
||||
{
|
||||
class VmdBoneFrame
|
||||
{
|
||||
public:
|
||||
std::string name;
|
||||
int frame;
|
||||
float position[3];
|
||||
float orientation[4];
|
||||
char interpolation[4][4][4];
|
||||
|
||||
void Read(std::istream* stream)
|
||||
{
|
||||
char buffer[15];
|
||||
stream->read((char*) buffer, sizeof(char)*15);
|
||||
name = std::string(buffer);
|
||||
stream->read((char*) &frame, sizeof(int));
|
||||
stream->read((char*) position, sizeof(float)*3);
|
||||
stream->read((char*) orientation, sizeof(float)*4);
|
||||
stream->read((char*) interpolation, sizeof(char) * 4 * 4 * 4);
|
||||
}
|
||||
|
||||
void Write(std::ostream* stream)
|
||||
{
|
||||
stream->write((char*)name.c_str(), sizeof(char) * 15);
|
||||
stream->write((char*)&frame, sizeof(int));
|
||||
stream->write((char*)position, sizeof(float) * 3);
|
||||
stream->write((char*)orientation, sizeof(float) * 4);
|
||||
stream->write((char*)interpolation, sizeof(char) * 4 * 4 * 4);
|
||||
}
|
||||
};
|
||||
|
||||
class VmdFaceFrame
|
||||
{
|
||||
public:
|
||||
std::string face_name;
|
||||
float weight;
|
||||
uint32_t frame;
|
||||
|
||||
void Read(std::istream* stream)
|
||||
{
|
||||
char buffer[15];
|
||||
stream->read((char*) &buffer, sizeof(char) * 15);
|
||||
face_name = std::string(buffer);
|
||||
stream->read((char*) &frame, sizeof(int));
|
||||
stream->read((char*) &weight, sizeof(float));
|
||||
}
|
||||
|
||||
void Write(std::ostream* stream)
|
||||
{
|
||||
stream->write((char*)face_name.c_str(), sizeof(char) * 15);
|
||||
stream->write((char*)&frame, sizeof(int));
|
||||
stream->write((char*)&weight, sizeof(float));
|
||||
}
|
||||
};
|
||||
|
||||
class VmdCameraFrame
|
||||
{
|
||||
public:
|
||||
int frame;
|
||||
float distance;
|
||||
float position[3];
|
||||
float orientation[3];
|
||||
char interpolation[6][4];
|
||||
float angle;
|
||||
char unknown[3];
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
stream->read((char*) &frame, sizeof(int));
|
||||
stream->read((char*) &distance, sizeof(float));
|
||||
stream->read((char*) position, sizeof(float) * 3);
|
||||
stream->read((char*) orientation, sizeof(float) * 3);
|
||||
stream->read((char*) interpolation, sizeof(char) * 24);
|
||||
stream->read((char*) &angle, sizeof(float));
|
||||
stream->read((char*) unknown, sizeof(char) * 3);
|
||||
}
|
||||
|
||||
void Write(std::ostream *stream)
|
||||
{
|
||||
stream->write((char*)&frame, sizeof(int));
|
||||
stream->write((char*)&distance, sizeof(float));
|
||||
stream->write((char*)position, sizeof(float) * 3);
|
||||
stream->write((char*)orientation, sizeof(float) * 3);
|
||||
stream->write((char*)interpolation, sizeof(char) * 24);
|
||||
stream->write((char*)&angle, sizeof(float));
|
||||
stream->write((char*)unknown, sizeof(char) * 3);
|
||||
}
|
||||
};
|
||||
|
||||
class VmdLightFrame
|
||||
{
|
||||
public:
|
||||
int frame;
|
||||
float color[3];
|
||||
float position[3];
|
||||
|
||||
void Read(std::istream* stream)
|
||||
{
|
||||
stream->read((char*) &frame, sizeof(int));
|
||||
stream->read((char*) color, sizeof(float) * 3);
|
||||
stream->read((char*) position, sizeof(float) * 3);
|
||||
}
|
||||
|
||||
void Write(std::ostream* stream)
|
||||
{
|
||||
stream->write((char*)&frame, sizeof(int));
|
||||
stream->write((char*)color, sizeof(float) * 3);
|
||||
stream->write((char*)position, sizeof(float) * 3);
|
||||
}
|
||||
};
|
||||
|
||||
class VmdIkEnable
|
||||
{
|
||||
public:
|
||||
std::string ik_name;
|
||||
bool enable;
|
||||
};
|
||||
|
||||
class VmdIkFrame
|
||||
{
|
||||
public:
|
||||
int frame;
|
||||
bool display;
|
||||
std::vector<VmdIkEnable> ik_enable;
|
||||
|
||||
void Read(std::istream *stream)
|
||||
{
|
||||
char buffer[20];
|
||||
stream->read((char*) &frame, sizeof(int));
|
||||
stream->read((char*) &display, sizeof(uint8_t));
|
||||
int ik_count;
|
||||
stream->read((char*) &ik_count, sizeof(int));
|
||||
ik_enable.resize(ik_count);
|
||||
for (int i = 0; i < ik_count; i++)
|
||||
{
|
||||
stream->read(buffer, 20);
|
||||
ik_enable[i].ik_name = std::string(buffer);
|
||||
stream->read((char*) &ik_enable[i].enable, sizeof(uint8_t));
|
||||
}
|
||||
}
|
||||
|
||||
void Write(std::ostream *stream)
|
||||
{
|
||||
stream->write((char*)&frame, sizeof(int));
|
||||
stream->write((char*)&display, sizeof(uint8_t));
|
||||
int ik_count = static_cast<int>(ik_enable.size());
|
||||
stream->write((char*)&ik_count, sizeof(int));
|
||||
for (int i = 0; i < ik_count; i++)
|
||||
{
|
||||
const VmdIkEnable& ik_enable = this->ik_enable.at(i);
|
||||
stream->write(ik_enable.ik_name.c_str(), 20);
|
||||
stream->write((char*)&ik_enable.enable, sizeof(uint8_t));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class VmdMotion
|
||||
{
|
||||
public:
|
||||
std::string model_name;
|
||||
int version;
|
||||
std::vector<VmdBoneFrame> bone_frames;
|
||||
std::vector<VmdFaceFrame> face_frames;
|
||||
std::vector<VmdCameraFrame> camera_frames;
|
||||
std::vector<VmdLightFrame> light_frames;
|
||||
std::vector<VmdIkFrame> ik_frames;
|
||||
|
||||
static std::unique_ptr<VmdMotion> LoadFromFile(char const *filename)
|
||||
{
|
||||
std::ifstream stream(filename, std::ios::binary);
|
||||
auto result = LoadFromStream(&stream);
|
||||
stream.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
static std::unique_ptr<VmdMotion> LoadFromStream(std::ifstream *stream)
|
||||
{
|
||||
|
||||
char buffer[30];
|
||||
auto result = mmd::make_unique<VmdMotion>();
|
||||
|
||||
// magic and version
|
||||
stream->read((char*) buffer, 30);
|
||||
if (strncmp(buffer, "Vocaloid Motion Data", 20))
|
||||
{
|
||||
std::cerr << "invalid vmd file." << std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
result->version = std::atoi(buffer + 20);
|
||||
|
||||
// name
|
||||
stream->read(buffer, 20);
|
||||
result->model_name = std::string(buffer);
|
||||
|
||||
// bone frames
|
||||
int bone_frame_num;
|
||||
stream->read((char*) &bone_frame_num, sizeof(int));
|
||||
result->bone_frames.resize(bone_frame_num);
|
||||
for (int i = 0; i < bone_frame_num; i++)
|
||||
{
|
||||
result->bone_frames[i].Read(stream);
|
||||
}
|
||||
|
||||
// face frames
|
||||
int face_frame_num;
|
||||
stream->read((char*) &face_frame_num, sizeof(int));
|
||||
result->face_frames.resize(face_frame_num);
|
||||
for (int i = 0; i < face_frame_num; i++)
|
||||
{
|
||||
result->face_frames[i].Read(stream);
|
||||
}
|
||||
|
||||
// camera frames
|
||||
int camera_frame_num;
|
||||
stream->read((char*) &camera_frame_num, sizeof(int));
|
||||
result->camera_frames.resize(camera_frame_num);
|
||||
for (int i = 0; i < camera_frame_num; i++)
|
||||
{
|
||||
result->camera_frames[i].Read(stream);
|
||||
}
|
||||
|
||||
// light frames
|
||||
int light_frame_num;
|
||||
stream->read((char*) &light_frame_num, sizeof(int));
|
||||
result->light_frames.resize(light_frame_num);
|
||||
for (int i = 0; i < light_frame_num; i++)
|
||||
{
|
||||
result->light_frames[i].Read(stream);
|
||||
}
|
||||
|
||||
// unknown2
|
||||
stream->read(buffer, 4);
|
||||
|
||||
// ik frames
|
||||
if (stream->peek() != std::ios::traits_type::eof())
|
||||
{
|
||||
int ik_num;
|
||||
stream->read((char*) &ik_num, sizeof(int));
|
||||
result->ik_frames.resize(ik_num);
|
||||
for (int i = 0; i < ik_num; i++)
|
||||
{
|
||||
result->ik_frames[i].Read(stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (stream->peek() != std::ios::traits_type::eof())
|
||||
{
|
||||
std::cerr << "vmd stream has unknown data." << std::endl;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool SaveToFile(const std::u16string& /*filename*/)
|
||||
{
|
||||
// TODO: How to adapt u16string to string?
|
||||
/*
|
||||
std::ofstream stream(filename.c_str(), std::ios::binary);
|
||||
auto result = SaveToStream(&stream);
|
||||
stream.close();
|
||||
return result;
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SaveToStream(std::ofstream *stream)
|
||||
{
|
||||
std::string magic = "Vocaloid Motion Data 0002\0";
|
||||
magic.resize(30);
|
||||
|
||||
// magic and version
|
||||
stream->write(magic.c_str(), 30);
|
||||
|
||||
// name
|
||||
stream->write(model_name.c_str(), 20);
|
||||
|
||||
// bone frames
|
||||
const int bone_frame_num = static_cast<int>(bone_frames.size());
|
||||
stream->write(reinterpret_cast<const char*>(&bone_frame_num), sizeof(int));
|
||||
for (int i = 0; i < bone_frame_num; i++)
|
||||
{
|
||||
bone_frames[i].Write(stream);
|
||||
}
|
||||
|
||||
// face frames
|
||||
const int face_frame_num = static_cast<int>(face_frames.size());
|
||||
stream->write(reinterpret_cast<const char*>(&face_frame_num), sizeof(int));
|
||||
for (int i = 0; i < face_frame_num; i++)
|
||||
{
|
||||
face_frames[i].Write(stream);
|
||||
}
|
||||
|
||||
// camera frames
|
||||
const int camera_frame_num = static_cast<int>(camera_frames.size());
|
||||
stream->write(reinterpret_cast<const char*>(&camera_frame_num), sizeof(int));
|
||||
for (int i = 0; i < camera_frame_num; i++)
|
||||
{
|
||||
camera_frames[i].Write(stream);
|
||||
}
|
||||
|
||||
// light frames
|
||||
const int light_frame_num = static_cast<int>(light_frames.size());
|
||||
stream->write(reinterpret_cast<const char*>(&light_frame_num), sizeof(int));
|
||||
for (int i = 0; i < light_frame_num; i++)
|
||||
{
|
||||
light_frames[i].Write(stream);
|
||||
}
|
||||
|
||||
// self shadow datas
|
||||
const int self_shadow_num = 0;
|
||||
stream->write(reinterpret_cast<const char*>(&self_shadow_num), sizeof(int));
|
||||
|
||||
// ik frames
|
||||
const int ik_num = static_cast<int>(ik_frames.size());
|
||||
stream->write(reinterpret_cast<const char*>(&ik_num), sizeof(int));
|
||||
for (int i = 0; i < ik_num; i++)
|
||||
{
|
||||
ik_frames[i].Write(stream);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
@ -51,7 +51,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <assimp/types.h>
|
||||
#include <assimp/material.h>
|
||||
#include <assimp/DefaultLogger.hpp>
|
||||
#include <assimp/Macros.h>
|
||||
|
||||
using namespace Assimp;
|
||||
|
||||
@ -545,23 +544,7 @@ aiReturn aiMaterial::AddProperty (const aiString* pInput,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
// We don't want to add the whole buffer .. write a 32 bit length
|
||||
// prefix followed by the zero-terminated UTF8 string.
|
||||
// (HACK) I don't want to break the ABI now, but we definitely
|
||||
// ought to change aiString::mLength to uint32_t one day.
|
||||
if (sizeof(size_t) == 8) {
|
||||
aiString copy = *pInput;
|
||||
uint32_t* s = reinterpret_cast<uint32_t*>(©.length);
|
||||
s[1] = static_cast<uint32_t>(pInput->length);
|
||||
|
||||
return AddBinaryProperty(s+1,
|
||||
static_cast<unsigned int>(pInput->length+1+4),
|
||||
pKey,
|
||||
type,
|
||||
index,
|
||||
aiPTI_String);
|
||||
}
|
||||
ai_assert(sizeof(size_t)==4);
|
||||
ai_assert(sizeof(ai_uint32)==4);
|
||||
return AddBinaryProperty(pInput,
|
||||
static_cast<unsigned int>(pInput->length+1+4),
|
||||
pKey,
|
||||
|
268
thirdparty/assimp/code/PostProcessing/ArmaturePopulate.cpp
vendored
Normal file
268
thirdparty/assimp/code/PostProcessing/ArmaturePopulate.cpp
vendored
Normal file
@ -0,0 +1,268 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#include "ArmaturePopulate.h"
|
||||
|
||||
#include <assimp/BaseImporter.h>
|
||||
#include <assimp/DefaultLogger.hpp>
|
||||
#include <assimp/postprocess.h>
|
||||
#include <assimp/scene.h>
|
||||
#include <iostream>
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
/// The default class constructor.
|
||||
ArmaturePopulate::ArmaturePopulate() : BaseProcess()
|
||||
{}
|
||||
|
||||
/// The class destructor.
|
||||
ArmaturePopulate::~ArmaturePopulate()
|
||||
{}
|
||||
|
||||
bool ArmaturePopulate::IsActive(unsigned int pFlags) const {
|
||||
return (pFlags & aiProcess_PopulateArmatureData) != 0;
|
||||
}
|
||||
|
||||
void ArmaturePopulate::SetupProperties(const Importer *pImp) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
void ArmaturePopulate::Execute(aiScene *out) {
|
||||
|
||||
// Now convert all bone positions to the correct mOffsetMatrix
|
||||
std::vector<aiBone *> bones;
|
||||
std::vector<aiNode *> nodes;
|
||||
std::map<aiBone *, aiNode *> bone_stack;
|
||||
BuildBoneList(out->mRootNode, out->mRootNode, out, bones);
|
||||
BuildNodeList(out->mRootNode, nodes);
|
||||
|
||||
BuildBoneStack(out->mRootNode, out->mRootNode, out, bones, bone_stack, nodes);
|
||||
|
||||
ASSIMP_LOG_DEBUG_F("Bone stack size: ", bone_stack.size());
|
||||
|
||||
for (std::pair<aiBone *, aiNode *> kvp : bone_stack) {
|
||||
aiBone *bone = kvp.first;
|
||||
aiNode *bone_node = kvp.second;
|
||||
ASSIMP_LOG_DEBUG_F("active node lookup: ", bone->mName.C_Str());
|
||||
// lcl transform grab - done in generate_nodes :)
|
||||
|
||||
// bone->mOffsetMatrix = bone_node->mTransformation;
|
||||
aiNode *armature = GetArmatureRoot(bone_node, bones);
|
||||
|
||||
ai_assert(armature);
|
||||
|
||||
// set up bone armature id
|
||||
bone->mArmature = armature;
|
||||
|
||||
// set this bone node to be referenced properly
|
||||
ai_assert(bone_node);
|
||||
bone->mNode = bone_node;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Reprocess all nodes to calculate bone transforms properly based on the REAL
|
||||
* mOffsetMatrix not the local. */
|
||||
/* Before this would use mesh transforms which is wrong for bone transforms */
|
||||
/* Before this would work for simple character skeletons but not complex meshes
|
||||
* with multiple origins */
|
||||
/* Source: sketch fab log cutter fbx */
|
||||
void ArmaturePopulate::BuildBoneList(aiNode *current_node,
|
||||
const aiNode *root_node,
|
||||
const aiScene *scene,
|
||||
std::vector<aiBone *> &bones) {
|
||||
ai_assert(scene);
|
||||
for (unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId) {
|
||||
aiNode *child = current_node->mChildren[nodeId];
|
||||
ai_assert(child);
|
||||
|
||||
// check for bones
|
||||
for (unsigned int meshId = 0; meshId < child->mNumMeshes; ++meshId) {
|
||||
ai_assert(child->mMeshes);
|
||||
unsigned int mesh_index = child->mMeshes[meshId];
|
||||
aiMesh *mesh = scene->mMeshes[mesh_index];
|
||||
ai_assert(mesh);
|
||||
|
||||
for (unsigned int boneId = 0; boneId < mesh->mNumBones; ++boneId) {
|
||||
aiBone *bone = mesh->mBones[boneId];
|
||||
ai_assert(bone);
|
||||
|
||||
// duplicate meshes exist with the same bones sometimes :)
|
||||
// so this must be detected
|
||||
if (std::find(bones.begin(), bones.end(), bone) == bones.end()) {
|
||||
// add the element once
|
||||
bones.push_back(bone);
|
||||
}
|
||||
}
|
||||
|
||||
// find mesh and get bones
|
||||
// then do recursive lookup for bones in root node hierarchy
|
||||
}
|
||||
|
||||
BuildBoneList(child, root_node, scene, bones);
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepare flat node list which can be used for non recursive lookups later */
|
||||
void ArmaturePopulate::BuildNodeList(const aiNode *current_node,
|
||||
std::vector<aiNode *> &nodes) {
|
||||
ai_assert(current_node);
|
||||
|
||||
for (unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId) {
|
||||
aiNode *child = current_node->mChildren[nodeId];
|
||||
ai_assert(child);
|
||||
|
||||
nodes.push_back(child);
|
||||
|
||||
BuildNodeList(child, nodes);
|
||||
}
|
||||
}
|
||||
|
||||
/* A bone stack allows us to have multiple armatures, with the same bone names
|
||||
* A bone stack allows us also to retrieve bones true transform even with
|
||||
* duplicate names :)
|
||||
*/
|
||||
void ArmaturePopulate::BuildBoneStack(aiNode *current_node,
|
||||
const aiNode *root_node,
|
||||
const aiScene *scene,
|
||||
const std::vector<aiBone *> &bones,
|
||||
std::map<aiBone *, aiNode *> &bone_stack,
|
||||
std::vector<aiNode *> &node_stack) {
|
||||
ai_assert(scene);
|
||||
ai_assert(root_node);
|
||||
ai_assert(!node_stack.empty());
|
||||
|
||||
for (aiBone *bone : bones) {
|
||||
ai_assert(bone);
|
||||
aiNode *node = GetNodeFromStack(bone->mName, node_stack);
|
||||
if (node == nullptr) {
|
||||
node_stack.clear();
|
||||
BuildNodeList(root_node, node_stack);
|
||||
ASSIMP_LOG_DEBUG_F("Resetting bone stack: nullptr element ", bone->mName.C_Str());
|
||||
|
||||
node = GetNodeFromStack(bone->mName, node_stack);
|
||||
|
||||
if (!node) {
|
||||
ASSIMP_LOG_ERROR("serious import issue node for bone was not detected");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
ASSIMP_LOG_DEBUG_F("Successfully added bone[", bone->mName.C_Str(), "] to stack and bone node is: ", node->mName.C_Str());
|
||||
|
||||
bone_stack.insert(std::pair<aiBone *, aiNode *>(bone, node));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Returns the armature root node */
|
||||
/* This is required to be detected for a bone initially, it will recurse up
|
||||
* until it cannot find another bone and return the node No known failure
|
||||
* points. (yet)
|
||||
*/
|
||||
aiNode *ArmaturePopulate::GetArmatureRoot(aiNode *bone_node,
|
||||
std::vector<aiBone *> &bone_list) {
|
||||
while (bone_node) {
|
||||
if (!IsBoneNode(bone_node->mName, bone_list)) {
|
||||
ASSIMP_LOG_DEBUG_F("GetArmatureRoot() Found valid armature: ", bone_node->mName.C_Str());
|
||||
return bone_node;
|
||||
}
|
||||
|
||||
bone_node = bone_node->mParent;
|
||||
}
|
||||
|
||||
ASSIMP_LOG_ERROR("GetArmatureRoot() can't find armature!");
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Simple IsBoneNode check if this could be a bone */
|
||||
bool ArmaturePopulate::IsBoneNode(const aiString &bone_name,
|
||||
std::vector<aiBone *> &bones) {
|
||||
for (aiBone *bone : bones) {
|
||||
if (bone->mName == bone_name) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Pop this node by name from the stack if found */
|
||||
/* Used in multiple armature situations with duplicate node / bone names */
|
||||
/* Known flaw: cannot have nodes with bone names, will be fixed in later release
|
||||
*/
|
||||
/* (serious to be fixed) Known flaw: nodes which have more than one bone could
|
||||
* be prematurely dropped from stack */
|
||||
aiNode *ArmaturePopulate::GetNodeFromStack(const aiString &node_name,
|
||||
std::vector<aiNode *> &nodes) {
|
||||
std::vector<aiNode *>::iterator iter;
|
||||
aiNode *found = nullptr;
|
||||
for (iter = nodes.begin(); iter < nodes.end(); ++iter) {
|
||||
aiNode *element = *iter;
|
||||
ai_assert(element);
|
||||
// node valid and node name matches
|
||||
if (element->mName == node_name) {
|
||||
found = element;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found != nullptr) {
|
||||
ASSIMP_LOG_INFO_F("Removed node from stack: ", found->mName.C_Str());
|
||||
// now pop the element from the node list
|
||||
nodes.erase(iter);
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
// unique names can cause this problem
|
||||
ASSIMP_LOG_ERROR("[Serious] GetNodeFromStack() can't find node from stack!");
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} // Namespace Assimp
|
112
thirdparty/assimp/code/PostProcessing/ArmaturePopulate.h
vendored
Normal file
112
thirdparty/assimp/code/PostProcessing/ArmaturePopulate.h
vendored
Normal file
@ -0,0 +1,112 @@
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
with or without modification, are permitted provided that the
|
||||
following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
* Neither the name of the assimp team, nor the names of its
|
||||
contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior
|
||||
written permission of the assimp team.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef ARMATURE_POPULATE_H_
|
||||
#define ARMATURE_POPULATE_H_
|
||||
|
||||
#include "Common/BaseProcess.h"
|
||||
#include <assimp/BaseImporter.h>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
|
||||
struct aiNode;
|
||||
struct aiBone;
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
/** Armature Populate: This is a post process designed
|
||||
* To save you time when importing models into your game engines
|
||||
* This was originally designed only for fbx but will work with other formats
|
||||
* it is intended to auto populate aiBone data with armature and the aiNode
|
||||
* This is very useful when dealing with skinned meshes
|
||||
* or when dealing with many different skeletons
|
||||
* It's off by default but recommend that you try it and use it
|
||||
* It should reduce down any glue code you have in your
|
||||
* importers
|
||||
* You can contact RevoluPowered <gordon@gordonite.tech>
|
||||
* For more info about this
|
||||
*/
|
||||
class ASSIMP_API ArmaturePopulate : public BaseProcess {
|
||||
public:
|
||||
/// The default class constructor.
|
||||
ArmaturePopulate();
|
||||
|
||||
/// The class destructor.
|
||||
virtual ~ArmaturePopulate();
|
||||
|
||||
/// Overwritten, @see BaseProcess
|
||||
virtual bool IsActive( unsigned int pFlags ) const;
|
||||
|
||||
/// Overwritten, @see BaseProcess
|
||||
virtual void SetupProperties( const Importer* pImp );
|
||||
|
||||
/// Overwritten, @see BaseProcess
|
||||
virtual void Execute( aiScene* pScene );
|
||||
|
||||
static aiNode *GetArmatureRoot(aiNode *bone_node,
|
||||
std::vector<aiBone *> &bone_list);
|
||||
|
||||
static bool IsBoneNode(const aiString &bone_name,
|
||||
std::vector<aiBone *> &bones);
|
||||
|
||||
static aiNode *GetNodeFromStack(const aiString &node_name,
|
||||
std::vector<aiNode *> &nodes);
|
||||
|
||||
static void BuildNodeList(const aiNode *current_node,
|
||||
std::vector<aiNode *> &nodes);
|
||||
|
||||
static void BuildBoneList(aiNode *current_node, const aiNode *root_node,
|
||||
const aiScene *scene,
|
||||
std::vector<aiBone *> &bones);
|
||||
|
||||
static void BuildBoneStack(aiNode *current_node, const aiNode *root_node,
|
||||
const aiScene *scene,
|
||||
const std::vector<aiBone *> &bones,
|
||||
std::map<aiBone *, aiNode *> &bone_stack,
|
||||
std::vector<aiNode *> &node_stack);
|
||||
};
|
||||
|
||||
} // Namespace Assimp
|
||||
|
||||
|
||||
#endif // SCALE_PROCESS_H_
|
@ -354,12 +354,12 @@ void ComputeUVMappingProcess::ComputePlaneMapping(aiMesh* mesh,const aiVector3D&
|
||||
}
|
||||
else if (axis * base_axis_z >= angle_epsilon) {
|
||||
FindMeshCenter(mesh, center, min, max);
|
||||
diffu = max.y - min.y;
|
||||
diffv = max.z - min.z;
|
||||
diffu = max.x - min.x;
|
||||
diffv = max.y - min.y;
|
||||
|
||||
for (unsigned int pnt = 0; pnt < mesh->mNumVertices;++pnt) {
|
||||
const aiVector3D& pos = mesh->mVertices[pnt];
|
||||
out[pnt].Set((pos.y - min.y) / diffu,(pos.x - min.x) / diffv,0.0);
|
||||
out[pnt].Set((pos.x - min.x) / diffu,(pos.y - min.y) / diffv,0.0);
|
||||
}
|
||||
}
|
||||
// slower code path in case the mapping axis is not one of the coordinate system axes
|
||||
|
@ -52,7 +52,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "FindInvalidDataProcess.h"
|
||||
#include "ProcessHelper.h"
|
||||
|
||||
#include <assimp/Macros.h>
|
||||
#include <assimp/Exceptional.h>
|
||||
#include <assimp/qnan.h>
|
||||
|
||||
|
@ -538,13 +538,17 @@ void ValidateDSProcess::Validate( const aiAnimation* pAnimation)
|
||||
{
|
||||
Validate(&pAnimation->mName);
|
||||
|
||||
// validate all materials
|
||||
if (pAnimation->mNumChannels)
|
||||
// validate all animations
|
||||
if (pAnimation->mNumChannels || pAnimation->mNumMorphMeshChannels)
|
||||
{
|
||||
if (!pAnimation->mChannels) {
|
||||
if (!pAnimation->mChannels && pAnimation->mNumChannels) {
|
||||
ReportError("aiAnimation::mChannels is NULL (aiAnimation::mNumChannels is %i)",
|
||||
pAnimation->mNumChannels);
|
||||
}
|
||||
if (!pAnimation->mMorphMeshChannels && pAnimation->mNumMorphMeshChannels) {
|
||||
ReportError("aiAnimation::mMorphMeshChannels is NULL (aiAnimation::mNumMorphMeshChannels is %i)",
|
||||
pAnimation->mNumMorphMeshChannels);
|
||||
}
|
||||
for (unsigned int i = 0; i < pAnimation->mNumChannels;++i)
|
||||
{
|
||||
if (!pAnimation->mChannels[i])
|
||||
@ -554,6 +558,15 @@ void ValidateDSProcess::Validate( const aiAnimation* pAnimation)
|
||||
}
|
||||
Validate(pAnimation, pAnimation->mChannels[i]);
|
||||
}
|
||||
for (unsigned int i = 0; i < pAnimation->mNumMorphMeshChannels;++i)
|
||||
{
|
||||
if (!pAnimation->mMorphMeshChannels[i])
|
||||
{
|
||||
ReportError("aiAnimation::mMorphMeshChannels[%i] is NULL (aiAnimation::mNumMorphMeshChannels is %i)",
|
||||
i, pAnimation->mNumMorphMeshChannels);
|
||||
}
|
||||
Validate(pAnimation, pAnimation->mMorphMeshChannels[i]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ReportError("aiAnimation::mNumChannels is 0. At least one node animation channel must be there.");
|
||||
@ -903,6 +916,48 @@ void ValidateDSProcess::Validate( const aiAnimation* pAnimation,
|
||||
}
|
||||
}
|
||||
|
||||
void ValidateDSProcess::Validate( const aiAnimation* pAnimation,
|
||||
const aiMeshMorphAnim* pMeshMorphAnim)
|
||||
{
|
||||
Validate(&pMeshMorphAnim->mName);
|
||||
|
||||
if (!pMeshMorphAnim->mNumKeys) {
|
||||
ReportError("Empty mesh morph animation channel");
|
||||
}
|
||||
|
||||
// otherwise check whether one of the keys exceeds the total duration of the animation
|
||||
if (pMeshMorphAnim->mNumKeys)
|
||||
{
|
||||
if (!pMeshMorphAnim->mKeys)
|
||||
{
|
||||
ReportError("aiMeshMorphAnim::mKeys is NULL (aiMeshMorphAnim::mNumKeys is %i)",
|
||||
pMeshMorphAnim->mNumKeys);
|
||||
}
|
||||
double dLast = -10e10;
|
||||
for (unsigned int i = 0; i < pMeshMorphAnim->mNumKeys;++i)
|
||||
{
|
||||
// ScenePreprocessor will compute the duration if still the default value
|
||||
// (Aramis) Add small epsilon, comparison tended to fail if max_time == duration,
|
||||
// seems to be due the compilers register usage/width.
|
||||
if (pAnimation->mDuration > 0. && pMeshMorphAnim->mKeys[i].mTime > pAnimation->mDuration+0.001)
|
||||
{
|
||||
ReportError("aiMeshMorphAnim::mKeys[%i].mTime (%.5f) is larger "
|
||||
"than aiAnimation::mDuration (which is %.5f)",i,
|
||||
(float)pMeshMorphAnim->mKeys[i].mTime,
|
||||
(float)pAnimation->mDuration);
|
||||
}
|
||||
if (i && pMeshMorphAnim->mKeys[i].mTime <= dLast)
|
||||
{
|
||||
ReportWarning("aiMeshMorphAnim::mKeys[%i].mTime (%.5f) is smaller "
|
||||
"than aiMeshMorphAnim::mKeys[%i] (which is %.5f)",i,
|
||||
(float)pMeshMorphAnim->mKeys[i].mTime,
|
||||
i-1, (float)dLast);
|
||||
}
|
||||
dLast = pMeshMorphAnim->mKeys[i].mTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
void ValidateDSProcess::Validate( const aiNode* pNode)
|
||||
{
|
||||
@ -958,7 +1013,7 @@ void ValidateDSProcess::Validate( const aiString* pString)
|
||||
{
|
||||
if (pString->length > MAXLEN)
|
||||
{
|
||||
ReportError("aiString::length is too large (%lu, maximum is %lu)",
|
||||
ReportError("aiString::length is too large (%u, maximum is %lu)",
|
||||
pString->length,MAXLEN);
|
||||
}
|
||||
const char* sz = pString->data;
|
||||
|
@ -55,6 +55,7 @@ struct aiBone;
|
||||
struct aiMesh;
|
||||
struct aiAnimation;
|
||||
struct aiNodeAnim;
|
||||
struct aiMeshMorphAnim;
|
||||
struct aiTexture;
|
||||
struct aiMaterial;
|
||||
struct aiNode;
|
||||
@ -150,6 +151,13 @@ protected:
|
||||
void Validate( const aiAnimation* pAnimation,
|
||||
const aiNodeAnim* pBoneAnim);
|
||||
|
||||
/** Validates a mesh morph animation channel.
|
||||
* @param pAnimation Input animation.
|
||||
* @param pMeshMorphAnim Mesh morph animation channel.
|
||||
* */
|
||||
void Validate( const aiAnimation* pAnimation,
|
||||
const aiMeshMorphAnim* pMeshMorphAnim);
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
/** Validates a node and all of its subnodes
|
||||
* @param Node Input node*/
|
||||
|
23
thirdparty/assimp/code/revision.h
vendored
23
thirdparty/assimp/code/revision.h
vendored
@ -1,7 +1,28 @@
|
||||
#ifndef ASSIMP_REVISION_H_INC
|
||||
#define ASSIMP_REVISION_H_INC
|
||||
|
||||
#define GitVersion 0x00000000
|
||||
#define GitVersion 0x308db73d
|
||||
#define GitBranch "master"
|
||||
|
||||
#define VER_MAJOR 5
|
||||
#define VER_MINOR 0
|
||||
#define VER_PATCH 0
|
||||
#define VER_BUILD 0
|
||||
|
||||
#define STR_HELP(x) #x
|
||||
#define STR(x) STR_HELP(x)
|
||||
|
||||
#define VER_FILEVERSION VER_MAJOR,VER_MINOR,VER_PATCH,VER_BUILD
|
||||
#if (GitVersion == 0)
|
||||
#define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD)
|
||||
#else
|
||||
#define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) " (Commit 308db73d)"
|
||||
#endif
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define VER_ORIGINAL_FILENAME_STR "assimp.dll"
|
||||
#else
|
||||
#define VER_ORIGINAL_FILENAME_STR "assimp.dll"
|
||||
#endif // NDEBUG
|
||||
|
||||
#endif // ASSIMP_REVISION_H_INC
|
||||
|
8
thirdparty/assimp/include/assimp/.editorconfig
vendored
Normal file
8
thirdparty/assimp/include/assimp/.editorconfig
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# See <http://EditorConfig.org> for details
|
||||
|
||||
[*.{h,hpp,inl}]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
indent_size = 4
|
||||
indent_style = space
|
20
thirdparty/assimp/include/assimp/BaseImporter.h
vendored
20
thirdparty/assimp/include/assimp/BaseImporter.h
vendored
@ -41,9 +41,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/** @file Definition of the base class for all importer worker classes. */
|
||||
#pragma once
|
||||
#ifndef INCLUDED_AI_BASEIMPORTER_H
|
||||
#define INCLUDED_AI_BASEIMPORTER_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include "Exceptional.h"
|
||||
|
||||
#include <vector>
|
||||
@ -191,16 +196,13 @@ public:
|
||||
/**
|
||||
* Assimp Importer
|
||||
* unit conversions available
|
||||
* if you need another measurment unit add it below.
|
||||
* it's currently defined in assimp that we prefer meters.
|
||||
* NOTE: Valid options are initialised in the
|
||||
* constructor in the implementation file to
|
||||
* work around a VS2013 compiler bug if support
|
||||
* for that compiler is dropped in the future
|
||||
* initialisation can be moved back here
|
||||
* */
|
||||
std::map<ImporterUnits, double> importerUnits = {
|
||||
{ImporterUnits::M, 1},
|
||||
{ImporterUnits::CM, 0.01},
|
||||
{ImporterUnits::MM, 0.001},
|
||||
{ImporterUnits::INCHES, 0.0254},
|
||||
{ImporterUnits::FEET, 0.3048}
|
||||
};
|
||||
std::map<ImporterUnits, double> importerUnits;
|
||||
|
||||
virtual void SetApplicationUnits( const ImporterUnits& unit )
|
||||
{
|
||||
|
6
thirdparty/assimp/include/assimp/Bitmap.h
vendored
6
thirdparty/assimp/include/assimp/Bitmap.h
vendored
@ -46,10 +46,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Used for file formats which embed their textures into the model file.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_BITMAP_H_INC
|
||||
#define AI_BITMAP_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
#include <stdint.h>
|
||||
#include <cstddef>
|
||||
|
@ -42,9 +42,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
/** @file Helper class tp perform various byte oder swappings
|
||||
(e.g. little to big endian) */
|
||||
#pragma once
|
||||
#ifndef AI_BYTESWAPPER_H_INC
|
||||
#define AI_BYTESWAPPER_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/ai_assert.h>
|
||||
#include <assimp/types.h>
|
||||
#include <stdint.h>
|
||||
|
@ -43,16 +43,26 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file CreateAnimMesh.h
|
||||
* Create AnimMesh from Mesh
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef INCLUDED_AI_CREATE_ANIM_MESH_H
|
||||
#define INCLUDED_AI_CREATE_ANIM_MESH_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/mesh.h>
|
||||
|
||||
namespace Assimp {
|
||||
namespace Assimp {
|
||||
|
||||
/** Create aiAnimMesh from aiMesh. */
|
||||
/**
|
||||
* Create aiAnimMesh from aiMesh.
|
||||
* @param mesh The input mesh to create an animated mesh from.
|
||||
* @return The new created animated mesh.
|
||||
*/
|
||||
ASSIMP_API aiAnimMesh *aiCreateAnimMesh(const aiMesh *mesh);
|
||||
|
||||
} // end of namespace Assimp
|
||||
|
||||
#endif // INCLUDED_AI_CREATE_ANIM_MESH_H
|
||||
|
||||
|
@ -41,15 +41,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/** @file Default file I/O using fXXX()-family of functions */
|
||||
#pragma once
|
||||
#ifndef AI_DEFAULTIOSTREAM_H_INC
|
||||
#define AI_DEFAULTIOSTREAM_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assimp/IOStream.hpp>
|
||||
#include <assimp/importerdesc.h>
|
||||
#include <assimp/Defines.h>
|
||||
|
||||
namespace Assimp {
|
||||
namespace Assimp {
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
//! @class DefaultIOStream
|
||||
@ -57,8 +62,7 @@ namespace Assimp {
|
||||
//! @note An instance of this class can exist without a valid file handle
|
||||
//! attached to it. All calls fail, but the instance can nevertheless be
|
||||
//! used with no restrictions.
|
||||
class ASSIMP_API DefaultIOStream : public IOStream
|
||||
{
|
||||
class ASSIMP_API DefaultIOStream : public IOStream {
|
||||
friend class DefaultIOSystem;
|
||||
#if __ANDROID__
|
||||
# if __ANDROID_API__ > 9
|
||||
@ -82,7 +86,6 @@ public:
|
||||
size_t pSize,
|
||||
size_t pCount);
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
/// Write to stream
|
||||
size_t Write(const void* pvBuffer,
|
||||
@ -107,16 +110,13 @@ public:
|
||||
void Flush();
|
||||
|
||||
private:
|
||||
// File data-structure, using clib
|
||||
FILE* mFile;
|
||||
// Filename
|
||||
std::string mFilename;
|
||||
// Cached file size
|
||||
mutable size_t mCachedSize;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
DefaultIOStream::DefaultIOStream() AI_NO_EXCEPT
|
||||
: mFile(nullptr)
|
||||
, mFilename("")
|
||||
@ -125,7 +125,7 @@ DefaultIOStream::DefaultIOStream() AI_NO_EXCEPT
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
DefaultIOStream::DefaultIOStream (FILE* pFile, const std::string &strFilename)
|
||||
: mFile(pFile)
|
||||
, mFilename(strFilename)
|
||||
@ -137,4 +137,3 @@ DefaultIOStream::DefaultIOStream (FILE* pFile, const std::string &strFilename)
|
||||
} // ns assimp
|
||||
|
||||
#endif //!!AI_DEFAULTIOSTREAM_H_INC
|
||||
|
||||
|
@ -41,9 +41,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/** @file Default implementation of IOSystem using the standard C file functions */
|
||||
#pragma once
|
||||
#ifndef AI_DEFAULTIOSYSTEM_H_INC
|
||||
#define AI_DEFAULTIOSYSTEM_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/IOSystem.hpp>
|
||||
|
||||
namespace Assimp {
|
||||
|
9
thirdparty/assimp/include/assimp/Defines.h
vendored
9
thirdparty/assimp/include/assimp/Defines.h
vendored
@ -38,6 +38,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_DEFINES_H_INC
|
||||
#define AI_DEFINES_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
// We need those constants, workaround for any platforms where nobody defined them yet
|
||||
#if (!defined SIZE_MAX)
|
||||
# define SIZE_MAX (~((size_t)0))
|
||||
@ -47,3 +55,4 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
# define UINT_MAX (~((unsigned int)0))
|
||||
#endif
|
||||
|
||||
#endif // AI_DEINES_H_INC
|
||||
|
23
thirdparty/assimp/include/assimp/Exceptional.h
vendored
23
thirdparty/assimp/include/assimp/Exceptional.h
vendored
@ -38,11 +38,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef INCLUDED_EXCEPTIONAL_H
|
||||
#define INCLUDED_EXCEPTIONAL_H
|
||||
#pragma once
|
||||
#ifndef AI_INCLUDED_EXCEPTIONAL_H
|
||||
#define AI_INCLUDED_EXCEPTIONAL_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <stdexcept>
|
||||
#include <assimp/DefaultIOStream.h>
|
||||
|
||||
using std::runtime_error;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
@ -53,17 +59,14 @@ using std::runtime_error;
|
||||
/** FOR IMPORTER PLUGINS ONLY: Simple exception class to be thrown if an
|
||||
* unrecoverable error occurs while importing. Loading APIs return
|
||||
* NULL instead of a valid aiScene then. */
|
||||
class DeadlyImportError
|
||||
: public runtime_error
|
||||
{
|
||||
class DeadlyImportError : public runtime_error {
|
||||
public:
|
||||
/** Constructor with arguments */
|
||||
explicit DeadlyImportError( const std::string& errorText)
|
||||
: runtime_error(errorText)
|
||||
{
|
||||
: runtime_error(errorText) {
|
||||
// empty
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
typedef DeadlyImportError DeadlyExportError;
|
||||
@ -84,7 +87,7 @@ struct ExceptionSwallower {
|
||||
template <typename T>
|
||||
struct ExceptionSwallower<T*> {
|
||||
T* operator ()() const {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
@ -122,4 +125,4 @@ struct ExceptionSwallower<void> {
|
||||
}\
|
||||
}
|
||||
|
||||
#endif // INCLUDED_EXCEPTIONAL_H
|
||||
#endif // AI_INCLUDED_EXCEPTIONAL_H
|
||||
|
@ -48,6 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_EXPORT_HPP_INC
|
||||
#define AI_EXPORT_HPP_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||
|
||||
#include "cexport.h"
|
||||
|
@ -40,12 +40,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_GENERIC_PROPERTY_H_INCLUDED
|
||||
#define AI_GENERIC_PROPERTY_H_INCLUDED
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/Importer.hpp>
|
||||
#include <assimp/ai_assert.h>
|
||||
#include "Hash.h"
|
||||
#include <assimp/Hash.h>
|
||||
|
||||
#include <map>
|
||||
|
||||
|
6
thirdparty/assimp/include/assimp/Hash.h
vendored
6
thirdparty/assimp/include/assimp/Hash.h
vendored
@ -39,10 +39,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_HASH_H_INCLUDED
|
||||
#define AI_HASH_H_INCLUDED
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
|
12
thirdparty/assimp/include/assimp/IOStream.hpp
vendored
12
thirdparty/assimp/include/assimp/IOStream.hpp
vendored
@ -48,14 +48,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_IOSTREAM_H_INC
|
||||
#define AI_IOSTREAM_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
|
||||
#ifndef __cplusplus
|
||||
# error This header requires C++ to be used. aiFileIO.h is the \
|
||||
corresponding C interface.
|
||||
#endif
|
||||
|
||||
namespace Assimp {
|
||||
namespace Assimp {
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
/** @brief CPP-API: Class to handle file I/O for C++
|
||||
@ -125,13 +129,13 @@ public:
|
||||
}; //! class IOStream
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
IOStream::IOStream() AI_NO_EXCEPT {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
IOStream::~IOStream() {
|
||||
// empty
|
||||
}
|
||||
|
@ -1,5 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
Open Asset Import Library (assimp)
|
||||
----------------------------------------------------------------------
|
||||
@ -42,10 +40,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_IOSTREAMBUFFER_H_INC
|
||||
#define AI_IOSTREAMBUFFER_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
#include <assimp/IOStream.hpp>
|
||||
|
||||
#include "ParsingUtils.h"
|
||||
#include <assimp/ParsingUtils.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
@ -124,7 +129,7 @@ private:
|
||||
};
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
IOStreamBuffer<T>::IOStreamBuffer( size_t cache )
|
||||
: m_stream( nullptr )
|
||||
, m_filesize( 0 )
|
||||
@ -138,13 +143,13 @@ IOStreamBuffer<T>::IOStreamBuffer( size_t cache )
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
IOStreamBuffer<T>::~IOStreamBuffer() {
|
||||
// empty
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool IOStreamBuffer<T>::open( IOStream *stream ) {
|
||||
// file still opened!
|
||||
if ( nullptr != m_stream ) {
|
||||
@ -174,7 +179,7 @@ bool IOStreamBuffer<T>::open( IOStream *stream ) {
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool IOStreamBuffer<T>::close() {
|
||||
if ( nullptr == m_stream ) {
|
||||
return false;
|
||||
@ -192,19 +197,19 @@ bool IOStreamBuffer<T>::close() {
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
size_t IOStreamBuffer<T>::size() const {
|
||||
return m_filesize;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
size_t IOStreamBuffer<T>::cacheSize() const {
|
||||
return m_cacheSize;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool IOStreamBuffer<T>::readNextBlock() {
|
||||
m_stream->Seek( m_filePos, aiOrigin_SET );
|
||||
size_t readLen = m_stream->Read( &m_cache[ 0 ], sizeof( T ), m_cacheSize );
|
||||
@ -222,25 +227,25 @@ bool IOStreamBuffer<T>::readNextBlock() {
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
size_t IOStreamBuffer<T>::getNumBlocks() const {
|
||||
return m_numBlocks;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
size_t IOStreamBuffer<T>::getCurrentBlockIndex() const {
|
||||
return m_blockIdx;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
size_t IOStreamBuffer<T>::getFilePos() const {
|
||||
return m_filePos;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool IOStreamBuffer<T>::getNextDataLine( std::vector<T> &buffer, T continuationToken ) {
|
||||
buffer.resize( m_cacheSize );
|
||||
if ( m_cachePos >= m_cacheSize || 0 == m_filePos ) {
|
||||
@ -289,13 +294,13 @@ bool IOStreamBuffer<T>::getNextDataLine( std::vector<T> &buffer, T continuationT
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline
|
||||
static AI_FORCE_INLINE
|
||||
bool isEndOfCache( size_t pos, size_t cacheSize ) {
|
||||
return ( pos == cacheSize );
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool IOStreamBuffer<T>::getNextLine(std::vector<T> &buffer) {
|
||||
buffer.resize(m_cacheSize);
|
||||
if ( isEndOfCache( m_cachePos, m_cacheSize ) || 0 == m_filePos) {
|
||||
@ -335,7 +340,7 @@ bool IOStreamBuffer<T>::getNextLine(std::vector<T> &buffer) {
|
||||
}
|
||||
|
||||
template<class T>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool IOStreamBuffer<T>::getNextBlock( std::vector<T> &buffer) {
|
||||
// Return the last block-value if getNextLine was used before
|
||||
if ( 0 != m_cachePos ) {
|
||||
@ -353,3 +358,5 @@ bool IOStreamBuffer<T>::getNextBlock( std::vector<T> &buffer) {
|
||||
}
|
||||
|
||||
} // !ns Assimp
|
||||
|
||||
#endif // AI_IOSTREAMBUFFER_H_INC
|
||||
|
@ -50,6 +50,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_IOSYSTEM_H_INC
|
||||
#define AI_IOSYSTEM_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef __cplusplus
|
||||
# error This header requires C++ to be used. aiFileIO.h is the \
|
||||
corresponding C interface.
|
||||
|
@ -48,6 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_ASSIMP_HPP_INC
|
||||
#define AI_ASSIMP_HPP_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef __cplusplus
|
||||
# error This header requires C++ to be used. Use assimp.h for plain C.
|
||||
#endif // __cplusplus
|
||||
|
36
thirdparty/assimp/include/assimp/LineSplitter.h
vendored
36
thirdparty/assimp/include/assimp/LineSplitter.h
vendored
@ -48,9 +48,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef INCLUDED_LINE_SPLITTER_H
|
||||
#define INCLUDED_LINE_SPLITTER_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <stdexcept>
|
||||
#include "StreamReader.h"
|
||||
#include "ParsingUtils.h"
|
||||
#include <assimp/StreamReader.h>
|
||||
#include <assimp/ParsingUtils.h>
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
@ -140,7 +144,7 @@ private:
|
||||
bool mSwallow, mSkip_empty_lines, mTrim;
|
||||
};
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_empty_lines, bool trim )
|
||||
: mIdx(0)
|
||||
, mCur()
|
||||
@ -153,12 +157,12 @@ LineSplitter::LineSplitter(StreamReaderLE& stream, bool skip_empty_lines, bool t
|
||||
mIdx = 0;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter::~LineSplitter() {
|
||||
// empty
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter& LineSplitter::operator++() {
|
||||
if (mSwallow) {
|
||||
mSwallow = false;
|
||||
@ -199,12 +203,12 @@ LineSplitter& LineSplitter::operator++() {
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter &LineSplitter::operator++(int) {
|
||||
return ++(*this);
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
const char *LineSplitter::operator[] (size_t idx) const {
|
||||
const char* s = operator->()->c_str();
|
||||
|
||||
@ -222,7 +226,7 @@ const char *LineSplitter::operator[] (size_t idx) const {
|
||||
}
|
||||
|
||||
template <size_t N>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
void LineSplitter::get_tokens(const char* (&tokens)[N]) const {
|
||||
const char* s = operator->()->c_str();
|
||||
|
||||
@ -238,44 +242,44 @@ void LineSplitter::get_tokens(const char* (&tokens)[N]) const {
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
const std::string* LineSplitter::operator -> () const {
|
||||
return &mCur;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
std::string LineSplitter::operator* () const {
|
||||
return mCur;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter::operator bool() const {
|
||||
return mStream.GetRemainingSize() > 0;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter::operator line_idx() const {
|
||||
return mIdx;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
LineSplitter::line_idx LineSplitter::get_index() const {
|
||||
return mIdx;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
StreamReaderLE &LineSplitter::get_stream() {
|
||||
return mStream;
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
bool LineSplitter::match_start(const char* check) {
|
||||
const size_t len = ::strlen(check);
|
||||
|
||||
return len <= mCur.length() && std::equal(check, check + len, mCur.begin());
|
||||
}
|
||||
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
void LineSplitter::swallow_next_increment() {
|
||||
mSwallow = true;
|
||||
}
|
||||
|
5
thirdparty/assimp/include/assimp/LogAux.h
vendored
5
thirdparty/assimp/include/assimp/LogAux.h
vendored
@ -43,9 +43,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file LogAux.h
|
||||
* @brief Common logging usage patterns for importer implementations
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef INCLUDED_AI_LOGAUX_H
|
||||
#define INCLUDED_AI_LOGAUX_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/TinyFormatter.h>
|
||||
#include <assimp/Exceptional.h>
|
||||
#include <assimp/DefaultLogger.hpp>
|
||||
|
49
thirdparty/assimp/include/assimp/Macros.h
vendored
49
thirdparty/assimp/include/assimp/Macros.h
vendored
@ -1,49 +0,0 @@
|
||||
/*
|
||||
---------------------------------------------------------------------------
|
||||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2019, 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.
|
||||
---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* Helper macro to set a pointer to NULL in debug builds
|
||||
*/
|
||||
#if (defined ASSIMP_BUILD_DEBUG)
|
||||
# define AI_DEBUG_INVALIDATE_PTR(x) x = NULL;
|
||||
#else
|
||||
# define AI_DEBUG_INVALIDATE_PTR(x)
|
||||
#endif
|
||||
|
@ -41,6 +41,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
/** @file MathFunctions.h
|
||||
* @brief Implementation of math utility functions.
|
||||
*
|
||||
|
@ -42,12 +42,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
/** @file MemoryIOWrapper.h
|
||||
* Handy IOStream/IOSystem implemetation to read directly from a memory buffer */
|
||||
#pragma once
|
||||
#ifndef AI_MEMORYIOSTREAM_H_INC
|
||||
#define AI_MEMORYIOSTREAM_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/IOStream.hpp>
|
||||
#include <assimp/IOSystem.hpp>
|
||||
#include <assimp/ai_assert.h>
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace Assimp {
|
||||
|
@ -44,11 +44,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file ParsingUtils.h
|
||||
* @brief Defines helper functions for text parsing
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_PARSING_UTILS_H_INC
|
||||
#define AI_PARSING_UTILS_H_INC
|
||||
|
||||
#include "StringComparison.h"
|
||||
#include "StringUtils.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/StringComparison.h>
|
||||
#include <assimp/StringUtils.h>
|
||||
#include <assimp/defs.h>
|
||||
|
||||
namespace Assimp {
|
||||
|
14
thirdparty/assimp/include/assimp/Profiler.h
vendored
14
thirdparty/assimp/include/assimp/Profiler.h
vendored
@ -43,12 +43,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file Profiler.h
|
||||
* @brief Utility to measure the respective runtime of each import step
|
||||
*/
|
||||
#ifndef INCLUDED_PROFILER_H
|
||||
#define INCLUDED_PROFILER_H
|
||||
#pragma once
|
||||
#ifndef AI_INCLUDED_PROFILER_H
|
||||
#define AI_INCLUDED_PROFILER_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <chrono>
|
||||
#include <assimp/DefaultLogger.hpp>
|
||||
#include "TinyFormatter.h"
|
||||
#include <assimp/TinyFormatter.h>
|
||||
|
||||
#include <map>
|
||||
|
||||
@ -67,7 +72,6 @@ public:
|
||||
// empty
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
/** Start a named timer */
|
||||
void BeginRegion(const std::string& region) {
|
||||
@ -95,5 +99,5 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // AI_INCLUDED_PROFILER_H
|
||||
|
||||
|
@ -47,9 +47,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_PROGRESSHANDLER_H_INC
|
||||
#define AI_PROGRESSHANDLER_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
namespace Assimp {
|
||||
#include <assimp/types.h>
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
// ------------------------------------------------------------------------------------
|
||||
/** @brief CPP-API: Abstract interface for custom progress report receivers.
|
||||
|
@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
@ -43,9 +42,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file Declares a helper class, "CommentRemover", which can be
|
||||
* used to remove comments (single and multi line) from a text file.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_REMOVE_COMMENTS_H_INC
|
||||
#define AI_REMOVE_COMMENTS_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/defs.h>
|
||||
|
||||
@ -58,8 +61,7 @@ namespace Assimp {
|
||||
* to those in C or C++ so this code has been moved to a separate
|
||||
* module.
|
||||
*/
|
||||
class ASSIMP_API CommentRemover
|
||||
{
|
||||
class ASSIMP_API CommentRemover {
|
||||
// class cannot be instanced
|
||||
CommentRemover() {}
|
||||
|
||||
|
@ -42,9 +42,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
/** Small helper classes to optimize finding vertices close to a given location
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_D3DSSPATIALSORT_H_INC
|
||||
#define AI_D3DSSPATIALSORT_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
|
@ -43,17 +43,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file Declares a helper class, "SceneCombiner" providing various
|
||||
* utilities to merge scenes.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_SCENE_COMBINER_H_INC
|
||||
#define AI_SCENE_COMBINER_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/ai_assert.h>
|
||||
#include <assimp/types.h>
|
||||
#include <assimp/Defines.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <set>
|
||||
#include <list>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
struct aiScene;
|
||||
@ -68,6 +73,7 @@ struct aiMesh;
|
||||
struct aiAnimMesh;
|
||||
struct aiAnimation;
|
||||
struct aiNodeAnim;
|
||||
struct aiMeshMorphAnim;
|
||||
|
||||
namespace Assimp {
|
||||
|
||||
@ -372,6 +378,7 @@ public:
|
||||
static void Copy (aiBone** dest, const aiBone* src);
|
||||
static void Copy (aiLight** dest, const aiLight* src);
|
||||
static void Copy (aiNodeAnim** dest, const aiNodeAnim* src);
|
||||
static void Copy (aiMeshMorphAnim** dest, const aiMeshMorphAnim* src);
|
||||
static void Copy (aiMetadata** dest, const aiMetadata* src);
|
||||
|
||||
// recursive, of course
|
||||
|
@ -47,9 +47,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* for animation skeletons.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_SKELETONMESHBUILDER_H_INC
|
||||
#define AI_SKELETONMESHBUILDER_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
#include <assimp/mesh.h>
|
||||
|
||||
|
@ -43,10 +43,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file Defines the helper data structures for importing 3DS files.
|
||||
http://www.jalix.org/ressources/graphics/3DS/_unofficials/3ds-unofficial.txt */
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_SMOOTHINGGROUPS_H_INC
|
||||
#define AI_SMOOTHINGGROUPS_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/vector3.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
|
||||
|
@ -41,13 +41,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
/** @file Generation of normal vectors basing on smoothing groups */
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_SMOOTHINGGROUPS_INL_INCLUDED
|
||||
#define AI_SMOOTHINGGROUPS_INL_INCLUDED
|
||||
|
||||
// internal headers
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/SGSpatialSort.h>
|
||||
|
||||
// CRT header
|
||||
#include <algorithm>
|
||||
|
||||
using namespace Assimp;
|
||||
|
@ -41,9 +41,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/** Small helper classes to optimise finding vertizes close to a given location */
|
||||
#pragma once
|
||||
#ifndef AI_SPATIALSORT_H_INC
|
||||
#define AI_SPATIALSORT_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
#include <assimp/types.h>
|
||||
|
||||
|
@ -41,11 +41,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/** @file Declares a helper class, "StandardShapes" which generates
|
||||
* vertices for standard shapes, such as cylnders, cones, spheres ..
|
||||
* vertices for standard shapes, such as cylinders, cones, spheres ..
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_STANDARD_SHAPES_H_INC
|
||||
#define AI_STANDARD_SHAPES_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/vector3.h>
|
||||
#include <vector>
|
||||
|
||||
|
10
thirdparty/assimp/include/assimp/StreamReader.h
vendored
10
thirdparty/assimp/include/assimp/StreamReader.h
vendored
@ -44,15 +44,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file Defines the StreamReader class which reads data from
|
||||
* a binary stream with a well-defined endianness.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_STREAMREADER_H_INCLUDED
|
||||
#define AI_STREAMREADER_H_INCLUDED
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/IOStream.hpp>
|
||||
#include <assimp/Defines.h>
|
||||
#include <assimp/ByteSwapper.h>
|
||||
#include <assimp/Exceptional.h>
|
||||
|
||||
#include "ByteSwapper.h"
|
||||
#include "Exceptional.h"
|
||||
#include <memory>
|
||||
|
||||
namespace Assimp {
|
||||
|
@ -43,11 +43,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
/** @file Defines the StreamWriter class which writes data to
|
||||
* a binary stream with a well-defined endianness. */
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_STREAMWRITER_H_INCLUDED
|
||||
#define AI_STREAMWRITER_H_INCLUDED
|
||||
|
||||
#include "ByteSwapper.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/ByteSwapper.h>
|
||||
#include <assimp/IOStream.hpp>
|
||||
|
||||
#include <memory>
|
||||
|
@ -49,12 +49,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
These functions are not consistently available on all platforms,
|
||||
or the provided implementations behave too differently.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef INCLUDED_AI_STRING_WORKERS_H
|
||||
#define INCLUDED_AI_STRING_WORKERS_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/ai_assert.h>
|
||||
#include <assimp/defs.h>
|
||||
#include "StringComparison.h"
|
||||
#include <assimp/StringComparison.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
@ -39,9 +39,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef INCLUDED_AI_STRINGUTILS_H
|
||||
#define INCLUDED_AI_STRINGUTILS_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/defs.h>
|
||||
|
||||
#include <sstream>
|
||||
|
@ -45,7 +45,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_SUBDISIVION_H_INC
|
||||
#define AI_SUBDISIVION_H_INC
|
||||
|
||||
#include <cstddef>
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
|
||||
struct aiMesh;
|
||||
|
32
thirdparty/assimp/include/assimp/TinyFormatter.h
vendored
32
thirdparty/assimp/include/assimp/TinyFormatter.h
vendored
@ -45,9 +45,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* to get rid of the boost::format dependency. Much slinker,
|
||||
* basically just extends stringstream.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef INCLUDED_TINY_FORMATTER_H
|
||||
#define INCLUDED_TINY_FORMATTER_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <sstream>
|
||||
|
||||
namespace Assimp {
|
||||
@ -65,24 +70,15 @@ namespace Formatter {
|
||||
* @endcode */
|
||||
template < typename T,
|
||||
typename CharTraits = std::char_traits<T>,
|
||||
typename Allocator = std::allocator<T>
|
||||
>
|
||||
class basic_formatter
|
||||
{
|
||||
|
||||
typename Allocator = std::allocator<T> >
|
||||
class basic_formatter {
|
||||
public:
|
||||
typedef class std::basic_string<T,CharTraits,Allocator> string;
|
||||
typedef class std::basic_ostringstream<T,CharTraits,Allocator> stringstream;
|
||||
|
||||
typedef class std::basic_string<
|
||||
T,CharTraits,Allocator
|
||||
> string;
|
||||
|
||||
typedef class std::basic_ostringstream<
|
||||
T,CharTraits,Allocator
|
||||
> stringstream;
|
||||
|
||||
public:
|
||||
|
||||
basic_formatter() {}
|
||||
basic_formatter() {
|
||||
// empty
|
||||
}
|
||||
|
||||
/* Allow basic_formatter<T>'s to be used almost interchangeably
|
||||
* with std::(w)string or const (w)char* arguments because the
|
||||
@ -104,14 +100,10 @@ public:
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
public:
|
||||
|
||||
operator string () const {
|
||||
return underlying.str();
|
||||
}
|
||||
|
||||
|
||||
/* note - this is declared const because binding temporaries does only
|
||||
* work for const references, so many function prototypes will
|
||||
* include const basic_formatter<T>& s but might still want to
|
||||
|
67
thirdparty/assimp/include/assimp/Vertex.h
vendored
67
thirdparty/assimp/include/assimp/Vertex.h
vendored
@ -47,12 +47,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
that are not currently well-defined (and would cause compile errors
|
||||
due to missing operators in the math library), are commented.
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_VERTEX_H_INC
|
||||
#define AI_VERTEX_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/vector3.h>
|
||||
#include <assimp/mesh.h>
|
||||
#include <assimp/ai_assert.h>
|
||||
|
||||
#include <functional>
|
||||
|
||||
namespace Assimp {
|
||||
@ -91,23 +97,14 @@ namespace Assimp {
|
||||
* to *all* vertex components equally. This is useful for stuff like interpolation
|
||||
* or subdivision, but won't work if special handling is required for some vertex components. */
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
class Vertex
|
||||
{
|
||||
class Vertex {
|
||||
friend Vertex operator + (const Vertex&,const Vertex&);
|
||||
friend Vertex operator - (const Vertex&,const Vertex&);
|
||||
|
||||
// friend Vertex operator + (const Vertex&,ai_real);
|
||||
// friend Vertex operator - (const Vertex&,ai_real);
|
||||
friend Vertex operator * (const Vertex&,ai_real);
|
||||
friend Vertex operator / (const Vertex&,ai_real);
|
||||
|
||||
// friend Vertex operator + (ai_real, const Vertex&);
|
||||
// friend Vertex operator - (ai_real, const Vertex&);
|
||||
friend Vertex operator * (ai_real, const Vertex&);
|
||||
// friend Vertex operator / (ai_real, const Vertex&);
|
||||
|
||||
public:
|
||||
|
||||
Vertex() {}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -158,8 +155,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Vertex& operator += (const Vertex& v) {
|
||||
*this = *this+v;
|
||||
return *this;
|
||||
@ -170,18 +165,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Vertex& operator += (ai_real v) {
|
||||
*this = *this+v;
|
||||
return *this;
|
||||
}
|
||||
|
||||
Vertex& operator -= (ai_real v) {
|
||||
*this = *this-v;
|
||||
return *this;
|
||||
}
|
||||
*/
|
||||
Vertex& operator *= (ai_real v) {
|
||||
*this = *this*v;
|
||||
return *this;
|
||||
@ -192,12 +175,9 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Convert back to non-interleaved storage */
|
||||
void SortBack(aiMesh* out, unsigned int idx) const {
|
||||
|
||||
ai_assert(idx<out->mNumVertices);
|
||||
out->mVertices[idx] = position;
|
||||
|
||||
@ -291,8 +271,6 @@ public:
|
||||
aiColor4D colors[AI_MAX_NUMBER_OF_COLOR_SETS];
|
||||
};
|
||||
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
AI_FORCE_INLINE Vertex operator + (const Vertex& v0,const Vertex& v1) {
|
||||
return Vertex::BinaryOp<std::plus>(v0,v1);
|
||||
@ -302,19 +280,6 @@ AI_FORCE_INLINE Vertex operator - (const Vertex& v0,const Vertex& v1) {
|
||||
return Vertex::BinaryOp<std::minus>(v0,v1);
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
/*
|
||||
AI_FORCE_INLINE Vertex operator + (const Vertex& v0,ai_real f) {
|
||||
return Vertex::BinaryOp<Intern::plus>(v0,f);
|
||||
}
|
||||
|
||||
AI_FORCE_INLINE Vertex operator - (const Vertex& v0,ai_real f) {
|
||||
return Vertex::BinaryOp<Intern::minus>(v0,f);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
AI_FORCE_INLINE Vertex operator * (const Vertex& v0,ai_real f) {
|
||||
return Vertex::BinaryOp<Intern::multiplies>(v0,f);
|
||||
}
|
||||
@ -323,26 +288,10 @@ AI_FORCE_INLINE Vertex operator / (const Vertex& v0,ai_real f) {
|
||||
return Vertex::BinaryOp<Intern::multiplies>(v0,1.f/f);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
/*
|
||||
AI_FORCE_INLINE Vertex operator + (ai_real f,const Vertex& v0) {
|
||||
return Vertex::BinaryOp<Intern::plus>(f,v0);
|
||||
}
|
||||
|
||||
AI_FORCE_INLINE Vertex operator - (ai_real f,const Vertex& v0) {
|
||||
return Vertex::BinaryOp<Intern::minus>(f,v0);
|
||||
}
|
||||
*/
|
||||
|
||||
AI_FORCE_INLINE Vertex operator * (ai_real f,const Vertex& v0) {
|
||||
return Vertex::BinaryOp<Intern::multiplies>(f,v0);
|
||||
}
|
||||
|
||||
/*
|
||||
AI_FORCE_INLINE Vertex operator / (ai_real f,const Vertex& v0) {
|
||||
return Vertex::BinaryOp<Intern::divides>(f,v0);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
#endif
|
||||
#endif // AI_VERTEX_H_INC
|
||||
|
5
thirdparty/assimp/include/assimp/XMLTools.h
vendored
5
thirdparty/assimp/include/assimp/XMLTools.h
vendored
@ -40,9 +40,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef INCLUDED_ASSIMP_XML_TOOLS_H
|
||||
#define INCLUDED_ASSIMP_XML_TOOLS_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace Assimp {
|
||||
|
11
thirdparty/assimp/include/assimp/aabb.h
vendored
11
thirdparty/assimp/include/assimp/aabb.h
vendored
@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
@ -45,6 +43,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_AABB_H_INC
|
||||
#define AI_AABB_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/vector3.h>
|
||||
|
||||
struct aiAABB {
|
||||
@ -69,8 +71,9 @@ struct aiAABB {
|
||||
// empty
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif // __cplusplus
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
#endif // AI_AABB_H_INC
|
||||
|
4
thirdparty/assimp/include/assimp/ai_assert.h
vendored
4
thirdparty/assimp/include/assimp/ai_assert.h
vendored
@ -44,6 +44,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_ASSERT_H_INC
|
||||
#define AI_ASSERT_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef ASSIMP_BUILD_DEBUG
|
||||
# include <assert.h>
|
||||
# define ai_assert(expression) assert( expression )
|
||||
|
4
thirdparty/assimp/include/assimp/anim.h
vendored
4
thirdparty/assimp/include/assimp/anim.h
vendored
@ -50,6 +50,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_ANIM_H_INC
|
||||
#define AI_ANIM_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
#include <assimp/quaternion.h>
|
||||
|
||||
|
4
thirdparty/assimp/include/assimp/camera.h
vendored
4
thirdparty/assimp/include/assimp/camera.h
vendored
@ -47,6 +47,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_CAMERA_H_INC
|
||||
#define AI_CAMERA_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
6
thirdparty/assimp/include/assimp/cexport.h
vendored
6
thirdparty/assimp/include/assimp/cexport.h
vendored
@ -3,7 +3,7 @@
|
||||
Open Asset Import Library (assimp)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2006-2011, assimp team
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
All rights reserved.
|
||||
|
||||
@ -46,6 +46,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_EXPORT_H_INC
|
||||
#define AI_EXPORT_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||
|
||||
// Public ASSIMP data structures
|
||||
|
6
thirdparty/assimp/include/assimp/cfileio.h
vendored
6
thirdparty/assimp/include/assimp/cfileio.h
vendored
@ -48,10 +48,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_FILEIO_H_INC
|
||||
#define AI_FILEIO_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct aiFileIO;
|
||||
struct aiFile;
|
||||
|
||||
|
6
thirdparty/assimp/include/assimp/cimport.h
vendored
6
thirdparty/assimp/include/assimp/cimport.h
vendored
@ -48,8 +48,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_ASSIMP_H_INC
|
||||
#define AI_ASSIMP_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
#include "importerdesc.h"
|
||||
#include <assimp/importerdesc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
13
thirdparty/assimp/include/assimp/color4.h
vendored
13
thirdparty/assimp/include/assimp/color4.h
vendored
@ -47,7 +47,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_COLOR4D_H_INC
|
||||
#define AI_COLOR4D_H_INC
|
||||
|
||||
#include "defs.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/defs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -56,8 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* alpha component. Color values range from 0 to 1. */
|
||||
// ----------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
class aiColor4t
|
||||
{
|
||||
class aiColor4t {
|
||||
public:
|
||||
aiColor4t() AI_NO_EXCEPT : r(), g(), b(), a() {}
|
||||
aiColor4t (TReal _r, TReal _g, TReal _b, TReal _a)
|
||||
@ -65,14 +68,12 @@ public:
|
||||
explicit aiColor4t (TReal _r) : r(_r), g(_r), b(_r), a(_r) {}
|
||||
aiColor4t (const aiColor4t& o) = default;
|
||||
|
||||
public:
|
||||
// combined operators
|
||||
const aiColor4t& operator += (const aiColor4t& o);
|
||||
const aiColor4t& operator -= (const aiColor4t& o);
|
||||
const aiColor4t& operator *= (TReal f);
|
||||
const aiColor4t& operator /= (TReal f);
|
||||
|
||||
public:
|
||||
// comparison
|
||||
bool operator == (const aiColor4t& other) const;
|
||||
bool operator != (const aiColor4t& other) const;
|
||||
@ -85,8 +86,6 @@ public:
|
||||
/** check whether a color is (close to) black */
|
||||
inline bool IsBlack() const;
|
||||
|
||||
public:
|
||||
|
||||
// Red, green, blue and alpha color values
|
||||
TReal r, g, b, a;
|
||||
}; // !struct aiColor4D
|
||||
|
94
thirdparty/assimp/include/assimp/color4.inl
vendored
94
thirdparty/assimp/include/assimp/color4.inl
vendored
@ -48,36 +48,61 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_COLOR4D_INL_INC
|
||||
#define AI_COLOR4D_INL_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include "color4.h"
|
||||
#include <assimp/color4.h>
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE const aiColor4t<TReal>& aiColor4t<TReal>::operator += (const aiColor4t<TReal>& o) {
|
||||
r += o.r; g += o.g; b += o.b; a += o.a;
|
||||
AI_FORCE_INLINE
|
||||
const aiColor4t<TReal>& aiColor4t<TReal>::operator += (const aiColor4t<TReal>& o) {
|
||||
r += o.r;
|
||||
g += o.g;
|
||||
b += o.b;
|
||||
a += o.a;
|
||||
|
||||
return *this;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE const aiColor4t<TReal>& aiColor4t<TReal>::operator -= (const aiColor4t<TReal>& o) {
|
||||
r -= o.r; g -= o.g; b -= o.b; a -= o.a;
|
||||
AI_FORCE_INLINE
|
||||
const aiColor4t<TReal>& aiColor4t<TReal>::operator -= (const aiColor4t<TReal>& o) {
|
||||
r -= o.r;
|
||||
g -= o.g;
|
||||
b -= o.b;
|
||||
a -= o.a;
|
||||
|
||||
return *this;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE const aiColor4t<TReal>& aiColor4t<TReal>::operator *= (TReal f) {
|
||||
r *= f; g *= f; b *= f; a *= f;
|
||||
AI_FORCE_INLINE
|
||||
const aiColor4t<TReal>& aiColor4t<TReal>::operator *= (TReal f) {
|
||||
r *= f;
|
||||
g *= f;
|
||||
b *= f;
|
||||
a *= f;
|
||||
|
||||
return *this;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE const aiColor4t<TReal>& aiColor4t<TReal>::operator /= (TReal f) {
|
||||
r /= f; g /= f; b /= f; a /= f;
|
||||
AI_FORCE_INLINE
|
||||
const aiColor4t<TReal>& aiColor4t<TReal>::operator /= (TReal f) {
|
||||
r /= f;
|
||||
g /= f;
|
||||
b /= f;
|
||||
a /= f;
|
||||
|
||||
return *this;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE TReal aiColor4t<TReal>::operator[](unsigned int i) const {
|
||||
AI_FORCE_INLINE
|
||||
TReal aiColor4t<TReal>::operator[](unsigned int i) const {
|
||||
switch ( i ) {
|
||||
case 0:
|
||||
return r;
|
||||
@ -94,7 +119,8 @@ AI_FORCE_INLINE TReal aiColor4t<TReal>::operator[](unsigned int i) const {
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE TReal& aiColor4t<TReal>::operator[](unsigned int i) {
|
||||
AI_FORCE_INLINE
|
||||
TReal& aiColor4t<TReal>::operator[](unsigned int i) {
|
||||
switch ( i ) {
|
||||
case 0:
|
||||
return r;
|
||||
@ -111,17 +137,20 @@ AI_FORCE_INLINE TReal& aiColor4t<TReal>::operator[](unsigned int i) {
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE bool aiColor4t<TReal>::operator== (const aiColor4t<TReal>& other) const {
|
||||
AI_FORCE_INLINE
|
||||
bool aiColor4t<TReal>::operator== (const aiColor4t<TReal>& other) const {
|
||||
return r == other.r && g == other.g && b == other.b && a == other.a;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE bool aiColor4t<TReal>::operator!= (const aiColor4t<TReal>& other) const {
|
||||
AI_FORCE_INLINE
|
||||
bool aiColor4t<TReal>::operator!= (const aiColor4t<TReal>& other) const {
|
||||
return r != other.r || g != other.g || b != other.b || a != other.a;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE bool aiColor4t<TReal>::operator< (const aiColor4t<TReal>& other) const {
|
||||
AI_FORCE_INLINE
|
||||
bool aiColor4t<TReal>::operator< (const aiColor4t<TReal>& other) const {
|
||||
return r < other.r || (
|
||||
r == other.r && (
|
||||
g < other.g || (
|
||||
@ -136,14 +165,17 @@ AI_FORCE_INLINE bool aiColor4t<TReal>::operator< (const aiColor4t<TReal>& other)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator + (const aiColor4t<TReal>& v1, const aiColor4t<TReal>& v2) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator + (const aiColor4t<TReal>& v1, const aiColor4t<TReal>& v2) {
|
||||
return aiColor4t<TReal>( v1.r + v2.r, v1.g + v2.g, v1.b + v2.b, v1.a + v2.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator - (const aiColor4t<TReal>& v1, const aiColor4t<TReal>& v2) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator - (const aiColor4t<TReal>& v1, const aiColor4t<TReal>& v2) {
|
||||
return aiColor4t<TReal>( v1.r - v2.r, v1.g - v2.g, v1.b - v2.b, v1.a - v2.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
@ -153,53 +185,63 @@ AI_FORCE_INLINE aiColor4t<TReal> operator * (const aiColor4t<TReal>& v1, const a
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator / (const aiColor4t<TReal>& v1, const aiColor4t<TReal>& v2) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator / (const aiColor4t<TReal>& v1, const aiColor4t<TReal>& v2) {
|
||||
return aiColor4t<TReal>( v1.r / v2.r, v1.g / v2.g, v1.b / v2.b, v1.a / v2.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator * ( TReal f, const aiColor4t<TReal>& v) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator * ( TReal f, const aiColor4t<TReal>& v) {
|
||||
return aiColor4t<TReal>( f*v.r, f*v.g, f*v.b, f*v.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator * ( const aiColor4t<TReal>& v, TReal f) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator * ( const aiColor4t<TReal>& v, TReal f) {
|
||||
return aiColor4t<TReal>( f*v.r, f*v.g, f*v.b, f*v.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator / ( const aiColor4t<TReal>& v, TReal f) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator / ( const aiColor4t<TReal>& v, TReal f) {
|
||||
return v * (1/f);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator / ( TReal f,const aiColor4t<TReal>& v) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator / ( TReal f,const aiColor4t<TReal>& v) {
|
||||
return aiColor4t<TReal>(f,f,f,f)/v;
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator + ( const aiColor4t<TReal>& v, TReal f) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator + ( const aiColor4t<TReal>& v, TReal f) {
|
||||
return aiColor4t<TReal>( f+v.r, f+v.g, f+v.b, f+v.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator - ( const aiColor4t<TReal>& v, TReal f) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator - ( const aiColor4t<TReal>& v, TReal f) {
|
||||
return aiColor4t<TReal>( v.r-f, v.g-f, v.b-f, v.a-f);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator + ( TReal f, const aiColor4t<TReal>& v) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator + ( TReal f, const aiColor4t<TReal>& v) {
|
||||
return aiColor4t<TReal>( f+v.r, f+v.g, f+v.b, f+v.a);
|
||||
}
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
AI_FORCE_INLINE aiColor4t<TReal> operator - ( TReal f, const aiColor4t<TReal>& v) {
|
||||
AI_FORCE_INLINE
|
||||
aiColor4t<TReal> operator - ( TReal f, const aiColor4t<TReal>& v) {
|
||||
return aiColor4t<TReal>( f-v.r, f-v.g, f-v.b, f-v.a);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline bool aiColor4t<TReal> :: IsBlack() const {
|
||||
AI_FORCE_INLINE
|
||||
bool aiColor4t<TReal>::IsBlack() const {
|
||||
// The alpha component doesn't care here. black is black.
|
||||
static const TReal epsilon = 10e-3f;
|
||||
return std::fabs( r ) < epsilon && std::fabs( g ) < epsilon && std::fabs( b ) < epsilon;
|
||||
|
43
thirdparty/assimp/include/assimp/defs.h
vendored
43
thirdparty/assimp/include/assimp/defs.h
vendored
@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
@ -50,6 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_DEFINES_H_INC
|
||||
#define AI_DEFINES_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/config.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@ -126,16 +128,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* GENBOUNDINGBOXES */
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _WIN32
|
||||
# undef ASSIMP_API
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/* Define 'ASSIMP_BUILD_DLL_EXPORT' to build a DLL of the library */
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
# ifdef ASSIMP_BUILD_DLL_EXPORT
|
||||
# define ASSIMP_API __declspec(dllexport)
|
||||
# define ASSIMP_API_WINONLY __declspec(dllexport)
|
||||
# pragma warning (disable : 4251)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
/* Define 'ASSIMP_DLL' before including Assimp to link to ASSIMP in
|
||||
@ -148,7 +148,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
# define ASSIMP_API
|
||||
# define ASSIMP_API_WINONLY
|
||||
# endif
|
||||
#elif defined(SWIG)
|
||||
|
||||
/* Do nothing, the relevant defines are all in AssimpSwigPort.i */
|
||||
|
||||
#else
|
||||
# define ASSIMP_API __attribute__ ((visibility("default")))
|
||||
# define ASSIMP_API_WINONLY
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# ifdef ASSIMP_BUILD_DLL_EXPORT
|
||||
# pragma warning (disable : 4251)
|
||||
# endif
|
||||
/* Force the compiler to inline a function, if possible
|
||||
*/
|
||||
# define AI_FORCE_INLINE __forceinline
|
||||
@ -156,17 +168,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/* Tells the compiler that a function never returns. Used in code analysis
|
||||
* to skip dead paths (e.g. after an assertion evaluated to false). */
|
||||
# define AI_WONT_RETURN __declspec(noreturn)
|
||||
|
||||
#elif defined(SWIG)
|
||||
|
||||
/* Do nothing, the relevant defines are all in AssimpSwigPort.i */
|
||||
|
||||
#else
|
||||
|
||||
# define AI_WONT_RETURN
|
||||
|
||||
# define ASSIMP_API __attribute__ ((visibility("default")))
|
||||
# define ASSIMP_API_WINONLY
|
||||
# define AI_FORCE_INLINE inline
|
||||
#endif // (defined _MSC_VER)
|
||||
|
||||
@ -291,9 +298,10 @@ static const ai_real ai_epsilon = (ai_real) 0.00001;
|
||||
#endif
|
||||
|
||||
|
||||
/* To avoid running out of memory
|
||||
* This can be adjusted for specific use cases
|
||||
* It's NOT a total limit, just a limit for individual allocations
|
||||
/**
|
||||
* To avoid running out of memory
|
||||
* This can be adjusted for specific use cases
|
||||
* It's NOT a total limit, just a limit for individual allocations
|
||||
*/
|
||||
#define AI_MAX_ALLOC(type) ((256U * 1024 * 1024) / sizeof(type))
|
||||
|
||||
@ -307,4 +315,13 @@ static const ai_real ai_epsilon = (ai_real) 0.00001;
|
||||
# endif
|
||||
#endif // _MSC_VER
|
||||
|
||||
/**
|
||||
* Helper macro to set a pointer to NULL in debug builds
|
||||
*/
|
||||
#if (defined ASSIMP_BUILD_DEBUG)
|
||||
# define AI_DEBUG_INVALIDATE_PTR(x) x = NULL;
|
||||
#else
|
||||
# define AI_DEBUG_INVALIDATE_PTR(x)
|
||||
#endif
|
||||
|
||||
#endif // !! AI_DEFINES_H_INC
|
||||
|
6
thirdparty/assimp/include/assimp/fast_atof.h
vendored
6
thirdparty/assimp/include/assimp/fast_atof.h
vendored
@ -13,10 +13,14 @@
|
||||
// to ensure long numbers are handled correctly
|
||||
// ------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#pragma once
|
||||
#ifndef FAST_A_TO_F_H_INCLUDED
|
||||
#define FAST_A_TO_F_H_INCLUDED
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
#include <stdint.h>
|
||||
|
10
thirdparty/assimp/include/assimp/importerdesc.h
vendored
10
thirdparty/assimp/include/assimp/importerdesc.h
vendored
@ -48,11 +48,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_IMPORTER_DESC_H_INC
|
||||
#define AI_IMPORTER_DESC_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
|
||||
/** Mixed set of flags for #aiImporterDesc, indicating some features
|
||||
* common to many importers*/
|
||||
enum aiImporterFlags
|
||||
{
|
||||
enum aiImporterFlags {
|
||||
/** Indicates that there is a textual encoding of the
|
||||
* file format; and that it is supported.*/
|
||||
aiImporterFlags_SupportTextFlavour = 0x1,
|
||||
@ -87,8 +90,7 @@ enum aiImporterFlags
|
||||
* as importers/exporters are added to Assimp, so it might be useful
|
||||
* to have a common mechanism to query some rough importer
|
||||
* characteristics. */
|
||||
struct aiImporterDesc
|
||||
{
|
||||
struct aiImporterDesc {
|
||||
/** Full name of the importer (i.e. Blender3D importer)*/
|
||||
const char* mName;
|
||||
|
||||
|
6
thirdparty/assimp/include/assimp/light.h
vendored
6
thirdparty/assimp/include/assimp/light.h
vendored
@ -49,7 +49,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_LIGHT_H_INC
|
||||
#define AI_LIGHT_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
6
thirdparty/assimp/include/assimp/material.h
vendored
6
thirdparty/assimp/include/assimp/material.h
vendored
@ -48,7 +48,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_MATERIAL_H_INC
|
||||
#define AI_MATERIAL_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
265
thirdparty/assimp/include/assimp/material.inl
vendored
265
thirdparty/assimp/include/assimp/material.inl
vendored
@ -49,14 +49,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_MATERIAL_INL_INC
|
||||
#define AI_MATERIAL_INL_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiPropertyTypeInfo ai_real_to_property_type_info(float)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiPropertyTypeInfo ai_real_to_property_type_info(float) {
|
||||
return aiPTI_Float;
|
||||
}
|
||||
|
||||
inline aiPropertyTypeInfo ai_real_to_property_type_info(double)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiPropertyTypeInfo ai_real_to_property_type_info(double) {
|
||||
return aiPTI_Double;
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
@ -64,30 +68,30 @@ inline aiPropertyTypeInfo ai_real_to_property_type_info(double)
|
||||
//! @cond never
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::GetTexture( aiTextureType type,
|
||||
unsigned int index,
|
||||
C_STRUCT aiString* path,
|
||||
aiTextureMapping* mapping /*= NULL*/,
|
||||
unsigned int* uvindex /*= NULL*/,
|
||||
ai_real* blend /*= NULL*/,
|
||||
aiTextureOp* op /*= NULL*/,
|
||||
aiTextureMapMode* mapmode /*= NULL*/) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::GetTexture( aiTextureType type,
|
||||
unsigned int index,
|
||||
C_STRUCT aiString* path,
|
||||
aiTextureMapping* mapping /*= NULL*/,
|
||||
unsigned int* uvindex /*= NULL*/,
|
||||
ai_real* blend /*= NULL*/,
|
||||
aiTextureOp* op /*= NULL*/,
|
||||
aiTextureMapMode* mapmode /*= NULL*/) const {
|
||||
return ::aiGetMaterialTexture(this,type,index,path,mapping,uvindex,blend,op,mapmode);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline unsigned int aiMaterial::GetTextureCount(aiTextureType type) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
unsigned int aiMaterial::GetTextureCount(aiTextureType type) const {
|
||||
return ::aiGetMaterialTextureCount(this,type);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template <typename Type>
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx, Type* pOut,
|
||||
unsigned int* pMax) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx, Type* pOut,
|
||||
unsigned int* pMax) const {
|
||||
unsigned int iNum = pMax ? *pMax : 1;
|
||||
|
||||
const aiMaterialProperty* prop;
|
||||
@ -114,9 +118,9 @@ inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template <typename Type>
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,Type& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,Type& pOut) const {
|
||||
const aiMaterialProperty* prop;
|
||||
const aiReturn ret = ::aiGetMaterialProperty(this,pKey,type,idx,
|
||||
(const aiMaterialProperty**)&prop);
|
||||
@ -136,60 +140,56 @@ inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,ai_real* pOut,
|
||||
unsigned int* pMax) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,ai_real* pOut,
|
||||
unsigned int* pMax) const {
|
||||
return ::aiGetMaterialFloatArray(this,pKey,type,idx,pOut,pMax);
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,int* pOut,
|
||||
unsigned int* pMax) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,int* pOut,
|
||||
unsigned int* pMax) const {
|
||||
return ::aiGetMaterialIntegerArray(this,pKey,type,idx,pOut,pMax);
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,ai_real& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,ai_real& pOut) const {
|
||||
return aiGetMaterialFloat(this,pKey,type,idx,&pOut);
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,int& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,int& pOut) const {
|
||||
return aiGetMaterialInteger(this,pKey,type,idx,&pOut);
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiColor4D& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiColor4D& pOut) const {
|
||||
return aiGetMaterialColor(this,pKey,type,idx,&pOut);
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiColor3D& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiColor3D& pOut) const {
|
||||
aiColor4D c;
|
||||
const aiReturn ret = aiGetMaterialColor(this,pKey,type,idx,&c);
|
||||
pOut = aiColor3D(c.r,c.g,c.b);
|
||||
return ret;
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiString& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiString& pOut) const {
|
||||
return aiGetMaterialString(this,pKey,type,idx,&pOut);
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiUVTransform& pOut) const
|
||||
{
|
||||
AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
||||
unsigned int idx,aiUVTransform& pOut) const {
|
||||
return aiGetMaterialUVTransform(this,pKey,type,idx,&pOut);
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<class TYPE>
|
||||
aiReturn aiMaterial::AddProperty (const TYPE* pInput,
|
||||
@ -204,84 +204,83 @@ aiReturn aiMaterial::AddProperty (const TYPE* pInput,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const float* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE aiReturn aiMaterial::AddProperty(const float* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(float),
|
||||
pKey,type,index,aiPTI_Float);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const double* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty(const double* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(double),
|
||||
pKey,type,index,aiPTI_Double);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiUVTransform),
|
||||
pKey,type,index,ai_real_to_property_type_info(pInput->mRotation));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const aiColor4D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty(const aiColor4D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiColor4D),
|
||||
pKey,type,index,ai_real_to_property_type_info(pInput->a));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const aiColor3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty(const aiColor3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiColor3D),
|
||||
pKey,type,index,ai_real_to_property_type_info(pInput->b));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const aiVector3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty(const aiVector3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiVector3D),
|
||||
pKey,type,index,ai_real_to_property_type_info(pInput->x));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
inline aiReturn aiMaterial::AddProperty(const int* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty(const int* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(int),
|
||||
pKey,type,index,aiPTI_Integer);
|
||||
@ -296,12 +295,12 @@ inline aiReturn aiMaterial::AddProperty(const int* pInput,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<float>(const float* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<float>(const float* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(float),
|
||||
pKey,type,index,aiPTI_Float);
|
||||
@ -309,12 +308,12 @@ inline aiReturn aiMaterial::AddProperty<float>(const float* pInput,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<double>(const double* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<double>(const double* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(double),
|
||||
pKey,type,index,aiPTI_Double);
|
||||
@ -322,12 +321,12 @@ inline aiReturn aiMaterial::AddProperty<double>(const double* pInput,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<aiUVTransform>(const aiUVTransform* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<aiUVTransform>(const aiUVTransform* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiUVTransform),
|
||||
pKey,type,index,aiPTI_Float);
|
||||
@ -335,12 +334,12 @@ inline aiReturn aiMaterial::AddProperty<aiUVTransform>(const aiUVTransform* pInp
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<aiColor4D>(const aiColor4D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<aiColor4D>(const aiColor4D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiColor4D),
|
||||
pKey,type,index,aiPTI_Float);
|
||||
@ -348,12 +347,12 @@ inline aiReturn aiMaterial::AddProperty<aiColor4D>(const aiColor4D* pInput,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<aiColor3D>(const aiColor3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<aiColor3D>(const aiColor3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiColor3D),
|
||||
pKey,type,index,aiPTI_Float);
|
||||
@ -361,12 +360,12 @@ inline aiReturn aiMaterial::AddProperty<aiColor3D>(const aiColor3D* pInput,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<aiVector3D>(const aiVector3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<aiVector3D>(const aiVector3D* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(aiVector3D),
|
||||
pKey,type,index,aiPTI_Float);
|
||||
@ -374,12 +373,12 @@ inline aiReturn aiMaterial::AddProperty<aiVector3D>(const aiVector3D* pInput,
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<>
|
||||
inline aiReturn aiMaterial::AddProperty<int>(const int* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiReturn aiMaterial::AddProperty<int>(const int* pInput,
|
||||
const unsigned int pNumValues,
|
||||
const char* pKey,
|
||||
unsigned int type,
|
||||
unsigned int index) {
|
||||
return AddBinaryProperty((const void*)pInput,
|
||||
pNumValues * sizeof(int),
|
||||
pKey,type,index,aiPTI_Integer);
|
||||
|
15
thirdparty/assimp/include/assimp/matrix3x3.h
vendored
15
thirdparty/assimp/include/assimp/matrix3x3.h
vendored
@ -48,7 +48,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_MATRIX3X3_H_INC
|
||||
#define AI_MATRIX3X3_H_INC
|
||||
|
||||
#include "defs.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/defs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -65,10 +69,8 @@ template <typename T> class aiVector2t;
|
||||
* defined thereby.
|
||||
*/
|
||||
template <typename TReal>
|
||||
class aiMatrix3x3t
|
||||
{
|
||||
class aiMatrix3x3t {
|
||||
public:
|
||||
|
||||
aiMatrix3x3t() AI_NO_EXCEPT :
|
||||
a1(static_cast<TReal>(1.0f)), a2(), a3(),
|
||||
b1(), b2(static_cast<TReal>(1.0f)), b3(),
|
||||
@ -82,8 +84,6 @@ public:
|
||||
c1(_c1), c2(_c2), c3(_c3)
|
||||
{}
|
||||
|
||||
public:
|
||||
|
||||
// matrix multiplication.
|
||||
aiMatrix3x3t& operator *= (const aiMatrix3x3t& m);
|
||||
aiMatrix3x3t operator * (const aiMatrix3x3t& m) const;
|
||||
@ -101,8 +101,6 @@ public:
|
||||
template <typename TOther>
|
||||
operator aiMatrix3x3t<TOther> () const;
|
||||
|
||||
public:
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
/** @brief Construction from a 4x4 matrix. The remaining parts
|
||||
* of the matrix are ignored.
|
||||
@ -122,7 +120,6 @@ public:
|
||||
aiMatrix3x3t& Inverse();
|
||||
TReal Determinant() const;
|
||||
|
||||
public:
|
||||
// -------------------------------------------------------------------
|
||||
/** @brief Returns a rotation matrix for a rotation around z
|
||||
* @param a Rotation angle, in radians
|
||||
|
72
thirdparty/assimp/include/assimp/matrix3x3.inl
vendored
72
thirdparty/assimp/include/assimp/matrix3x3.inl
vendored
@ -48,10 +48,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_MATRIX3X3_INL_INC
|
||||
#define AI_MATRIX3X3_INL_INC
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include "matrix3x3.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <assimp/matrix3x3.h>
|
||||
#include <assimp/matrix4x4.h>
|
||||
|
||||
#include "matrix4x4.h"
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <limits>
|
||||
@ -59,8 +63,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Construction from a 4x4 matrix. The remaining parts of the matrix are ignored.
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>::aiMatrix3x3t( const aiMatrix4x4t<TReal>& pMatrix)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>::aiMatrix3x3t( const aiMatrix4x4t<TReal>& pMatrix) {
|
||||
a1 = pMatrix.a1; a2 = pMatrix.a2; a3 = pMatrix.a3;
|
||||
b1 = pMatrix.b1; b2 = pMatrix.b2; b3 = pMatrix.b3;
|
||||
c1 = pMatrix.c1; c2 = pMatrix.c2; c3 = pMatrix.c3;
|
||||
@ -68,8 +72,8 @@ inline aiMatrix3x3t<TReal>::aiMatrix3x3t( const aiMatrix4x4t<TReal>& pMatrix)
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::operator *= (const aiMatrix3x3t<TReal>& m)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::operator *= (const aiMatrix3x3t<TReal>& m) {
|
||||
*this = aiMatrix3x3t<TReal>(m.a1 * a1 + m.b1 * a2 + m.c1 * a3,
|
||||
m.a2 * a1 + m.b2 * a2 + m.c2 * a3,
|
||||
m.a3 * a1 + m.b3 * a2 + m.c3 * a3,
|
||||
@ -85,8 +89,7 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::operator *= (const aiMatrix3x3t
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
template <typename TOther>
|
||||
aiMatrix3x3t<TReal>::operator aiMatrix3x3t<TOther> () const
|
||||
{
|
||||
aiMatrix3x3t<TReal>::operator aiMatrix3x3t<TOther> () const {
|
||||
return aiMatrix3x3t<TOther>(static_cast<TOther>(a1),static_cast<TOther>(a2),static_cast<TOther>(a3),
|
||||
static_cast<TOther>(b1),static_cast<TOther>(b2),static_cast<TOther>(b3),
|
||||
static_cast<TOther>(c1),static_cast<TOther>(c2),static_cast<TOther>(c3));
|
||||
@ -94,8 +97,8 @@ aiMatrix3x3t<TReal>::operator aiMatrix3x3t<TOther> () const
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal> aiMatrix3x3t<TReal>::operator* (const aiMatrix3x3t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal> aiMatrix3x3t<TReal>::operator* (const aiMatrix3x3t<TReal>& m) const {
|
||||
aiMatrix3x3t<TReal> temp( *this);
|
||||
temp *= m;
|
||||
return temp;
|
||||
@ -103,7 +106,8 @@ inline aiMatrix3x3t<TReal> aiMatrix3x3t<TReal>::operator* (const aiMatrix3x3t<TR
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) {
|
||||
AI_FORCE_INLINE
|
||||
TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) {
|
||||
switch ( p_iIndex ) {
|
||||
case 0:
|
||||
return &a1;
|
||||
@ -119,7 +123,8 @@ inline TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) {
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline const TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) const {
|
||||
AI_FORCE_INLINE
|
||||
const TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) const {
|
||||
switch ( p_iIndex ) {
|
||||
case 0:
|
||||
return &a1;
|
||||
@ -135,8 +140,8 @@ inline const TReal* aiMatrix3x3t<TReal>::operator[] (unsigned int p_iIndex) cons
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline bool aiMatrix3x3t<TReal>::operator== (const aiMatrix4x4t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix3x3t<TReal>::operator== (const aiMatrix4x4t<TReal>& m) const {
|
||||
return a1 == m.a1 && a2 == m.a2 && a3 == m.a3 &&
|
||||
b1 == m.b1 && b2 == m.b2 && b3 == m.b3 &&
|
||||
c1 == m.c1 && c2 == m.c2 && c3 == m.c3;
|
||||
@ -144,14 +149,15 @@ inline bool aiMatrix3x3t<TReal>::operator== (const aiMatrix4x4t<TReal>& m) const
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline bool aiMatrix3x3t<TReal>::operator!= (const aiMatrix4x4t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix3x3t<TReal>::operator!= (const aiMatrix4x4t<TReal>& m) const {
|
||||
return !(*this == m);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<typename TReal>
|
||||
inline bool aiMatrix3x3t<TReal>::Equal(const aiMatrix4x4t<TReal>& m, TReal epsilon) const {
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix3x3t<TReal>::Equal(const aiMatrix4x4t<TReal>& m, TReal epsilon) const {
|
||||
return
|
||||
std::abs(a1 - m.a1) <= epsilon &&
|
||||
std::abs(a2 - m.a2) <= epsilon &&
|
||||
@ -166,8 +172,8 @@ inline bool aiMatrix3x3t<TReal>::Equal(const aiMatrix4x4t<TReal>& m, TReal epsil
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Transpose()
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Transpose() {
|
||||
// (TReal&) don't remove, GCC complains cause of packed fields
|
||||
std::swap( (TReal&)a2, (TReal&)b1);
|
||||
std::swap( (TReal&)a3, (TReal&)c1);
|
||||
@ -177,15 +183,15 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Transpose()
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline TReal aiMatrix3x3t<TReal>::Determinant() const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
TReal aiMatrix3x3t<TReal>::Determinant() const {
|
||||
return a1*b2*c3 - a1*b3*c2 + a2*b3*c1 - a2*b1*c3 + a3*b1*c2 - a3*b2*c1;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Inverse()
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Inverse() {
|
||||
// Compute the reciprocal determinant
|
||||
TReal det = Determinant();
|
||||
if(det == static_cast<TReal>(0.0))
|
||||
@ -219,8 +225,8 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Inverse()
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::RotationZ(TReal a, aiMatrix3x3t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::RotationZ(TReal a, aiMatrix3x3t<TReal>& out) {
|
||||
out.a1 = out.b2 = std::cos(a);
|
||||
out.b1 = std::sin(a);
|
||||
out.a2 = - out.b1;
|
||||
@ -234,8 +240,8 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::RotationZ(TReal a, aiMatrix3x3t
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Returns a rotation matrix for a rotation around an arbitrary axis.
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Rotation( TReal a, const aiVector3t<TReal>& axis, aiMatrix3x3t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Rotation( TReal a, const aiVector3t<TReal>& axis, aiMatrix3x3t<TReal>& out) {
|
||||
TReal c = std::cos( a), s = std::sin( a), t = 1 - c;
|
||||
TReal x = axis.x, y = axis.y, z = axis.z;
|
||||
|
||||
@ -249,8 +255,8 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Rotation( TReal a, const aiVect
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Translation( const aiVector2t<TReal>& v, aiMatrix3x3t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Translation( const aiVector2t<TReal>& v, aiMatrix3x3t<TReal>& out) {
|
||||
out = aiMatrix3x3t<TReal>();
|
||||
out.a3 = v.x;
|
||||
out.b3 = v.y;
|
||||
@ -268,9 +274,8 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::Translation( const aiVector2t<T
|
||||
*/
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::FromToMatrix(const aiVector3t<TReal>& from,
|
||||
const aiVector3t<TReal>& to, aiMatrix3x3t<TReal>& mtx)
|
||||
{
|
||||
AI_FORCE_INLINE aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::FromToMatrix(const aiVector3t<TReal>& from,
|
||||
const aiVector3t<TReal>& to, aiMatrix3x3t<TReal>& mtx) {
|
||||
const TReal e = from * to;
|
||||
const TReal f = (e < 0)? -e:e;
|
||||
|
||||
@ -352,6 +357,5 @@ inline aiMatrix3x3t<TReal>& aiMatrix3x3t<TReal>::FromToMatrix(const aiVector3t<T
|
||||
return mtx;
|
||||
}
|
||||
|
||||
|
||||
#endif // __cplusplus
|
||||
#endif // AI_MATRIX3X3_INL_INC
|
||||
|
18
thirdparty/assimp/include/assimp/matrix4x4.h
vendored
18
thirdparty/assimp/include/assimp/matrix4x4.h
vendored
@ -47,8 +47,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_MATRIX4X4_H_INC
|
||||
#define AI_MATRIX4X4_H_INC
|
||||
|
||||
#include "vector3.h"
|
||||
#include "defs.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/vector3.h>
|
||||
#include <assimp/defs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -66,8 +70,7 @@ template<typename TReal> class aiQuaterniont;
|
||||
* defined thereby.
|
||||
*/
|
||||
template<typename TReal>
|
||||
class aiMatrix4x4t
|
||||
{
|
||||
class aiMatrix4x4t {
|
||||
public:
|
||||
|
||||
/** set to identity */
|
||||
@ -91,8 +94,6 @@ public:
|
||||
aiMatrix4x4t(const aiVector3t<TReal>& scaling, const aiQuaterniont<TReal>& rotation,
|
||||
const aiVector3t<TReal>& position);
|
||||
|
||||
public:
|
||||
|
||||
// array access operators
|
||||
/** @fn TReal* operator[] (unsigned int p_iIndex)
|
||||
* @param [in] p_iIndex - index of the row.
|
||||
@ -120,8 +121,6 @@ public:
|
||||
template <typename TOther>
|
||||
operator aiMatrix4x4t<TOther> () const;
|
||||
|
||||
public:
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
/** @brief Transpose the matrix */
|
||||
aiMatrix4x4t& Transpose();
|
||||
@ -182,7 +181,6 @@ public:
|
||||
void DecomposeNoScaling (aiQuaterniont<TReal>& rotation,
|
||||
aiVector3t<TReal>& position) const;
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
/** @brief Creates a trafo matrix from a set of euler angles
|
||||
* @param x Rotation angle for the x-axis, in radians
|
||||
@ -192,7 +190,6 @@ public:
|
||||
aiMatrix4x4t& FromEulerAnglesXYZ(TReal x, TReal y, TReal z);
|
||||
aiMatrix4x4t& FromEulerAnglesXYZ(const aiVector3t<TReal>& blubb);
|
||||
|
||||
public:
|
||||
// -------------------------------------------------------------------
|
||||
/** @brief Returns a rotation matrix for a rotation around the x axis
|
||||
* @param a Rotation angle, in radians
|
||||
@ -256,7 +253,6 @@ public:
|
||||
static aiMatrix4x4t& FromToMatrix(const aiVector3t<TReal>& from,
|
||||
const aiVector3t<TReal>& to, aiMatrix4x4t& out);
|
||||
|
||||
public:
|
||||
TReal a1, a2, a3, a4;
|
||||
TReal b1, b2, b3, b4;
|
||||
TReal c1, c2, c3, c4;
|
||||
|
168
thirdparty/assimp/include/assimp/matrix4x4.inl
vendored
168
thirdparty/assimp/include/assimp/matrix4x4.inl
vendored
@ -60,12 +60,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
aiMatrix4x4t<TReal>::aiMatrix4x4t() AI_NO_EXCEPT :
|
||||
a1(1.0f), a2(), a3(), a4(),
|
||||
b1(), b2(1.0f), b3(), b4(),
|
||||
c1(), c2(), c3(1.0f), c4(),
|
||||
d1(), d2(), d3(), d4(1.0f)
|
||||
{
|
||||
|
||||
a1(1.0f), a2(), a3(), a4(),
|
||||
b1(), b2(1.0f), b3(), b4(),
|
||||
c1(), c2(), c3(1.0f), c4(),
|
||||
d1(), d2(), d3(), d4(1.0f) {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
@ -74,19 +73,17 @@ aiMatrix4x4t<TReal>::aiMatrix4x4t (TReal _a1, TReal _a2, TReal _a3, TReal _a4,
|
||||
TReal _b1, TReal _b2, TReal _b3, TReal _b4,
|
||||
TReal _c1, TReal _c2, TReal _c3, TReal _c4,
|
||||
TReal _d1, TReal _d2, TReal _d3, TReal _d4) :
|
||||
a1(_a1), a2(_a2), a3(_a3), a4(_a4),
|
||||
b1(_b1), b2(_b2), b3(_b3), b4(_b4),
|
||||
c1(_c1), c2(_c2), c3(_c3), c4(_c4),
|
||||
d1(_d1), d2(_d2), d3(_d3), d4(_d4)
|
||||
{
|
||||
|
||||
a1(_a1), a2(_a2), a3(_a3), a4(_a4),
|
||||
b1(_b1), b2(_b2), b3(_b3), b4(_b4),
|
||||
c1(_c1), c2(_c2), c3(_c3), c4(_c4),
|
||||
d1(_d1), d2(_d2), d3(_d3), d4(_d4) {
|
||||
// empty
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
template <typename TOther>
|
||||
aiMatrix4x4t<TReal>::operator aiMatrix4x4t<TOther> () const
|
||||
{
|
||||
aiMatrix4x4t<TReal>::operator aiMatrix4x4t<TOther> () const {
|
||||
return aiMatrix4x4t<TOther>(static_cast<TOther>(a1),static_cast<TOther>(a2),static_cast<TOther>(a3),static_cast<TOther>(a4),
|
||||
static_cast<TOther>(b1),static_cast<TOther>(b2),static_cast<TOther>(b3),static_cast<TOther>(b4),
|
||||
static_cast<TOther>(c1),static_cast<TOther>(c2),static_cast<TOther>(c3),static_cast<TOther>(c4),
|
||||
@ -96,8 +93,8 @@ aiMatrix4x4t<TReal>::operator aiMatrix4x4t<TOther> () const
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiMatrix3x3t<TReal>& m)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiMatrix3x3t<TReal>& m) {
|
||||
a1 = m.a1; a2 = m.a2; a3 = m.a3; a4 = static_cast<TReal>(0.0);
|
||||
b1 = m.b1; b2 = m.b2; b3 = m.b3; b4 = static_cast<TReal>(0.0);
|
||||
c1 = m.c1; c2 = m.c2; c3 = m.c3; c4 = static_cast<TReal>(0.0);
|
||||
@ -106,8 +103,8 @@ inline aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiMatrix3x3t<TReal>& m)
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiVector3t<TReal>& scaling, const aiQuaterniont<TReal>& rotation, const aiVector3t<TReal>& position)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiVector3t<TReal>& scaling, const aiQuaterniont<TReal>& rotation, const aiVector3t<TReal>& position) {
|
||||
// build a 3x3 rotation matrix
|
||||
aiMatrix3x3t<TReal> m = rotation.GetMatrix();
|
||||
|
||||
@ -134,8 +131,8 @@ inline aiMatrix4x4t<TReal>::aiMatrix4x4t (const aiVector3t<TReal>& scaling, cons
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::operator *= (const aiMatrix4x4t<TReal>& m)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::operator *= (const aiMatrix4x4t<TReal>& m) {
|
||||
*this = aiMatrix4x4t<TReal>(
|
||||
m.a1 * a1 + m.b1 * a2 + m.c1 * a3 + m.d1 * a4,
|
||||
m.a2 * a1 + m.b2 * a2 + m.c2 * a3 + m.d2 * a4,
|
||||
@ -158,8 +155,7 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::operator *= (const aiMatrix4x4t
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator* (const TReal& aFloat) const
|
||||
{
|
||||
AI_FORCE_INLINE aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator* (const TReal& aFloat) const {
|
||||
aiMatrix4x4t<TReal> temp(
|
||||
a1 * aFloat,
|
||||
a2 * aFloat,
|
||||
@ -182,8 +178,8 @@ inline aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator* (const TReal& aFloat)
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator+ (const aiMatrix4x4t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator+ (const aiMatrix4x4t<TReal>& m) const {
|
||||
aiMatrix4x4t<TReal> temp(
|
||||
m.a1 + a1,
|
||||
m.a2 + a2,
|
||||
@ -206,18 +202,16 @@ inline aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator+ (const aiMatrix4x4t<TR
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator* (const aiMatrix4x4t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal> aiMatrix4x4t<TReal>::operator* (const aiMatrix4x4t<TReal>& m) const {
|
||||
aiMatrix4x4t<TReal> temp( *this);
|
||||
temp *= m;
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Transpose()
|
||||
{
|
||||
AI_FORCE_INLINE aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Transpose() {
|
||||
// (TReal&) don't remove, GCC complains cause of packed fields
|
||||
std::swap( (TReal&)b1, (TReal&)a2);
|
||||
std::swap( (TReal&)c1, (TReal&)a3);
|
||||
@ -228,11 +222,10 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Transpose()
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline TReal aiMatrix4x4t<TReal>::Determinant() const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
TReal aiMatrix4x4t<TReal>::Determinant() const {
|
||||
return a1*b2*c3*d4 - a1*b2*c4*d3 + a1*b3*c4*d2 - a1*b3*c2*d4
|
||||
+ a1*b4*c2*d3 - a1*b4*c3*d2 - a2*b3*c4*d1 + a2*b3*c1*d4
|
||||
- a2*b4*c1*d3 + a2*b4*c3*d1 - a2*b1*c3*d4 + a2*b1*c4*d3
|
||||
@ -243,8 +236,8 @@ inline TReal aiMatrix4x4t<TReal>::Determinant() const
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Inverse()
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Inverse() {
|
||||
// Compute the reciprocal determinant
|
||||
const TReal det = Determinant();
|
||||
if(det == static_cast<TReal>(0.0))
|
||||
@ -288,9 +281,10 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Inverse()
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) {
|
||||
AI_FORCE_INLINE
|
||||
TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) {
|
||||
if (p_iIndex > 3) {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
switch ( p_iIndex ) {
|
||||
case 0:
|
||||
@ -309,9 +303,10 @@ inline TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) {
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline const TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) const {
|
||||
AI_FORCE_INLINE
|
||||
const TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) const {
|
||||
if (p_iIndex > 3) {
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
switch ( p_iIndex ) {
|
||||
@ -331,8 +326,8 @@ inline const TReal* aiMatrix4x4t<TReal>::operator[](unsigned int p_iIndex) const
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline bool aiMatrix4x4t<TReal>::operator== (const aiMatrix4x4t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix4x4t<TReal>::operator== (const aiMatrix4x4t<TReal>& m) const {
|
||||
return (a1 == m.a1 && a2 == m.a2 && a3 == m.a3 && a4 == m.a4 &&
|
||||
b1 == m.b1 && b2 == m.b2 && b3 == m.b3 && b4 == m.b4 &&
|
||||
c1 == m.c1 && c2 == m.c2 && c3 == m.c3 && c4 == m.c4 &&
|
||||
@ -341,14 +336,15 @@ inline bool aiMatrix4x4t<TReal>::operator== (const aiMatrix4x4t<TReal>& m) const
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline bool aiMatrix4x4t<TReal>::operator!= (const aiMatrix4x4t<TReal>& m) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix4x4t<TReal>::operator!= (const aiMatrix4x4t<TReal>& m) const {
|
||||
return !(*this == m);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
template<typename TReal>
|
||||
inline bool aiMatrix4x4t<TReal>::Equal(const aiMatrix4x4t<TReal>& m, TReal epsilon) const {
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix4x4t<TReal>::Equal(const aiMatrix4x4t<TReal>& m, TReal epsilon) const {
|
||||
return
|
||||
std::abs(a1 - m.a1) <= epsilon &&
|
||||
std::abs(a2 - m.a2) <= epsilon &&
|
||||
@ -400,13 +396,10 @@ inline bool aiMatrix4x4t<TReal>::Equal(const aiMatrix4x4t<TReal>& m, TReal epsil
|
||||
\
|
||||
do {} while(false)
|
||||
|
||||
|
||||
|
||||
|
||||
template <typename TReal>
|
||||
inline void aiMatrix4x4t<TReal>::Decompose (aiVector3t<TReal>& pScaling, aiQuaterniont<TReal>& pRotation,
|
||||
aiVector3t<TReal>& pPosition) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
void aiMatrix4x4t<TReal>::Decompose (aiVector3t<TReal>& pScaling, aiQuaterniont<TReal>& pRotation,
|
||||
aiVector3t<TReal>& pPosition) const {
|
||||
ASSIMP_MATRIX4_4_DECOMPOSE_PART;
|
||||
|
||||
// build a 3x3 rotation matrix
|
||||
@ -419,7 +412,7 @@ inline void aiMatrix4x4t<TReal>::Decompose (aiVector3t<TReal>& pScaling, aiQuate
|
||||
}
|
||||
|
||||
template <typename TReal>
|
||||
inline
|
||||
AI_FORCE_INLINE
|
||||
void aiMatrix4x4t<TReal>::Decompose(aiVector3t<TReal>& pScaling, aiVector3t<TReal>& pRotation, aiVector3t<TReal>& pPosition) const {
|
||||
ASSIMP_MATRIX4_4_DECOMPOSE_PART;
|
||||
|
||||
@ -474,10 +467,10 @@ void aiMatrix4x4t<TReal>::Decompose(aiVector3t<TReal>& pScaling, aiVector3t<TRea
|
||||
#undef ASSIMP_MATRIX4_4_DECOMPOSE_PART
|
||||
|
||||
template <typename TReal>
|
||||
inline void aiMatrix4x4t<TReal>::Decompose(aiVector3t<TReal>& pScaling, aiVector3t<TReal>& pRotationAxis, TReal& pRotationAngle,
|
||||
aiVector3t<TReal>& pPosition) const
|
||||
{
|
||||
aiQuaterniont<TReal> pRotation;
|
||||
AI_FORCE_INLINE
|
||||
void aiMatrix4x4t<TReal>::Decompose(aiVector3t<TReal>& pScaling, aiVector3t<TReal>& pRotationAxis, TReal& pRotationAngle,
|
||||
aiVector3t<TReal>& pPosition) const {
|
||||
aiQuaterniont<TReal> pRotation;
|
||||
|
||||
Decompose(pScaling, pRotation, pPosition);
|
||||
pRotation.Normalize();
|
||||
@ -499,9 +492,9 @@ aiQuaterniont<TReal> pRotation;
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline void aiMatrix4x4t<TReal>::DecomposeNoScaling (aiQuaterniont<TReal>& rotation,
|
||||
aiVector3t<TReal>& position) const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
void aiMatrix4x4t<TReal>::DecomposeNoScaling (aiQuaterniont<TReal>& rotation,
|
||||
aiVector3t<TReal>& position) const {
|
||||
const aiMatrix4x4t<TReal>& _this = *this;
|
||||
|
||||
// extract translation
|
||||
@ -515,15 +508,15 @@ inline void aiMatrix4x4t<TReal>::DecomposeNoScaling (aiQuaterniont<TReal>& rotat
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromEulerAnglesXYZ(const aiVector3t<TReal>& blubb)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromEulerAnglesXYZ(const aiVector3t<TReal>& blubb) {
|
||||
return FromEulerAnglesXYZ(blubb.x,blubb.y,blubb.z);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromEulerAnglesXYZ(TReal x, TReal y, TReal z)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromEulerAnglesXYZ(TReal x, TReal y, TReal z) {
|
||||
aiMatrix4x4t<TReal>& _this = *this;
|
||||
|
||||
TReal cx = std::cos(x);
|
||||
@ -551,8 +544,8 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromEulerAnglesXYZ(TReal x, TRe
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline bool aiMatrix4x4t<TReal>::IsIdentity() const
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
bool aiMatrix4x4t<TReal>::IsIdentity() const {
|
||||
// Use a small epsilon to solve floating-point inaccuracies
|
||||
const static TReal epsilon = 10e-3f;
|
||||
|
||||
@ -576,8 +569,8 @@ inline bool aiMatrix4x4t<TReal>::IsIdentity() const
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationX(TReal a, aiMatrix4x4t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationX(TReal a, aiMatrix4x4t<TReal>& out) {
|
||||
/*
|
||||
| 1 0 0 0 |
|
||||
M = | 0 cos(A) -sin(A) 0 |
|
||||
@ -591,8 +584,8 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationX(TReal a, aiMatrix4x4t
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationY(TReal a, aiMatrix4x4t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationY(TReal a, aiMatrix4x4t<TReal>& out) {
|
||||
/*
|
||||
| cos(A) 0 sin(A) 0 |
|
||||
M = | 0 1 0 0 |
|
||||
@ -607,8 +600,8 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationY(TReal a, aiMatrix4x4t
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationZ(TReal a, aiMatrix4x4t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationZ(TReal a, aiMatrix4x4t<TReal>& out) {
|
||||
/*
|
||||
| cos(A) -sin(A) 0 0 |
|
||||
M = | sin(A) cos(A) 0 0 |
|
||||
@ -623,26 +616,25 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::RotationZ(TReal a, aiMatrix4x4t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// Returns a rotation matrix for a rotation around an arbitrary axis.
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Rotation( TReal a, const aiVector3t<TReal>& axis, aiMatrix4x4t<TReal>& out)
|
||||
{
|
||||
TReal c = std::cos( a), s = std::sin( a), t = 1 - c;
|
||||
TReal x = axis.x, y = axis.y, z = axis.z;
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Rotation( TReal a, const aiVector3t<TReal>& axis, aiMatrix4x4t<TReal>& out) {
|
||||
TReal c = std::cos( a), s = std::sin( a), t = 1 - c;
|
||||
TReal x = axis.x, y = axis.y, z = axis.z;
|
||||
|
||||
// Many thanks to MathWorld and Wikipedia
|
||||
out.a1 = t*x*x + c; out.a2 = t*x*y - s*z; out.a3 = t*x*z + s*y;
|
||||
out.b1 = t*x*y + s*z; out.b2 = t*y*y + c; out.b3 = t*y*z - s*x;
|
||||
out.c1 = t*x*z - s*y; out.c2 = t*y*z + s*x; out.c3 = t*z*z + c;
|
||||
out.a4 = out.b4 = out.c4 = static_cast<TReal>(0.0);
|
||||
out.d1 = out.d2 = out.d3 = static_cast<TReal>(0.0);
|
||||
out.d4 = static_cast<TReal>(1.0);
|
||||
// Many thanks to MathWorld and Wikipedia
|
||||
out.a1 = t*x*x + c; out.a2 = t*x*y - s*z; out.a3 = t*x*z + s*y;
|
||||
out.b1 = t*x*y + s*z; out.b2 = t*y*y + c; out.b3 = t*y*z - s*x;
|
||||
out.c1 = t*x*z - s*y; out.c2 = t*y*z + s*x; out.c3 = t*z*z + c;
|
||||
out.a4 = out.b4 = out.c4 = static_cast<TReal>(0.0);
|
||||
out.d1 = out.d2 = out.d3 = static_cast<TReal>(0.0);
|
||||
out.d4 = static_cast<TReal>(1.0);
|
||||
|
||||
return out;
|
||||
return out;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Translation( const aiVector3t<TReal>& v, aiMatrix4x4t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Translation( const aiVector3t<TReal>& v, aiMatrix4x4t<TReal>& out) {
|
||||
out = aiMatrix4x4t<TReal>();
|
||||
out.a4 = v.x;
|
||||
out.b4 = v.y;
|
||||
@ -652,8 +644,8 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Translation( const aiVector3t<T
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Scaling( const aiVector3t<TReal>& v, aiMatrix4x4t<TReal>& out)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Scaling( const aiVector3t<TReal>& v, aiMatrix4x4t<TReal>& out) {
|
||||
out = aiMatrix4x4t<TReal>();
|
||||
out.a1 = v.x;
|
||||
out.b2 = v.y;
|
||||
@ -672,9 +664,9 @@ inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::Scaling( const aiVector3t<TReal
|
||||
*/
|
||||
// ----------------------------------------------------------------------------------------
|
||||
template <typename TReal>
|
||||
inline aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromToMatrix(const aiVector3t<TReal>& from,
|
||||
const aiVector3t<TReal>& to, aiMatrix4x4t<TReal>& mtx)
|
||||
{
|
||||
AI_FORCE_INLINE
|
||||
aiMatrix4x4t<TReal>& aiMatrix4x4t<TReal>::FromToMatrix(const aiVector3t<TReal>& from,
|
||||
const aiVector3t<TReal>& to, aiMatrix4x4t<TReal>& mtx) {
|
||||
aiMatrix3x3t<TReal> m3;
|
||||
aiMatrix3x3t<TReal>::FromToMatrix(from,to,m3);
|
||||
mtx = aiMatrix4x4t<TReal>(m3);
|
||||
|
40
thirdparty/assimp/include/assimp/mesh.h
vendored
40
thirdparty/assimp/include/assimp/mesh.h
vendored
@ -48,11 +48,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_MESH_H_INC
|
||||
#define AI_MESH_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
#include <assimp/aabb.h>
|
||||
|
||||
struct aiNode;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@ -250,6 +252,9 @@ struct aiVertexWeight {
|
||||
};
|
||||
|
||||
|
||||
// Forward declare aiNode (pointer use only)
|
||||
struct aiNode;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
/** @brief A single bone of a mesh.
|
||||
*
|
||||
@ -266,12 +271,16 @@ struct aiBone {
|
||||
//! The maximum value for this member is #AI_MAX_BONE_WEIGHTS.
|
||||
unsigned int mNumWeights;
|
||||
|
||||
#ifndef ASSIMP_BUILD_NO_ARMATUREPOPULATE_PROCESS
|
||||
// The bone armature node - used for skeleton conversion
|
||||
aiNode* mArmature;
|
||||
// you must enable aiProcess_PopulateArmatureData to populate this
|
||||
C_STRUCT aiNode* mArmature;
|
||||
|
||||
// The bone node in the scene - used for skeleton conversion
|
||||
aiNode* mNode;
|
||||
// you must enable aiProcess_PopulateArmatureData to populate this
|
||||
C_STRUCT aiNode* mNode;
|
||||
|
||||
#endif
|
||||
//! The influence weights of this bone, by vertex index.
|
||||
C_STRUCT aiVertexWeight* mWeights;
|
||||
|
||||
@ -288,11 +297,6 @@ struct aiBone {
|
||||
*/
|
||||
C_STRUCT aiMatrix4x4 mOffsetMatrix;
|
||||
|
||||
/** Matrix used for the global rest transform
|
||||
* This tells you directly the rest without extending as required in most game engine implementations
|
||||
* */
|
||||
C_STRUCT aiMatrix4x4 mRestMatrix;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
//! Default constructor
|
||||
@ -431,11 +435,11 @@ struct aiAnimMesh
|
||||
/**Anim Mesh name */
|
||||
C_STRUCT aiString mName;
|
||||
|
||||
/** Replacement for aiMesh::mVertices. If this array is non-NULL,
|
||||
/** Replacement for aiMesh::mVertices. If this array is non-nullptr,
|
||||
* it *must* contain mNumVertices entries. The corresponding
|
||||
* array in the host mesh must be non-NULL as well - animation
|
||||
* array in the host mesh must be non-nullptr as well - animation
|
||||
* meshes may neither add or nor remove vertex components (if
|
||||
* a replacement array is NULL and the corresponding source
|
||||
* a replacement array is nullptr and the corresponding source
|
||||
* array is not, the source data is taken instead)*/
|
||||
C_STRUCT aiVector3D* mVertices;
|
||||
|
||||
@ -609,7 +613,7 @@ struct aiMesh
|
||||
C_STRUCT aiVector3D* mVertices;
|
||||
|
||||
/** Vertex normals.
|
||||
* The array contains normalized vectors, NULL if not present.
|
||||
* The array contains normalized vectors, nullptr if not present.
|
||||
* The array is mNumVertices in size. Normals are undefined for
|
||||
* point and line primitives. A mesh consisting of points and
|
||||
* lines only may not have normal vectors. Meshes with mixed
|
||||
@ -632,7 +636,7 @@ struct aiMesh
|
||||
|
||||
/** Vertex tangents.
|
||||
* The tangent of a vertex points in the direction of the positive
|
||||
* X texture axis. The array contains normalized vectors, NULL if
|
||||
* X texture axis. The array contains normalized vectors, nullptr if
|
||||
* not present. The array is mNumVertices in size. A mesh consisting
|
||||
* of points and lines only may not have normal vectors. Meshes with
|
||||
* mixed primitive types (i.e. lines and triangles) may have
|
||||
@ -646,7 +650,7 @@ struct aiMesh
|
||||
|
||||
/** Vertex bitangents.
|
||||
* The bitangent of a vertex points in the direction of the positive
|
||||
* Y texture axis. The array contains normalized vectors, NULL if not
|
||||
* Y texture axis. The array contains normalized vectors, nullptr if not
|
||||
* present. The array is mNumVertices in size.
|
||||
* @note If the mesh contains tangents, it automatically also contains
|
||||
* bitangents.
|
||||
@ -655,14 +659,14 @@ struct aiMesh
|
||||
|
||||
/** Vertex color sets.
|
||||
* A mesh may contain 0 to #AI_MAX_NUMBER_OF_COLOR_SETS vertex
|
||||
* colors per vertex. NULL if not present. Each array is
|
||||
* colors per vertex. nullptr if not present. Each array is
|
||||
* mNumVertices in size if present.
|
||||
*/
|
||||
C_STRUCT aiColor4D* mColors[AI_MAX_NUMBER_OF_COLOR_SETS];
|
||||
|
||||
/** Vertex texture coords, also known as UV channels.
|
||||
* A mesh may contain 0 to AI_MAX_NUMBER_OF_TEXTURECOORDS per
|
||||
* vertex. NULL if not present. The array is mNumVertices in size.
|
||||
* vertex. nullptr if not present. The array is mNumVertices in size.
|
||||
*/
|
||||
C_STRUCT aiVector3D* mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];
|
||||
|
||||
@ -684,7 +688,7 @@ struct aiMesh
|
||||
C_STRUCT aiFace* mFaces;
|
||||
|
||||
/** The number of bones this mesh contains.
|
||||
* Can be 0, in which case the mBones array is NULL.
|
||||
* Can be 0, in which case the mBones array is nullptr.
|
||||
*/
|
||||
unsigned int mNumBones;
|
||||
|
||||
|
4
thirdparty/assimp/include/assimp/metadata.h
vendored
4
thirdparty/assimp/include/assimp/metadata.h
vendored
@ -48,6 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_METADATA_H_INC
|
||||
#define AI_METADATA_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER <= 1500)
|
||||
# include "Compiler/pstdint.h"
|
||||
#else
|
||||
|
@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
@ -44,9 +42,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/** @file pbrmaterial.h
|
||||
* @brief Defines the material system of the library
|
||||
*/
|
||||
#pragma once
|
||||
#ifndef AI_PBRMATERIAL_H_INC
|
||||
#define AI_PBRMATERIAL_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#define AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_FACTOR "$mat.gltf.pbrMetallicRoughness.baseColorFactor", 0, 0
|
||||
#define AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLIC_FACTOR "$mat.gltf.pbrMetallicRoughness.metallicFactor", 0, 0
|
||||
#define AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_ROUGHNESS_FACTOR "$mat.gltf.pbrMetallicRoughness.roughnessFactor", 0, 0
|
||||
|
21
thirdparty/assimp/include/assimp/postprocess.h
vendored
21
thirdparty/assimp/include/assimp/postprocess.h
vendored
@ -47,7 +47,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_POSTPROCESS_H_INC
|
||||
#define AI_POSTPROCESS_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#include <assimp/types.h>
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -316,6 +320,19 @@ enum aiPostProcessSteps
|
||||
*/
|
||||
aiProcess_FixInfacingNormals = 0x2000,
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
/**
|
||||
* This step generically populates aiBone->mArmature and aiBone->mNode generically
|
||||
* The point of these is it saves you later having to calculate these elements
|
||||
* This is useful when handling rest information or skin information
|
||||
* If you have multiple armatures on your models we strongly recommend enabling this
|
||||
* Instead of writing your own multi-root, multi-armature lookups we have done the
|
||||
* hard work for you :)
|
||||
*/
|
||||
aiProcess_PopulateArmatureData = 0x4000,
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
/** <hr>This step splits meshes with more than one primitive type in
|
||||
* homogeneous sub-meshes.
|
||||
@ -533,6 +550,8 @@ enum aiPostProcessSteps
|
||||
*/
|
||||
aiProcess_Debone = 0x4000000,
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
/** <hr>This step will perform a global scale of the model.
|
||||
*
|
||||
|
31
thirdparty/assimp/include/assimp/qnan.h
vendored
31
thirdparty/assimp/include/assimp/qnan.h
vendored
@ -50,19 +50,23 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* but last time I checked compiler coverage was so bad that I decided
|
||||
* to reinvent the wheel.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#ifndef AI_QNAN_H_INCLUDED
|
||||
#define AI_QNAN_H_INCLUDED
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/defs.h>
|
||||
|
||||
#include <limits>
|
||||
#include <stdint.h>
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
/** Data structure to represent the bit pattern of a 32 Bit
|
||||
* IEEE 754 floating-point number. */
|
||||
union _IEEESingle
|
||||
{
|
||||
union _IEEESingle {
|
||||
float Float;
|
||||
struct
|
||||
{
|
||||
@ -75,8 +79,7 @@ union _IEEESingle
|
||||
// ---------------------------------------------------------------------------
|
||||
/** Data structure to represent the bit pattern of a 64 Bit
|
||||
* IEEE 754 floating-point number. */
|
||||
union _IEEEDouble
|
||||
{
|
||||
union _IEEEDouble {
|
||||
double Double;
|
||||
struct
|
||||
{
|
||||
@ -89,8 +92,7 @@ union _IEEEDouble
|
||||
// ---------------------------------------------------------------------------
|
||||
/** Check whether a given float is qNaN.
|
||||
* @param in Input value */
|
||||
AI_FORCE_INLINE bool is_qnan(float in)
|
||||
{
|
||||
AI_FORCE_INLINE bool is_qnan(float in) {
|
||||
// the straightforward solution does not work:
|
||||
// return (in != in);
|
||||
// compiler generates code like this
|
||||
@ -107,8 +109,7 @@ AI_FORCE_INLINE bool is_qnan(float in)
|
||||
// ---------------------------------------------------------------------------
|
||||
/** Check whether a given double is qNaN.
|
||||
* @param in Input value */
|
||||
AI_FORCE_INLINE bool is_qnan(double in)
|
||||
{
|
||||
AI_FORCE_INLINE bool is_qnan(double in) {
|
||||
// the straightforward solution does not work:
|
||||
// return (in != in);
|
||||
// compiler generates code like this
|
||||
@ -127,8 +128,7 @@ AI_FORCE_INLINE bool is_qnan(double in)
|
||||
*
|
||||
* Denorms return false, they're treated like normal values.
|
||||
* @param in Input value */
|
||||
AI_FORCE_INLINE bool is_special_float(float in)
|
||||
{
|
||||
AI_FORCE_INLINE bool is_special_float(float in) {
|
||||
_IEEESingle temp;
|
||||
memcpy(&temp, &in, sizeof(float));
|
||||
return (temp.IEEE.Exp == (1u << 8)-1);
|
||||
@ -139,8 +139,7 @@ AI_FORCE_INLINE bool is_special_float(float in)
|
||||
*
|
||||
* Denorms return false, they're treated like normal values.
|
||||
* @param in Input value */
|
||||
AI_FORCE_INLINE bool is_special_float(double in)
|
||||
{
|
||||
AI_FORCE_INLINE bool is_special_float(double in) {
|
||||
_IEEESingle temp;
|
||||
memcpy(&temp, &in, sizeof(float));
|
||||
return (temp.IEEE.Exp == (1u << 11)-1);
|
||||
@ -150,15 +149,13 @@ AI_FORCE_INLINE bool is_special_float(double in)
|
||||
/** Check whether a float is NOT qNaN.
|
||||
* @param in Input value */
|
||||
template<class TReal>
|
||||
AI_FORCE_INLINE bool is_not_qnan(TReal in)
|
||||
{
|
||||
AI_FORCE_INLINE bool is_not_qnan(TReal in) {
|
||||
return !is_qnan(in);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
/** @brief Get a fresh qnan. */
|
||||
AI_FORCE_INLINE ai_real get_qnan()
|
||||
{
|
||||
AI_FORCE_INLINE ai_real get_qnan() {
|
||||
return std::numeric_limits<ai_real>::quiet_NaN();
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include "defs.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/defs.h>
|
||||
|
||||
template <typename TReal> class aiVector3t;
|
||||
template <typename TReal> class aiMatrix3x3t;
|
||||
|
@ -48,8 +48,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_QUATERNION_INL_INC
|
||||
#define AI_QUATERNION_INL_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include "quaternion.h"
|
||||
#include <assimp/quaternion.h>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
|
42
thirdparty/assimp/include/assimp/scene.h
vendored
42
thirdparty/assimp/include/assimp/scene.h
vendored
@ -48,14 +48,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_SCENE_H_INC
|
||||
#define AI_SCENE_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#include "texture.h"
|
||||
#include "mesh.h"
|
||||
#include "light.h"
|
||||
#include "camera.h"
|
||||
#include "material.h"
|
||||
#include "anim.h"
|
||||
#include "metadata.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
#include <assimp/texture.h>
|
||||
#include <assimp/mesh.h>
|
||||
#include <assimp/light.h>
|
||||
#include <assimp/camera.h>
|
||||
#include <assimp/material.h>
|
||||
#include <assimp/anim.h>
|
||||
#include <assimp/metadata.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
# include <cstdlib>
|
||||
@ -106,13 +110,13 @@ struct ASSIMP_API aiNode
|
||||
/** The transformation relative to the node's parent. */
|
||||
C_STRUCT aiMatrix4x4 mTransformation;
|
||||
|
||||
/** Parent node. NULL if this node is the root node. */
|
||||
/** Parent node. nullptr if this node is the root node. */
|
||||
C_STRUCT aiNode* mParent;
|
||||
|
||||
/** The number of child nodes of this node. */
|
||||
unsigned int mNumChildren;
|
||||
|
||||
/** The child nodes of this node. NULL if mNumChildren is 0. */
|
||||
/** The child nodes of this node. nullptr if mNumChildren is 0. */
|
||||
C_STRUCT aiNode** mChildren;
|
||||
|
||||
/** The number of meshes of this node. */
|
||||
@ -123,7 +127,7 @@ struct ASSIMP_API aiNode
|
||||
*/
|
||||
unsigned int* mMeshes;
|
||||
|
||||
/** Metadata associated with this node or NULL if there is no metadata.
|
||||
/** Metadata associated with this node or nullptr if there is no metadata.
|
||||
* Whether any metadata is generated depends on the source file format. See the
|
||||
* @link importer_notes @endlink page for more information on every source file
|
||||
* format. Importers that don't document any metadata don't write any.
|
||||
@ -145,7 +149,7 @@ struct ASSIMP_API aiNode
|
||||
* of the scene.
|
||||
*
|
||||
* @param name Name to search for
|
||||
* @return NULL or a valid Node if the search was successful.
|
||||
* @return nullptr or a valid Node if the search was successful.
|
||||
*/
|
||||
inline
|
||||
const aiNode* FindNode(const aiString& name) const {
|
||||
@ -340,7 +344,7 @@ struct aiScene
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
//! Default constructor - set everything to 0/NULL
|
||||
//! Default constructor - set everything to 0/nullptr
|
||||
ASSIMP_API aiScene();
|
||||
|
||||
//! Destructor
|
||||
@ -349,33 +353,33 @@ struct aiScene
|
||||
//! Check whether the scene contains meshes
|
||||
//! Unless no special scene flags are set this will always be true.
|
||||
inline bool HasMeshes() const {
|
||||
return mMeshes != NULL && mNumMeshes > 0;
|
||||
return mMeshes != nullptr && mNumMeshes > 0;
|
||||
}
|
||||
|
||||
//! Check whether the scene contains materials
|
||||
//! Unless no special scene flags are set this will always be true.
|
||||
inline bool HasMaterials() const {
|
||||
return mMaterials != NULL && mNumMaterials > 0;
|
||||
return mMaterials != nullptr && mNumMaterials > 0;
|
||||
}
|
||||
|
||||
//! Check whether the scene contains lights
|
||||
inline bool HasLights() const {
|
||||
return mLights != NULL && mNumLights > 0;
|
||||
return mLights != nullptr && mNumLights > 0;
|
||||
}
|
||||
|
||||
//! Check whether the scene contains textures
|
||||
inline bool HasTextures() const {
|
||||
return mTextures != NULL && mNumTextures > 0;
|
||||
return mTextures != nullptr && mNumTextures > 0;
|
||||
}
|
||||
|
||||
//! Check whether the scene contains cameras
|
||||
inline bool HasCameras() const {
|
||||
return mCameras != NULL && mNumCameras > 0;
|
||||
return mCameras != nullptr && mNumCameras > 0;
|
||||
}
|
||||
|
||||
//! Check whether the scene contains animations
|
||||
inline bool HasAnimations() const {
|
||||
return mAnimations != NULL && mNumAnimations > 0;
|
||||
return mAnimations != nullptr && mNumAnimations > 0;
|
||||
}
|
||||
|
||||
//! Returns a short filename from a full path
|
||||
|
13
thirdparty/assimp/include/assimp/texture.h
vendored
13
thirdparty/assimp/include/assimp/texture.h
vendored
@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
|
||||
|
||||
Copyright (c) 2006-2019, assimp team
|
||||
|
||||
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use of this software in source and binary forms,
|
||||
@ -53,13 +51,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_TEXTURE_H_INC
|
||||
#define AI_TEXTURE_H_INC
|
||||
|
||||
#include "types.h"
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include <assimp/types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
/** \def AI_EMBEDDED_TEXNAME_PREFIX
|
||||
@ -79,7 +80,6 @@ extern "C" {
|
||||
# define AI_MAKE_EMBEDDED_TEXNAME(_n_) AI_EMBEDDED_TEXNAME_PREFIX # _n_
|
||||
#endif
|
||||
|
||||
|
||||
#include "./Compiler/pushpack1.h"
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
@ -87,8 +87,7 @@ extern "C" {
|
||||
*
|
||||
* Used by aiTexture.
|
||||
*/
|
||||
struct aiTexel
|
||||
{
|
||||
struct aiTexel {
|
||||
unsigned char b,g,r,a;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
40
thirdparty/assimp/include/assimp/types.h
vendored
40
thirdparty/assimp/include/assimp/types.h
vendored
@ -48,22 +48,30 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_TYPES_H_INC
|
||||
#define AI_TYPES_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
// Some runtime headers
|
||||
#include <sys/types.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
|
||||
// Our compile configuration
|
||||
#include "defs.h"
|
||||
#include <assimp/defs.h>
|
||||
|
||||
// Some types moved to separate header due to size of operators
|
||||
#include "vector3.h"
|
||||
#include "vector2.h"
|
||||
#include "color4.h"
|
||||
#include "matrix3x3.h"
|
||||
#include "matrix4x4.h"
|
||||
#include "quaternion.h"
|
||||
#include <assimp/vector3.h>
|
||||
#include <assimp/vector2.h>
|
||||
#include <assimp/color4.h>
|
||||
#include <assimp/matrix3x3.h>
|
||||
#include <assimp/matrix4x4.h>
|
||||
#include <assimp/quaternion.h>
|
||||
|
||||
typedef int32_t ai_int32;
|
||||
typedef uint32_t ai_uint32 ;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <cstring>
|
||||
@ -71,7 +79,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <string> // for aiString::Set(const std::string&)
|
||||
|
||||
namespace Assimp {
|
||||
//! @cond never
|
||||
//! @cond never
|
||||
namespace Intern {
|
||||
// --------------------------------------------------------------------
|
||||
/** @brief Internal helper class to utilize our internal new/delete
|
||||
@ -269,8 +277,8 @@ struct aiString
|
||||
}
|
||||
|
||||
/** Copy constructor */
|
||||
aiString(const aiString& rOther) :
|
||||
length(rOther.length)
|
||||
aiString(const aiString& rOther)
|
||||
: length(rOther.length)
|
||||
{
|
||||
// Crop the string to the maximum length
|
||||
length = length>=MAXLEN?MAXLEN-1:length;
|
||||
@ -280,7 +288,7 @@ struct aiString
|
||||
|
||||
/** Constructor from std::string */
|
||||
explicit aiString(const std::string& pString) :
|
||||
length(pString.length())
|
||||
length( (ai_uint32) pString.length())
|
||||
{
|
||||
length = length>=MAXLEN?MAXLEN-1:length;
|
||||
memcpy( data, pString.c_str(), length);
|
||||
@ -292,15 +300,15 @@ struct aiString
|
||||
if( pString.length() > MAXLEN - 1) {
|
||||
return;
|
||||
}
|
||||
length = pString.length();
|
||||
length = (ai_uint32)pString.length();
|
||||
memcpy( data, pString.c_str(), length);
|
||||
data[length] = 0;
|
||||
}
|
||||
|
||||
/** Copy a const char* to the aiString */
|
||||
void Set( const char* sz) {
|
||||
const size_t len = ::strlen(sz);
|
||||
if( len > MAXLEN - 1) {
|
||||
const ai_int32 len = (ai_uint32) ::strlen(sz);
|
||||
if( len > (ai_int32)MAXLEN - 1) {
|
||||
return;
|
||||
}
|
||||
length = len;
|
||||
@ -346,7 +354,7 @@ struct aiString
|
||||
|
||||
/** Append a string to the string */
|
||||
void Append (const char* app) {
|
||||
const size_t len = ::strlen(app);
|
||||
const ai_uint32 len = (ai_uint32) ::strlen(app);
|
||||
if (!len) {
|
||||
return;
|
||||
}
|
||||
@ -379,7 +387,7 @@ struct aiString
|
||||
/** Binary length of the string excluding the terminal 0. This is NOT the
|
||||
* logical length of strings containing UTF-8 multi-byte sequences! It's
|
||||
* the number of bytes from the beginning of the string to its end.*/
|
||||
size_t length;
|
||||
ai_uint32 length;
|
||||
|
||||
/** String buffer. Size limit is MAXLEN */
|
||||
char data[MAXLEN];
|
||||
|
4
thirdparty/assimp/include/assimp/vector2.h
vendored
4
thirdparty/assimp/include/assimp/vector2.h
vendored
@ -47,6 +47,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#ifndef AI_VECTOR2D_H_INC
|
||||
#define AI_VECTOR2D_H_INC
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
# include <cmath>
|
||||
#else
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user