mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
bkup commit
fbx details matching for skinned meshes, gltf still offset
This commit is contained in:
parent
af6722f547
commit
4ac9639a52
|
|
@ -34,17 +34,14 @@
|
|||
aiAnimation* AssimpAppNode::sActiveSequence = NULL;
|
||||
F32 AssimpAppNode::sTimeMultiplier = 1.0f;
|
||||
|
||||
AssimpAppNode::AssimpAppNode(const struct aiScene* scene, const struct aiNode* node, AssimpAppNode* parent)
|
||||
AssimpAppNode::AssimpAppNode(const aiScene* scene, const aiNode* node, AssimpAppNode* parentNode)
|
||||
: mScene(scene),
|
||||
mNode(node ? node : scene->mRootNode),
|
||||
appParent(parent),
|
||||
mInvertMeshes(false),
|
||||
mLastTransformTime(TSShapeLoader::DefaultTime - 1),
|
||||
mDefaultTransformValid(false)
|
||||
{
|
||||
|
||||
mScene = scene;
|
||||
mNode = node ? node : scene->mRootNode;
|
||||
appParent = parentNode;
|
||||
// Initialize node and parent names.
|
||||
mName = dStrdup(mNode->mName.C_Str());
|
||||
if ( dStrlen(mName) == 0 )
|
||||
|
|
@ -52,46 +49,12 @@ AssimpAppNode::AssimpAppNode(const struct aiScene* scene, const struct aiNode* n
|
|||
const char* defaultName = "null";
|
||||
mName = dStrdup(defaultName);
|
||||
}
|
||||
|
||||
mParentName = dStrdup(parent ? parent->getName() : "ROOT");
|
||||
|
||||
mParentName = dStrdup(parentNode ? parentNode->mName : "ROOT");
|
||||
// Convert transformation matrix
|
||||
assimpToTorqueMat(node->mTransformation, mNodeTransform);
|
||||
Con::printf("[ASSIMP] Node Created: %s, Parent: %s", mName, mParentName);
|
||||
}
|
||||
|
||||
// Get all child nodes
|
||||
void AssimpAppNode::buildChildList()
|
||||
{
|
||||
// Ensure mNode is valid
|
||||
if (!mNode) {
|
||||
Con::errorf("[ASSIMP] Error: mNode is null in buildChildList");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mNode->mChildren)
|
||||
return;
|
||||
|
||||
for (U32 n = 0; n < mNode->mNumChildren; ++n) {
|
||||
if (!mNode->mChildren[n]) {
|
||||
Con::errorf("[ASSIMP] Warning: Null child node at index %d", n);
|
||||
continue;
|
||||
}
|
||||
|
||||
mChildNodes.push_back(new AssimpAppNode(mScene, mNode->mChildren[n], this));
|
||||
}
|
||||
}
|
||||
|
||||
// Get all geometry attached to this node
|
||||
void AssimpAppNode::buildMeshList()
|
||||
{
|
||||
for (U32 n = 0; n < mNode->mNumMeshes; ++n)
|
||||
{
|
||||
const struct aiMesh* mesh = mScene->mMeshes[mNode->mMeshes[n]];
|
||||
mMeshes.push_back(new AssimpAppMesh(mesh, this));
|
||||
}
|
||||
}
|
||||
|
||||
MatrixF AssimpAppNode::getTransform(F32 time)
|
||||
{
|
||||
// Check if we can use the last computed transform
|
||||
|
|
@ -338,3 +301,13 @@ aiNode* AssimpAppNode::findChildNodeByName(const char* nodeName, aiNode* rootNod
|
|||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void AssimpAppNode::addChild(AssimpAppNode* child)
|
||||
{
|
||||
mChildNodes.push_back(child);
|
||||
}
|
||||
|
||||
void AssimpAppNode::addMesh(AssimpAppMesh* child)
|
||||
{
|
||||
mMeshes.push_back(child);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,25 +47,24 @@ class AssimpAppNode : public AppNode
|
|||
void getAnimatedTransform(MatrixF& mat, F32 t, aiAnimation* animSeq);
|
||||
Point3F interpolateVectorKey(const aiVectorKey* keys, U32 numKeys, F32 frameTime);
|
||||
QuatF interpolateQuaternionKey(const aiQuatKey* keys, U32 numKeys, F32 frameTime);
|
||||
void buildMeshList() override;
|
||||
void buildChildList() override;
|
||||
|
||||
void buildMeshList() override {};
|
||||
void buildChildList() override {};
|
||||
protected:
|
||||
|
||||
const aiScene* mScene;
|
||||
const aiNode* mNode; ///< Pointer to the assimp scene node
|
||||
AssimpAppNode* appParent; ///< Parent node
|
||||
MatrixF mNodeTransform; ///< Scene node transform converted to TorqueSpace (filled for ALL nodes)
|
||||
AssimpAppNode* appParent; ///< Parent node
|
||||
MatrixF mNodeTransform; ///< Scene node transform converted to TorqueSpace (filled for ALL nodes)
|
||||
|
||||
bool mInvertMeshes; ///< True if this node's coordinate space is inverted (left handed)
|
||||
F32 mLastTransformTime; ///< Time of the last transform lookup (getTransform)
|
||||
MatrixF mLastTransform; ///< Last transform lookup (getTransform) (Only Non-Dummy Nodes)
|
||||
bool mDefaultTransformValid; ///< Flag indicating whether the defaultNodeTransform is valid
|
||||
MatrixF mDefaultNodeTransform; ///< Transform at DefaultTime (Only Non-Dummy Nodes)
|
||||
bool mInvertMeshes; ///< True if this node's coordinate space is inverted (left handed)
|
||||
F32 mLastTransformTime; ///< Time of the last transform lookup (getTransform)
|
||||
MatrixF mLastTransform; ///< Last transform lookup (getTransform) (Only Non-Dummy Nodes)
|
||||
bool mDefaultTransformValid; ///< Flag indicating whether the defaultNodeTransform is valid
|
||||
MatrixF mDefaultNodeTransform; ///< Transform at DefaultTime (Only Non-Dummy Nodes)
|
||||
|
||||
public:
|
||||
|
||||
AssimpAppNode(const struct aiScene* scene, const struct aiNode* node, AssimpAppNode* parent = 0);
|
||||
AssimpAppNode(const aiScene* scene, const aiNode* node, AssimpAppNode* parentNode = nullptr);
|
||||
virtual ~AssimpAppNode()
|
||||
{
|
||||
//
|
||||
|
|
@ -115,6 +114,9 @@ public:
|
|||
static void assimpToTorqueMat(const aiMatrix4x4& inAssimpMat, MatrixF& outMat);
|
||||
static void convertMat(MatrixF& outMat);
|
||||
static aiNode* findChildNodeByName(const char* nodeName, aiNode* rootNode);
|
||||
|
||||
void AssimpAppNode::addChild(AssimpAppNode* child);
|
||||
void AssimpAppNode::addMesh(AssimpAppMesh* child);
|
||||
};
|
||||
|
||||
#endif // _ASSIMP_APPNODE_H_
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ void AssimpShapeLoader::enumerateScene()
|
|||
Con::printf("[ASSIMP] Attempting to load file: %s", shapePath.getFullPath().c_str());
|
||||
|
||||
// Define post-processing steps
|
||||
unsigned int ppsteps = aiProcess_Triangulate | aiProcess_ConvertToLeftHanded & ~aiProcess_FlipWindingOrder;
|
||||
unsigned int ppsteps = aiProcess_Triangulate | aiProcess_ConvertToLeftHanded & ~aiProcess_MakeLeftHanded;
|
||||
|
||||
const auto& options = ColladaUtils::getOptions();
|
||||
if (options.reverseWindingOrder) ppsteps |= aiProcess_FlipWindingOrder;
|
||||
|
|
@ -248,7 +248,13 @@ void AssimpShapeLoader::enumerateScene()
|
|||
}
|
||||
}
|
||||
|
||||
// Extract embedded textures
|
||||
aiMatrix4x4 rotationMatrix;
|
||||
rotationMatrix = aiMatrix4x4::RotationX(-AI_MATH_PI / 2, rotationMatrix);
|
||||
applyTransformation(mScene->mRootNode, rotationMatrix);
|
||||
|
||||
rotationMatrix = aiMatrix4x4::RotationY(AI_MATH_PI, rotationMatrix);
|
||||
applyTransformation(mScene->mRootNode, rotationMatrix);
|
||||
|
||||
for (unsigned int i = 0; i < mScene->mNumTextures; ++i) {
|
||||
extractTexture(i, mScene->mTextures[i]);
|
||||
}
|
||||
|
|
@ -268,12 +274,18 @@ void AssimpShapeLoader::enumerateScene()
|
|||
delete rootNode;
|
||||
}
|
||||
|
||||
processAssimpNode(mScene->mRootNode, mScene, rootNode);
|
||||
|
||||
// Add a bounds node if none exists
|
||||
if (!boundsNode) {
|
||||
auto* reqNode = new aiNode("bounds");
|
||||
mScene->mRootNode->addChildren(1, &reqNode);
|
||||
rotationMatrix = aiMatrix4x4::RotationX(-AI_MATH_PI / 2, rotationMatrix);
|
||||
applyTransformation(reqNode, rotationMatrix);
|
||||
/*rotationMatrix = aiMatrix4x4::RotationY(-AI_MATH_PI, rotationMatrix);
|
||||
applyTransformation(reqNode, rotationMatrix);*/
|
||||
|
||||
auto* appBoundsNode = new AssimpAppNode(mScene, reqNode);
|
||||
auto* appBoundsNode = new AssimpAppNode(mScene, reqNode, rootNode);
|
||||
if (!processNode(appBoundsNode)) {
|
||||
delete appBoundsNode;
|
||||
}
|
||||
|
|
@ -306,6 +318,37 @@ void AssimpShapeLoader::configureImportUnits() {
|
|||
}
|
||||
}
|
||||
|
||||
void AssimpShapeLoader::processAssimpNode(const aiNode* node, const aiScene* scene, AssimpAppNode* parentNode)
|
||||
{
|
||||
AssimpAppNode* currNode;
|
||||
if (node == scene->mRootNode)
|
||||
{
|
||||
currNode = parentNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
currNode = new AssimpAppNode(scene, node, parentNode);
|
||||
|
||||
if (parentNode)
|
||||
{
|
||||
parentNode->addChild(currNode);
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < node->mNumMeshes; i++)
|
||||
{
|
||||
U32 meshIdx = node->mMeshes[i];
|
||||
const aiMesh* mesh = scene->mMeshes[meshIdx];
|
||||
AssimpAppMesh* curMesh = new AssimpAppMesh(mesh, currNode);
|
||||
currNode->addMesh(curMesh);
|
||||
}
|
||||
}
|
||||
// Recursively process child nodes
|
||||
for (U32 i = 0; i < node->mNumChildren; i++)
|
||||
{
|
||||
processAssimpNode(node->mChildren[i], scene, currNode);
|
||||
}
|
||||
}
|
||||
|
||||
void AssimpShapeLoader::processAnimations()
|
||||
{
|
||||
// add all animations into 1 ambient animation.
|
||||
|
|
|
|||
|
|
@ -26,6 +26,12 @@
|
|||
#ifndef _TSSHAPELOADER_H_
|
||||
#include "ts/loader/tsShapeLoader.h"
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef _ASSIMP_APPNODE_H_
|
||||
#include "ts/assimp/assimpAppNode.h"
|
||||
#endif
|
||||
|
||||
#include <assimp/Importer.hpp>
|
||||
#include <assimp/texture.h>
|
||||
|
||||
|
|
@ -41,12 +47,14 @@ protected:
|
|||
Assimp::Importer mImporter;
|
||||
const aiScene* mScene;
|
||||
|
||||
//bool processNode(AppNode* node) override;
|
||||
bool ignoreNode(const String& name) override;
|
||||
bool ignoreMesh(const String& name) override;
|
||||
void detectDetails();
|
||||
void extractTexture(U32 index, aiTexture* pTex);
|
||||
|
||||
private:
|
||||
void processAssimpNode(const aiNode* node, const aiScene* scene, AssimpAppNode* parentNode = nullptr);
|
||||
void addNodeToTree(S32 parentItem, aiNode* node, GuiTreeViewCtrl* tree, U32& nodeCount);
|
||||
void addMetaDataToTree(const aiMetadata* metaData, GuiTreeViewCtrl* tree);
|
||||
bool getMetabool(const char* key, bool& boolVal);
|
||||
|
|
|
|||
|
|
@ -41,8 +41,8 @@ class AppNode
|
|||
// the reason these are tracked by AppNode is that
|
||||
// AppNode is responsible for deleting all it's children
|
||||
// and attached meshes.
|
||||
virtual void buildMeshList() = 0;
|
||||
virtual void buildChildList() = 0;
|
||||
virtual void buildMeshList() {};
|
||||
virtual void buildChildList() {};
|
||||
|
||||
protected:
|
||||
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ protected:
|
|||
|
||||
// Collect the nodes, objects and sequences for the scene
|
||||
virtual void enumerateScene() = 0;
|
||||
bool processNode(AppNode* node);
|
||||
virtual bool processNode(AppNode* node);
|
||||
virtual bool ignoreNode(const String& name) { return false; }
|
||||
virtual bool ignoreMesh(const String& name) { return false; }
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue