public SliceCameraDescription(int id, float angle, float leftSeam, float rightSeam, ProjectorDescription projector, GameObject parent, Camera copyFrom)
        {
            this.id           = id;
            this.angleDegrees = angle;
            this.leftSeam     = leftSeam;
            this.rightSeam    = rightSeam;
            this.projector    = projector;
            sliceName         = "Slave(" + (projector.ProjectorMesh.Id / 2) + ")." +
                                (projector.stereoType == ProjectorDescription.ProjectorStereoType.Left ? ".LeftProjector" : ".RightProjector")
                                + ".SliceCam(" + id + ")";


            cameraObject = new GameObject(sliceName);
            cameraObject.AddComponent <Camera>();
            cameraObject.camera.transform.parent = parent.transform;
            //cameraObject.AddComponent<CameraLines>(); //use this for easy way of getting lines
            // Set up render path

            cameraObject.camera.depthTextureMode = DepthTextureMode.Depth;
            cameraObject.camera.renderingPath    = RenderingPath.Forward;


            // We will manually call .render on these cameras
            cameraObject.camera.enabled = false;

            this.CopyFrom(copyFrom);
        }
        public SliceCameraDescription(int id, float angle, float leftSeam, float rightSeam, ProjectorDescription projector, GameObject parent, Camera copyFrom)
        {
            this.id = id;
            this.angleDegrees = angle;
            this.leftSeam = leftSeam;
            this.rightSeam = rightSeam;
            this.projector = projector;
            sliceName = "Slave(" + (projector.ProjectorMesh.Id / 2) + ")." +
                (projector.stereoType == ProjectorDescription.ProjectorStereoType.Left ? ".LeftProjector" : ".RightProjector")
                + ".SliceCam(" + id + ")";

            cameraObject = new GameObject(sliceName);
            cameraObject.AddComponent<Camera>();
            cameraObject.camera.transform.parent = parent.transform;
            //cameraObject.AddComponent<CameraLines>(); //use this for easy way of getting lines
            // Set up render path

            cameraObject.camera.depthTextureMode = DepthTextureMode.Depth;
            cameraObject.camera.renderingPath = RenderingPath.Forward;

            // We will manually call .render on these cameras
            cameraObject.camera.enabled = false;

            this.CopyFrom(copyFrom);
        }
        protected void AllSlicesRendered(ProjectorDescription pd)
        {
            // Render a picture-in-picture of the depth buffer

            RenderTexture.active = pd._targetRenderTexture;

            GL.PushMatrix();
            GL.LoadPixelMatrix(0, pd._targetRenderTexture.width, pd._targetRenderTexture.height, 0);

            Graphics.DrawTexture(new Rect(100, 100, 500, 400), this.projectorDepthBuffers[pd]);
            RenderTexture.active = null;

            GL.PopMatrix();
        }
	private void UpdateTextures (ProjectorDescription projector)
	{
		GameObject warpMeshObject = projector.warpMeshObject;
		if (showGrid) {
			// Use grid instead of showing scene
			if (projector.stereoType == ProjectorDescription.ProjectorStereoType.Left) {
				//Debug.Log("Set Left Eye to Grid");
				warpMeshObject.GetComponent<RefreshTextureScript> ().toReplace = leftEyeGrid;
				Vector2 texScale = new Vector2 (projector.ProjectorMesh.MeshEnd - projector.ProjectorMesh.MeshStart, 1.0f);
				warpMeshObject.renderer.material.mainTextureScale = texScale;
				Vector2 texOffset = new Vector2 (projector.ProjectorMesh.MeshStart, 0.0f);
				warpMeshObject.renderer.material.mainTextureOffset = texOffset;
			} else {
				//Debug.Log("Set Right Eye to Grid");
				warpMeshObject.GetComponent<RefreshTextureScript> ().toReplace = rightEyeGrid;
				Vector2 texScale = new Vector2 (projector.ProjectorMesh.MeshEnd - projector.ProjectorMesh.MeshStart, 1.0f);
				Vector2 texOffset = new Vector2 (projector.ProjectorMesh.MeshStart, 0.0f);
				warpMeshObject.renderer.material.mainTextureScale = texScale;
				warpMeshObject.renderer.material.mainTextureOffset = texOffset;
			}
		} else {
			warpMeshObject.GetComponent<RefreshTextureScript> ().toReplace = projector._targetRenderTexture;
			warpMeshObject.renderer.material.mainTextureScale = new Vector2 (1.0f, 1.0f);
			warpMeshObject.renderer.material.mainTextureOffset = new Vector2 (0, 0);
			foreach (SliceCameraDescription cameraDescription in _sliceCameraDescriptions) {
//                Camera camera = cameraDescription.CameraObject.camera;
				cameraDescription.ComputeProjection (cameraAngle, renderRadius, renderHeight, eyeWidth, eyeHeight, sliceWidth);
				cameraDescription.ComputeViewport (Screen.width);
				//cameraDescription.SetRenderLayer(modelLayer);
			}
		}
	}
	private void UpdateBlend (ProjectorDescription projector)
	{			
		GameObject warpMeshObject = projector.warpMeshObject;
		if (this.showBlend) {			
			warpMeshObject.renderer.material.SetTexture ("_BlendTex", projector._targetBlendTexture);
		} else {
			warpMeshObject.renderer.material.SetTexture("_BlendTex",null);
		}
	}
	void CreateMeshesForSlaves ()
	{
		// AH: Update this function so that it only creates meshes 
		// if this is the correct slave node. Or we are forcing
		// all slave nodes to render.
		_sliceCameraParent.name = "Slice Cameras";
		_sliceCameraParent.transform.parent = gameObject.transform;
		_sliceCameraParent.transform.localPosition = Vector3.zero;
//        Debug.Log("Number of projector meshes = " + _projectorMeshes.Count);
		foreach (ProjectorMesh projectorMesh in _projectorMeshes) {
			ProjectorDescription projector = new ProjectorDescription (projectorMesh, 
                _projectorRenderTextureWidth,
                _projectorRenderTextureHeight,
                warpMeshPrefab,
                this.transform.FindChild ("Cluster Manager"));
			_projectors.Add (projector);
            

			GameObject nodeParent = new GameObject ();
			string stereoTypeString = (projector.stereoType == ProjectorDescription.ProjectorStereoType.Left) ? "Left" : "Right";
			nodeParent.name = "Node:" + projector.nodeNumber + " " + stereoTypeString;
			nodeParent.transform.parent = _sliceCameraParent.transform;
			nodeParent.transform.localPosition = Vector3.zero;

			_sliceCameraDescriptions = projector.CreateSliceCameras (sliceSeams, 
																	nodeParent, 
																	this, 
																	_masterCamera);
																		
			foreach (SliceCameraDescription cameraDescription in _sliceCameraDescriptions) {
				if (ClusterManager.Instance.IsMaster) {
					cameraDescription.CameraObject.SetActive (false);
				}
			}
			UpdateTextures (projector);
			UpdateBlend (projector);
			
			// Create a camera for each slave that views the slave portion.
			projector.CreateDisplayCamera (gameObject, _orthoCameraTemplate);
			if (ClusterManager.Instance.IsMaster) {
				projector.ProjectorObject.SetActive (false);
			}
		}
		_masterCamera.camera.enabled = true;
	}