/**
         * Ctor.
         * @param id The projector id.
         * @param width width of the projector grid.
         * @param height height of the projector grid.
         * @param start start seam for the projector.
         * @param end end seam for the projector.
         */
        public ProjectorDescription(ProjectorMesh projectorMesh, 
            int renderTextureWidth,
            int renderTextureHeight,
            GameObject warpMeshPrefab,
            Transform clusterManager)
        {
            this.projectorMesh = projectorMesh;
            nodeNumber = projectorMesh.Id / 2;

            if (projectorMesh.Id % 2 == 0)
            {
                stereoType = ProjectorStereoType.Left;
            }
            else if (projectorMesh.Id % 2 == 1)
            {
                stereoType = ProjectorStereoType.Right;
            }
            meshVertices = new Vector3[projectorMesh.NumVertices];
            meshUVs = new Vector2[projectorMesh.NumVertices];
            triangles = new int[3 * 2 * projectorMesh.GridWidth * projectorMesh.GridHeight];

            _projectorObject = new GameObject("Ortho Camera Rig: " + projectorMesh.Id);

            //
            // Position this rig under the Cluster Manager
            // to make the scene browser clearer
            _projectorObject.transform.parent = clusterManager;

            /////////////////
            // Create Mesh //
            /////////////////
            Mesh mesh = this.CreateMesh();
            if (mesh == null)
            {
                // Create mesh failed, exit
                throw new Exception("Mesh Creation Failed.");
            }
            //            Debug.Log("Mesh Created.");

            // Projector is the left of the two assigned to this IG
            string warpMeshPrefix = "IG(" + (projectorMesh.Id / 2) + ").Projector(" + projectorMesh.Id + ")";
            GameObject warpMeshObject = GameObject.Instantiate(warpMeshPrefab) as GameObject;
            warpMeshObject.name = warpMeshPrefix + ".object";
            //GameObject warpMeshObject = new GameObject(warpMeshPrefix + ".object");
            warpMeshObject.transform.parent = this.ProjectorObject.transform;
            //warpMeshObject.AddComponent("MeshFilter");
            //warpMeshObject.AddComponent("MeshRenderer");
            (warpMeshObject.GetComponent("MeshFilter") as MeshFilter).mesh = mesh;
            MeshRenderer meshRenderer = warpMeshObject.GetComponent<MeshRenderer>();
            meshRenderer.castShadows = false;
            meshRenderer.receiveShadows = false;

            this.warpMeshObject = warpMeshObject;

            ///////////////////////////////////////////////////
            // Create a new render texture for the projector //
            ///////////////////////////////////////////////////
            int renderTextureDepth = 24;
            RenderTexture renderTexture = new RenderTexture(renderTextureWidth, renderTextureHeight, renderTextureDepth);
            this._targetRenderTexture = renderTexture;

            ///////////////////////////////////////////////////
            // Create a new blend texture for this projector //
            ///////////////////////////////////////////////////
            string path = "file:///" + CONFIG_PATH + "Avie/BlendTextures/blend" + projectorMesh.Id.ToString("00") + ".png";
            WWW www = new WWW(path);
            this._targetBlendTexture = www.texture;

            if (www.error != null)
                Debug.Log (www.error);

            ///////////////////////////////////////////////////
            // Add HSV/ Gamma adjust						 //
            ///////////////////////////////////////////////////
            icMaterial icm = this.warpMeshObject.AddComponent<icMaterial>();
            icm.multiplyByParentColour = false;

            RefreshTextureScript rts = this.warpMeshObject.AddComponent<RefreshTextureScript>();
            rts.toReplace = this._targetRenderTexture;
            ImageShaderScript iss = this.warpMeshObject.AddComponent<ImageShaderScript>();

            iss.separatePass = true;
            iss.enabled = false;
            //imageShaderScript needs to be enabled one frame later, or a white flash occurs...
        }
        /**
         * Ctor.
         * @param id The projector id.
         * @param width width of the projector grid.
         * @param height height of the projector grid.
         * @param start start seam for the projector.
         * @param end end seam for the projector.
         */
        public ProjectorDescription(ProjectorMesh projectorMesh,
                                    int renderTextureWidth,
                                    int renderTextureHeight,
                                    GameObject warpMeshPrefab,
                                    Transform clusterManager)
        {
            this.projectorMesh = projectorMesh;
            nodeNumber         = projectorMesh.Id / 2;

            if (projectorMesh.Id % 2 == 0)
            {
                stereoType = ProjectorStereoType.Left;
            }
            else if (projectorMesh.Id % 2 == 1)
            {
                stereoType = ProjectorStereoType.Right;
            }
            meshVertices = new Vector3[projectorMesh.NumVertices];
            meshUVs      = new Vector2[projectorMesh.NumVertices];
            triangles    = new int[3 * 2 * projectorMesh.GridWidth * projectorMesh.GridHeight];

            _projectorObject = new GameObject("Ortho Camera Rig: " + projectorMesh.Id);

            //
            // Position this rig under the Cluster Manager
            // to make the scene browser clearer
            _projectorObject.transform.parent = clusterManager;

            /////////////////
            // Create Mesh //
            /////////////////
            Mesh mesh = this.CreateMesh();

            if (mesh == null)
            {
                // Create mesh failed, exit
                throw new Exception("Mesh Creation Failed.");
            }
//            Debug.Log("Mesh Created.");

            // Projector is the left of the two assigned to this IG
            string     warpMeshPrefix = "IG(" + (projectorMesh.Id / 2) + ").Projector(" + projectorMesh.Id + ")";
            GameObject warpMeshObject = GameObject.Instantiate(warpMeshPrefab) as GameObject;

            warpMeshObject.name = warpMeshPrefix + ".object";
            //GameObject warpMeshObject = new GameObject(warpMeshPrefix + ".object");
            warpMeshObject.transform.parent = this.ProjectorObject.transform;
            //warpMeshObject.AddComponent("MeshFilter");
            //warpMeshObject.AddComponent("MeshRenderer");
            (warpMeshObject.GetComponent("MeshFilter") as MeshFilter).mesh = mesh;
            MeshRenderer meshRenderer = warpMeshObject.GetComponent <MeshRenderer>();

            meshRenderer.castShadows    = false;
            meshRenderer.receiveShadows = false;

            this.warpMeshObject = warpMeshObject;


            ///////////////////////////////////////////////////
            // Create a new render texture for the projector //
            ///////////////////////////////////////////////////
            int           renderTextureDepth = 24;
            RenderTexture renderTexture      = new RenderTexture(renderTextureWidth, renderTextureHeight, renderTextureDepth);

            this._targetRenderTexture = renderTexture;

            ///////////////////////////////////////////////////
            // Create a new blend texture for this projector //
            ///////////////////////////////////////////////////
            string path = "file:///" + CONFIG_PATH + "Avie/BlendTextures/blend" + projectorMesh.Id.ToString("00") + ".png";
            WWW    www  = new WWW(path);

            this._targetBlendTexture = www.texture;

            if (www.error != null)
            {
                Debug.Log(www.error);
            }

            ///////////////////////////////////////////////////
            // Add HSV/ Gamma adjust						 //
            ///////////////////////////////////////////////////
            icMaterial icm = this.warpMeshObject.AddComponent <icMaterial>();

            icm.multiplyByParentColour = false;


            RefreshTextureScript rts = this.warpMeshObject.AddComponent <RefreshTextureScript>();

            rts.toReplace = this._targetRenderTexture;
            ImageShaderScript iss = this.warpMeshObject.AddComponent <ImageShaderScript>();

            iss.separatePass = true;
            iss.enabled      = false;
            //imageShaderScript needs to be enabled one frame later, or a white flash occurs...
        }