private void ConformAnimationBindPoses(Skeleton skeleton, Skeleton conformToSkeleton) { foreach (var trackGroup in Root.TrackGroups) { for (var i = 0; i < trackGroup.TransformTracks.Count; i++) { var track = trackGroup.TransformTracks[i]; var bone = skeleton.GetBoneByName(track.Name); if (bone == null) { string msg = String.Format("Animation track references bone '{0}' that cannot be found in the skeleton.", track.Name); throw new ExportException(msg); } var conformingBone = conformToSkeleton.GetBoneByName(track.Name); if (conformingBone == null) { string msg = String.Format("Animation track references bone '{0}' that cannot be found in the conforming skeleton.", track.Name); throw new ExportException(msg); } var keyframes = track.ToKeyframes(); keyframes.SwapBindPose(bone.OriginalTransform, conformingBone.Transform.ToMatrix4()); var newTrack = TransformTrack.FromKeyframes(keyframes); newTrack.Flags = track.Flags; newTrack.Name = track.Name; newTrack.ParentAnimation = track.ParentAnimation; trackGroup.TransformTracks[i] = newTrack; } } }
private void UpdateOBBs(Skeleton skeleton, Mesh mesh) { if (mesh.BoneBindings == null || mesh.BoneBindings.Count == 0) { return; } var obbs = new List <OBB>(mesh.BoneBindings.Count); for (var i = 0; i < mesh.BoneBindings.Count; i++) { obbs.Add(new OBB { Min = new Vector3(1000.0f, 1000.0f, 1000.0f), Max = new Vector3(-1000.0f, -1000.0f, -1000.0f), }); } foreach (var vert in mesh.PrimaryVertexData.Vertices) { for (var i = 0; i < 4; i++) { if (vert.BoneWeights[i] > 0) { var bi = vert.BoneIndices[i]; var obb = obbs[bi]; obb.NumVerts++; var bone = skeleton.GetBoneByName(mesh.BoneBindings[bi].BoneName); var invWorldTransform = ColladaHelpers.FloatsToMatrix(bone.InverseWorldTransform); var transformed = Vector3.Transform(vert.Position, invWorldTransform); obb.Min.X = Math.Min(obb.Min.X, transformed.X); obb.Min.Y = Math.Min(obb.Min.Y, transformed.Y); obb.Min.Z = Math.Min(obb.Min.Z, transformed.Z); obb.Max.X = Math.Max(obb.Max.X, transformed.X); obb.Max.Y = Math.Max(obb.Max.Y, transformed.Y); obb.Max.Z = Math.Max(obb.Max.Z, transformed.Z); } } } for (var i = 0; i < obbs.Count; i++) { var obb = obbs[i]; if (obb.NumVerts > 0) { mesh.BoneBindings[i].OBBMin = new float[] { obb.Min.X, obb.Min.Y, obb.Min.Z }; mesh.BoneBindings[i].OBBMax = new float[] { obb.Max.X, obb.Max.Y, obb.Max.Z }; } else { mesh.BoneBindings[i].OBBMin = new float[] { 0.0f, 0.0f, 0.0f }; mesh.BoneBindings[i].OBBMax = new float[] { 0.0f, 0.0f, 0.0f }; } } }
private void ConformAnimationBindPoses(Skeleton skeleton, Skeleton conformToSkeleton) { if (Root.TrackGroups == null) { return; } foreach (var trackGroup in Root.TrackGroups) { for (var i = 0; i < trackGroup.TransformTracks.Count; i++) { var track = trackGroup.TransformTracks[i]; var bone = skeleton.GetBoneByName(track.Name); if (bone == null) { //Dummy_Foot -> Dummy_Foot_01 bone = skeleton.GetBoneByName(track.Name + "_01"); } if (bone == null) { throw new ExportException($"Animation track references bone '{track.Name}' that cannot be found in the skeleton '{skeleton.Name}'."); } var conformingBone = conformToSkeleton.GetBoneByName(bone.Name); if (conformingBone == null) { throw new ExportException($"Animation track references bone '{bone.Name}' that cannot be found in the conforming skeleton '{conformToSkeleton.Name}'."); } var keyframes = track.ToKeyframes(); keyframes.SwapBindPose(bone.OriginalTransform, conformingBone.Transform.ToMatrix4()); var newTrack = TransformTrack.FromKeyframes(keyframes); newTrack.Flags = track.Flags; newTrack.Name = track.Name; newTrack.ParentAnimation = track.ParentAnimation; trackGroup.TransformTracks[i] = newTrack; } } }
private void ConformSkeletonAnimations(Skeleton skeleton) { if (Root.TrackGroups == null) { return; } foreach (var trackGroup in Root.TrackGroups) { foreach (var track in trackGroup.TransformTracks) { var bone = skeleton.GetBoneByName(track.Name); //Dummy_Foot -> Dummy_Foot_01 if (bone == null) { bone = skeleton.GetBoneByName(track.Name + "_01"); } if (bone == null) { throw new ExportException($"Animation track references bone '{track.Name}' that cannot be found in the skeleton '{skeleton.Name}'."); } } } }
private void ConformSkeletonAnimations(Skeleton skeleton) { foreach (var trackGroup in Root.TrackGroups) { foreach (var track in trackGroup.TransformTracks) { var bone = skeleton.GetBoneByName(track.Name); if (bone == null) { string msg = String.Format("Animation track references bone '{0}' that cannot be found in the skeleton.", track.Name); throw new ExportException(msg); } } } }