private static void AddOneScaleFrame(bool useScaleFrames, AquaMotion.KeyData node, Assimp.Node aiNode = null) { if (useScaleFrames) { AquaMotion.MKEY sclKeys = new AquaMotion.MKEY(); sclKeys.keyType = 3; sclKeys.dataType = 1; sclKeys.keyCount = 1; if (aiNode == null) { sclKeys.vector4Keys = new List <Vector4>() { new Vector4(1.0f, 1.0f, 1.0f, 0) }; } else { Matrix4x4.Invert(GetMat4FromAssimpMat4(aiNode.Transform), out Matrix4x4 mat4); sclKeys.vector4Keys = new List <Vector4>() { new Vector4(mat4.M11, mat4.M22, mat4.M33, 0) }; } node.keyData.Add(sclKeys); } }
private static void AddOnePosFrame(AquaMotion.KeyData node, Assimp.Node aiNode, float baseScale) { AquaMotion.MKEY posKeys = new AquaMotion.MKEY(); posKeys.keyType = 1; posKeys.dataType = 1; posKeys.keyCount = 1; var mat4 = GetMat4FromAssimpMat4(aiNode.Transform); posKeys.vector4Keys = new List <Vector4>() { new Vector4(mat4.M14 * baseScale, mat4.M24 * baseScale, mat4.M34 * baseScale, 0) }; node.keyData.Add(posKeys); }
private static void AddOneRotFrame(AquaMotion.KeyData node, Assimp.Node aiNode) { AquaMotion.MKEY rotKeys = new AquaMotion.MKEY(); rotKeys.keyType = 2; rotKeys.dataType = 3; rotKeys.keyCount = 1; Matrix4x4.Invert(GetMat4FromAssimpMat4(aiNode.Transform), out Matrix4x4 mat4); var quat = Quaternion.CreateFromRotationMatrix(mat4); rotKeys.vector4Keys = new List <Vector4>() { new Vector4(quat.X, quat.Y, quat.Z, quat.W) }; node.keyData.Add(rotKeys); }
public void UpdateToNGSPlayerMotion(AquaMotion motion) { //Add the nodeTreeFlag if it's there AquaMotion.KeyData nodeTree = null; if (motion.motionKeys[motion.motionKeys.Count - 1].mseg.nodeName.GetString().Contains("NodeTreeFlag")) { nodeTree = motion.motionKeys[motion.motionKeys.Count - 1]; } //Remove to the old count while (motion.motionKeys.Count > oldRange) { motion.motionKeys.RemoveAt(motion.motionKeys.Count - 1); } //Go through and add NGS nodes for (int i = oldRange; i < endRange + 1; i++) { var keySet = new AquaMotion.KeyData(); keySet.mseg.nodeDataCount = 3; keySet.mseg.nodeId = i; keySet.mseg.nodeType = 2; keySet.mseg.nodeName = AquaCommon.PSO2String.GeneratePSO2String(nodeNames[i]); var pos = new AquaMotion.MKEY(); var rot = new AquaMotion.MKEY(); var scale = new AquaMotion.MKEY(); //If the key isn't in there, set to the default. Else set based on the old id if (!remapDict.ContainsKey(i)) { // position pos.dataType = 1; pos.keyCount = 1; pos.keyType = 1; pos.vector4Keys.Add(defaultPos[i]); // rotation rot.dataType = 3; rot.keyCount = 1; rot.keyType = 2; rot.vector4Keys.Add(new Vector4(defaultRots[i].X, defaultRots[i].Y, defaultRots[i].Z, defaultRots[i].W)); // scale scale.dataType = 1; scale.keyCount = 1; scale.keyType = 3; scale.vector4Keys.Add(new Vector4(1.0f, 1.0f, 1.0f, 0)); } else { for (int keyData = 0; keyData < motion.motionKeys[remapDict[i]].keyData.Count; keyData++) { switch (motion.motionKeys[remapDict[i]].keyData[keyData].keyType) { case 1: pos = motion.motionKeys[remapDict[i]].keyData[keyData]; if (motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys.Count > 1) { for (int frameId = 0; frameId < motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys.Count; frameId++) { var frame = motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys[frameId]; frame = frame - defaultPos[remapDict[i]]; motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys[frameId] = frame + defaultPos[i]; } } break; case 2: rot = motion.motionKeys[remapDict[i]].keyData[keyData]; //Extract and apply rotation for every frame for (int frameId = 0; frameId < motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys.Count; frameId++) { var frame = motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys[frameId]; var quat = new Quaternion(frame.X, frame.Y, frame.Z, frame.W); quat = quat * Quaternion.Inverse(defaultRots[remapDict[i]]); quat = quat * defaultRots[i]; motion.motionKeys[remapDict[i]].keyData[keyData].vector4Keys[frameId] = new Vector4(quat.X, quat.Y, quat.Z, quat.W); } break; case 3: scale = motion.motionKeys[remapDict[i]].keyData[keyData]; break; } } //Check if anything was left out and set to defaults if so if (pos.keyType == 0) { pos.dataType = 1; pos.keyCount = 1; pos.keyType = 1; pos.vector4Keys.Add(defaultPos[i]); } if (rot.keyType == 0) { rot.dataType = 3; rot.keyCount = 1; rot.keyType = 2; rot.vector4Keys.Add(new Vector4(defaultRots[i].X, defaultRots[i].Y, defaultRots[i].Z, defaultRots[i].W)); } if (scale.keyType == 0) { scale.dataType = 1; scale.keyCount = 1; scale.keyType = 3; scale.vector4Keys.Add(new Vector4(1.0f, 1.0f, 1.0f, 0)); } } keySet.keyData.Add(pos); keySet.keyData.Add(rot); keySet.keyData.Add(scale); motion.motionKeys.Add(keySet); } if (nodeTree != null) { motion.motionKeys.Add(nodeTree); } else { //Generate NodeTreeFlag nodeTree = new AquaMotion.KeyData(); nodeTree.mseg.nodeDataCount = 3; nodeTree.mseg.nodeId = 0; nodeTree.mseg.nodeType = 16; nodeTree.mseg.nodeName = AquaCommon.PSO2String.GeneratePSO2String("__NodeTreeFlag__"); for (int set = 0; set < 3; set++) { var mkey = new AquaMotion.MKEY(); mkey.dataType = 5; mkey.keyCount = motion.moHeader.endFrame + 1; mkey.keyType = 16 + set; for (int key = 0; key < mkey.keyCount; key++) { if (key == 0) { mkey.frameTimings.Add(0x9); } else if (key == mkey.keyCount - 1) { mkey.frameTimings.Add((ushort)((key * 0x10) + 0xA)); } else { mkey.frameTimings.Add((ushort)((key * 0x10) + 0x8)); } mkey.intKeys.Add(0x31); } nodeTree.keyData.Add(mkey); } } motion.moHeader.nodeCount = motion.motionKeys.Count; }