private static HdMorph.VertexEdit ReadVertexEdit(BinaryReader reader, int levelIdx) { float x = reader.ReadSingle(); ushort packedPathLow; ushort packedPathHigh; if (levelIdx < LongPathLevelThreshold) { packedPathLow = 0; packedPathHigh = reader.ReadUInt16(); } else { packedPathLow = reader.ReadUInt16(); packedPathHigh = reader.ReadUInt16(); } uint packedPath = ((uint)packedPathHigh << 16) | (uint)packedPathLow; float y = reader.ReadSingle(); float z = reader.ReadSingle(); var delta = new Vector3(x, y, z); var vertexEdit = new HdMorph.VertexEdit(packedPath, delta); if (vertexEdit.PathLength != levelIdx + 1) { throw new InvalidOperationException("path length mismatch"); } return(vertexEdit); }
public void TestPackPath() { int[] path = { 0, 2, 1 }; uint packedPath = HdMorph.VertexEdit.PackPath(0, 2, 1); var vertexEdit = new HdMorph.VertexEdit(packedPath, Vector3.Zero); Assert.AreEqual(path.Length, vertexEdit.PathLength); Assert.AreEqual(path[0], vertexEdit.GetPathElement(0)); Assert.AreEqual(path[1], vertexEdit.GetPathElement(1)); Assert.AreEqual(path[2], vertexEdit.GetPathElement(2)); }
private void TestLevel1HdMorph() { var delta = new Vector3(10, 20, 30); var vertexEdit = new HdMorph.VertexEdit(HdMorph.VertexEdit.PackPath(0, 2), delta); var faceEdit = new HdMorph.FaceEdit(100, ImmutableArray.Create(vertexEdit)); var level1 = new HdMorph.Level(controlTopology.Faces.Length, 1, ImmutableArray.Create(faceEdit)); var levels = ImmutableArray.Create(level1); HdMorph hdMorph = new HdMorph(levels); Vector3 expectedPosition = new Vector3(29.7680817f, 183.135971f, 13.2819338f); //from Daz studio export TestHdMorph(hdMorph, 100 * 4, 2, expectedPosition); }
private void TestLevel2HdMorph() { var delta = new Vector3(10, 20, 30); var vertexEdit = new HdMorph.VertexEdit(HdMorph.VertexEdit.PackPath(0, 2, 1), delta); var faceEdit = new HdMorph.FaceEdit(200, ImmutableArray.Create(vertexEdit)); var level1 = new HdMorph.Level(controlTopology.Faces.Length, 1, ImmutableArray <HdMorph.FaceEdit> .Empty); var level2 = new HdMorph.Level(controlTopology.Faces.Length, 2, ImmutableArray.Create(faceEdit)); var levels = ImmutableArray.Create(level1, level2); HdMorph hdMorph = new HdMorph(levels); Vector3 expectedPosition = new Vector3(7.82922983f, 197.132507f, -15.0236731f); //from Daz studio export TestHdMorph(hdMorph, ((200 * 4) + 0) * 4 + 2, 1, expectedPosition); }
public void Run() { var delta = new Vector3(10, 20, 30); var vertexEdit = new HdMorph.VertexEdit(HdMorph.VertexEdit.PackPath(0, 2, 1), delta); var faceEdit = new HdMorph.FaceEdit(200, ImmutableArray.Create(vertexEdit)); var level1 = new HdMorph.Level(G3FControlFaceCount, 1, ImmutableArray <HdMorph.FaceEdit> .Empty); var level2 = new HdMorph.Level(G3FControlFaceCount, 2, ImmutableArray.Create(faceEdit)); var levels = ImmutableArray.Create(level1, level2); HdMorph hdMorph = new HdMorph(levels); var outFile = new FileInfo(@"C:\Users\Public\Documents\My DAZ 3D Library\data\DAZ 3D\Genesis 3\Female\Morphs\GregTest\FBM-GregHDTest.dhdm"); HdMorphSerialization.SaveHdMorph(outFile, hdMorph); }
private static void WriterVertexEdit(BinaryWriter writer, int levelIdx, HdMorph.VertexEdit vertexEdit) { writer.Write(vertexEdit.Delta.X); ushort packedPathLow = (ushort)(vertexEdit.PackedPath & 0xffff); ushort packedPathHigh = (ushort)(vertexEdit.PackedPath >> 16); if (levelIdx < LongPathLevelThreshold) { writer.Write(packedPathHigh); } else { writer.Write(packedPathLow); writer.Write(packedPathHigh); } writer.Write(vertexEdit.Delta.Y); writer.Write(vertexEdit.Delta.Z); }