浏览代码

haxe3 compat + use floats instead of doubles

Nicolas Cannasse 13 年之前
父节点
当前提交
72b2a8b1ab
共有 2 个文件被更改,包括 59 次插入56 次删除
  1. 40 41
      h3d/fbx/XBXReader.hx
  2. 19 15
      h3d/fbx/XBXWriter.hx

+ 40 - 41
h3d/fbx/XBXReader.hx

@@ -5,27 +5,22 @@ class XBXReader
 {
 	var i : haxe.io.Input;
 	var version : Int;
-	
+
 	public function new(i) {
 		this.i = i;
 	}
-	
+
 	function error(?msg) {
 		throw "Invalid XBX data"+((null!=msg)? (": "+msg) : "");
 	}
-	
-	function readFloat()
-	{
-		return i.readDouble();
-	}
-	
+
 	function readString() {
 		var len = i.readByte();
 		if( len >= 0x80 )
 			len = (i.readUInt24() << 7) | (len & 0x7F);
 		return i.readString(len);
 	}
-	
+
 	public function read() : FbxNode {
 		if( i.readString(3) != "XBX" )
 			error("no XBX sig");
@@ -34,63 +29,67 @@ class XBXReader
 			error("version err "+version);
 		return readNode();
 	}
-	
+
 	public function readNode() : FbxNode
 	{
-		var name;
-		var r =
-		{
-			name: name = readString(),
-			props:
-				{
-					var a = [];
-					var l = i.readByte();
-					a[l-1] = null;
-					for ( i in  0...l)
-						a[i] = readProp();
-					a;
-				},
-			childs:
-				{
-					var a = [];
-					var l = i.readInt24();
-					a[l - 1] = null;
-					for ( i in  0...l)
-						a[i] = readNode();
-					a;
-				}
+		return {
+			name: readString(),
+			props: {
+				var a = [];
+				var l = i.readByte();
+				a[l-1] = null;
+				for( i in 0...l )
+					a[i] = readProp();
+				a;
+			},
+			childs: {
+				var a = [];
+				var l = i.readInt24();
+				a[l - 1] = null;
+				for( i in 0...l)
+					a[i] = readNode();
+				a;
+			}
 		};
 		return r;
 	}
-	
+
+	inline function readInt() {
+		#if haxe3
+		return i.readInt32();
+		#else
+		return i.readInt31();
+		#end
+	}
+
 	public function readProp()
 	{
 		var b = i.readByte();
 		var t = switch( b )
 		{
-			case 0: PInt( i.readInt31() );
-			case 1: PFloat( readFloat() );
+			case 0: PInt( readInt());
+			case 1: PFloat( i.readFloat() );
 			case 2: PString( readString() );
 			case 3: PIdent( readString() );
 			case 4:
-				var l = i.readInt31();
+				var l = readInt();
 				var a = [];
 				a[l - 1] = 0;
-				for ( idx in 0...l)
-					a[idx] = i.readInt31();
+				for( idx in 0...l )
+					a[idx] = readInt();
 				PInts( a );
 			case 5:
-				var l = i.readInt31();
+				var l = readInt();
 				var a = [];
 				a[l - 1] = 0.;
 				for( idx in 0...l)
-					a[idx] = readFloat();
+					a[idx] = i.readFloat();
 				PFloats( a );
 			default:
 				error( "unknown prop " + b);
 				null;
 		}
-		
+
 		return t;
 	}
 }

+ 19 - 15
h3d/fbx/XBXWriter.hx

@@ -11,14 +11,14 @@ class XBXWriter
 	public function new(o) {
 		this.o = o;
 	}
-	
+
 	public function write( n : FbxNode )
 	{
 		o.writeString("XBX");
 		o.writeByte(0); // version
 		writeNode(n);
 	}
-	
+
 	function writeString( s : String ) {
 		if( s.length < 0x80 )
 			o.writeByte(s.length);
@@ -28,40 +28,44 @@ class XBXWriter
 		}
 		o.writeString(s);
 	}
-	
+
 	public function writeNode( n : FbxNode)
 	{
 		writeString( n.name);
 		o.writeByte( n.props.length );
 		for ( p in n.props)
 			writeProperty( p );
-			
+
 		o.writeInt24( n.childs.length );
 		for ( c in n.childs )
 			writeNode( c );
 	}
-	
-	public function writeFloat(v)
-	{
-		o.writeDouble( v);
+
+	inline function writeInt(v) {
+		#if haxe3
+		o.writeInt32(v);
+		#else
+		o.writeInt31(v);
+		#end
 	}
-	
+
+
 	public function writeProperty( p : FbxProp )
 	{
 		o.writeByte( Type.enumIndex( p ) );
-		
+
 		switch( p )
 		{
-			case PInt( v ):		o.writeInt31( v );
-			case PFloat( v ):	writeFloat( v );
+			case PInt( v ):		writeInt( v );
+			case PFloat( v ):	i.writeFloat(v);
 			case PString( v ):	writeString( v );
 			case PIdent( v ): 	writeString( v );
 			case PInts( va ):
-				o.writeInt31( va.length );
-				for ( i in va ) o.writeInt31( i );
+				writeInt( va.length );
+				for ( i in va ) writeInt( i );
 			case PFloats( va ):
 				o.writeInt31( va.length );
-				for ( i in va ) writeFloat( i );
+				for ( i in va ) i.writeFloat(i);
 		}
 	}