Bone::Bone(FbxScene& scene) { //construct hierarchy *this = Bone { *(scene.GetRootNode()) }; std::map<std::string, std::pair<unsigned int, scm::math::mat4f> > bone_info{} ; unsigned num_bones = 0; for (unsigned int i = 0; i < scene.GetGeometryCount(); i++) { FbxGeometry* geo = scene.GetGeometry(i); if (geo->GetAttributeType() == FbxNodeAttribute::eMesh) { //check for skinning, use first skin deformer FbxSkin* skin; for (unsigned i = 0; i < geo->GetDeformerCount(); ++i) { FbxDeformer* defPtr = { geo->GetDeformer(i) }; if (defPtr->GetDeformerType() == FbxDeformer::eSkin) { skin = static_cast<FbxSkin*>(defPtr); break; } } if (!skin) { Logger::LOG_ERROR << "Mesh does not contain skin deformer" << std::endl; assert(false); } //one cluster corresponds to one bone for (unsigned i = 0; i < skin->GetClusterCount(); ++i) { FbxCluster* cluster = skin->GetCluster(i); FbxNode* node = cluster->GetLink(); if (!node) { Logger::LOG_ERROR << "associated node does not exist!" << std::endl; assert(false); } std::string bone_name(node->GetName()); //helper to check for matrix magnitude auto magnitude = [](scm::math::mat4f const & mat)->float { float mag = 0.0f; for (unsigned i = 0; i < 16; ++i) { mag += mat[i] * mat[i]; } return mag; } ; //reference pose of bone FbxAMatrix bind_transform; cluster->GetTransformLinkMatrix(bind_transform); //check if the clusters have an extra transformation FbxAMatrix cluster_transform; cluster->GetTransformMatrix(cluster_transform); if (magnitude(to_gua::mat4f(cluster_transform) - scm::math::mat4f::identity()) > 0.000000001f) { Logger::LOG_WARNING << "weight cluster of bone '" << bone_name << "' has transformation, animation will be skewed" << std::endl; } //add bone to list if it is not already included if (bone_info.find(bone_name) == bone_info.end()) { bone_info[bone_name] = std::make_pair( num_bones, to_gua::mat4f(bind_transform.Inverse() * cluster_transform)); ++num_bones; } } // traverse hierarchy and set accumulated values in the bone this->set_properties(bone_info); } } }
float UFBXBLUEPRINT::getCircleAreaDLL() //(float radius) { // Create the FBX SDK manager FbxManager* lSdkManager = FbxManager::Create(); // Create an IOSettings object. FbxIOSettings * ios = FbxIOSettings::Create(lSdkManager, IOSROOT); lSdkManager->SetIOSettings(ios); // ... Configure the FbxIOSettings object ... // Create an importer. FbxImporter* lImporter = FbxImporter::Create(lSdkManager, ""); // Declare the path and filename of the file containing the scene. // In this case, we are assuming the file is in the same directory as the executable. const char* lFilename = "file.fbx"; // Initialize the importer. bool lImportStatus = lImporter->Initialize(lFilename, -1, lSdkManager->GetIOSettings()); if (!lImportStatus) { printf("Call to FbxImporter::Initialize() failed.\n"); printf("Error returned: %s\n\n", lImporter->GetStatus().GetErrorString()); exit(-1); } // Create a new scene so it can be populated by the imported file. FbxScene* lScene = FbxScene::Create(lSdkManager, "myScene"); // Import the contents of the file into the scene. lImporter->Import(lScene); // The file has been imported; we can get rid of the importer. lImporter->Destroy(); // File format version numbers to be populated. int lFileMajor, lFileMinor, lFileRevision; // Populate the FBX file format version numbers with the import file. lImporter->GetFileVersion(lFileMajor, lFileMinor, lFileRevision); int numofgeometrys = lScene->GetGeometryCount(); for (int i = 0; i < numofgeometrys; i++) { fbxsdk::FbxGeometry* fbxgeo = lScene->GetGeometry(i); // fbxsdk::FbxMesh* fbxmesh = fbxgeo->Get if (fbxgeo != 0) { int numofcontrolpoints =fbxgeo->GetControlPointsCount(); FbxVector4* controlpoints = fbxgeo->GetControlPoints(0); // x[12] = controlpoints[12]->mData[0]; //Fbxsdk::FbxVector4* pNormalArray; //fbxgeo->GetNormals(pNormalArray); //fbxgeo->GetNormalsIndices(); // fbxgeo->GetNormals(); // fbxgeo->get } } /* FbxClassId lShaderClassID = lSdkManager->FindFbxFileClass("Shader", "FlatShader"); for(int i = 0; i < lNode->GetSrcObjectCount(lShaderClassID); i++) { FbxObject* lObject = lNode->GetSrcObject(lShaderClassID, i); } */ return 1.00f; }