Browse Source

Blenshapes: support multi-object blendshapes

lviguier 1 year ago
parent
commit
ba3e523b0c
2 changed files with 14 additions and 5 deletions
  1. 9 3
      h3d/prim/Blendshape.hx
  2. 5 2
      hxd/fmt/fbx/HMDOut.hx

+ 9 - 3
h3d/prim/Blendshape.hx

@@ -4,6 +4,7 @@ package h3d.prim;
 class Blendshape {
 
 	var hmdModel : HMDModel;
+	var shapes : Array<hxd.fmt.hmd.Data.BlendShape>;
 	var weights : Array<Float>;
 	var inputMapping : Array<Map<String, Int>> = [];
 	var shapesBytes = [];
@@ -18,7 +19,13 @@ class Blendshape {
 		var is32 = hmdModel.data.vertexCount > 0x10000;
 		var vertexFormat = hmdModel.data.vertexFormat;
 		var size = hmdModel.data.vertexCount * vertexFormat.strideBytes;
-		var shapes = hmdModel.lib.header.shapes;
+
+		var geoId = 0;
+		for (gIdx => g in hmdModel.lib.header.geometries)
+			if (g == hmdModel.data)
+				geoId = gIdx;
+
+		shapes = [ for(s in hmdModel.lib.header.shapes) if (s.geom == geoId) s];
 
 		weights = [];
 
@@ -64,7 +71,7 @@ class Blendshape {
 		if (hmdModel.lib.header.shapes == null)
 			return 0;
 
-		return hmdModel.lib.header.shapes.length;
+		return shapes.length;
 	}
 
 	function uploadBlendshapeBytes() {
@@ -79,7 +86,6 @@ class Blendshape {
 		hmdModel.lib.resource.entry.readBytes(originalBytes, 0, hmdModel.dataPosition + hmdModel.data.vertexPosition, size);
 
 		var flagOffset = 31;
-		var shapes = hmdModel.lib.header.shapes;
 
 		var bytesOffset = haxe.io.Bytes.alloc(originalBytes.length);
 		bytesOffset.fill(0, originalBytes.length, 0);

+ 5 - 2
hxd/fmt/fbx/HMDOut.hx

@@ -551,6 +551,7 @@ class HMDOut extends BaseLibrary {
 			var s = shapes[i];
 			var shape = new BlendShape();
 			shape.name = s.name;
+			shape.geom = -1;
 			var indexes = s.get("Indexes").getFloats();//shapeIndexes[i];
 			var verts = s.get("Vertices").getFloats();
 			var normals = s.get("Normals").getFloats();
@@ -908,8 +909,10 @@ class HMDOut extends BaseLibrary {
 				gdata = { gid : d.geometries.length, materials : geom.materials };
 				d.geometries.push(geom.g);
 				hgeom.set(g.getId(), gdata);
-				for ( s in d.shapes )
-					s.geom = gdata.gid;
+				for ( s in d.shapes ) {
+					if (s.geom == -1)
+						s.geom = gdata.gid;
+				}
 			}
 			model.geometry = gdata.gid;