
using UnityEngine;
using System.Collections;
using VRTK;
using UnityEngine.UI;
using ArgosTweenSpacePuppy;
public class CenterSphere_Interactions : MonoBehaviour
{
private VRTK_InteractableObject interact;
private Vector3 myPosition;
private Text posText;
private bool isTouched;
private Transform center;
private MD_Measure_Cube md_Measure_Cube;
private MD_Scale_Cube md_Scale_Cube;
private bool wasTouched = false;
private bool bSnapModeOn = false;
private Rigidbody rb;
private GameObject tController;
private int wait_for_touch = 0;
private float tAccum_Scaler;
private VRTK_ControllerActions controllerActions;
private VRTK_ControllerEvents controllerEvents;
private Vector3 vRounded;
public GameObject Phantom_Scaler;
public float ps_Base_Scale;
float waitForUpdate = 0;
Vector3 vLast_Snap;
Vector3 vLast_Spawn;
float dt_since_Spawn;
void Awake()
{
rb = GetComponent<Rigidbody>();
rb.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
void Start()
{
interact = GetComponent<VRTK_InteractableObject>();
interact.InteractableObjectTouched += new InteractableObjectEventHandler(DoObjectTouched);
interact.InteractableObjectUntouched += new InteractableObjectEventHandler(DoObjectUntouched);
interact.InteractableObjectGrabbed += new InteractableObjectEventHandler(DoObjectGrabbed);
interact.InteractableObjectUngrabbed += new InteractableObjectEventHandler(DoObjectUnGrabbed);
rb = GetComponent<Rigidbody>();
Text[] t = GetComponentsInChildren<Text>();
posText = t[0];
center = GetComponentInChildren<Inner_Sphere>().transform;
posText.text = transform.position.ToString("F2");
isTouched = false;
HidePosition();
if (Phantom_Scaler != null)
{
ps_Base_Scale = Phantom_Scaler.transform.localScale.x;
}
md_Measure_Cube = FindObjectOfType< MD_Measure_Cube >();
md_Scale_Cube = FindObjectOfType< MD_Scale_Cube >();
}
private void Init()
{
//interact = GetComponent<VRTK_InteractableObject>();
//interact.InteractableObjectTouched += new InteractableObjectEventHandler(DoObjectTouched);
//Text[] t = GetComponentsInChildren<Text>();
//posText = t[0];
//posText.text = transform.position.ToString("F2");
//isTouched = true;
}
//public void SetPosition(int NoteIx)
//{
// Text[] t = GetComponentsInChildren<Text>();
// t[0].text = transform.position.ToString("F2");
//}
public void setPhantom_Scaler(GameObject go)
{
Phantom_Scaler = go;
ps_Base_Scale = Phantom_Scaler.transform.localScale.x;
}
public void SetText(string s)
{
Text[] t = GetComponentsInChildren<Text>();
t[0].text = s;
}
void OnCollisionEnter(Collision collisionInfo)
{
//argos_SoundGen.playNote(NoteIdx);
//dbg_Text.text = " DoObjectTouched_PlayNote called";
}
private void DoObjectGrabbed(object sender, InteractableObjectEventArgs e)
{
}
private void DoObjectUnGrabbed(object sender, InteractableObjectEventArgs e)
{
if (md_Measure_Cube.isTriggerPressed())
{
vRounded.y += HMD_Ctrl_Tracking.Instance.Get_Grid_Height();
rb.position = vRounded;
}
rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
}
//StartTouching(GameObject currentTouchingObject)
//public override void StartTouching(GameObject touchingObject)
//{
// base.StartTouching(touchingObject);
// controllerActions = touchingObject.GetComponent<VRTK_ControllerActions>();
// controllerEvents = touchingObject.GetComponent<VRTK_ControllerEvents>();
// controllerActions.TriggerHapticPulse(3333, 0.5f, 0.01f);
//}
private void DoObjectTouched(object sender, InteractableObjectEventArgs e)
{
isTouched = true;
tController = e.interactingObject;
rb.constraints = RigidbodyConstraints.FreezeAll;
ShowPosition();
vLast_Spawn = rb.position;
dt_since_Spawn = 0f;
}
private void DoObjectUntouched(object sender, InteractableObjectEventArgs e)
{
isTouched = false;
HidePosition();
StartCoroutine(WaitToUnConstrain());
rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
}
private IEnumerator WaitToUnConstrain()
{
yield return new WaitForSeconds(0.2f);
//rb.constraints = RigidbodyConstraints.None;
rb.velocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
}
public void ShowPosition()
{
tAccum_Scaler = 0;
StopCoroutine("TweenPosTextScale");
StartCoroutine("TweenPosTextScale", true);
}
public void HidePosition()
{
tAccum_Scaler = 0;
StopCoroutine("TweenPosTextScale");
StartCoroutine("TweenPosTextScale", false);
}
private IEnumerator TweenPosTextScale(bool show)
{
float targetScale = 0;
Vector3 Dir = -1 * Vector3.one;
if (show)
{
targetScale = 1;
Dir = Vector3.one;
}
int i = 0; //Sanity check for infinite loops
while (i < 250 && ((show && center.localScale.x < targetScale) || (!show && center.localScale.x > targetScale)))
{
center.localScale += Dir * Time.deltaTime * 2f; //Tweening function - currently 0.25 second linear
if (Phantom_Scaler != null)
{
Phantom_Scaler.transform.localScale = ps_Base_Scale*(0.9f * Vector3.one + 0.1f * center.localScale.x * Vector3.one);
}
yield return true;
i++;
}
center.localScale = Dir * targetScale;
if (Phantom_Scaler != null)
{
Phantom_Scaler.transform.localScale = ps_Base_Scale * (0.9f * Vector3.one + 0.1f * center.localScale.x * Vector3.one);
}
//transform.localScale = Dir * (.333f + .666f * targetScale);
StopCoroutine("TweenPosTextScale");
}
private float round_to_Point_25(float val)
{
float doub = val * (4f/5f);
doub = Mathf.Round(doub);
return doub * (5f/4f);
}
void Update()
{
wait_for_touch++; //debounce Touch Events
waitForUpdate -= Time.deltaTime;
if (waitForUpdate < 0)
{
if (isTouched)
{
Vector3 v = rb.position;
v.y -= HMD_Ctrl_Tracking.Instance.Get_Grid_Height();
if (md_Measure_Cube.isTriggerPressed()) //snap mode
{
v.x = round_to_Point_25(v.x);
v.y = round_to_Point_25(v.y);
v.z = round_to_Point_25(v.z);
vRounded = v;
if(vLast_Snap != v)
{
StartCoroutine(Haptic_Click());
}
vLast_Snap = v;
bSnapModeOn = true;
}
else
{
if (bSnapModeOn)
{
this.GetComponent<VRTK_InteractableObject>().ForceStopInteracting();
vRounded.y += HMD_Ctrl_Tracking.Instance.Get_Grid_Height();
rb.position = vRounded;
}
bSnapModeOn = false;
}
md_Measure_Cube.Update_To_Position(v);
Vector3 vScaled = v / 5f;
posText.text = vScaled.ToString("F2");
if (Camera.main != null)
{
center.rotation = Camera.main.transform.rotation;
}
dt_since_Spawn += Time.deltaTime;
Vector3 vMoved = v - vLast_Spawn;
if(vMoved.magnitude > 0.5f && dt_since_Spawn > 0.025f)
{
md_Scale_Cube.Spawn_Update_this_frame();
dt_since_Spawn = 0;
vLast_Spawn = v;
}
}
}
}
private IEnumerator Haptic_Click()
{
int i = 0;
while (i < 1)
{
if(tController != null)
{
tController.GetComponent<VRTK_ControllerActions>().TriggerHapticPulse(600);
}
yield return true;
i++;
}
StopCoroutine(Haptic_Click());
}
}
Scaling – Particle Buffer – Performance – Handle Center Sphere – Extents
Brushes = Types ideas for Shader Dynamics

