Просмотр исходного кода

don't use flash.Memory to convert bones offsets to floats, instead use a ByteArray (a little slower but works on iOS/AOT)

ncannasse 12 лет назад
Родитель
Сommit
f991c04acf
1 измененных файлов с 7 добавлено и 15 удалено
  1. 7 15
      h3d/prim/FBXModel.hx

+ 7 - 15
h3d/prim/FBXModel.hx

@@ -53,8 +53,6 @@ class FBXModel extends MeshPrimitive {
 		return bounds;
 		return bounds;
 	}
 	}
 	
 	
-	static var TMP = null;
-
 	override function render( engine : h3d.Engine ) {
 	override function render( engine : h3d.Engine ) {
 		if( curMaterial < 0 ) {
 		if( curMaterial < 0 ) {
 			super.render(engine);
 			super.render(engine);
@@ -97,19 +95,11 @@ class FBXModel extends MeshPrimitive {
 		
 		
 		var idx = new flash.Vector<UInt>();
 		var idx = new flash.Vector<UInt>();
 		var midx = new Array<flash.Vector<UInt>>();
 		var midx = new Array<flash.Vector<UInt>>();
-		var pbuf = new flash.Vector<Float>(), nbuf = (norms == null ? null : new flash.Vector<Float>()), sbuf = (skin == null ? null : new flash.Vector<Float>()), tbuf = (tuvs == null ? null : new flash.Vector<Float>());
+		var pbuf = new flash.Vector<Float>(), nbuf = (norms == null ? null : new flash.Vector<Float>()), sbuf = (skin == null ? null : new flash.utils.ByteArray()), tbuf = (tuvs == null ? null : new flash.Vector<Float>());
 		var cbuf = (colors == null ? null : new flash.Vector<Float>());
 		var cbuf = (colors == null ? null : new flash.Vector<Float>());
 		var pout = 0, nout = 0, sout = 0, tout = 0, cout = 0;
 		var pout = 0, nout = 0, sout = 0, tout = 0, cout = 0;
 		
 		
-		if( sbuf != null ) {
-			var tmp = TMP;
-			if( tmp == null ) {
-				tmp = new flash.utils.ByteArray();
-				tmp.length = 1024;
-				TMP = tmp;
-			}
-			flash.Memory.select(tmp);
-		}
+		if( sbuf != null ) sbuf.endian = flash.utils.Endian.LITTLE_ENDIAN;
 		
 		
 		// triangulize indexes : format is  A,B,...,-X : negative values mark the end of the polygon
 		// triangulize indexes : format is  A,B,...,-X : negative values mark the end of the polygon
 		var count = 0, pos = 0, matPos = 0;
 		var count = 0, pos = 0, matPos = 0;
@@ -146,10 +136,10 @@ class FBXModel extends MeshPrimitive {
 						var p = vidx * skin.bonesPerVertex;
 						var p = vidx * skin.bonesPerVertex;
 						var idx = 0;
 						var idx = 0;
 						for( i in 0...skin.bonesPerVertex ) {
 						for( i in 0...skin.bonesPerVertex ) {
-							sbuf[sout++] = skin.vertexWeights[p + i];
+							sbuf.writeFloat(skin.vertexWeights[p + i]);
 							idx = (skin.vertexJoints[p + i] << (8*i)) | idx;
 							idx = (skin.vertexJoints[p + i] << (8*i)) | idx;
 						}
 						}
-						sbuf[sout++] = int32ToFloat(idx);
+						sbuf.writeUnsignedInt(idx);
 					}
 					}
 					
 					
 					if( cbuf != null ) {
 					if( cbuf != null ) {
@@ -189,7 +179,9 @@ class FBXModel extends MeshPrimitive {
 		if( nbuf != null ) addBuffer("normal", engine.mem.allocVector(nbuf, 3, 0));
 		if( nbuf != null ) addBuffer("normal", engine.mem.allocVector(nbuf, 3, 0));
 		if( tbuf != null ) addBuffer("uv", engine.mem.allocVector(tbuf, 2, 0));
 		if( tbuf != null ) addBuffer("uv", engine.mem.allocVector(tbuf, 2, 0));
 		if( sbuf != null ) {
 		if( sbuf != null ) {
-			var skinBuf = engine.mem.allocVector(sbuf, skin.bonesPerVertex + 1, 0);
+			var nverts = Std.int(sbuf.length / ((skin.bonesPerVertex + 1) * 4));
+			var skinBuf = engine.mem.alloc(nverts, skin.bonesPerVertex + 1, 0);
+			skinBuf.upload(sbuf, 0, nverts);
 			addBuffer("weights", skinBuf, 0);
 			addBuffer("weights", skinBuf, 0);
 			addBuffer("indexes", skinBuf, skin.bonesPerVertex);
 			addBuffer("indexes", skinBuf, skin.bonesPerVertex);
 		}
 		}