public void FillSkeleton(SuperBMDLib.BMD.INF1 INF1, STSkeleton skeleton, List <SuperBMDLib.Rigging.Bone> flatSkeleton) { for (int i = 1; i < INF1.FlatNodes.Count; i++) { SuperBMDLib.Scenegraph.SceneNode curNode = INF1.FlatNodes[i]; if (curNode.Type == SuperBMDLib.Scenegraph.Enums.NodeType.Joint) { var Bone = flatSkeleton[curNode.Index]; var stBone = new STBone(skeleton); stBone.Text = Bone.Name; stBone.FromTransform(Bone.TransformationMatrix); if (Bone.Parent != null) { stBone.parentIndex = flatSkeleton.IndexOf(Bone.Parent); } else { stBone.parentIndex = -1; } skeleton.bones.Add(stBone); } } }
/// <summary> /// Computes mesh and bone cloth drivers /// </summary> public void ComputeClothDrivers() { var boneList = G1MSkeleton.GenericSkeleton.bones; var nunProps = new List <NUNO.NUNOType0303Struct>(); uint nunoOffset = 0; if (NUNO != null) { nunoOffset = (uint)NUNO.NUNO0303StructList.Count; foreach (var nuno0303 in NUNO.NUNO0303StructList) { nunProps.Add(nuno0303); } } if (NUNV != null) { foreach (var nuno0303 in NUNV.NUNV0303StructList) { nunProps.Add(nuno0303); } } foreach (var prop in nunProps) { int boneStart = boneList.Count; var parentBone = Model.JointInfos[prop.BoneParentID - 1].JointIndices[0]; GenericRenderedObject mesh = new GenericRenderedObject(); mesh.Text = $"driver_{boneList.Count}"; mesh.Checked = true; Renderer.Meshes.Add(mesh); meshNode.Nodes.Add(mesh); var polyGroup = new STGenericPolygonGroup(); polyGroup.Material = new STGenericMaterial(); polyGroup.Material.Text = "driver_cloth"; polyGroup.PrimativeType = STPrimitiveType.Triangles; mesh.PolygonGroups.Add(polyGroup); for (int p = 0; p < prop.Points.Length; p++) { var point = prop.Points[p]; var link = prop.Influences[p]; STBone b = new STBone(G1MSkeleton.GenericSkeleton); b.Text = $"CP_{boneList.Count}"; b.FromTransform(OpenTK.Matrix4.Identity); b.Position = point.Xyz; b.parentIndex = link.P3; if (b.parentIndex == -1) { b.parentIndex = (int)parentBone; } else { b.parentIndex += boneStart; b.Position = OpenTK.Vector3.TransformPosition( point.Xyz, G1MSkeleton.GenericSkeleton.GetBoneTransform((int)parentBone) * G1MSkeleton.GenericSkeleton.GetBoneTransform(b.parentIndex).Inverted()); } boneList.Add(b); G1MSkeleton.GenericSkeleton.reset(); G1MSkeleton.GenericSkeleton.update(); mesh.vertices.Add(new Vertex() { pos = Vector3.TransformPosition(Vector3.Zero, G1MSkeleton.GenericSkeleton.GetBoneTransform(boneList.Count - 1)), boneWeights = new List <float>() { 1 }, boneIds = new List <int>() { boneList.Count - 1 }, }); if (link.P1 > 0 && link.P3 > 0) { polyGroup.faces.Add(p); polyGroup.faces.Add(link.P1); polyGroup.faces.Add(link.P3); } if (link.P2 > 0 && link.P4 > 0) { polyGroup.faces.Add(p); polyGroup.faces.Add(link.P2); polyGroup.faces.Add(link.P4); } } mesh.CalculateNormals(); } }