public Bone(Bone source) { name = String.Copy(source.name); pos = new Vector3(source.pos); rot = new Quaternion(source.rot); scale = new Vector3(source.scale); piviot = new Vector3(source.piviot); offset_pos = new Vector3(source.offset_pos); orig_piviot = source.orig_piviot; orig_pos = source.orig_pos; orig_rot = source.orig_rot; orig_scale = source.orig_scale; mParentBone = source.mParentBone; mDeformMatrix = new Matrix4(source.mDeformMatrix); }
public static void addbone(XmlNode bone, Bone parent) { if (bone.Name != "bone") return; Bone b = new Bone(); b.name = bone.Attributes.GetNamedItem("name").Value; string pos = bone.Attributes.GetNamedItem("pos").Value; string[] posparts = pos.Split(' '); b.pos = new Vector3(float.Parse(posparts[0], Utils.EnUsCulture), float.Parse(posparts[1], Utils.EnUsCulture), float.Parse(posparts[2], Utils.EnUsCulture)); b.orig_pos = new Vector3(b.pos); b.offset_pos = new Vector3(b.pos); string rot = bone.Attributes.GetNamedItem("rot").Value; string[] rotparts = rot.Split(' '); b.rot = Quaternion.CreateFromEulers((float)(float.Parse(rotparts[0], Utils.EnUsCulture) * Math.PI / 180f), (float)(float.Parse(rotparts[1], Utils.EnUsCulture) * Math.PI / 180f), (float)(float.Parse(rotparts[2], Utils.EnUsCulture) * Math.PI / 180f)); b.orig_rot = new Quaternion(b.rot); string scale = bone.Attributes.GetNamedItem("scale").Value; string[] scaleparts = scale.Split(' '); b.scale = new Vector3(float.Parse(scaleparts[0], Utils.EnUsCulture), float.Parse(scaleparts[1], Utils.EnUsCulture), float.Parse(scaleparts[2], Utils.EnUsCulture)); b.orig_scale = new Vector3(b.scale); float[] deform = Math3D.CreateSRTMatrix(new Vector3(1, 1, 1), b.rot, b.orig_pos); b.mDeformMatrix = new Matrix4(deform[0], deform[1], deform[2], deform[3], deform[4], deform[5], deform[6], deform[7], deform[8], deform[9], deform[10], deform[11], deform[12], deform[13], deform[14], deform[15]); //TODO piviot b.parent = parent; if (parent != null) { b.mParentBone = parent.name; parent.children.Add(b); } lock (Bone.mBones) mBones.Add(b.name, b); mIndexedBones.Add(boneaddindex++, b); Logger.Log("Found bone " + b.name, Helpers.LogLevel.Info); foreach (XmlNode childbone in bone.ChildNodes) { addbone(childbone, b); } }
public skeleton() { mBones = new Dictionary<string, Bone>(); lock (Bone.mBones) foreach (Bone src in Bone.mBones.Values) { Bone newbone = new Bone(src); mBones.Add(newbone.name, newbone); } //rebuild the skeleton structure on the new copy foreach (Bone src in mBones.Values) { if (src.mParentBone != null) { src.parent = mBones[src.mParentBone]; src.parent.children.Add(src); } } //FUDGE if (mUpperMeshMapping.Count == 0) { mUpperMeshMapping.Add(1, "mPelvis"); mUpperMeshMapping.Add(2, "mTorso"); mUpperMeshMapping.Add(3, "mChest"); mUpperMeshMapping.Add(4, "mNeck"); mUpperMeshMapping.Add(5, "mNeck"); mUpperMeshMapping.Add(6, "mCollarLeft"); mUpperMeshMapping.Add(7, "mShoulderLeft"); mUpperMeshMapping.Add(8, "mElbowLeft"); mUpperMeshMapping.Add(9, "mWristLeft"); mUpperMeshMapping.Add(10, "mNeck"); // this case might fail for mWriteLeft and mNeck acting together? mUpperMeshMapping.Add(11, "mCollarRight"); mUpperMeshMapping.Add(12, "mShoulderRight"); mUpperMeshMapping.Add(13, "mElbowRight"); mUpperMeshMapping.Add(14, "mWristRight"); mUpperMeshMapping.Add(15, ""); mLowerMeshMapping.Add(1, "mPelvis"); mLowerMeshMapping.Add(2, "mHipRight"); mLowerMeshMapping.Add(3, "mKneeRight"); mLowerMeshMapping.Add(4, "mAnkleRight"); mLowerMeshMapping.Add(5, "mPelvis"); mLowerMeshMapping.Add(6, "mHipLeft"); mLowerMeshMapping.Add(7, "mKneeLeft"); mLowerMeshMapping.Add(8, "mAnkleLeft"); mLowerMeshMapping.Add(9, ""); mHeadMeshMapping.Add(1, "mNeck"); mHeadMeshMapping.Add(2, "mHead"); mHeadMeshMapping.Add(3, ""); } }