public override void Init() { try { JSONStorable js = containingAtom.GetStorableByID("geometry"); if (js != null) { DAZCharacterSelector dcs = js as DAZCharacterSelector; GenerateDAZMorphsControlUI morphUI = dcs.morphsControlUI; if (morphUI != null) { stomachMorph = morphUI.GetMorphByDisplayName("Breath1"); mouthMorph = morphUI.GetMorphByDisplayName("Mouth Open"); nosePinchMorph = morphUI.GetMorphByDisplayName("Nose Pinch"); noseFlareMorph = morphUI.GetMorphByDisplayName("Nostrils Flare"); } } headAudio = containingAtom.GetStorableByID("HeadAudioSource"); chestController = containingAtom.GetStorableByID("chestControl") as FreeControllerV3; SetupUI(); if (chestController != null) { chestController.jointRotationDriveSpring = chestSpring.val; chestController.jointRotationDriveDamper = 1.0f; } List <BreathEntry> tmp = new List <BreathEntry>(); for (int i = 0; i < breathEntries.Length; ++i) { if (!breathEntries[i].moan) { tmp.Add(breathEntries[i]); } } breathEntriesNoMoan = tmp.ToArray(); breatheNeedInit = true; float v = variance.val * (breathEntries.Length - 1); float bi = breatheIntensity * (breathEntries.Length - 1); float min = Mathf.Max(bi - v - 1.0f, -0.5f); float max = Mathf.Min(bi + v + 1.0f, breathEntries.Length - 0.5f); int index = Mathf.RoundToInt(UnityEngine.Random.Range(min, max)); breatheIndex = Mathf.Clamp(index, 0, breathEntries.Length - 1); breatheCycle = 0.0f; breatheIntensity = intensity.val; breathePower = UnityEngine.Random.Range(0.8f, 1.2f); breatheDuration = UnityEngine.Random.Range(0.0f, 1.5f); } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } }
public void InitBreathing(Atom containingAtom, JSONStorableFloat theStomachMorph) { try { stomachMorph = theStomachMorph; chestController = containingAtom.GetStorableByID("chestControl") as FreeControllerV3; if (chestController != null) { chestController.jointRotationDriveSpring = 90.0f; chestController.jointRotationDriveDamper = 1.0f; } breatheNeedInit = true; float v = 0.2f * (breathEntries.Length - 1); float min = Mathf.Max(0 - v - 1.0f, -0.5f); float max = Mathf.Min(v + 1.0f, breathEntries.Length - 0.5f); int index = Mathf.RoundToInt(UnityEngine.Random.Range(min, max)); breatheIndex = Mathf.Clamp(index, 0, breathEntries.Length - 1); breatheCycle = 0.0f; breathePower = UnityEngine.Random.Range(0.8f, 1.2f); breatheDuration = UnityEngine.Random.Range(0.0f, 1.5f); } catch (Exception e) { SuperController.LogError("Exception caught: " + e + " (May be related to: Easy Sounds must be loaded on a female Person atom."); } }
Keyframe CreateKeyframe(JSONClass pose, AnimationStep step = null, int insertionIndex = -1) { if (step == null) { step = animationPattern.CreateStepAtPosition(animationPattern.steps.Length); } step.containingAtom.GetStorableByID("scale").SetFloatParamValue("scale", 0); step.containingAtom.mainController.GetComponent <SphereCollider>().radius = 0.06f; Keyframe k = new Keyframe(pose, step); if (insertionIndex >= 0) { keyframes.Insert(insertionIndex, k); } else { keyframes.Add(k); } lastCount = keyframes.Count; FreeControllerV3 stepMC = step.containingAtom.mainController; stepMC.canGrabPosition = false; stepMC.canGrabRotation = false; LayoutKeys(); return(k); }
void LayoutKeys() { if (lookAtCamera.val == true) { containingAtom.mainController.transform.LookAt(SuperController.singleton.lookCamera.transform); } int x = 0; int y = 0; keyframes.ForEach((key) => { x++; FreeControllerV3 stepMC = key.step.containingAtom.mainController; Vector3 position = animationPattern.containingAtom.mainController.transform.position; stepMC.transform.position = animationPattern.containingAtom.mainController.transform.TransformPoint(new Vector3(-x * 0.2f, -y * 0.2f, 0)); if (x >= maxKeyframesPerRow.val) { x = 0; y++; } }); }
void Update() { try { bool visibilityState = SuperController.singleton.GetSelectedAtom() == containingAtom; bool visChanged = false; if (visibilityState != lastVisibility) { visChanged = true; lastVisibility = visibilityState; } bool controlChanged = lastController != SuperController.singleton.GetSelectedController(); if (controlChanged) { lastController = SuperController.singleton.GetSelectedController(); } int index = 0; buttons.ForEach((button) => { button.containingAtom.SetOn(visibilityState); if (visChanged || lastController) { RestorePosition(button, SuperController.singleton.GetSelectedController(), index); } index++; }); } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } }
private void animateHands(FreeControllerV3 hc, Hand hand, string[] fingerMorphs, float mirror) { float fx; h = hand.PalmPosition; r = hand.Rotation; Vector3 pos = new Vector3(h[0], h[1], h[2]); Quaternion rot = new Quaternion(r.x, r.y, r.z, r.w); hc.transform.position = pos; hc.transform.rotation = rot; hc.transform.Rotate(0, 90 * mirror, 0); hc.transform.Translate(xOffsetSlider.val * mirror, 0, 0, Space.Self); for (int i = 0; i < hand.Fingers.Count; i++) { DAZMorph morph = morphControl.GetMorphByDisplayName(fingerMorphs[i]); Quaternion vd = leapQuaternionToQuaternion(hand.Fingers[i].bones[3].Rotation); vd = Quaternion.Inverse(vd * Quaternion.Euler(0, -90 * mirror, 0)) * rot; if (i == 0) { fx = (0.5f - minMax(0f, 1f, positiveAttitude(vd.x))) * 1.22f; } else { fx = minMax(0f, 1f, correctRotation(vd.x, 0.65f)) * 0.9f; } if (fx != 0) { morph.morphValue = fx / 0.85f; } } }
public override void Init() { try { if (containingAtom?.type != "Person") { SuperController.LogError($"Please apply the ImprovedPoV plugin to the 'Person' atom you wish to possess. Currently applied on '{containingAtom.type}'."); DestroyImmediate(this); return; } _person = containingAtom; _mainCamera = CameraTarget.centerTarget?.targetCamera; _possessor = SuperController .FindObjectsOfType(typeof(Possessor)) .Where(p => p.name == "CenterEye") .Select(p => p as Possessor) .FirstOrDefault(); _headControl = (FreeControllerV3)_person.GetStorableByID("headControl"); _selector = _person.GetComponentInChildren <DAZCharacterSelector>(); InitControls(); Camera.onPreRender += OnPreRender; Camera.onPostRender += OnPostRender; } catch (Exception e) { SuperController.LogError("Failed to initialize Improved PoV: " + e); DestroyImmediate(this); } }
public FreeControllerAnimationTarget(FreeControllerV3 controller) { curves = new List <AnimationCurve> { x, y, z, rotX, rotY, rotZ, rotW }; this.controller = controller; }
public FreeControllerAnimationTarget Add(FreeControllerV3 fc) { if (fc == null || fc.containingAtom != _containingAtom) { return(null); } var target = _clip.targetControllers.FirstOrDefault(t => t.controller == fc); if (target != null) { return(target); } foreach (var clip in _animation.index.ByLayer(_clip.animationLayer)) { var t = clip.Add(fc); if (t == null) { continue; } t.SetKeyframeToCurrentTransform(0f); t.SetKeyframeToCurrentTransform(clip.animationLength); if (clip == _clip) { target = t; } } return(target); }
IEnumerator CreateAudioSource() { yield return(new WaitForSeconds(0.5f)); audioSourceAtom = GetAtomById(AUDIO_SOURCE_NAME); if (audioSourceAtom == null) { SuperController.singleton.StartCoroutine(SuperController.singleton.AddAtomByType("AudioSource", AUDIO_SOURCE_NAME, true)); yield return(new WaitWhile(() => GetAtomById(AUDIO_SOURCE_NAME) != null)); audioSourceAtom = GetAtomById(AUDIO_SOURCE_NAME); } if (audioSourceAtom != null) { audioSource = audioSourceAtom.GetStorableByID("AudioSource") as AudioSourceControl; if (audioSource != null) { FreeControllerV3 hipControl = containingAtom.freeControllers.First((controller) => controller.name == "hipControl"); if (hipControl != null) { FreeControllerV3 sfxControl = audioSourceAtom.mainController; sfxControl.transform.SetPositionAndRotation(hipControl.transform.position, hipControl.transform.rotation); sfxControl.currentPositionState = FreeControllerV3.PositionState.ParentLink; sfxControl.currentRotationState = FreeControllerV3.RotationState.ParentLink; Rigidbody rb = SuperController.singleton.RigidbodyNameToRigidbody("Person:hipControl"); sfxControl.SelectLinkToRigidbody(rb, FreeControllerV3.SelectLinkState.PositionAndRotation); audioSource.volume = 0.5f; } } HideController(audioSourceAtom); } }
public HeadController(DollmasterPlugin dm) : base(dm) { headControlEnabled = new JSONStorableBool("headControlEnabled", true); dm.RegisterBool(headControlEnabled); UIDynamicToggle moduleEnableToggle = dm.CreateToggle(headControlEnabled); moduleEnableToggle.label = "Enable Head Gaze"; moduleEnableToggle.backgroundColor = Color.green; durationBetweenLookChange = new JSONStorableFloat("duration between look at toggle", 8, 1, 30, false); dm.RegisterFloat(durationBetweenLookChange); dm.CreateSlider(durationBetweenLookChange); headTurnSpeed = new JSONStorableFloat("headTurnSpeed", 2.5f, 0.01f, 20.0f); dm.RegisterFloat(headTurnSpeed); dm.CreateSlider(headTurnSpeed); headControl = atom.GetStorableByID("headControl") as FreeControllerV3; chestControl = atom.GetStorableByID("chestControl") as FreeControllerV3; neckBone = atom.GetStorableByID("neck") as DAZBone; alwaysLookAtMe = new JSONStorableBool("alwaysLookAtMe", false); dm.RegisterBool(alwaysLookAtMe); UIDynamicToggle forceLookToggle = ui.CreateToggle("Hold Gaze", 180, 40); alwaysLookAtMe.toggle = forceLookToggle.toggle; forceLookToggle.transform.Translate(0.415f, 0.01f, 0, Space.Self); forceLookToggle.backgroundColor = new Color(0.2f, 0.2f, 0.2f); forceLookToggle.labelText.color = new Color(1, 1, 1); eyesStorable = atom.GetStorableByID("Eyes"); dm.CreateSpacer(true); }
public override void Awake() { base.Awake(); _possessor = SuperController.singleton.centerCameraTarget.transform.GetComponent <Possessor>(); _headControl = (FreeControllerV3)containingAtom.GetStorableByID("headControl"); }
public void OnInit(VAMLaunch plugin) { _pluginFreeController = plugin.containingAtom.GetStorableByID("control") as FreeControllerV3; InitOptionsUI(plugin); InitEditorGizmos(); }
public override void Init() { try { string CONFIG_PATH = GetPluginPath() + "/positions.json"; poses = JSON.Parse(SuperController.singleton.ReadFileIntoString(CONFIG_PATH)).AsObject; headControl = containingAtom.GetStorableByID("headControl") as FreeControllerV3; CreateButton("Save Pose").button.onClick.AddListener(() => { Vector3 localEuler = headControl.transform.localEulerAngles; JSONArray positions = poses["positions"].AsArray; JSONClass vector = new JSONClass(); vector["x"] = localEuler.x.ToString(); vector["y"] = localEuler.y.ToString(); vector["z"] = localEuler.z.ToString(); positions.Add(vector); SuperController.singleton.SaveStringIntoFile(CONFIG_PATH, poses.ToString(" ")); }); targetRotation = headControl.transform.localRotation; } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } }
public static FreeControllerV3Snapshot Snap(FreeControllerV3 controller) { if (controller == null) { throw new NullReferenceException("Controller reference not set to an instance of an object"); } var control = controller.control; if (control == null) { throw new NullReferenceException($"Controller '{controller.name}' does not have a control"); } return(new FreeControllerV3Snapshot { controller = controller, _position = control.position, _rotation = control.rotation, canGrabPosition = controller.canGrabPosition, canGrabRotation = controller.canGrabRotation, _positionState = controller.currentPositionState, _rotationState = controller.currentRotationState, holdPositionSpring = controller.RBHoldPositionSpring, holdRotationSpring = controller.RBHoldRotationSpring, hidden = controller.hidden, }); }
public override void Init() { try { if (containingAtom.type != "Person") { SuperController.LogError("Use this plugin on a Person only"); } else { _control = containingAtom.mainController; _frozenControls = new List <FreeControllerV3>(); FreeControllerV3[] controls = containingAtom.freeControllers; foreach (var control in controls) { if (control != _control) { _frozenControls.Add(control); } } _routine = StartCoroutine(FreezeControlsRoutine()); _initialized = true; } } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } }
void RestorePosition(Atom atom, FreeControllerV3 controller, int index) { if (atom == null) { return; } if (controller == null) { return; } Vector3 headPos = containingAtom.GetStorableByID("headControl").transform.position; float headY = headPos[1]; Transform tc = SuperController.singleton.lookCamera.transform; Quaternion cr = tc.rotation; Vector3 pc = tc.position; float currentHeight = (defautHeight.val + headY + pc[1] / 3) / 2.3333f; cr[2] = 0; cr[0] = 0; pc[1] = currentHeight; atom.mainController.transform.SetPositionAndRotation(controller.transform.position, cr); atom.mainController.transform.Translate(defaultDistance, currentHeight, 0, Space.Self); atom.mainController.transform.Translate(0, -BUTTON_SPACING * index, 0, Space.World); atom.mainController.transform.LookAt(pc); }
IEnumerator CreateWorldButtonCO(string buttonLabel, UnityEngine.Events.UnityAction call, int index) { Atom containingAtom = GetContainingAtom(); string name = containingAtom.uid; string uid = name + " " + buttonLabel; Atom atom = SuperController.singleton.GetAtomByUid(uid); if (atom == null) { yield return(SuperController.singleton.AddAtomByType("UIButton", uid)); } else { Debug.Log("button already exists"); if (buttons == null) { buttons = new List <Atom>(); } buttons.Add(atom); yield return(null); } atom = SuperController.singleton.GetAtomByUid(uid); atom.GetStorableByID("Text").SetStringParamValue("text", buttonLabel); UIButtonTrigger ubt = atom.GetStorableByID("Trigger") as UIButtonTrigger; ubt.button.onClick.AddListener(call); atom.GetStorableByID("Canvas").SetFloatParamValue("xSize", 500); atom.GetStorableByID("Canvas").SetFloatParamValue("ySize", 100); HSVColor black = new HSVColor(); black.H = 0; black.S = 0; black.V = .12f; HSVColor gray = new HSVColor(); gray.H = 0; gray.S = 0; gray.V = 0.75f; atom.GetStorableByID("ButtonColor").SetColorParamValue("color", black); atom.GetStorableByID("TextColor").SetColorParamValue("color", gray); atom.GetStorableByID("Text").SetFloatParamValue("fontSize", 50); FreeControllerV3 controller = atom.GetStorableByID("control") as FreeControllerV3; controller.deselectedMeshScale = 0.000f; SphereCollider collider = controller.GetComponent <SphereCollider>(); collider.radius = 0.0f; collider.enabled = false; atom.SetOn(false); buttons.Add(atom); }
public void SetControllerVisibility(FreeControllerV3 controller, bool visible) { if (AllowVisibility(controller)) { visible = true; } if (scaleMapping.ContainsKey(controller) == false) { scaleMapping.Add(controller, controller.deselectedMeshScale); } controller.deselectedMeshScale = visible ? scaleMapping[controller] : 0.0f; controller.highlightedScale = visible ? HIGHLIGHTED_SCALE : 0.0f; controller.unhighlightedScale = visible ? HIGHLIGHTED_SCALE : 0.0f; controller.meshScale = visible ? DEFAULT_SCALE : 0.0f; SphereCollider collider = controller.GetComponent <SphereCollider>(); collider.radius = visible ? 0.11f : 0.0f; collider.enabled = visible; if (visible) { scaleMapping.Remove(controller); } }
public void OnInitStorables(VAMLaunch plugin) { _minPosition = new JSONStorableFloat("oscSourceMinPosition", 10.0f, 0.0f, 99.0f); plugin.RegisterFloat(_minPosition); _maxPosition = new JSONStorableFloat("oscSourceMaxPosition", 80.0f, 0.0f, 99.0f); plugin.RegisterFloat(_maxPosition); _speed = new JSONStorableFloat("oscSourceSpeed", 30.0f, 20.0f, 80.0f); plugin.RegisterFloat(_speed); _animationOffset = new JSONStorableFloat("oscAnimationOffset", 0.0f, 0.0f, 0.5f); plugin.RegisterFloat(_animationOffset); _targetAnimationAtomChooser = new JSONStorableStringChooser("oscSourceTargetAnimationAtom", GetTargetAnimationAtomChoices(), "", "Target Animation Pattern", (name) => { _animationAtomController = null; _targetAnimationPattern = null; if (string.IsNullOrEmpty(name)) { return; } var atom = SuperController.singleton.GetAtomByUid(name); if (atom && atom.animationPatterns.Length > 0) { _animationAtomController = atom.freeControllers[0]; _targetAnimationPattern = atom.animationPatterns[0]; } }); plugin.RegisterStringChooser(_targetAnimationAtomChooser); }
void SetupThrustTransform(Atom thrustAtom) { CycleForceProducerV2 cf = thrustAtom.GetStorableByID("ForceProducer") as CycleForceProducerV2; cf.SetForceReceiver(containingAtom.name + ":hip"); FreeControllerV3 cfControl = thrustAtom.mainController; FreeControllerV3 headControl = containingAtom.freeControllers.First((controller) => controller.name == "headControl"); FreeControllerV3 hipControl = containingAtom.freeControllers.First((controller) => controller.name == "hipControl"); cfControl.transform.SetPositionAndRotation(hipControl.transform.position, hipControl.transform.rotation); cfControl.transform.LookAt(headControl.transform); cfControl.transform.Rotate(0, 180, 0, Space.Self); cfControl.transform.Rotate(new Vector3(0, 0, 1), 90, Space.Self); cfControl.transform.Rotate(new Vector3(1, 0, 0), -90, Space.Self); cfControl.transform.Rotate(new Vector3(0, 0, 1), 90, Space.Self); cfControl.currentPositionState = FreeControllerV3.PositionState.ParentLink; cfControl.currentRotationState = FreeControllerV3.RotationState.ParentLink; Rigidbody rb = SuperController.singleton.RigidbodyNameToRigidbody(containingAtom.name + ":hipControl"); cfControl.SelectLinkToRigidbody(rb, FreeControllerV3.SelectLinkState.PositionAndRotation); HideController(thrustAtom); cycleForce = cf; }
public MeasureHandsPaddingStep(EmbodyContext context) : base(context) { _head = context.containingAtom.rigidbodies.First(fc => fc.name == "head"); _leftHandControl = context.containingAtom.freeControllers.First(fc => fc.name == "lHandControl"); _rightHandControl = context.containingAtom.freeControllers.First(fc => fc.name == "rHandControl"); }
private static Vector3 ComputePosition(Transform transform, FreeControllerV3 controller, MotionControllerWithCustomPossessPoint motionControl) { var possessPointDelta = controller.control.position - motionControl.controllerPointTransform.position; var currentPosition = transform.position; return(currentPosition + possessPointDelta); }
public static void AlignRigAndController(this SuperController sc, FreeControllerV3 controller, MotionControllerWithCustomPossessPoint motionControl, bool alignControl = true) { var up = sc.navigationRig.up; sc.navigationRig.rotation = ComputeRotation(sc.navigationRig, controller, up); if (alignControl) { controller.AlignTo(motionControl.controllerPointTransform, true); } var position = ComputePosition(sc.navigationRig, controller, motionControl); var upDelta = Vector3.Dot(position - sc.navigationRig.position, up); position += up * (0f - upDelta); sc.navigationRig.position = position; sc.playerHeightAdjust += upDelta; if (sc.MonitorCenterCamera != null) { var monitorCenterCameraTransform = sc.MonitorCenterCamera.transform; monitorCenterCameraTransform.LookAt(controller.transform.position + controller.GetForwardPossessAxis()); var localEulerAngles = monitorCenterCameraTransform.localEulerAngles; localEulerAngles.y = 0f; localEulerAngles.z = 0f; monitorCenterCameraTransform.localEulerAngles = localEulerAngles; } }
void LateUpdate() { try { if (allowDoubleClick) { if (Input.GetMouseButtonUp(0)) { if ((Time.time - lastPressedTime) < doubleClickTime && SuperController.singleton.GetSelectedController() == lastSelected) { SelectMainController(); } lastSelected = SuperController.singleton.GetSelectedController(); lastPressedTime = Time.time; } } if (Input.GetMouseButtonUp(0) && (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))) { SelectMainController(); } } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } }
public override void Init() { if (containingAtom.type != "Person") { throw new Exception("This must be added to a Person"); } _labiaTrigger = containingAtom.GetComponentsInChildren <CollisionTrigger>().FirstOrDefault(t => t.name == "LabiaTrigger"); _labiaHandler = _labiaTrigger.gameObject.GetComponentInChildren <CollisionTriggerEventHandler>(); _abdomen = containingAtom.freeControllers.FirstOrDefault(fc => fc.name == "abdomen2Control"); _animators = new List <LabiaAnimator>(); _animators.Add(LabiaAnimator.Create(containingAtom, "Labia minora-size", isInwardMorph: false, inwardMax: 0.7f, outwardMax: 2)); _animators.Add(LabiaAnimator.Create(containingAtom, "Labia minora-style1", isInwardMorph: false, inwardMax: 0.7f, outwardMax: 2f)); _animators.Add(LabiaAnimator.Create(containingAtom, "Labia minora-exstrophy", isInwardMorph: true, inwardMax: 0.1f, outwardMax: 1f)); _animators.Add(LabiaAnimator.Create(containingAtom, "Labia majora-relaxation", isInwardMorph: false, inwardMax: 1f, outwardMax: 0f)); _animators.Add(LabiaAnimator.Create(containingAtom, "Gen_Innie", isInwardMorph: true, inwardMax: 0.10f, outwardMax: 0.25f, easing: (p) => p * p * p)); _animators.Add(LabiaAnimator.Create(containingAtom, "Gens In - Out", isInwardMorph: true, inwardMax: 1.0f, outwardMax: 0f, enabled: false)); _animators = _animators.Where(a => a != null).ToList(); // remove any null entries _animators.ForEach(a => a.Morph.SetDefaultValue()); FrictionStorable = new JSONStorableFloat("Friction", 1f, (f) => { _friction = f; }, 0, 1); _friction = FrictionStorable.val; CreateSlider(FrictionStorable); RegisterFloat(FrictionStorable); InwardExaggerationStorable = new JSONStorableFloat( "Inward Exaggeration", 0f, (val) => { _animators.ForEach(a => a.InwardMax = a.InwardMaxDefault + val); }, 0, 1); InwardExaggerationStorable.val = 0; CreateSlider(InwardExaggerationStorable); RegisterFloat(InwardExaggerationStorable); OutwardExaggerationStorable = new JSONStorableFloat( "Outward Exaggeration", 0f, (val) => { _animators.ForEach(a => a.OutwardMax = a.OutwardMaxDefault + val); }, 0, 1); OutwardExaggerationStorable.val = 0; CreateSlider(OutwardExaggerationStorable); RegisterFloat(OutwardExaggerationStorable); foreach (var a in _animators) { var storable = new JSONStorableBool(a.Morph.displayName, a.Enabled, (b) => { a.Enabled = b; a.Morph.SetDefaultValue(); }); storable.val = a.Enabled; CreateToggle(storable, rightSide: true); RegisterBool(storable); } }
public FreeControllerAnimationTarget Add(FreeControllerV3 controller) { if (targetControllers.Any(c => c.controller == controller)) { return(null); } return(Add(new FreeControllerAnimationTarget(controller))); }
public MeasureAnchorWidthStep(WizardContext context, string part, ControllerAnchorPoint anchor) { _context = context; _part = part; _anchor = anchor; _leftHandControl = context.containingAtom.freeControllers.First(fc => fc.name == "lHandControl"); _rightHandControl = context.containingAtom.freeControllers.First(fc => fc.name == "rHandControl"); }
public AtomSelect(FreeControllerV3 controller) : this((a) => a.uid.Equals(controller?.containingAtom?.uid)) { if (controller != null) { _atomUid = controller.containingAtom.uid; _controllerName = controller.name; } }
private bool AllowVisibility(FreeControllerV3 controller) { bool anyControlOn = controller.currentPositionState == FreeControllerV3.PositionState.On && controller.currentRotationState == FreeControllerV3.RotationState.On; bool interactiveInPlay = controller.interactableInPlayMode; bool isAtomOn = controller.containingAtom.on; return(anyControlOn && interactiveInPlay && isAtomOn); }