Browse Source

fixed large hmd models

Nicolas Cannasse 4 years ago
parent
commit
2426d7a307
3 changed files with 31 additions and 65 deletions
  1. 2 2
      h3d/prim/HMDModel.hx
  2. 27 61
      hxd/fmt/fbx/HMDOut.hx
  3. 2 2
      hxd/fmt/hmd/Library.hx

+ 2 - 2
h3d/prim/HMDModel.hx

@@ -55,8 +55,7 @@ class HMDModel extends MeshPrimitive {
 
 	override function alloc(engine:h3d.Engine) {
 		dispose();
-		var is32 = data.vertexCount >= 65534;
-		buffer = new h3d.Buffer(data.vertexCount, data.vertexStride, is32 ? [LargeBuffer] : null);
+		buffer = new h3d.Buffer(data.vertexCount, data.vertexStride, [LargeBuffer]);
 
 		var entry = lib.resource.entry;
 		entry.open();
@@ -73,6 +72,7 @@ class HMDModel extends MeshPrimitive {
 			indexesTriPos.push(Std.int(indexCount/3));
 			indexCount += n;
 		}
+		var is32 = data.vertexCount > 0x10000;
 		indexes = new h3d.Indexes(indexCount, is32);
 
 		entry.skip(data.indexPosition - (data.vertexPosition + size));

+ 27 - 61
hxd/fmt/fbx/HMDOut.hx

@@ -179,16 +179,11 @@ class HMDOut extends BaseLibrary {
 		// build geometry
 		var gm = geom.getGeomMatrix();
 		var vbuf = new hxd.FloatBuffer();
-		var ibufs = null, lbufs = null;
-		var isSmall = verts.length > 65534 * 3;
-		if( isSmall ) ibufs = [] else lbufs = [];
+		var ibufs = [];
 
 		if( skin != null && skin.isSplit() ) {
 			for( _ in skin.splitJoints )
-				if( isSmall )
-					ibufs.push(new hxd.IndexBuffer());
-				else
-					lbufs.push([]);
+				ibufs.push([]);
 		}
 
 		g.bounds = new h3d.col.Bounds();
@@ -309,20 +304,11 @@ class HMDOut extends BaseLibrary {
 
 			// by-skin-group index
 			if( skin != null && skin.isSplit() ) {
-				if( isSmall ) {
-					for( n in 0...count - 2 ) {
-						var idx = ibufs[skin.triangleGroups[stri++]];
-						idx.push(vertexRemap[start + n]);
-						idx.push(vertexRemap[start + count - 1]);
-						idx.push(vertexRemap[start + n + 1]);
-					}
-				} else {
-					for( n in 0...count - 2 ) {
-						var idx = lbufs[skin.triangleGroups[stri++]];
-						idx.push(vertexRemap[start + n]);
-						idx.push(vertexRemap[start + count - 1]);
-						idx.push(vertexRemap[start + n + 1]);
-					}
+				for( n in 0...count - 2 ) {
+					var idx = ibufs[skin.triangleGroups[stri++]];
+					idx.push(vertexRemap[start + n]);
+					idx.push(vertexRemap[start + count - 1]);
+					idx.push(vertexRemap[start + n + 1]);
 				}
 			}
 			// by-material index
@@ -334,28 +320,15 @@ class HMDOut extends BaseLibrary {
 					mid = mats[matPos];
 					if( mats.length > 1 ) matPos++;
 				}
-				if( isSmall ) {
-					var idx = ibufs[mid];
-					if( idx == null ) {
-						idx = new hxd.IndexBuffer();
-						ibufs[mid] = idx;
-					}
-					for( n in 0...count - 2 ) {
-						idx.push(vertexRemap[start + n]);
-						idx.push(vertexRemap[start + count - 1]);
-						idx.push(vertexRemap[start + n + 1]);
-					}
-				} else {
-					var idx = lbufs[mid];
-					if( idx == null ) {
-						idx = [];
-						lbufs[mid] = idx;
-					}
-					for( n in 0...count - 2 ) {
-						idx.push(vertexRemap[start + n]);
-						idx.push(vertexRemap[start + count - 1]);
-						idx.push(vertexRemap[start + n + 1]);
-					}
+				var idx = ibufs[mid];
+				if( idx == null ) {
+					idx = [];
+					ibufs[mid] = idx;
+				}
+				for( n in 0...count - 2 ) {
+					idx.push(vertexRemap[start + n]);
+					idx.push(vertexRemap[start + count - 1]);
+					idx.push(vertexRemap[start + n + 1]);
 				}
 			}
 
@@ -371,28 +344,21 @@ class HMDOut extends BaseLibrary {
 		g.indexCounts = [];
 
 		var matMap = [], matCount = 0;
+		var is32 = g.vertexCount > 0x10000;
 
-		if( isSmall ) {
-			for( idx in ibufs ) {
-				if( idx == null ) {
-					matCount++;
-					continue;
-				}
-				matMap.push(matCount++);
-				g.indexCounts.push(idx.length);
-				for( i in idx )
-					dataOut.writeUInt16(i);
+		for( idx in ibufs ) {
+			if( idx == null ) {
+				matCount++;
+				continue;
 			}
-		} else {
-			for( idx in lbufs ) {
-				if( idx == null ) {
-					matCount++;
-					continue;
-				}
-				matMap.push(matCount++);
-				g.indexCounts.push(idx.length);
+			matMap.push(matCount++);
+			g.indexCounts.push(idx.length);
+			if( is32 ) {
 				for( i in idx )
 					dataOut.writeInt32(i);
+			} else {
+				for( i in idx )
+					dataOut.writeUInt16(i);
 			}
 		}
 

+ 2 - 2
hxd/fmt/hmd/Library.hx

@@ -148,8 +148,8 @@ class Library {
 
 		entry.skip(geom.indexPosition - (geom.vertexPosition + vsize));
 
-		var isSmall = geom.vertexCount < 65534;
-		var imult = isSmall ? 4 : 2;
+		var isSmall = geom.vertexCount <= 0x10000;
+		var imult = isSmall ? 2 : 4;
 
 		var isize;
 		if( material == null )