Parcourir la source

Library.loadSkin: limited support for 4 bones per vertex

trethaller il y a 3 ans
Parent
commit
30efa9ac86
1 fichiers modifiés avec 10 ajouts et 6 suppressions
  1. 10 6
      hxd/fmt/hmd/Library.hx

+ 10 - 6
hxd/fmt/hmd/Library.hx

@@ -587,14 +587,18 @@ class Library {
 		if( skin.vertexWeights != null )
 		if( skin.vertexWeights != null )
 			return;
 			return;
 
 
-		if( skin.bonesPerVertex != 3 )
-			throw "assert";
-
 		@:privateAccess skin.vertexCount = geom.vertexCount;
 		@:privateAccess skin.vertexCount = geom.vertexCount;
-		var data = getBuffers(geom, [
+
+		// For now only take 3 first weights into account even in 4 bones per vertex, which should be fine since they're sorted
+		var format = [
 			new hxd.fmt.hmd.Data.GeometryFormat("position",DVec3),
 			new hxd.fmt.hmd.Data.GeometryFormat("position",DVec3),
 			new hxd.fmt.hmd.Data.GeometryFormat("weights",DVec3),
 			new hxd.fmt.hmd.Data.GeometryFormat("weights",DVec3),
-			new hxd.fmt.hmd.Data.GeometryFormat("indexes",DBytes4)]);
+			new hxd.fmt.hmd.Data.GeometryFormat("indexes",DBytes4)];
+		var data = getBuffers(geom, format);
+		var formatStride = 0;
+		for(f in format)
+			formatStride += f.format.getSize();
+
 		skin.vertexWeights = new haxe.ds.Vector(skin.vertexCount * skin.bonesPerVertex);
 		skin.vertexWeights = new haxe.ds.Vector(skin.vertexCount * skin.bonesPerVertex);
 		skin.vertexJoints = new haxe.ds.Vector(skin.vertexCount * skin.bonesPerVertex);
 		skin.vertexJoints = new haxe.ds.Vector(skin.vertexCount * skin.bonesPerVertex);
 
 
@@ -631,7 +635,7 @@ class Library {
 		for( r in ranges ) {
 		for( r in ranges ) {
 			for( idx in r.pos...r.pos+r.count ) {
 			for( idx in r.pos...r.pos+r.count ) {
 				var vidx = data.indexes[idx];
 				var vidx = data.indexes[idx];
-				var p = vidx * 7;
+				var p = vidx * formatStride;
 				var x = vbuf[p];
 				var x = vbuf[p];
 				if( x != x ) {
 				if( x != x ) {
 					// already processed
 					// already processed