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);
        }
    }
Beispiel #2
0
        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();
        }
    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;
    }
    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);
            }
        }
    }
    void StartRenderSystem()
    {
        // In case the render system already exists, detroy it
        ShutdownRenderSystem();

        this.setDisplayConfiguration();
        // AH: Read in the warp mesh. This only reads in the
        // warp meshes relevant for this IG?
        ReadWarpMesh();

        // Establish exactly how many and where the slices and seams are
        sliceSeams = new float[_numSlicesPerIG * _numIGs];
        sliceWidth = 1.0f / (_numSlicesPerIG * _numIGs);
        for (int i = 0; i < sliceSeams.Length; i++)
        {
            sliceSeams [i] = sliceWidth * (float)i;
        }
        cameraAngle = 360.0f / (float)(sliceSeams.Length);
//        Debug.Log("Each slice camera looks at " + (sliceSeams.Length).ToString() + "th of the AVIE, which is " + cameraAngle.ToString() + " degrees.");

        _sliceCameraParent = new GameObject();
        CreateMeshesForSlaves();

        //
        // Organize Meshes in appropriate manner
        // based on flags
        //
        // Arrange the projector displays in a grid

        //
        // If displaying all displays. Arrange them appropriately
        //
        if (_internalDisplayConfiguration == DisplayConfigurations.MASTER)
        {
            // There should only be two projectors per slave
            ProjectorDescription leftProjector = _projectors [0];
            leftProjector._orthographicCamera.SetActive(false);
            leftProjector.warpMeshObject.SetActive(true);

            ProjectorDescription rightProjector = _projectors [1];
            rightProjector._orthographicCamera.SetActive(false);
            rightProjector.warpMeshObject.SetActive(true);

            _masterCamera.camera.enabled = true;
        }
        else if (_internalDisplayConfiguration == DisplayConfigurations.LEFT_BLANK)
        {
            // There should only be two projectors per slave
            ProjectorDescription leftProjector = _projectors [0];
            leftProjector._orthographicCamera.camera.rect = new Rect(0, 0, 0.5f, 1.0f);
            leftProjector._orthographicCamera.SetActive(true);
            leftProjector.warpMeshObject.SetActive(true);

            ProjectorDescription rightProjector = _projectors [1];
            rightProjector._orthographicCamera.SetActive(false);
            rightProjector.warpMeshObject.SetActive(false);

            _masterCamera.camera.enabled = false;
        }
        else if (_internalDisplayConfiguration == DisplayConfigurations.BLANK_RIGHT)
        {
            // There should only be two projectors per slave
            ProjectorDescription leftProjector = _projectors [0];
            leftProjector._orthographicCamera.SetActive(false);
            leftProjector.warpMeshObject.SetActive(false);

            ProjectorDescription rightProjector = _projectors [1];
            rightProjector._orthographicCamera.camera.rect = new Rect(0.5f, 0, 0.5f, 1.0f);
            rightProjector._orthographicCamera.SetActive(true);
            rightProjector.warpMeshObject.SetActive(true);

            _masterCamera.camera.enabled = false;
        }
        else if (_internalDisplayConfiguration == DisplayConfigurations.LEFT_RIGHT)
        {
            // There should only be two projectors per slave
            ProjectorDescription leftProjector = _projectors [0];
            leftProjector._orthographicCamera.camera.rect = new Rect(0, 0, 0.5f, 1.0f);
            leftProjector._orthographicCamera.SetActive(true);
            leftProjector.warpMeshObject.SetActive(true);

            ProjectorDescription rightProjector = _projectors [1];
            rightProjector._orthographicCamera.camera.rect = new Rect(0.5f, 0, 0.5f, 1.0f);
            rightProjector._orthographicCamera.SetActive(true);
            rightProjector.warpMeshObject.SetActive(true);

            _masterCamera.camera.enabled = false;
        }
        else if (_internalDisplayConfiguration == DisplayConfigurations.MULTI_VIEW)
        {
            float screenWidth  = 1.0f / 6.0f;
            float screenHeight = 0.5f;

            for (int i = 0; i < 11; i += 2)
            {
                float x_offset = i / 2 * screenWidth;

                // There should only be two projectors per slave
                ProjectorDescription leftProjector = _projectors [i];
                leftProjector._orthographicCamera.camera.rect = new Rect(x_offset, 0, screenWidth, screenHeight);
                leftProjector._orthographicCamera.SetActive(true);
                leftProjector.warpMeshObject.SetActive(true);

                ProjectorDescription rightProjector = _projectors [i + 1];
                rightProjector._orthographicCamera.camera.rect = new Rect(x_offset, screenHeight, screenWidth, screenHeight);
                rightProjector._orthographicCamera.SetActive(true);
                rightProjector.warpMeshObject.SetActive(true);
            }

            _masterCamera.camera.enabled = false;
        }
        else if (_internalDisplayConfiguration == DisplayConfigurations.DOUBLE_IG)
        {
            float screenWidth  = 1.0f / 4.0f;
            float screenHeight = 1.0f;

            for (int i = 0; i < 4; i += 2)
            {
                float x_offset = i / 4f;
                // There should only be two projectors per slave
                ProjectorDescription leftProjector = _projectors [i];

                leftProjector._orthographicCamera.camera.rect = new Rect(x_offset, 0, screenWidth, screenHeight);
                leftProjector._orthographicCamera.SetActive(true);
                leftProjector.warpMeshObject.SetActive(true);


                x_offset = (i + 1f) / 4f;

                ProjectorDescription rightProjector = _projectors [i + 1];
                rightProjector._orthographicCamera.camera.rect = new Rect(x_offset, 0, screenWidth, screenHeight);
                rightProjector._orthographicCamera.SetActive(true);
                rightProjector.warpMeshObject.SetActive(true);
            }

            _masterCamera.camera.enabled = false;
        }
        else if (_internalDisplayConfiguration == DisplayConfigurations.TRIPLE_IG)
        {
            float screenWidth  = 1.0f / 3.0f;
            float screenHeight = 0.5f;

            for (int i = 0; i < 5; i += 2)
            {
                float x_offset = i / 2 * screenWidth;

                // There should only be two projectors per slave
                ProjectorDescription leftProjector = _projectors [i];
                leftProjector._orthographicCamera.camera.rect = new Rect(x_offset, 0, screenWidth, screenHeight);
                leftProjector._orthographicCamera.SetActive(true);
                leftProjector.warpMeshObject.SetActive(true);

                ProjectorDescription rightProjector = _projectors [i + 1];
                rightProjector._orthographicCamera.camera.rect = new Rect(x_offset, screenHeight, screenWidth, screenHeight);
                rightProjector._orthographicCamera.SetActive(true);
                rightProjector.warpMeshObject.SetActive(true);
            }

            _masterCamera.camera.enabled = false;
        }
        InitialCameraSettings ics = this.GetComponent <InitialCameraSettings> ();

        if (ics != null)
        {
            ics.ExecuteInitialCameraSettings();
        }
    }