فهرست منبع

Added : Flag to skip empty node hierarchies

Simon 10 سال پیش
والد
کامیت
fe50b2810c

+ 39 - 0
Exporters/FBX/BabylonFbxNative/BabylonNode.cpp

@@ -1,3 +1,5 @@
+#include "BabylonNode.h"
+#include "BabylonNode.h"
 #include "stdafx.h"
 #include "BabylonNode.h"
 #include "NodeHelpers.h"
@@ -27,6 +29,43 @@ BabylonNodeType BabylonNode::nodeType(){
 	return BabylonNodeType::Empty;
 }
 
+bool BabylonNode::isEmptySkeletonOrEmptyMesh()
+{
+	auto type = nodeType();
+	switch (type)
+	{
+	case BabylonNodeType::Mesh:
+	{
+		auto mesh = _node->GetMesh();
+		if (mesh->GetPolygonCount() == 0) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
+	case BabylonNodeType::Skeleton:
+	case BabylonNodeType::Empty:
+		return true;
+	default:
+		return false;
+	}
+}
+
+bool BabylonNode::isEmptySkeletonOrEmptyMeshRecursive()
+{
+	if (!isEmptySkeletonOrEmptyMesh()) {
+		return false;
+	}
+
+	for (auto& c : children()) {
+		if (!c.isEmptySkeletonOrEmptyMeshRecursive()) {
+			return false;
+		}
+	}
+	return true;
+}
+
 babylon_vector3 BabylonNode::localScale(FbxTime time){
 	auto transform = ConvertToBabylonCoordinateSystem(CalculateLocalTransform(_node,time));
 	return transform.GetS();

+ 2 - 1
Exporters/FBX/BabylonFbxNative/BabylonNode.h

@@ -33,7 +33,8 @@ public:
 
 	FbxNode* fbxNode(){ return _node; }
 	
-
+	bool isEmptySkeletonOrEmptyMesh();
+	bool isEmptySkeletonOrEmptyMeshRecursive();
 	void appendChild(FbxNode* fbxNode){
 		_children.emplace_back(fbxNode);
 	}

+ 10 - 7
Exporters/FBX/FbxExporter/FbxExporter.cpp

@@ -78,11 +78,11 @@ bool isNodeOrDescendantVisible(FbxNode* node){
 	return false;
 }
 
-void exploreMeshes(BabylonScene& scene, BabylonNode& node) {
+void exploreMeshes(BabylonScene& scene, BabylonNode& node, bool skipEmptyNodes) {
 	if (node.nodeType() == BabylonNodeType::Skeleton && node.hasOnlySkeletonDescendants()) {
 		return;
 	}
-	if (!node.fbxNode()->GetVisibility()){
+	if (skipEmptyNodes && node.isEmptySkeletonOrEmptyMeshRecursive()) {
 		return;
 	}
 	// append mesh
@@ -141,7 +141,7 @@ void exploreMeshes(BabylonScene& scene, BabylonNode& node) {
 
 
 	for (auto& child : node.children()) {
-		exploreMeshes(scene, child);
+		exploreMeshes(scene, child, skipEmptyNodes);
 	}
 
 
@@ -213,7 +213,7 @@ void exportTexture(const std::shared_ptr<BabylonTexture>& tex, const std::wstrin
 
 int _tmain(int argc, _TCHAR* argv[])
 {
-	std::wcout << L"Usage : FbxExporter <path to fbx file> <outdir> [/fps:60|30|24]" << std::endl;
+	std::wcout << L"Usage : FbxExporter <path to fbx file> <outdir> [/fps:60|30|24] [/skipemptynodes]" << std::endl;
 	if (argc < 3) {
 		std::wcerr << L"Invalid argument count" << std::endl;
 		return -1;
@@ -231,10 +231,13 @@ int _tmain(int argc, _TCHAR* argv[])
 	}
 	std::wstring wOutputPath(argv[2]);
 	CreateDirectory(wOutputPath.c_str(), nullptr);
-	
+	bool skipEmptyNodes = false;
 	for (int i = 3; i < argc; ++i){
 		std::wstring warg = argv[i];
-		if (warg.find(L"/fps:") == 0){
+		if (warg == L"/skipemptynodes") {
+			skipEmptyNodes = true;
+		}
+		else if (warg.find(L"/fps:") == 0){
 			if (warg == L"/fps:60"){
 				GlobalSettings::Current().AnimationsTimeMode = FbxTime::EMode::eFrames60;
 			}
@@ -259,7 +262,7 @@ int _tmain(int argc, _TCHAR* argv[])
 
 	BabylonScene babScene;
 	std::cout << "exporting empty nodes as empty meshes" << std::endl;
-	exploreMeshes(babScene, *root);
+	exploreMeshes(babScene, *root, skipEmptyNodes);
 
 	for (auto& mat : babScene.materials()){
 		exportTexture(mat.ambientTexture, wOutputPath);