"We offer new support options and therefor the forums are now in read-only mode! Please check out our Support Center for more information." - Vuforia Engine Team

Selective Rendering for Image Target trackables

Hello,

I am trying to selectively render ar trackables on an Image Target.

I have written a script that uses a "Next" button to advance a counter.  A script on my AR Trackable looks at the counter and executes renderer.enabled = true when the counter is above a set point. 

My script works, but unfortunately interferes with turning the rendering off when Tracking is lost.  I am trying to figure out how I can have my selective rendering, but always turn it off if tracking is lost.

I added a public variable to DefaultTrackableEventHandler.cs

/*==============================================================================
Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Qualcomm Connected Experiences, Inc.
==============================================================================*/

using UnityEngine;

/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class DefaultTrackableEventHandler : MonoBehaviour,
                                            ITrackableEventHandler
{

	// public var
	public string itstatus;

    #region PRIVATE_MEMBER_VARIABLES
 
    private TrackableBehaviour mTrackableBehaviour;
    
    #endregion // PRIVATE_MEMBER_VARIABLES



    #region UNTIY_MONOBEHAVIOUR_METHODS
    
    void Start()
    {
		itstatus = "lost";
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
    }

    #endregion // UNTIY_MONOBEHAVIOUR_METHODS



    #region PUBLIC_METHODS

    /// <summary>
    /// Implementation of the ITrackableEventHandler function called when the
    /// tracking state changes.
    /// </summary>
    public void OnTrackableStateChanged(
                                    TrackableBehaviour.Status previousStatus,
                                    TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            OnTrackingFound();
        }
        else
        {
            OnTrackingLost();
        }
    }

    #endregion // PUBLIC_METHODS



    #region PRIVATE_METHODS


    private void OnTrackingFound()
    {
		itstatus = "found";
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

        // Enable rendering:
        foreach (Renderer component in rendererComponents)
        {
            component.enabled = true;
        }

        // Enable colliders:
        foreach (Collider component in colliderComponents)
        {
            component.enabled = true;
        }

        Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
    }


    private void OnTrackingLost()
    {
		itstatus = "lost";
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
        Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);

        // Disable rendering:
        foreach (Renderer component in rendererComponents)
        {
            component.enabled = false;
        }

        // Disable colliders:
        foreach (Collider component in colliderComponents)
        {
            component.enabled = false;
        }

        Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
    }

    #endregion // PRIVATE_METHODS
}

 

And I try to use that variable the script on my trackable:

using UnityEngine;
using System.Collections;

public class Activate01 : MonoBehaviour {
	public GameObject player;
	private NextButton2 playerScript;
	private DefaultTrackableEventHandler trackstatus;

	void Start () {
				trackstatus = player.GetComponent<DefaultTrackableEventHandler> ();
				playerScript = player.GetComponent<NextButton2> ();
		}
	// Update is called once per frame
	void LateUpdate () {
		if(playerScript.nextcounter >= 1 && trackstatus.itstatus == "found") {
			Debug.Log (And "01 On");
			renderer.enabled = true;
	}
		else {
			Debug.Log ("01 Off");
			renderer.enabled = false;
}
}
}

 

My script only partially works.  I am also getting this error:  NullReferenceException: Object reference not set to an instance of an objectActivate01.LateUpdate () (at Assets/Scripts/Activate01.cs:15)

Any ideas on what I need to do to make this work?