Prechádzať zdrojové kódy

fixed y-to-z axis conversion with multiple roots

Nicolas Cannasse 5 rokov pred
rodič
commit
99bc94c289
1 zmenil súbory, kde vykonal 37 pridanie a 35 odobranie
  1. 37 35
      hxd/fmt/fbx/BaseLibrary.hx

+ 37 - 35
hxd/fmt/fbx/BaseLibrary.hx

@@ -183,7 +183,7 @@ class BaseLibrary {
 			updateModelScale();
 
 		// init properties
-		for( m in this.root.getAll("Objects.Model") ) {
+		for( m in getAllModels() ) {
 			for( p in m.getAll("Properties70.P") )
 				switch( p.props[0].toString() ) {
 				case "UDP3DSMAX" | "Events":
@@ -222,6 +222,18 @@ class BaseLibrary {
 		}
 	}
 
+	function getAllModels() {
+		return this.root.getAll("Objects.Model");
+	}
+
+	function getRootModels() {
+		return [for( m in getAllModels() ) if( isRootModel(m) ) m];
+	}
+
+	function isRootModel( m ) {
+		return getParent(m,"Model",true) == null;
+	}
+
 	function updateModelScale() {
 		var unitScale = 1;
 		var originScale = 1;
@@ -267,8 +279,8 @@ class BaseLibrary {
 			return;
 
 		// scale on root models
-		for( m in this.root.getAll("Objects.Model") ) {
-			var isRoot = getParent(m,"Model",true) == null;
+		for( m in getAllModels() ) {
+			var isRoot = isRootModel(m);
 			for( p in m.getAll("Properties70.P") )
 				switch( p.props[0].toString() ) {
 				case "Lcl Scaling" if( isRoot ):
@@ -319,38 +331,28 @@ class BaseLibrary {
 
 	function convertYupToZup( originalUpAxis : Int ) {
 		switch( originalUpAxis ) {
-			case 2: // Original Axis Z - Maya & 3DS Max 
-				var rootObject = root.get("Objects.Model.Properties70");
-				for( c in rootObject.childs ) {
-					if( c.props[0].toString() == "PreRotation" && c.props[4].toFloat() == -90 && c.props[5].toFloat()== 0 && c.props[6].toFloat() == 0 ) {
-						rootObject.childs.remove(c);
-						break;
+			case 2: // Original Axis Z - Maya & 3DS Max
+				for( rootObject in getRootModels() ) {
+					var props = rootObject.get("Properties70");
+					for( c in props.childs ) {
+						if( c.props[0].toString() == "PreRotation" && c.props[4].toFloat() == -90 && c.props[5].toFloat()== 0 && c.props[6].toFloat() == 0 ) {
+							props.childs.remove(c);
+							break;
+						}
 					}
 				}
 			case -1, 1: // Original Axis -Y or Y - Blender & Maya
-				var connections = root.get("Connections");
-				var rootId = 0;
-				for( c in connections.childs ) {
-					if( c.props[2].toInt() == 0 ) {
-						rootId = c.props[1].toInt();
-						break;
-					}
-				}
-				var rootObject = root.get("Objects.Model");
-				for( m in this.root.getAll("Objects.Model") ) {
-					if( m.props[0].toInt() == rootId ) {
-						var needPreRot = true;
-						for( c in root.getAll("GlobalSettings.Properties70.P") ) {
-							if( c.props[0].toString() == "PreRotation" && c.props[4].toFloat() == 90 && c.props[5].toFloat()== 0 && c.props[6].toFloat() == 0 ) {
-								needPreRot = false;
-								break;
-							}
-						}
-						if( needPreRot ) {
-							var preRotProp : FbxNode = {name : "P", props : [PString("PreRotation"), PString("Vector3D"), PString("Vector"), PString(""), PFloat(90),PFloat(0),PFloat(0)], childs : []};
-							m.get("Properties70").childs.insert(0, preRotProp);
+				for( m in getRootModels() ) {
+					var needPreRot = true;
+					for( c in root.getAll("GlobalSettings.Properties70.P") ) {
+						if( c.props[0].toString() == "PreRotation" && c.props[4].toFloat() == 90 && c.props[5].toFloat()== 0 && c.props[6].toFloat() == 0 ) {
+							needPreRot = false;
+							break;
 						}
-						break;
+					}
+					if( needPreRot ) {
+						var preRotProp : FbxNode = {name : "P", props : [PString("PreRotation"), PString("Vector3D"), PString("Vector"), PString(""), PFloat(90),PFloat(0),PFloat(0)], childs : []};
+						m.get("Properties70").childs.insert(0, preRotProp);
 					}
 				}
 			default:
@@ -517,7 +519,7 @@ class BaseLibrary {
 		var hobjects = new Map<Int, TmpObject>();
 
 		hobjects.set(0, oroot);
-		for( model in root.getAll("Objects.Model") ) {
+		for( model in getAllModels() ) {
 			if( skipObjects.get(model.getName()) )
 				continue;
 			var mtype = model.getType();
@@ -655,7 +657,7 @@ class BaseLibrary {
 	public function mergeModels( modelNames : Array<String> ) {
 		if( modelNames.length <= 1 )
 			return;
-		var models = root.getAll("Objects.Model");
+		var models = getAllModels();
 		function getModel(name) {
 			for( m in models )
 				if( m.getName() == name )
@@ -995,7 +997,7 @@ class BaseLibrary {
 		// process UVs
 		if( uvAnims != null ) {
 			var modelByName = new Map();
-			for( obj in this.root.getAll("Objects.Model") )
+			for( obj in getAllModels() )
 				modelByName.set(obj.getName(), obj);
 			for( obj in uvAnims.keys() ) {
 				var frames = uvAnims.get(obj);
@@ -1238,7 +1240,7 @@ class BaseLibrary {
 	function autoMerge() {
 		// 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") ) {
+		for( model in getAllModels() ) {
 			if( skipObjects.get(model.getName()) )
 				continue;
 			var mtype = model.getType();