浏览代码

auto merge models with shared mesh (alphabetical order)

ncannasse 11 年之前
父节点
当前提交
84c3f3f9ef
共有 1 个文件被更改,包括 39 次插入1 次删除
  1. 39 1
      hxd/fmt/fbx/Library.hx

+ 39 - 1
hxd/fmt/fbx/Library.hx

@@ -765,7 +765,7 @@ class Library {
 	}
 
 	function isNullJoint( model : FbxNode ) {
-		if( getParent(model, "Deformer", true) != null )
+		if( getParents(model, "Deformer").length > 0 )
 			return false;
 		var parent = getParent(model, "Model", true);
 		if( parent == null )
@@ -800,6 +800,44 @@ class Library {
 			}
 		}
 
+		// if we have multiple deformers on the same joint, let's merge the geometries
+		var toMerge = [], mergeGroups = new Map<Int,Array<FbxNode>>();
+		for( model in root.getAll("Objects.Model") ) {
+			if( skipObjects.get(model.getName()) )
+				continue;
+			var mtype = model.getType();
+			var isJoint = mtype == "LimbNode" && (!unskinnedJointsAsObjects || !isNullJoint(model));
+			if( !isJoint ) continue;
+			var deformers = getParents(model, "Deformer");
+			if( deformers.length <= 1 ) continue;
+			var group = [];
+			for( d in deformers ) {
+				var def = getParent(d, "Deformer");
+				if( def == null ) continue;
+				var geom = getParent(def, "Geometry");
+				if( geom == null ) continue;
+				var model2 = getParent(geom, "Model");
+				if( model2 == null ) continue;
+				var id = model2.getId();
+				var g = mergeGroups.get(id);
+				if( g != null ) {
+					for( g in g ) {
+						group.remove(g);
+						group.push(g);
+					}
+					toMerge.remove(g);
+				}
+				group.remove(model2);
+				group.push(model2);
+				mergeGroups.set(id, group);
+			}
+			toMerge.push(group);
+		}
+		for( group in toMerge ) {
+			group.sort(function(m1, m2) return Reflect.compare(m1.getName(), m2.getName()));
+			mergeModels([for( g in group ) g.getName()]);
+		}
+
 		// init objects
 		var oroot : TmpObject = { model : null, isJoint : false, isMesh : false, childs : [], parent : null, obj : scene };
 		hobjects.set(0, oroot);