Explorar o código

handle GeometricRotation in FBX

ncannasse %!s(int64=8) %!d(string=hai) anos
pai
achega
e5307f46b2
Modificáronse 3 ficheiros con 64 adicións e 26 borrados
  1. 29 14
      h3d/prim/FBXModel.hx
  2. 23 6
      hxd/fmt/fbx/Geometry.hx
  3. 12 6
      hxd/fmt/fbx/HMDOut.hx

+ 29 - 14
h3d/prim/FBXModel.hx

@@ -39,18 +39,27 @@ class FBXModel extends MeshPrimitive {
 			return bounds;
 		bounds = new h3d.col.Bounds();
 		var verts = geom.getVertices();
-		var gt = geom.getGeomTranslate();
-		if( gt == null ) gt = new Point();
+		var gm = geom.getGeomMatrix();
+		var tmp = new h3d.col.Point();
 		if( verts.length > 0 ) {
-			bounds.xMin = bounds.xMax = verts[0] + gt.x;
-			bounds.yMin = bounds.yMax = verts[1] + gt.y;
-			bounds.zMin = bounds.zMax = verts[2] + gt.z;
+			tmp.set(verts[0], verts[1], verts[2]);
+			if( gm != null ) tmp.transform(gm);
+			bounds.xMin = bounds.xMax = tmp.x;
+			bounds.yMin = bounds.yMax = tmp.y;
+			bounds.zMin = bounds.zMax = tmp.z;
 		}
 		var pos = 3;
 		for( i in 1...Std.int(verts.length / 3) ) {
-			var x = verts[pos++] + gt.x;
-			var y = verts[pos++] + gt.y;
-			var z = verts[pos++] + gt.z;
+			var x = verts[pos++];
+			var y = verts[pos++];
+			var z = verts[pos++];
+			if( gm != null ) {
+				tmp.set(x, y, z);
+				tmp.transform(gm);
+				x = tmp.x;
+				y = tmp.y;
+				z = tmp.z;
+			}
 			if( x > bounds.xMax ) bounds.xMax = x;
 			if( x < bounds.xMin ) bounds.xMin = x;
 			if( y > bounds.yMax ) bounds.yMax = y;
@@ -104,9 +113,8 @@ class FBXModel extends MeshPrimitive {
 		var tuvs = geom.getUVs()[0];
 		var colors = geom.getColors();
 		var mats = multiMaterial ? geom.getMaterials() : null;
-
-		var gt = geom.getGeomTranslate();
-		if( gt == null ) gt = new Point();
+		var gm = geom.getGeomMatrix();
+		var tmp = new h3d.col.Point();
 
 		var idx = new hxd.IndexBuffer();
 		var midx = new Array<hxd.IndexBuffer>();
@@ -135,9 +143,16 @@ class FBXModel extends MeshPrimitive {
 					var k = n + start;
 					var vidx = index[k];
 
-					var x = verts[vidx * 3] + gt.x;
-					var y = verts[vidx * 3 + 1] + gt.y;
-					var z = verts[vidx * 3 + 2] + gt.z;
+					var x = verts[vidx * 3];
+					var y = verts[vidx * 3 + 1];
+					var z = verts[vidx * 3 + 2];
+					if( gm != null ) {
+						tmp.set(x, y, z);
+						tmp.transform(gm);
+						x = tmp.x;
+						y = tmp.y;
+						z = tmp.z;
+					}
 					pbuf.push(x);
 					pbuf.push(y);
 					pbuf.push(z);

+ 23 - 6
hxd/fmt/fbx/Geometry.hx

@@ -48,7 +48,7 @@ class Geometry {
 	public function merge( g : Geometry, materials : Array<Int> ) {
 		var vl = getVertices();
 		var vcount = Std.int(vl.length / 3);
-		if( g.getGeomTranslate() != null || this.getGeomTranslate() != null )
+		if( g.getGeomMatrix() != null || this.getGeomMatrix() != null )
 			throw "TODO";
 
 		// merge vertices
@@ -207,12 +207,29 @@ class Geometry {
 	}
 
 	@:access(hxd.fmt.fbx.BaseLibrary.leftHand)
-	public function getGeomTranslate() {
+	public function getGeomMatrix() {
+		var rot = null, trans = null;
 		for( p in lib.getParent(root, "Model").getAll("Properties70.P") )
-			if( p.props[0].toString() == "GeometricTranslation" )
-				return new h3d.col.Point(p.props[4].toFloat() * (lib.leftHand ? -1 : 1), p.props[5].toFloat(), p.props[6].toFloat());
-		return null;
+			switch( p.props[0].toString() ) {
+			case "GeometricTranslation":
+				trans = new h3d.col.Point(p.props[4].toFloat() * (lib.leftHand ? -1 : 1), p.props[5].toFloat(), p.props[6].toFloat());
+			case "GeometricRotation":
+				rot = new h3d.col.Point(p.props[4].toFloat() * Math.PI / 180, p.props[5].toFloat() * Math.PI / 180, p.props[6].toFloat() * Math.PI / 180);
+			default:
+			}
+		if( rot == null && trans == null )
+			return null;
+		var m = new h3d.Matrix();
+		if( rot == null )
+			m.identity();
+		else
+			m.initRotate(rot.x, rot.y, rot.z);
+		if( trans != null ) {
+			m.tx += trans.x;
+			m.ty += trans.y;
+			m.tz += trans.z;
+		}
+		return m;
 	}
 
-
 }

+ 12 - 6
hxd/fmt/fbx/HMDOut.hx

@@ -77,9 +77,7 @@ class HMDOut extends BaseLibrary {
 		g.vertexCount = 0;
 
 		// build geometry
-		var gt = geom.getGeomTranslate();
-		if( gt == null ) gt = new h3d.col.Point();
-
+		var gm = geom.getGeomMatrix();
 		var vbuf = new hxd.FloatBuffer();
 		var ibufs = [];
 
@@ -92,6 +90,7 @@ class HMDOut extends BaseLibrary {
 		var index = geom.getPolygons();
 		var count = 0, matPos = 0, stri = 0;
 		var lookup = new Map();
+		var tmp = new h3d.col.Point();
 		for( pos in 0...index.length ) {
 			var i = index[pos];
 			count++;
@@ -104,9 +103,16 @@ class HMDOut extends BaseLibrary {
 				var vidx = index[k];
 				var p = 0;
 
-				var x = verts[vidx * 3] + gt.x;
-				var y = verts[vidx * 3 + 1] + gt.y;
-				var z = verts[vidx * 3 + 2] + gt.z;
+				var x = verts[vidx * 3];
+				var y = verts[vidx * 3 + 1];
+				var z = verts[vidx * 3 + 2];
+				if( gm != null ) {
+					tmp.set(x, y, z);
+					tmp.transform(gm);
+					x = tmp.x;
+					y = tmp.y;
+					z = tmp.z;
+				}
 				tmpBuf[p++] = x;
 				tmpBuf[p++] = y;
 				tmpBuf[p++] = z;