Skip to content

Commit

Permalink
fix(Pointer): clean up pointer artifacts on destroy
Browse files Browse the repository at this point in the history
The pointers create game objects and register listeners and now when
a pointer script is destroyed it cleans up these created artifacts
by removing them.
  • Loading branch information
thestonefox committed Jul 1, 2016
1 parent 7a1005d commit dc61096
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public enum pointerVisibilityStates
private BoxCollider playAreaCursorCollider;
private Transform headset;
private bool isActive;
private bool eventsRegistered = false;

private float activateDelayTimer = 0f;

Expand Down Expand Up @@ -82,6 +83,7 @@ protected virtual void Start()
//Setup controller event listeners
controller.AliasPointerOn += new ControllerInteractionEventHandler(EnablePointerBeam);
controller.AliasPointerOff += new ControllerInteractionEventHandler(DisablePointerBeam);
eventsRegistered = true;

headset = DeviceFinder.HeadsetTransform();

Expand All @@ -105,6 +107,20 @@ protected virtual void Update()
}
}

protected virtual void OnDestroy()
{
if (eventsRegistered)
{
controller.AliasPointerOn -= EnablePointerBeam;
controller.AliasPointerOff -= DisablePointerBeam;
}

if (playAreaCursor != null)
{
Destroy(playAreaCursor);
}
}

protected virtual void InitPointer()
{
InitPlayAreaCursor();
Expand Down
72 changes: 49 additions & 23 deletions Assets/SteamVR_Unity_Toolkit/Scripts/VRTK_BezierPointer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,13 @@ public class VRTK_BezierPointer : VRTK_WorldPointer
public GameObject customPointerCursor;
public LayerMask layersToIgnore = Physics.IgnoreRaycastLayer;

private Transform projectedBeamContainer;
private Transform projectedBeamForward;
private Transform projectedBeamJoint;
private Transform projectedBeamDown;
private GameObject projectedBeamContainer;
private GameObject projectedBeamForward;
private GameObject projectedBeamJoint;
private GameObject projectedBeamDown;

private GameObject pointerCursor;
private GameObject curvedBeamContainer;
private CurveGenerator curvedBeam;

// Use this for initialization
Expand Down Expand Up @@ -65,25 +66,14 @@ protected override void InitPointer()
pointerCursor.layer = 2;
pointerCursor.SetActive(false);

var global = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_CurvedBeamContainer", this.gameObject.name));
global.SetActive(false);
curvedBeam = global.gameObject.AddComponent<CurveGenerator>();
curvedBeamContainer = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_CurvedBeamContainer", this.gameObject.name));
curvedBeamContainer.SetActive(false);
curvedBeam = curvedBeamContainer.gameObject.AddComponent<CurveGenerator>();
curvedBeam.transform.parent = null;
curvedBeam.Create(pointerDensity, pointerCursorRadius, customPointerTracer);
base.InitPointer();
}

private GameObject CreateCursor()
{
var cursorYOffset = 0.02f;
var cursor = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
cursor.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
cursor.GetComponent<MeshRenderer>().receiveShadows = false;
cursor.transform.localScale = new Vector3(pointerCursorRadius, cursorYOffset, pointerCursorRadius);
Destroy(cursor.GetComponent<CapsuleCollider>());
return cursor;
}

protected override void SetPointerMaterial()
{
if (pointerCursor.GetComponent<Renderer>())
Expand All @@ -105,7 +95,7 @@ protected override void TogglePointer(bool state)

projectedBeamForward.gameObject.SetActive(state);
projectedBeamJoint.gameObject.SetActive(state);
projectedBeamDown.gameObject.SetActive(state);
projectedBeamDown.SetActive(state);
}

protected override void DisablePointerBeam(object sender, ControllerInteractionEventArgs e)
Expand All @@ -116,6 +106,42 @@ protected override void DisablePointerBeam(object sender, ControllerInteractionE
curvedBeam.TogglePoints(false);
}

protected override void OnDestroy()
{
base.OnDestroy();
if (projectedBeamDown != null)
{
Destroy(projectedBeamDown);
}
if (pointerCursor != null)
{
Destroy(pointerCursor);
}
if (curvedBeam != null)
{
Destroy(curvedBeam);
}
if (projectedBeamContainer != null)
{
Destroy(projectedBeamContainer);
}
if (curvedBeamContainer != null)
{
Destroy(curvedBeamContainer);
}
}

private GameObject CreateCursor()
{
var cursorYOffset = 0.02f;
var cursor = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
cursor.GetComponent<MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
cursor.GetComponent<MeshRenderer>().receiveShadows = false;
cursor.transform.localScale = new Vector3(pointerCursorRadius, cursorYOffset, pointerCursorRadius);
Destroy(cursor.GetComponent<CapsuleCollider>());
return cursor;
}

private void TogglePointerCursor(bool state)
{
var pointerCursorState = (showPointerCursor && state ? showPointerCursor : false);
Expand All @@ -126,18 +152,18 @@ private void TogglePointerCursor(bool state)

private void InitProjectedBeams()
{
projectedBeamContainer = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamContainer", this.gameObject.name)).transform;
projectedBeamContainer = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamContainer", this.gameObject.name));
projectedBeamContainer.transform.parent = this.transform;
projectedBeamContainer.transform.localPosition = Vector3.zero;

projectedBeamForward = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamForward", this.gameObject.name)).transform;
projectedBeamForward = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamForward", this.gameObject.name));
projectedBeamForward.transform.parent = projectedBeamContainer.transform;

projectedBeamJoint = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamJoint", this.gameObject.name)).transform;
projectedBeamJoint = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamJoint", this.gameObject.name));
projectedBeamJoint.transform.parent = projectedBeamContainer.transform;
projectedBeamJoint.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);

projectedBeamDown = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamDown", this.gameObject.name)).transform;
projectedBeamDown = new GameObject(string.Format("[{0}]PlayerObject_WorldPointer_BezierPointer_ProjectedBeamDown", this.gameObject.name));
}

private float GetForwardBeamLength()
Expand Down
9 changes: 9 additions & 0 deletions Assets/SteamVR_Unity_Toolkit/Scripts/VRTK_SimplePointer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@ protected override void InitPointer()
TogglePointer(false);
}

protected override void OnDestroy()
{
base.OnDestroy();
if (pointerHolder != null)
{
Destroy(pointerHolder);
}
}

protected override void SetPointerMaterial()
{
base.SetPointerMaterial();
Expand Down

0 comments on commit dc61096

Please sign in to comment.