public override void doPress(MEvent eventArg) { base.doPress(eventArg); // If we are not in selecting mode (i.e. an object has been selected) // then set up for the translation. if (!_isSelecting()) { eventArg.getPosition(ref startPos_x, ref startPos_y); view = M3dView.active3dView; MDagPath camera = view.Camera; MFnCamera fnCamera = new MFnCamera(camera); MVector upDir = fnCamera.upDirection(MSpace.Space.kWorld); MVector rightDir = fnCamera.rightDirection(MSpace.Space.kWorld); // Determine the camera used in the current view if (fnCamera.isOrtho) { if (upDir.isEquivalent(MVector.zNegAxis, 1e-3)) { currWin = 0; // TOP } else if (rightDir.isEquivalent(MVector.xAxis, 1e-3)) { currWin = 1; // FRONT } else { currWin = 2; // SIDE } } else { currWin = 3; // PERSP MGlobal.displayWarning("moveTool only works in top, front and side views"); } // Create an instance of the move tool command. cmd = _newToolCommand() as moveCmd; cmd.setVector(0.0, 0.0, 0.0); } }
private static Dictionary <string, MayaM2Bone> ExtractJoints(List <MayaM2Sequence> seqList) { var jointMap = new Dictionary <string, MayaM2Bone>(); //Goal of iteration : Extract raw joint data and store it in intermediate object, MayaM2Bone var processedJoints = new HashSet <string>(); for (var jointIter = new MItDag(MItDag.TraversalType.kDepthFirst, MFn.Type.kJoint); !jointIter.isDone; jointIter.next()) { var jointPath = new MDagPath(); jointIter.getPath(jointPath); if (processedJoints.Contains(jointPath.fullPathName)) { continue; } MGlobal.displayInfo("Extracting raw data of " + jointPath.fullPathName); var joint = new MFnIkJoint(jointPath); var mayaBone = new MayaM2Bone(); jointMap[jointPath.fullPathName] = mayaBone; // Hierarchy var isRoot = joint.parentCount == 0 || !joint.parent(0).hasFn(MFn.Type.kJoint); if (!isRoot) { var parentPath = new MDagPath(); MDagPath.getAPathTo(joint.parent(0), parentPath); if (!jointMap.ContainsKey(parentPath.fullPathName)) { MGlobal.displayError("\tParent is not referenced. Crash incoming. Path : " + parentPath.fullPathName); } jointMap[jointPath.fullPathName].Parent = jointMap[parentPath.fullPathName]; } //Note : M2Bone.submesh_id is wrong in the wiki. Do not try to compute it. // Label jointMap[jointPath.fullPathName].Type = MGlobal.executeCommandStringResult("getAttr -asString " + joint.fullPathName + ".type"); jointMap[jointPath.fullPathName].OtherType = MGlobal.executeCommandStringResult("getAttr -asString " + joint.fullPathName + ".otherType"); jointMap[jointPath.fullPathName].Side = MGlobal.executeCommandStringResult("getAttr -asString " + joint.fullPathName + ".side"); // Base translation is used to compute position MAnimControl.currentTime = 0; jointMap[jointPath.fullPathName].BaseTranslation = joint.getTranslation(MSpace.Space.kTransform); foreach (var seq in seqList) { var transData = new List <Tuple <uint, MVector> >(); var rotData = new List <Tuple <uint, MQuaternion> >(); var scaleData = new List <Tuple <uint, MVector> >(); for (var i = seq.Start; i < seq.End; i += 33) //TODO FIXME What if not multiple of 33 ? { //Get data for this joint for this frame MAnimControl.currentTime = new MTime(i, MTime.Unit.kMilliseconds); var translation = joint.getTranslation(MSpace.Space.kTransform); var rotation = new MQuaternion(); joint.getRotation(rotation, MSpace.Space.kTransform); var scaleArray = new double[3]; joint.getScale(scaleArray); var scale = new MVector(scaleArray); if (!translation.isEquivalent(MVector.zero, Epsilon)) { var previousIsTheSame = transData.Count > 0 && transData.Last().Item2.isEquivalent(translation, Epsilon); if (!previousIsTheSame) { transData.Add(new Tuple <uint, MVector>((uint)(i - seq.Start), translation)); } } if (!rotation.isEquivalent(MQuaternion.identity, Epsilon)) { var previousIsTheSame = rotData.Count > 0 && rotData.Last().Item2.isEquivalent(rotation, Epsilon); if (!previousIsTheSame) { rotData.Add(new Tuple <uint, MQuaternion>((uint)(i - seq.Start), rotation)); } } if (!scale.isEquivalent(MVector.one, Epsilon)) { var previousIsTheSame = scaleData.Count > 0 && scaleData.Last().Item2.isEquivalent(scale, Epsilon); if (!previousIsTheSame) { scaleData.Add(new Tuple <uint, MVector>((uint)(i - seq.Start), scale)); } } } if (transData.Count > 0) { jointMap[joint.fullPathName].Translation.Add(transData); } if (rotData.Count > 0) { jointMap[joint.fullPathName].Rotation.Add(rotData); } if (scaleData.Count > 0) { jointMap[joint.fullPathName].Scale.Add(scaleData); } } processedJoints.Add(jointPath.fullPathName); } //Goal of iteration : apply transformations to joint data & their children processedJoints.Clear(); for (var jointIter = new MItDag(MItDag.TraversalType.kBreadthFirst, MFn.Type.kJoint); !jointIter.isDone; jointIter.next()) { var jointPath = new MDagPath(); jointIter.getPath(jointPath); if (processedJoints.Contains(jointPath.fullPathName)) { continue; } MGlobal.displayInfo("Applying joint orient of " + jointPath.fullPathName); var joint = new MFnIkJoint(jointPath); var jointOrient = new MQuaternion(); joint.getOrientation(jointOrient); for (uint i = 0; i < joint.childCount; i++) { if (!joint.child(i).hasFn(MFn.Type.kJoint)) { continue; } var childFn = new MFnIkJoint(joint.child(i)); MGlobal.displayInfo("\tto " + childFn.fullPathName + ";"); jointMap[childFn.fullPathName].RotateTranslation(jointOrient); } processedJoints.Add(jointPath.fullPathName); } return(jointMap); }