Merge branch 'master' into FBXParser_check_inputlength_fix
commit
5e979d72c9
|
@ -41,13 +41,13 @@ CMAKE_MINIMUM_REQUIRED( VERSION 3.0 )
|
||||||
# Toggles the use of the hunter package manager
|
# Toggles the use of the hunter package manager
|
||||||
option(HUNTER_ENABLED "Enable Hunter package manager support" OFF)
|
option(HUNTER_ENABLED "Enable Hunter package manager support" OFF)
|
||||||
|
|
||||||
include("cmake/HunterGate.cmake")
|
IF(HUNTER_ENABLED)
|
||||||
HunterGate(
|
include("cmake/HunterGate.cmake")
|
||||||
|
HunterGate(
|
||||||
URL "https://github.com/ruslo/hunter/archive/v0.23.176.tar.gz"
|
URL "https://github.com/ruslo/hunter/archive/v0.23.176.tar.gz"
|
||||||
SHA1 "2e9ae973d028660b735ac4c6142725ca36a0048a"
|
SHA1 "2e9ae973d028660b735ac4c6142725ca36a0048a"
|
||||||
)
|
)
|
||||||
|
|
||||||
IF(HUNTER_ENABLED)
|
|
||||||
add_definitions(-DASSIMP_USE_HUNTER)
|
add_definitions(-DASSIMP_USE_HUNTER)
|
||||||
ENDIF(HUNTER_ENABLED)
|
ENDIF(HUNTER_ENABLED)
|
||||||
|
|
||||||
|
@ -437,7 +437,9 @@ ELSE(HUNTER_ENABLED)
|
||||||
DESTINATION "${ASSIMP_LIB_INSTALL_DIR}/cmake/assimp-${ASSIMP_VERSION_MAJOR}.${ASSIMP_VERSION_MINOR}" COMPONENT ${LIBASSIMP-DEV_COMPONENT})
|
DESTINATION "${ASSIMP_LIB_INSTALL_DIR}/cmake/assimp-${ASSIMP_VERSION_MAJOR}.${ASSIMP_VERSION_MINOR}" COMPONENT ${LIBASSIMP-DEV_COMPONENT})
|
||||||
ENDIF(HUNTER_ENABLED)
|
ENDIF(HUNTER_ENABLED)
|
||||||
|
|
||||||
FIND_PACKAGE( DirectX )
|
if (ASSIMP_BUILD_SAMPLES OR ASSIMP_BUILD_SAMPLES)
|
||||||
|
FIND_PACKAGE(DirectX)
|
||||||
|
endif(ASSIMP_BUILD_SAMPLES OR ASSIMP_BUILD_SAMPLES)
|
||||||
|
|
||||||
IF( BUILD_DOCS )
|
IF( BUILD_DOCS )
|
||||||
ADD_SUBDIRECTORY(doc)
|
ADD_SUBDIRECTORY(doc)
|
||||||
|
|
|
@ -198,6 +198,7 @@ SET( Common_SRCS
|
||||||
Common/CreateAnimMesh.cpp
|
Common/CreateAnimMesh.cpp
|
||||||
Common/simd.h
|
Common/simd.h
|
||||||
Common/simd.cpp
|
Common/simd.cpp
|
||||||
|
Common/material.cpp
|
||||||
)
|
)
|
||||||
SOURCE_GROUP(Common FILES ${Common_SRCS})
|
SOURCE_GROUP(Common FILES ${Common_SRCS})
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (assimp)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2020, 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.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// @file material.cpp
|
||||||
|
/** Implement common material related functions. */
|
||||||
|
|
||||||
|
#include <assimp/ai_assert.h>
|
||||||
|
#include <assimp/material.h>
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
const char* TextureTypeToString(aiTextureType in)
|
||||||
|
{
|
||||||
|
switch (in)
|
||||||
|
{
|
||||||
|
case aiTextureType_NONE:
|
||||||
|
return "n/a";
|
||||||
|
case aiTextureType_DIFFUSE:
|
||||||
|
return "Diffuse";
|
||||||
|
case aiTextureType_SPECULAR:
|
||||||
|
return "Specular";
|
||||||
|
case aiTextureType_AMBIENT:
|
||||||
|
return "Ambient";
|
||||||
|
case aiTextureType_EMISSIVE:
|
||||||
|
return "Emissive";
|
||||||
|
case aiTextureType_OPACITY:
|
||||||
|
return "Opacity";
|
||||||
|
case aiTextureType_NORMALS:
|
||||||
|
return "Normals";
|
||||||
|
case aiTextureType_HEIGHT:
|
||||||
|
return "Height";
|
||||||
|
case aiTextureType_SHININESS:
|
||||||
|
return "Shininess";
|
||||||
|
case aiTextureType_DISPLACEMENT:
|
||||||
|
return "Displacement";
|
||||||
|
case aiTextureType_LIGHTMAP:
|
||||||
|
return "Lightmap";
|
||||||
|
case aiTextureType_REFLECTION:
|
||||||
|
return "Reflection";
|
||||||
|
case aiTextureType_BASE_COLOR:
|
||||||
|
return "BaseColor";
|
||||||
|
case aiTextureType_NORMAL_CAMERA:
|
||||||
|
return "NormalCamera";
|
||||||
|
case aiTextureType_EMISSION_COLOR:
|
||||||
|
return "EmissionColor";
|
||||||
|
case aiTextureType_METALNESS:
|
||||||
|
return "Metalness";
|
||||||
|
case aiTextureType_DIFFUSE_ROUGHNESS:
|
||||||
|
return "DiffuseRoughness";
|
||||||
|
case aiTextureType_AMBIENT_OCCLUSION:
|
||||||
|
return "AmbientOcclusion";
|
||||||
|
case aiTextureType_UNKNOWN:
|
||||||
|
return "Unknown";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ai_assert(false);
|
||||||
|
return "BUG";
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
|
||||||
|
|
||||||
Copyright (c) 2006-2020, assimp team
|
Copyright (c) 2006-2020, assimp team
|
||||||
|
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use of this software in source and binary forms,
|
Redistribution and use of this software in source and binary forms,
|
||||||
|
@ -36,7 +35,6 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#include "ArmaturePopulate.h"
|
#include "ArmaturePopulate.h"
|
||||||
|
@ -50,219 +48,215 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
/// The default class constructor.
|
/// The default class constructor.
|
||||||
ArmaturePopulate::ArmaturePopulate() : BaseProcess()
|
ArmaturePopulate::ArmaturePopulate() :
|
||||||
{}
|
BaseProcess() {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
/// The class destructor.
|
/// The class destructor.
|
||||||
ArmaturePopulate::~ArmaturePopulate()
|
ArmaturePopulate::~ArmaturePopulate() {
|
||||||
{}
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
bool ArmaturePopulate::IsActive(unsigned int pFlags) const {
|
bool ArmaturePopulate::IsActive(unsigned int pFlags) const {
|
||||||
return (pFlags & aiProcess_PopulateArmatureData) != 0;
|
return (pFlags & aiProcess_PopulateArmatureData) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArmaturePopulate::SetupProperties(const Importer *pImp) {
|
void ArmaturePopulate::SetupProperties(const Importer *pImp) {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArmaturePopulate::Execute(aiScene *out) {
|
void ArmaturePopulate::Execute(aiScene *out) {
|
||||||
|
|
||||||
// Now convert all bone positions to the correct mOffsetMatrix
|
// Now convert all bone positions to the correct mOffsetMatrix
|
||||||
std::vector<aiBone *> bones;
|
std::vector<aiBone *> bones;
|
||||||
std::vector<aiNode *> nodes;
|
std::vector<aiNode *> nodes;
|
||||||
std::map<aiBone *, aiNode *> bone_stack;
|
std::map<aiBone *, aiNode *> bone_stack;
|
||||||
BuildBoneList(out->mRootNode, out->mRootNode, out, bones);
|
BuildBoneList(out->mRootNode, out->mRootNode, out, bones);
|
||||||
BuildNodeList(out->mRootNode, nodes);
|
BuildNodeList(out->mRootNode, nodes);
|
||||||
|
|
||||||
BuildBoneStack(out->mRootNode, out->mRootNode, out, bones, bone_stack, nodes);
|
BuildBoneStack(out->mRootNode, out->mRootNode, out, bones, bone_stack, nodes);
|
||||||
|
|
||||||
ASSIMP_LOG_DEBUG_F("Bone stack size: ", bone_stack.size());
|
ASSIMP_LOG_DEBUG_F("Bone stack size: ", bone_stack.size());
|
||||||
|
|
||||||
for (std::pair<aiBone *, aiNode *> kvp : bone_stack) {
|
for (std::pair<aiBone *, aiNode *> kvp : bone_stack) {
|
||||||
aiBone *bone = kvp.first;
|
aiBone *bone = kvp.first;
|
||||||
aiNode *bone_node = kvp.second;
|
aiNode *bone_node = kvp.second;
|
||||||
ASSIMP_LOG_DEBUG_F("active node lookup: ", bone->mName.C_Str());
|
ASSIMP_LOG_DEBUG_F("active node lookup: ", bone->mName.C_Str());
|
||||||
// lcl transform grab - done in generate_nodes :)
|
// lcl transform grab - done in generate_nodes :)
|
||||||
|
|
||||||
// bone->mOffsetMatrix = bone_node->mTransformation;
|
// bone->mOffsetMatrix = bone_node->mTransformation;
|
||||||
aiNode *armature = GetArmatureRoot(bone_node, bones);
|
aiNode *armature = GetArmatureRoot(bone_node, bones);
|
||||||
|
|
||||||
ai_assert(armature);
|
ai_assert(armature);
|
||||||
|
|
||||||
// set up bone armature id
|
// set up bone armature id
|
||||||
bone->mArmature = armature;
|
bone->mArmature = armature;
|
||||||
|
|
||||||
// set this bone node to be referenced properly
|
// set this bone node to be referenced properly
|
||||||
ai_assert(bone_node);
|
ai_assert(bone_node);
|
||||||
bone->mNode = bone_node;
|
bone->mNode = bone_node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Reprocess all nodes to calculate bone transforms properly based on the REAL
|
// Reprocess all nodes to calculate bone transforms properly based on the REAL
|
||||||
* mOffsetMatrix not the local. */
|
// mOffsetMatrix not the local.
|
||||||
/* Before this would use mesh transforms which is wrong for bone transforms */
|
// Before this would use mesh transforms which is wrong for bone transforms
|
||||||
/* Before this would work for simple character skeletons but not complex meshes
|
// Before this would work for simple character skeletons but not complex meshes
|
||||||
* with multiple origins */
|
// with multiple origins
|
||||||
/* Source: sketch fab log cutter fbx */
|
// Source: sketch fab log cutter fbx
|
||||||
void ArmaturePopulate::BuildBoneList(aiNode *current_node,
|
void ArmaturePopulate::BuildBoneList(aiNode *current_node,
|
||||||
const aiNode *root_node,
|
const aiNode *root_node,
|
||||||
const aiScene *scene,
|
const aiScene *scene,
|
||||||
std::vector<aiBone *> &bones) {
|
std::vector<aiBone *> &bones) {
|
||||||
ai_assert(scene);
|
ai_assert(scene);
|
||||||
for (unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId) {
|
for (unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId) {
|
||||||
aiNode *child = current_node->mChildren[nodeId];
|
aiNode *child = current_node->mChildren[nodeId];
|
||||||
ai_assert(child);
|
ai_assert(child);
|
||||||
|
|
||||||
// check for bones
|
// check for bones
|
||||||
for (unsigned int meshId = 0; meshId < child->mNumMeshes; ++meshId) {
|
for (unsigned int meshId = 0; meshId < child->mNumMeshes; ++meshId) {
|
||||||
ai_assert(child->mMeshes);
|
ai_assert(child->mMeshes);
|
||||||
unsigned int mesh_index = child->mMeshes[meshId];
|
unsigned int mesh_index = child->mMeshes[meshId];
|
||||||
aiMesh *mesh = scene->mMeshes[mesh_index];
|
aiMesh *mesh = scene->mMeshes[mesh_index];
|
||||||
ai_assert(mesh);
|
ai_assert(mesh);
|
||||||
|
|
||||||
for (unsigned int boneId = 0; boneId < mesh->mNumBones; ++boneId) {
|
for (unsigned int boneId = 0; boneId < mesh->mNumBones; ++boneId) {
|
||||||
aiBone *bone = mesh->mBones[boneId];
|
aiBone *bone = mesh->mBones[boneId];
|
||||||
ai_assert(bone);
|
ai_assert(bone);
|
||||||
|
|
||||||
// duplicate meshes exist with the same bones sometimes :)
|
// duplicate mehes exist with the same bones sometimes :)
|
||||||
// so this must be detected
|
// so this must be detected
|
||||||
if (std::find(bones.begin(), bones.end(), bone) == bones.end()) {
|
if (std::find(bones.begin(), bones.end(), bone) == bones.end()) {
|
||||||
// add the element once
|
// add the element once
|
||||||
bones.push_back(bone);
|
bones.push_back(bone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find mesh and get bones
|
||||||
|
// then do recursive lookup for bones in root node hierarchy
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// find mesh and get bones
|
BuildBoneList(child, root_node, scene, 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 */
|
// Prepare flat node list which can be used for non recursive lookups later
|
||||||
void ArmaturePopulate::BuildNodeList(const aiNode *current_node,
|
void ArmaturePopulate::BuildNodeList(const aiNode *current_node,
|
||||||
std::vector<aiNode *> &nodes) {
|
std::vector<aiNode *> &nodes) {
|
||||||
ai_assert(current_node);
|
ai_assert(current_node);
|
||||||
|
|
||||||
for (unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId) {
|
for (unsigned int nodeId = 0; nodeId < current_node->mNumChildren; ++nodeId) {
|
||||||
aiNode *child = current_node->mChildren[nodeId];
|
aiNode *child = current_node->mChildren[nodeId];
|
||||||
ai_assert(child);
|
ai_assert(child);
|
||||||
|
|
||||||
nodes.push_back(child);
|
if (child->mNumMeshes == 0) {
|
||||||
|
nodes.push_back(child);
|
||||||
|
}
|
||||||
|
|
||||||
BuildNodeList(child, nodes);
|
BuildNodeList(child, nodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A bone stack allows us to have multiple armatures, with the same bone names
|
// 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
|
// A bone stack allows us also to retrieve bones true transform even with
|
||||||
* duplicate names :)
|
// duplicate names :)
|
||||||
*/
|
|
||||||
void ArmaturePopulate::BuildBoneStack(aiNode *current_node,
|
void ArmaturePopulate::BuildBoneStack(aiNode *current_node,
|
||||||
const aiNode *root_node,
|
const aiNode *root_node,
|
||||||
const aiScene *scene,
|
const aiScene *scene,
|
||||||
const std::vector<aiBone *> &bones,
|
const std::vector<aiBone *> &bones,
|
||||||
std::map<aiBone *, aiNode *> &bone_stack,
|
std::map<aiBone *, aiNode *> &bone_stack,
|
||||||
std::vector<aiNode *> &node_stack) {
|
std::vector<aiNode *> &node_stack) {
|
||||||
ai_assert(scene);
|
ai_assert(scene);
|
||||||
ai_assert(root_node);
|
ai_assert(root_node);
|
||||||
ai_assert(!node_stack.empty());
|
ai_assert(!node_stack.empty());
|
||||||
|
|
||||||
for (aiBone *bone : bones) {
|
for (aiBone *bone : bones) {
|
||||||
ai_assert(bone);
|
ai_assert(bone);
|
||||||
aiNode *node = GetNodeFromStack(bone->mName, node_stack);
|
aiNode *node = GetNodeFromStack(bone->mName, node_stack);
|
||||||
if (node == nullptr) {
|
if (node == nullptr) {
|
||||||
node_stack.clear();
|
node_stack.clear();
|
||||||
BuildNodeList(root_node, node_stack);
|
BuildNodeList(root_node, node_stack);
|
||||||
ASSIMP_LOG_DEBUG_F("Resetting bone stack: nullptr element ", bone->mName.C_Str());
|
ASSIMP_LOG_DEBUG_F("Resetting bone stack: nullptr element ", bone->mName.C_Str());
|
||||||
|
|
||||||
node = GetNodeFromStack(bone->mName, node_stack);
|
node = GetNodeFromStack(bone->mName, node_stack);
|
||||||
|
|
||||||
if (!node) {
|
if (!node) {
|
||||||
ASSIMP_LOG_ERROR("serious import issue node for bone was not detected");
|
ASSIMP_LOG_ERROR("serious import issue node for bone was not detected");
|
||||||
continue;
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
/* Returns the armature root node */
|
// This is required to be detected for a bone initially, it will recurse up
|
||||||
/* 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
|
||||||
* until it cannot find another bone and return the node No known failure
|
// points. (yet)
|
||||||
* points. (yet)
|
|
||||||
*/
|
|
||||||
aiNode *ArmaturePopulate::GetArmatureRoot(aiNode *bone_node,
|
aiNode *ArmaturePopulate::GetArmatureRoot(aiNode *bone_node,
|
||||||
std::vector<aiBone *> &bone_list) {
|
std::vector<aiBone *> &bone_list) {
|
||||||
while (bone_node) {
|
while (bone_node) {
|
||||||
if (!IsBoneNode(bone_node->mName, bone_list)) {
|
if (!IsBoneNode(bone_node->mName, bone_list)) {
|
||||||
ASSIMP_LOG_DEBUG_F("GetArmatureRoot() Found valid armature: ", bone_node->mName.C_Str());
|
ASSIMP_LOG_DEBUG_F("GetArmatureRoot() Found valid armature: ", bone_node->mName.C_Str());
|
||||||
return bone_node;
|
return bone_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
bone_node = bone_node->mParent;
|
||||||
}
|
}
|
||||||
|
|
||||||
bone_node = bone_node->mParent;
|
ASSIMP_LOG_ERROR("GetArmatureRoot() can't find armature!");
|
||||||
}
|
|
||||||
|
return nullptr;
|
||||||
ASSIMP_LOG_ERROR("GetArmatureRoot() can't find armature!");
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Simple IsBoneNode check if this could be a bone
|
||||||
|
|
||||||
/* Simple IsBoneNode check if this could be a bone */
|
|
||||||
bool ArmaturePopulate::IsBoneNode(const aiString &bone_name,
|
bool ArmaturePopulate::IsBoneNode(const aiString &bone_name,
|
||||||
std::vector<aiBone *> &bones) {
|
std::vector<aiBone *> &bones) {
|
||||||
for (aiBone *bone : bones) {
|
for (aiBone *bone : bones) {
|
||||||
if (bone->mName == bone_name) {
|
if (bone->mName == bone_name) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pop this node by name from the stack if found */
|
// Pop this node by name from the stack if found
|
||||||
/* Used in multiple armature situations with duplicate node / bone names */
|
// Used in multiple armature situations with duplicate node / bone names
|
||||||
/* Known flaw: cannot have nodes with bone names, will be fixed in later release
|
// 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
|
||||||
/* (serious to be fixed) Known flaw: nodes which have more than one bone could
|
// be prematurely dropped from stack
|
||||||
* be prematurely dropped from stack */
|
|
||||||
aiNode *ArmaturePopulate::GetNodeFromStack(const aiString &node_name,
|
aiNode *ArmaturePopulate::GetNodeFromStack(const aiString &node_name,
|
||||||
std::vector<aiNode *> &nodes) {
|
std::vector<aiNode *> &nodes) {
|
||||||
std::vector<aiNode *>::iterator iter;
|
std::vector<aiNode *>::iterator iter;
|
||||||
aiNode *found = nullptr;
|
aiNode *found = nullptr;
|
||||||
for (iter = nodes.begin(); iter < nodes.end(); ++iter) {
|
for (iter = nodes.begin(); iter < nodes.end(); ++iter) {
|
||||||
aiNode *element = *iter;
|
aiNode *element = *iter;
|
||||||
ai_assert(element);
|
ai_assert(element);
|
||||||
// node valid and node name matches
|
// node valid and node name matches
|
||||||
if (element->mName == node_name) {
|
if (element->mName == node_name) {
|
||||||
found = element;
|
found = element;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (found != nullptr) {
|
if (found != nullptr) {
|
||||||
ASSIMP_LOG_INFO_F("Removed node from stack: ", found->mName.C_Str());
|
ASSIMP_LOG_INFO_F("Removed node from stack: ", found->mName.C_Str());
|
||||||
// now pop the element from the node list
|
// now pop the element from the node list
|
||||||
nodes.erase(iter);
|
nodes.erase(iter);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
// unique names can cause this problem
|
// unique names can cause this problem
|
||||||
ASSIMP_LOG_ERROR("[Serious] GetNodeFromStack() can't find node from stack!");
|
ASSIMP_LOG_ERROR("[Serious] GetNodeFromStack() can't find node from stack!");
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // Namespace Assimp
|
} // Namespace Assimp
|
||||||
|
|
|
@ -230,46 +230,6 @@ VertexWeightTable* ComputeVertexBoneWeightTable(const aiMesh* pMesh)
|
||||||
return avPerVertexWeights;
|
return avPerVertexWeights;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
const char* TextureTypeToString(aiTextureType in)
|
|
||||||
{
|
|
||||||
switch (in)
|
|
||||||
{
|
|
||||||
case aiTextureType_NONE:
|
|
||||||
return "n/a";
|
|
||||||
case aiTextureType_DIFFUSE:
|
|
||||||
return "Diffuse";
|
|
||||||
case aiTextureType_SPECULAR:
|
|
||||||
return "Specular";
|
|
||||||
case aiTextureType_AMBIENT:
|
|
||||||
return "Ambient";
|
|
||||||
case aiTextureType_EMISSIVE:
|
|
||||||
return "Emissive";
|
|
||||||
case aiTextureType_OPACITY:
|
|
||||||
return "Opacity";
|
|
||||||
case aiTextureType_NORMALS:
|
|
||||||
return "Normals";
|
|
||||||
case aiTextureType_HEIGHT:
|
|
||||||
return "Height";
|
|
||||||
case aiTextureType_SHININESS:
|
|
||||||
return "Shininess";
|
|
||||||
case aiTextureType_DISPLACEMENT:
|
|
||||||
return "Displacement";
|
|
||||||
case aiTextureType_LIGHTMAP:
|
|
||||||
return "Lightmap";
|
|
||||||
case aiTextureType_REFLECTION:
|
|
||||||
return "Reflection";
|
|
||||||
case aiTextureType_UNKNOWN:
|
|
||||||
return "Unknown";
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ai_assert(false);
|
|
||||||
return "BUG";
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
const char* MappingTypeToString(aiTextureMapping in)
|
const char* MappingTypeToString(aiTextureMapping in)
|
||||||
{
|
{
|
||||||
|
|
|
@ -316,12 +316,6 @@ typedef std::vector <PerVertexWeight> VertexWeightTable;
|
||||||
// Compute a per-vertex bone weight table
|
// Compute a per-vertex bone weight table
|
||||||
VertexWeightTable* ComputeVertexBoneWeightTable(const aiMesh* pMesh);
|
VertexWeightTable* ComputeVertexBoneWeightTable(const aiMesh* pMesh);
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
// Get a string for a given aiTextureType
|
|
||||||
const char* TextureTypeToString(aiTextureType in);
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
// Get a string for a given aiTextureMapping
|
// Get a string for a given aiTextureMapping
|
||||||
const char* MappingTypeToString(aiTextureMapping in);
|
const char* MappingTypeToString(aiTextureMapping in);
|
||||||
|
|
|
@ -352,6 +352,8 @@ void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& pr
|
||||||
|
|
||||||
if (path[0] == '*') { // embedded
|
if (path[0] == '*') { // embedded
|
||||||
aiTexture* tex = mScene->mTextures[atoi(&path[1])];
|
aiTexture* tex = mScene->mTextures[atoi(&path[1])];
|
||||||
|
|
||||||
|
prop.texture->source->name = tex->mFilename.C_Str();
|
||||||
|
|
||||||
uint8_t* data = reinterpret_cast<uint8_t*>(tex->pcData);
|
uint8_t* data = reinterpret_cast<uint8_t*>(tex->pcData);
|
||||||
prop.texture->source->SetData(data, tex->mWidth, *mAsset);
|
prop.texture->source->SetData(data, tex->mWidth, *mAsset);
|
||||||
|
|
|
@ -680,6 +680,7 @@ void glTFImporter::ImportEmbeddedTextures(glTF::Asset& r)
|
||||||
size_t length = img.GetDataLength();
|
size_t length = img.GetDataLength();
|
||||||
void* data = img.StealData();
|
void* data = img.StealData();
|
||||||
|
|
||||||
|
tex->mFilename = img.name;
|
||||||
tex->mWidth = static_cast<unsigned int>(length);
|
tex->mWidth = static_cast<unsigned int>(length);
|
||||||
tex->mHeight = 0;
|
tex->mHeight = 0;
|
||||||
tex->pcData = reinterpret_cast<aiTexel*>(data);
|
tex->pcData = reinterpret_cast<aiTexel*>(data);
|
||||||
|
|
|
@ -351,6 +351,8 @@ void glTF2Exporter::GetMatTex(const aiMaterial* mat, Ref<Texture>& texture, aiTe
|
||||||
|
|
||||||
if (path[0] == '*') { // embedded
|
if (path[0] == '*') { // embedded
|
||||||
aiTexture* tex = mScene->mTextures[atoi(&path[1])];
|
aiTexture* tex = mScene->mTextures[atoi(&path[1])];
|
||||||
|
|
||||||
|
texture->source->name = tex->mFilename.C_Str();
|
||||||
|
|
||||||
// The asset has its own buffer, see Image::SetData
|
// The asset has its own buffer, see Image::SetData
|
||||||
texture->source->SetData(reinterpret_cast<uint8_t*> (tex->pcData), tex->mWidth, *mAsset);
|
texture->source->SetData(reinterpret_cast<uint8_t*> (tex->pcData), tex->mWidth, *mAsset);
|
||||||
|
|
|
@ -1248,6 +1248,7 @@ void glTF2Importer::ImportEmbeddedTextures(glTF2::Asset &r) {
|
||||||
size_t length = img.GetDataLength();
|
size_t length = img.GetDataLength();
|
||||||
void *data = img.StealData();
|
void *data = img.StealData();
|
||||||
|
|
||||||
|
tex->mFilename = img.name;
|
||||||
tex->mWidth = static_cast<unsigned int>(length);
|
tex->mWidth = static_cast<unsigned int>(length);
|
||||||
tex->mHeight = 0;
|
tex->mHeight = 0;
|
||||||
tex->pcData = reinterpret_cast<aiTexel *>(data);
|
tex->pcData = reinterpret_cast<aiTexel *>(data);
|
||||||
|
|
|
@ -312,6 +312,10 @@ enum aiTextureType
|
||||||
|
|
||||||
#define AI_TEXTURE_TYPE_MAX aiTextureType_UNKNOWN
|
#define AI_TEXTURE_TYPE_MAX aiTextureType_UNKNOWN
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
// Get a string for a given aiTextureType
|
||||||
|
ASSIMP_API const char* TextureTypeToString(enum aiTextureType in);
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** @brief Defines all shading models supported by the library
|
/** @brief Defines all shading models supported by the library
|
||||||
*
|
*
|
||||||
|
|
|
@ -444,6 +444,12 @@ int Assimp_Info (const char* const* params, unsigned int num) {
|
||||||
aiTextureType_DISPLACEMENT,
|
aiTextureType_DISPLACEMENT,
|
||||||
aiTextureType_LIGHTMAP,
|
aiTextureType_LIGHTMAP,
|
||||||
aiTextureType_REFLECTION,
|
aiTextureType_REFLECTION,
|
||||||
|
aiTextureType_BASE_COLOR,
|
||||||
|
aiTextureType_NORMAL_CAMERA,
|
||||||
|
aiTextureType_EMISSION_COLOR,
|
||||||
|
aiTextureType_METALNESS,
|
||||||
|
aiTextureType_DIFFUSE_ROUGHNESS,
|
||||||
|
aiTextureType_AMBIENT_OCCLUSION,
|
||||||
aiTextureType_UNKNOWN
|
aiTextureType_UNKNOWN
|
||||||
};
|
};
|
||||||
for(unsigned int type = 0; type < sizeof(types)/sizeof(types[0]); ++type) {
|
for(unsigned int type = 0; type < sizeof(types)/sizeof(types[0]); ++type) {
|
||||||
|
|
|
@ -69,44 +69,6 @@ const char* AICMD_MSG_DUMP_HELP =
|
||||||
FILE* out = NULL;
|
FILE* out = NULL;
|
||||||
bool shortened = false;
|
bool shortened = false;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
const char* TextureTypeToString(aiTextureType in)
|
|
||||||
{
|
|
||||||
switch (in)
|
|
||||||
{
|
|
||||||
case aiTextureType_NONE:
|
|
||||||
return "n/a";
|
|
||||||
case aiTextureType_DIFFUSE:
|
|
||||||
return "Diffuse";
|
|
||||||
case aiTextureType_SPECULAR:
|
|
||||||
return "Specular";
|
|
||||||
case aiTextureType_AMBIENT:
|
|
||||||
return "Ambient";
|
|
||||||
case aiTextureType_EMISSIVE:
|
|
||||||
return "Emissive";
|
|
||||||
case aiTextureType_OPACITY:
|
|
||||||
return "Opacity";
|
|
||||||
case aiTextureType_NORMALS:
|
|
||||||
return "Normals";
|
|
||||||
case aiTextureType_HEIGHT:
|
|
||||||
return "Height";
|
|
||||||
case aiTextureType_SHININESS:
|
|
||||||
return "Shininess";
|
|
||||||
case aiTextureType_DISPLACEMENT:
|
|
||||||
return "Displacement";
|
|
||||||
case aiTextureType_LIGHTMAP:
|
|
||||||
return "Lightmap";
|
|
||||||
case aiTextureType_REFLECTION:
|
|
||||||
return "Reflection";
|
|
||||||
case aiTextureType_UNKNOWN:
|
|
||||||
return "Unknown";
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ai_assert(false);
|
|
||||||
return "BUG";
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
int Assimp_Dump (const char* const* params, unsigned int num)
|
int Assimp_Dump (const char* const* params, unsigned int num)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue