//------------------------------------------------- void Update() { float value = linearMapping.value; //No need to set the blend if our value hasn't changed. if (value != lastValue) { float blendValue = IF_VR_Steam_Util.RemapNumberClamped(value, 0f, 1f, 1f, 100f); skinnedMesh.SetBlendShapeWeight(0, blendValue); } lastValue = value; }
//------------------------------------------------- private IEnumerator HapticPulses(IF_VR_Steam_Hand hand, float flMagnitude, int nCount) { if (hand != null) { int nRangeMax = (int)IF_VR_Steam_Util.RemapNumberClamped(flMagnitude, 0.0f, 1.0f, 100.0f, 900.0f); nCount = Mathf.Clamp(nCount, 1, 10); //float hapticDuration = nRangeMax * nCount; //hand.TriggerHapticPulse(hapticDuration, nRangeMax, flMagnitude); for (ushort i = 0; i < nCount; ++i) { ushort duration = (ushort)Random.Range(100, nRangeMax); hand.TriggerHapticPulse(duration); yield return(new WaitForSeconds(.01f)); } } }
//------------------------------------------------- // Computes the angle to rotate the game object based on the change in the transform //------------------------------------------------- private void ComputeAngle(IF_VR_Steam_Hand hand) { Vector3 toHandProjected = ComputeToTransformProjected(hand.hoverSphereTransform); if (!toHandProjected.Equals(lastHandProjected)) { float absAngleDelta = Vector3.Angle(lastHandProjected, toHandProjected); if (absAngleDelta > 0.0f) { if (frozen) { float frozenSqDist = (hand.hoverSphereTransform.position - frozenHandWorldPos).sqrMagnitude; if (frozenSqDist > frozenSqDistanceMinMaxThreshold.x) { outAngle = frozenAngle + Random.Range(-1.0f, 1.0f); float magnitude = IF_VR_Steam_Util.RemapNumberClamped(frozenSqDist, frozenSqDistanceMinMaxThreshold.x, frozenSqDistanceMinMaxThreshold.y, 0.0f, 1.0f); if (magnitude > 0) { StartCoroutine(HapticPulses(hand, magnitude, 10)); } else { StartCoroutine(HapticPulses(hand, 0.5f, 10)); } if (frozenSqDist >= frozenSqDistanceMinMaxThreshold.y) { onFrozenDistanceThreshold.Invoke(); } } } else { Vector3 cross = Vector3.Cross(lastHandProjected, toHandProjected).normalized; float dot = Vector3.Dot(worldPlaneNormal, cross); float signedAngleDelta = absAngleDelta; if (dot < 0.0f) { signedAngleDelta = -signedAngleDelta; } if (limited) { float angleTmp = Mathf.Clamp(outAngle + signedAngleDelta, minAngle, maxAngle); if (outAngle == minAngle) { if (angleTmp > minAngle && absAngleDelta < minMaxAngularThreshold) { outAngle = angleTmp; lastHandProjected = toHandProjected; } } else if (outAngle == maxAngle) { if (angleTmp < maxAngle && absAngleDelta < minMaxAngularThreshold) { outAngle = angleTmp; lastHandProjected = toHandProjected; } } else if (angleTmp == minAngle) { outAngle = angleTmp; lastHandProjected = toHandProjected; onMinAngle.Invoke(); if (freezeOnMin) { Freeze(hand); } } else if (angleTmp == maxAngle) { outAngle = angleTmp; lastHandProjected = toHandProjected; onMaxAngle.Invoke(); if (freezeOnMax) { Freeze(hand); } } else { outAngle = angleTmp; lastHandProjected = toHandProjected; } } else { outAngle += signedAngleDelta; lastHandProjected = toHandProjected; } } } } }