فهرست منبع

handle position rotation in LH

Nicolas Cannasse 11 سال پیش
والد
کامیت
ea9bca0ec3
6فایلهای تغییر یافته به همراه46 افزوده شده و 17 حذف شده
  1. 11 0
      hxd/fmt/fbx/BaseLibrary.hx
  2. 6 4
      hxd/fmt/fbx/H3DOut.hx
  3. 20 5
      hxd/fmt/h3d/Data.hx
  4. 4 4
      hxd/fmt/h3d/Reader.hx
  5. 3 3
      hxd/fmt/h3d/Writer.hx
  6. 2 1
      samples/skin/Main.hx

+ 11 - 0
hxd/fmt/fbx/BaseLibrary.hx

@@ -66,6 +66,17 @@ class DefaultMatrixes {
 		return m;
 	}
 
+	public function toQuaternion(leftHand) {
+		var m = new h3d.Matrix();
+		m.identity();
+		if( rotate != null ) m.rotate(rotate.x, rotate.y, rotate.z);
+		if( preRot != null ) m.rotate(preRot.x, preRot.y, preRot.z);
+		if( leftHand ) rightHandToLeft(m);
+		var q = new h3d.Quat();
+		q.initRotateMatrix(m);
+		return q;
+	}
+
 }
 
 class BaseLibrary {

+ 6 - 4
hxd/fmt/fbx/H3DOut.hx

@@ -174,10 +174,12 @@ class H3DOut extends BaseLibrary {
 			p.sx = m.scale == null ? 1 : m.scale.x;
 			p.sy = m.scale == null ? 1 : m.scale.y;
 			p.sz = m.scale == null ? 1 : m.scale.z;
-			// TODO : rotate in left hand and handle pre-rot
-			p.rx = 0;
-			p.ry = 0;
-			p.rz = 0;
+
+			var q = m.toQuaternion(true);
+			q.normalize();
+			p.qx = q.x;
+			p.qy = q.y;
+			p.qz = q.z;
 			model.position = p;
 			d.models.push(model);
 

+ 20 - 5
hxd/fmt/h3d/Data.hx

@@ -15,21 +15,36 @@ class Position {
 	public var x : Float;
 	public var y : Float;
 	public var z : Float;
-	public var rx : Float;
-	public var ry : Float;
-	public var rz : Float;
+	public var qx : Float;
+	public var qy : Float;
+	public var qz : Float;
 	public var sx : Float;
 	public var sy : Float;
 	public var sz : Float;
 	public function new() {
 	}
+
+	public function loadQuaternion( q : h3d.Quat ) {
+		var qw = 1 - (qx * qx + qy * qy + qz * qz);
+		q.x = qx;
+		q.y = qy;
+		q.z = qz;
+		q.w = qw < 0 ? -Math.sqrt( -qw) : Math.sqrt(qw);
+	}
+
 	public function toMatrix() {
 		var m = new h3d.Matrix();
-		m.initScale(sx, sy, sx);
-		m.rotate(rx, ry, rz);
+		var q = QTMP;
+		loadQuaternion(q);
+		q.saveToMatrix(m);
+		// prepend scale
+		m._11 *= sx; m._12 *= sx; m._13 *= sx;
+		m._21 *= sy; m._22 *= sy; m._23 *= sy;
+		m._31 *= sz; m._32 *= sz; m._33 *= sz;
 		m.translate(x, y, z);
 		return m;
 	}
+	static var QTMP = new h3d.Quat();
 }
 
 class GeometryFormat {

+ 4 - 4
hxd/fmt/h3d/Reader.hx

@@ -22,9 +22,9 @@ class Reader {
 		p.x = i.readFloat();
 		p.y = i.readFloat();
 		p.z = i.readFloat();
-		p.rx = i.readFloat();
-		p.ry = i.readFloat();
-		p.rz = i.readFloat();
+		p.qx = i.readFloat();
+		p.qy = i.readFloat();
+		p.qz = i.readFloat();
 		p.sx = i.readFloat();
 		p.sy = i.readFloat();
 		p.sz = i.readFloat();
@@ -74,6 +74,7 @@ class Reader {
 			m.name = readName();
 			m.parent = i.readInt32();
 			m.position = readPosition();
+			d.models.push(m);
 			var count = i.readByte();
 			if( count == 0 ) continue;
 			m.geometries = [];
@@ -82,7 +83,6 @@ class Reader {
 				m.geometries.push(i.readInt32());
 			for( k in 0...count )
 				m.materials.push(i.readInt32());
-			d.models.push(m);
 		}
 		return d;
 	}

+ 3 - 3
hxd/fmt/h3d/Writer.hx

@@ -26,9 +26,9 @@ class Writer {
 		out.writeFloat(p.x);
 		out.writeFloat(p.y);
 		out.writeFloat(p.z);
-		out.writeFloat(p.rx);
-		out.writeFloat(p.ry);
-		out.writeFloat(p.rz);
+		out.writeFloat(p.qx);
+		out.writeFloat(p.qy);
+		out.writeFloat(p.qz);
 		out.writeFloat(p.sx);
 		out.writeFloat(p.sy);
 		out.writeFloat(p.sz);

+ 2 - 1
samples/skin/Main.hx

@@ -15,7 +15,8 @@ class Main extends hxd.App {
 		// add lights
 		var dir = new DirLight(new h3d.Vector( -1, 3, -10), s3d);
 		for( m in obj.getMaterials() ) {
-			m.mainPass.getShader(h3d.shader.Texture).killAlpha = true;
+			var t = m.mainPass.getShader(h3d.shader.Texture);
+			if( t != null ) t.killAlpha = true;
 			m.mainPass.enableLights = true;
 			m.shadows = true;
 		}