浏览代码

use fetchBytes/readBytes for model and animation data

Nicolas Cannasse 3 年之前
父节点
当前提交
5659d94e9e
共有 2 个文件被更改,包括 18 次插入36 次删除
  1. 3 10
      h3d/prim/HMDModel.hx
  2. 15 26
      hxd/fmt/hmd/Library.hx

+ 3 - 10
h3d/prim/HMDModel.hx

@@ -62,12 +62,9 @@ class HMDModel extends MeshPrimitive {
 		buffer = new h3d.Buffer(data.vertexCount, data.vertexStride, [LargeBuffer]);
 
 		var entry = lib.resource.entry;
-		entry.open();
 
-		entry.skip(dataPosition + data.vertexPosition);
 		var size = data.vertexCount * data.vertexStride * 4;
-		var bytes = haxe.io.Bytes.alloc(size);
-		entry.read(bytes, 0, size);
+		var bytes = entry.fetchBytes(dataPosition + data.vertexPosition, size);
 		buffer.uploadBytes(bytes, 0, data.vertexCount);
 
 		indexCount = 0;
@@ -79,14 +76,10 @@ class HMDModel extends MeshPrimitive {
 		var is32 = data.vertexCount > 0x10000;
 		indexes = new h3d.Indexes(indexCount, is32);
 
-		entry.skip(data.indexPosition - (data.vertexPosition + size));
-		var imult = is32 ? 4 : 2;
-		var bytes = haxe.io.Bytes.alloc(indexCount * imult);
-		entry.read(bytes, 0, indexCount * imult);
+		var size = (is32 ? 4 : 2) * indexCount;
+		var bytes = entry.fetchBytes(dataPosition + data.indexPosition, size);
 		indexes.uploadBytes(bytes, 0, indexCount);
 
-		entry.close();
-
 		var pos = 0;
 		for( f in data.vertexFormat ) {
 			addBuffer(f.name, buffer, pos);

+ 15 - 26
hxd/fmt/hmd/Library.hx

@@ -40,10 +40,7 @@ class Library {
 	public function getData() {
 		var entry = resource.entry;
 		var b = haxe.io.Bytes.alloc(entry.size - header.dataPosition);
-		entry.open();
-		entry.skip(header.dataPosition);
-		entry.read(b, 0, b.length);
-		entry.close();
+		entry.readFull(b, header.dataPosition, b.length);
 		return b;
 	}
 
@@ -142,12 +139,10 @@ class Library {
 		var vsize = geom.vertexCount * geom.vertexStride * 4;
 		var vbuf = haxe.io.Bytes.alloc(vsize);
 		var entry = resource.entry;
-		entry.open();
-		entry.skip(header.dataPosition + geom.vertexPosition);
-		entry.read(vbuf, 0, vsize);
 
-		entry.skip(geom.indexPosition - (geom.vertexPosition + vsize));
+		entry.readFull(vbuf, header.dataPosition + geom.vertexPosition, vsize);
 
+		var dataPos = header.dataPosition + geom.indexPosition;
 		var isSmall = geom.vertexCount <= 0x10000;
 		var imult = isSmall ? 2 : 4;
 
@@ -158,11 +153,11 @@ class Library {
 			var ipos = 0;
 			for( i in 0...material )
 				ipos += geom.indexCounts[i];
-			entry.skip(ipos * imult);
+			dataPos += ipos * imult;
 			isize = geom.indexCounts[material] * imult;
 		}
 		var ibuf = haxe.io.Bytes.alloc(isize);
-		entry.read(ibuf, 0, isize);
+		entry.readFull(ibuf, dataPos, isize);
 
 		var buf = new GeometryBuffer();
 		if( material == null ) {
@@ -253,7 +248,6 @@ class Library {
 			#end
 		}
 
-		entry.close();
 		return buf;
 	}
 
@@ -465,12 +459,9 @@ class Library {
 		}
 
 		var entry = resource.entry;
-		entry.open();
-		entry.skip(header.dataPosition + a.dataPosition);
 		var count = stride * a.frames + singleStride;
 		var data = haxe.io.Bytes.alloc(count * 4);
-		entry.read(data,0,data.length);
-		entry.close();
+		entry.readFull(data,header.dataPosition + a.dataPosition,data.length);
 
 		#if hl
 		b.setData(data, stride);
@@ -490,8 +481,7 @@ class Library {
 		var l = new h3d.anim.LinearAnimation(a.name, a.frames, a.sampling);
 
 		var entry = resource.entry;
-		entry.open();
-		entry.skip(header.dataPosition + a.dataPosition);
+		var dataPos = header.dataPosition + a.dataPosition;
 
 		for( o in a.objects ) {
 			var pos = o.flags.has(HasPosition), rot = o.flags.has(HasRotation), scale = o.flags.has(HasScale);
@@ -501,8 +491,8 @@ class Library {
 					frameCount = 1;
 				var fl = new haxe.ds.Vector<h3d.anim.LinearAnimation.LinearFrame>(frameCount);
 				var size = ((pos ? 3 : 0) + (rot ? 3 : 0) + (scale?3:0)) * 4 * frameCount;
-				var data = haxe.io.Bytes.alloc(size);
-				entry.read(data, 0, size);
+				var data = entry.fetchBytes(dataPos, size);
+				dataPos += size;
 				var p = 0;
 				for( i in 0...frameCount ) {
 					var f = new h3d.anim.LinearAnimation.LinearFrame();
@@ -543,8 +533,8 @@ class Library {
 			if( o.flags.has(HasUV) ) {
 				var fl = new haxe.ds.Vector(a.frames*2);
 				var size = 2 * 4 * a.frames;
-				var data = haxe.io.Bytes.alloc(size);
-				entry.read(data, 0, size);
+				var data = entry.fetchBytes(dataPos, size);
+				dataPos += size;
 				for( i in 0...fl.length )
 					fl[i] = data.getFloat(i * 4);
 				l.addUVCurve(o.name, fl);
@@ -552,8 +542,8 @@ class Library {
 			if( o.flags.has(HasAlpha) ) {
 				var fl = new haxe.ds.Vector(a.frames);
 				var size = 4 * a.frames;
-				var data = haxe.io.Bytes.alloc(size);
-				entry.read(data, 0, size);
+				var data = entry.fetchBytes(dataPos, size);
+				dataPos += size;
 				for( i in 0...fl.length )
 					fl[i] = data.getFloat(i * 4);
 				l.addAlphaCurve(o.name, fl);
@@ -562,8 +552,8 @@ class Library {
 				for( p in o.props ) {
 					var fl = new haxe.ds.Vector(a.frames);
 					var size = 4 * a.frames;
-					var data = haxe.io.Bytes.alloc(size);
-					entry.read(data, 0, size);
+					var data = entry.fetchBytes(dataPos, size);
+					dataPos += size;
 					for( i in 0...fl.length )
 						fl[i] = data.getFloat(i * 4);
 					l.addPropCurve(o.name, p, fl);
@@ -571,7 +561,6 @@ class Library {
 			}
 		}
 
-		entry.close();
 		return l;
 	}