/// <summary> /// Pick up selected object /// </summary> public void PickUp() { GameObject obj; try { //Get selected object obj = selectObject.GetObject(); } catch (NullReferenceException) { SSTools.ShowMessage("No object selected", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } //If move target is selected, switch to parent if (MoveTargetChecker.IsMoveTarget(obj)) { obj = obj.transform.parent.gameObject; } if (!HandChecker.HasHands(obj)) { SSTools.ShowMessage("No hands placed", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } List <MInstruction> list = new List <MInstruction>(); //Get IDs of object String objID = obj.GetComponent <MMISceneObject>().MSceneObject.ID; //Instructions if both hands are present on object if (HandChecker.HasBothHands(obj)) { _carryIDManager.CurrentCarryIdBoth = MInstructionFactory.GenerateID(); MInstruction carryInstruction = new MInstruction(_carryIDManager.CurrentCarryIdBoth, "carry object", "Object/Carry") { Properties = PropertiesCreator.Create("TargetID", objID, "Hand", "Both") }; list.Add(carryInstruction); } //Instructions if only right hand is present on object else if (HandChecker.HasRightHand(obj)) { _carryIDManager.CurrentCarryIdRight = MInstructionFactory.GenerateID(); MInstruction carryInstruction = new MInstruction(_carryIDManager.CurrentCarryIdRight, "carry object", "Object/Carry") { Properties = PropertiesCreator.Create("TargetID", objID, "Hand", "Right"), }; list.Add(carryInstruction); } //Instructions if only left hand is present on object else if (HandChecker.HasLeftHand(obj)) { _carryIDManager.CurrentCarryIdLeft = MInstructionFactory.GenerateID(); MInstruction carryInstruction = new MInstruction(_carryIDManager.CurrentCarryIdLeft, "carry object", "Object/Carry") { Properties = PropertiesCreator.Create("TargetID", objID, "Hand", "Left"), }; list.Add(carryInstruction); } //Indicates that an object has been picked up, so it cannot be released pickedUp = true; //Add instructions to queue queueController.AddItem(list, "Pick up " + obj.name); }
/// <summary> /// Release selected object /// </summary> public void Release() { if (!pickedUp) { GameObject go; try { //Get selected object go = selectObject.GetObject(); } catch (NullReferenceException) { SSTools.ShowMessage("No object selected", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } //If move target is selected, switch to parent if (MoveTargetChecker.IsMoveTarget(go)) { go = go.transform.parent.gameObject; } //List for instructions List <MInstruction> list = new List <MInstruction>(); //List for hands on object List <GameObject> hands = new List <GameObject>(); if (HandChecker.HasLeftHand(go)) { MInstruction releaseLeft = new MInstruction(MInstructionFactory.GenerateID(), "release object", "Object/Release") { Properties = PropertiesCreator.Create("Hand", "Left", CoSimTopic.OnStart, _handPoseIdManager.CurrentHandIdLeft + ":" + CoSimAction.EndInstruction) //Properties = PropertiesCreator.Create("Hand", "Left") }; //Add instructions to position fingers list.AddRange(ReleaseHandPose("Left")); //Add instruction to release left hand list.Add(releaseLeft); //Remove left hand game object from object //hands.Add(go.transform.Find("LeftHand(Clone)").gameObject); hands.Add(HandChecker.GetLeftHand(go)); } if (HandChecker.HasRightHand(go)) { MInstruction releaseRight = new MInstruction(MInstructionFactory.GenerateID(), "release object", "Object/Release") { Properties = PropertiesCreator.Create("Hand", "Right", CoSimTopic.OnStart, _handPoseIdManager.CurrentHandIdRight + ":" + CoSimAction.EndInstruction) //Properties = PropertiesCreator.Create("Hand", "Right") }; //Add instructions to position fingers list.AddRange(ReleaseHandPose("Right")); //Add instruction to release right hand list.Add(releaseRight); //Remove right hand game object from object //hands.Add(go.transform.Find("RightHand(Clone)").gameObject); hands.Add(HandChecker.GetRightHand(go)); } //Destroy the hands after moving an object foreach (var hand in hands) { Destroy(hand); } //Add instructions to queue queueController.AddItem(list, "Release " + go.name); } else { SSTools.ShowMessage("Object needs to be moved first!", SSTools.Position.bottom, SSTools.Time.twoSecond); } }
/// <summary> /// Place selected object /// </summary> public void MoveObject() { GameObject obj; try { //Get selected object obj = selectObject.GetObject(); } catch (NullReferenceException) { SSTools.ShowMessage("No object selected", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } //If move target is selected, switch to parent if (MoveTargetChecker.IsMoveTarget(obj)) { obj = obj.transform.parent.gameObject; } if (!HandChecker.HasHands(obj)) { SSTools.ShowMessage("No hands placed", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } GameObject positionTarget; try { //Get move target positionTarget = obj.transform.Find("moveTarget").gameObject; } catch (NullReferenceException) { SSTools.ShowMessage("No move target defined", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } //List for instructions List <MInstruction> list = new List <MInstruction>(); //Get IDs of objects String objectID = obj.GetComponent <MMISceneObject>().MSceneObject.ID; String targetPositionID = positionTarget.GetComponent <MMISceneObject>().MSceneObject.ID; //Instruction if both hands are present on object if (HandChecker.HasBothHands(obj)) { MInstruction moveObject = new MInstruction(MInstructionFactory.GenerateID(), "move object", "Object/Move") { Properties = PropertiesCreator.Create("SubjectID", objectID, "Hand", "Both", "TargetID", targetPositionID, CoSimTopic.OnStart, _carryIDManager.CurrentCarryIdBoth + ":" + CoSimAction.EndInstruction) }; list.Add(moveObject); } //Instruction if only right hand is present on object else if (HandChecker.HasRightHand(obj)) { MInstruction moveObject = new MInstruction(MInstructionFactory.GenerateID(), "move object", "Object/Move") { Properties = PropertiesCreator.Create("SubjectID", objectID, "Hand", "Right", "TargetID", targetPositionID, CoSimTopic.OnStart, _carryIDManager.CurrentCarryIdRight + ":" + CoSimAction.EndInstruction) }; list.Add(moveObject); } //Instruction if only left hand is present on object else if (HandChecker.HasLeftHand(obj)) { MInstruction moveObject = new MInstruction(MInstructionFactory.GenerateID(), "move object", "Object/Move") { Properties = PropertiesCreator.Create("SubjectID", objectID, "Hand", "Left", "TargetID", targetPositionID, CoSimTopic.OnStart, _carryIDManager.CurrentCarryIdLeft + ":" + CoSimAction.EndInstruction) }; list.Add(moveObject); } //Indicates that an object has been moved and thus the Carry Instruction is finished pickedUp = false; //Add instructions to queue queueController.AddItem(list, "Place " + obj.name); }
/// <summary> /// Reach selected object /// </summary> public void ReachObject() { GameObject go; try { //Get selected object go = selectObject.GetObject(); } catch (NullReferenceException) { SSTools.ShowMessage("No object selected", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } //If move target is selected, switch to parent if (MoveTargetChecker.IsMoveTarget(go)) { go = go.transform.parent.gameObject; } //Check for hands if (!HandChecker.HasHands(go)) { SSTools.ShowMessage("No hands placed", SSTools.Position.bottom, SSTools.Time.twoSecond); return; } //List of instructions List <MInstruction> list = new List <MInstruction>(); if (HandChecker.HasLeftHand(go)) { //Get UnitySceneAccess ID of hand //GameObject hand = go.transform.Find("LeftHand(Clone)").gameObject; GameObject hand = HandChecker.GetLeftHand(go); String objectID = hand.GetComponent <MMISceneObject>().MSceneObject.ID; //Now create a specific instruction to reach with the right hand MInstruction reachLeft = new MInstruction(MInstructionFactory.GenerateID(), "reach left", "Pose/Reach") { Properties = PropertiesCreator.Create("TargetID", objectID, "Hand", "Left") }; //Add instructions to list list.Add(reachLeft); list.AddRange(MakeHandPose(go, "Left")); } if (HandChecker.HasRightHand(go)) { //Get UnitySceneAccess ID of hand //GameObject hand = go.transform.Find("RightHand(Clone)").gameObject; GameObject hand = HandChecker.GetRightHand(go); String objectID = hand.GetComponent <MMISceneObject>().MSceneObject.ID; //Now create a specific instruction to reach with the right hand MInstruction reachRight = new MInstruction(MInstructionFactory.GenerateID(), "reach right", "Pose/Reach") { Properties = PropertiesCreator.Create("TargetID", objectID, "Hand", "Right") }; //Add instructions to list list.Add(reachRight); list.AddRange(MakeHandPose(go, "Right")); } //Add instruction to queue queueController.AddItem(list, "Reach " + go.name); }