//======= Copyright (c) Valve Corporation, All rights reserved. ===============
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public struct PointerEventArgs
|
|
{
|
|
public uint controllerIndex;
|
|
public uint flags;
|
|
public float distance;
|
|
public Transform target;
|
|
}
|
|
|
|
public delegate void PointerEventHandler(object sender, PointerEventArgs e);
|
|
|
|
|
|
public class SteamVR_LaserPointer : MonoBehaviour
|
|
{
|
|
public bool active = true;
|
|
public Color color;
|
|
public float thickness = 0.002f;
|
|
public GameObject holder;
|
|
public GameObject pointer;
|
|
bool isActive = false;
|
|
public bool addRigidBody = false;
|
|
public Transform reference;
|
|
public event PointerEventHandler PointerIn;
|
|
public event PointerEventHandler PointerOut;
|
|
|
|
Transform previousContact = null;
|
|
|
|
// Use this for initialization
|
|
void Start ()
|
|
{
|
|
holder = new GameObject();
|
|
holder.transform.parent = this.transform;
|
|
holder.transform.localPosition = Vector3.zero;
|
|
holder.transform.localRotation = Quaternion.identity;
|
|
|
|
pointer = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
|
pointer.transform.parent = holder.transform;
|
|
pointer.transform.localScale = new Vector3(thickness, thickness, 100f);
|
|
pointer.transform.localPosition = new Vector3(0f, 0f, 50f);
|
|
pointer.transform.localRotation = Quaternion.identity;
|
|
BoxCollider collider = pointer.GetComponent<BoxCollider>();
|
|
if (addRigidBody)
|
|
{
|
|
if (collider)
|
|
{
|
|
collider.isTrigger = true;
|
|
}
|
|
Rigidbody rigidBody = pointer.AddComponent<Rigidbody>();
|
|
rigidBody.isKinematic = true;
|
|
}
|
|
else
|
|
{
|
|
if(collider)
|
|
{
|
|
Object.Destroy(collider);
|
|
}
|
|
}
|
|
Material newMaterial = new Material(Shader.Find("Unlit/Color"));
|
|
newMaterial.SetColor("_Color", color);
|
|
pointer.GetComponent<MeshRenderer>().material = newMaterial;
|
|
}
|
|
|
|
public virtual void OnPointerIn(PointerEventArgs e)
|
|
{
|
|
if (PointerIn != null)
|
|
PointerIn(this, e);
|
|
}
|
|
|
|
public virtual void OnPointerOut(PointerEventArgs e)
|
|
{
|
|
if (PointerOut != null)
|
|
PointerOut(this, e);
|
|
}
|
|
|
|
|
|
// Update is called once per frame
|
|
void Update ()
|
|
{
|
|
if (!isActive)
|
|
{
|
|
isActive = true;
|
|
this.transform.GetChild(0).gameObject.SetActive(true);
|
|
}
|
|
|
|
float dist = 100f;
|
|
|
|
SteamVR_TrackedController controller = GetComponent<SteamVR_TrackedController>();
|
|
|
|
Ray raycast = new Ray(transform.position, transform.forward);
|
|
RaycastHit hit;
|
|
bool bHit = Physics.Raycast(raycast, out hit);
|
|
|
|
if(previousContact && previousContact != hit.transform)
|
|
{
|
|
PointerEventArgs args = new PointerEventArgs();
|
|
if (controller != null)
|
|
{
|
|
args.controllerIndex = controller.controllerIndex;
|
|
}
|
|
args.distance = 0f;
|
|
args.flags = 0;
|
|
args.target = previousContact;
|
|
OnPointerOut(args);
|
|
previousContact = null;
|
|
}
|
|
if(bHit && previousContact != hit.transform)
|
|
{
|
|
PointerEventArgs argsIn = new PointerEventArgs();
|
|
if (controller != null)
|
|
{
|
|
argsIn.controllerIndex = controller.controllerIndex;
|
|
}
|
|
argsIn.distance = hit.distance;
|
|
argsIn.flags = 0;
|
|
argsIn.target = hit.transform;
|
|
OnPointerIn(argsIn);
|
|
previousContact = hit.transform;
|
|
}
|
|
if(!bHit)
|
|
{
|
|
previousContact = null;
|
|
}
|
|
if (bHit && hit.distance < 100f)
|
|
{
|
|
dist = hit.distance;
|
|
}
|
|
|
|
if (controller != null && controller.triggerPressed)
|
|
{
|
|
pointer.transform.localScale = new Vector3(thickness * 5f, thickness * 5f, dist);
|
|
}
|
|
else
|
|
{
|
|
pointer.transform.localScale = new Vector3(thickness, thickness, dist);
|
|
}
|
|
pointer.transform.localPosition = new Vector3(0f, 0f, dist/2f);
|
|
}
|
|
}
|