// Init
        //-------------------------------------------------------
        public apOptMainCamera(apPortrait portrait)
        {
            _parentPortrait = portrait;

            Clear();

            _refreshKey         = -1;
            _isAutomaticRefresh = true;

            _vrSupportMode = _parentPortrait._vrSupportMode;
#if UNITY_2019_1_OR_NEWER
            _vrRTSize = _parentPortrait._vrRenderTextureSize;
#endif
        }
Пример #2
0
        // Function
        //-----------------------------------------------
        public void Refresh(bool isRefreshForce, bool isUseSRP, apOptMainCamera mainCamera)
        {
            //변경 : mainCamera에서 Refresh를 통합으로 하고, 변경 사항이 있는 경우에만 갱신
            //그대로 유지할지 확인
            if (mainCamera == null)
            {
                Clear();
                return;
            }

            //카메라 상태를 갱신하자.
            _vrSupportMode = mainCamera.VRSupportMode;
            switch (mainCamera.GetNumberOfCamera())
            {
            case apOptMainCamera.NumberOfCamera.None:
                _renderCameraType = RenderCameraType.None;

                break;

            case apOptMainCamera.NumberOfCamera.Single:
                if (_vrSupportMode == apPortrait.VR_SUPPORT_MODE.SingleCamera)
                {
                    _renderCameraType = RenderCameraType.Single_VR;
                }
                else
                {
                    _renderCameraType = RenderCameraType.Single_NoVR;
                }
                break;

            case apOptMainCamera.NumberOfCamera.Multiple:
                _renderCameraType = RenderCameraType.Multiple;
                break;
            }

            if (mainCamera._refreshKey != _refreshKey ||
                isRefreshForce ||
                _status == STATUS.NoCamera ||
                _renderCameraType_Prev != _renderCameraType)
            {
                //다시 갱신
                //삭제할 카메라를 찾자
                _cal_curCamRenderData = null;
                for (int i = 0; i < _nCameras; i++)
                {
                    _cal_curCamRenderData = _cameraRenderDataList[i];
                    _cal_curCamRenderData.ReadyToUpdate();
                }

                List <apOptMainCamera.CameraData> mainRenderCameraDataList = mainCamera.RenderCameraDataList;

                if (mainCamera._refreshKey > 0 && mainRenderCameraDataList != null)
                {
                    List <CameraRenderData> addedCameraDataList = new List <CameraRenderData>();                  //<<추가해야하는 리스트

                    int nMainRenderCam = mainRenderCameraDataList.Count;
                    apOptMainCamera.CameraData curRenderCamData = null;
                    for (int iMainRCD = 0; iMainRCD < nMainRenderCam; iMainRCD++)
                    {
                        curRenderCamData = mainRenderCameraDataList[iMainRCD];
                        if (_cam2CamRenderData.ContainsKey(curRenderCamData._camera))
                        {
                            _cal_curCamRenderData = _cam2CamRenderData[curRenderCamData._camera];

                            //이건 계속 업데이트 되는 카메라
                            _cal_curCamRenderData.Update();
                        }
                        else
                        {
                            //새로 발견된 카메라
                            CameraRenderData newCamRenderData = new CameraRenderData(_parentOptMesh,
                                                                                     curRenderCamData._camera,
                                                                                     (_vrSupportMode == apPortrait.VR_SUPPORT_MODE.SingleCamera)
#if UNITY_2019_1_OR_NEWER
                                                                                     , mainCamera.VRRenderTextureSize == apPortrait.VR_RT_SIZE.ByEyeTextureSize
#endif
                                                                                     );
                            newCamRenderData._isUpdated = true;

                            addedCameraDataList.Add(newCamRenderData);
                        }
                    }

                    bool isAnyReleased = false;
                    //업데이트 되지 않은 것은 삭제하자.
                    for (int iCamRD = 0; iCamRD < _nCameras; iCamRD++)
                    {
                        _cal_curCamRenderData = _cameraRenderDataList[iCamRD];
                        if (!_cal_curCamRenderData._isUpdated)
                        {
                            //저장된 렌더 텍스쳐, 커맨드 버퍼 등을 Release
                            _cal_curCamRenderData.ReleaseAll();
                            isAnyReleased = true;
                        }
                    }

                    if (isAnyReleased)
                    {
                        _cameraRenderDataList.RemoveAll(delegate(CameraRenderData a)
                        {
                            return(!a._isUpdated);
                        });
                    }

                    //새로 추가를 하자.
                    if (addedCameraDataList.Count > 0)
                    {
                        _cal_curCamRenderData = null;
                        for (int i = 0; i < addedCameraDataList.Count; i++)
                        {
                            _cameraRenderDataList.Add(addedCameraDataList[i]);
                        }
                    }

                    //Cam 2 Data 갱신
                    _nCameras = _cameraRenderDataList.Count;
                    _cam2CamRenderData.Clear();
                    for (int i = 0; i < _nCameras; i++)
                    {
                        _cal_curCamRenderData = _cameraRenderDataList[i];
                        _cam2CamRenderData.Add(_cal_curCamRenderData._camera, _cal_curCamRenderData);
                    }
                }

                _refreshKey = mainCamera._refreshKey;

                if (_nCameras == 0)
                {
                    _mainData = null;

                    _status = STATUS.NoCamera;
                }
                else
                {
                    _mainData = _cameraRenderDataList[0];

                    _status = STATUS.Camera;
                }

                _renderCameraType_Prev = _renderCameraType;
            }


            _isAllSameForward        = mainCamera.IsAllSameForward;
            _isAllCameraOrthographic = mainCamera.IsAllOrthographic;


            #region [미사용 코드]
            ////- 카메라의 개수
            ////- 현재 카메라가 유효한지
            //bool isNeedToRefresh = false;
            //Camera[] sceneCameras = Camera.allCameras;
            //int nSceneCameras = (sceneCameras != null ? sceneCameras.Length : 0);

            //if (nSceneCameras == 0)
            //{
            //	//카메라가 없네요.
            //	if (_numberOfCameraType != NumberOfCameraType.None)
            //	{
            //		Clear();
            //	}
            //	return;
            //}

            //if(!isRefreshForce)
            //{
            //	//조건을 체크하자
            //	if (_numberOfCameraType == NumberOfCameraType.None
            //		|| _mainData == null
            //		|| _cameraRenderDataList.Count == 0
            //		|| _nCameras == 0
            //		|| _prevNumSceneCamera != nSceneCameras)
            //	{
            //		//초기화 된 상태이거나 씬의 카메라 개수가 다르다면
            //		isNeedToRefresh = true;
            //	}
            //	else
            //	{
            //		//존재하는 카메라가 유효하지 않다면
            //		if(_numberOfCameraType == NumberOfCameraType.Single)
            //		{
            //			//1개 일때
            //			if(!IsLookMesh(_mainData._camera))
            //			{
            //				//Single 카메라가 제대로 바라보고 있지 않다면
            //				isNeedToRefresh = true;
            //			}
            //		}
            //		else
            //		{
            //			//여러개일때
            //			CameraRenderData curCamData = null;
            //			for (int i = 0; i < _nCameras; i++)
            //			{
            //				curCamData = _cameraRenderDataList[i];
            //				if(curCamData == null
            //					|| curCamData._camera == null
            //					|| !IsLookMesh(curCamData._camera))
            //				{
            //					isNeedToRefresh = true;
            //					break;
            //				}

            //			}
            //		}
            //	}
            //}
            //else
            //{
            //	//무조건 Refresh
            //	isNeedToRefresh = true;
            //}

            //if(!isNeedToRefresh)
            //{
            //	//카메라를 새로 갱신할 필요가 없다.
            //	//카메라의 Forward와 타입만 비교하자.
            //	_isAllSameForward = true;
            //	_isAllCameraOrthographic = true;
            //	if(_numberOfCameraType == NumberOfCameraType.Multiple)
            //	{
            //		CameraRenderData curCamData = null;
            //		Vector3 mainForward = _mainData._transform.forward;
            //		for (int i = 0; i < _nCameras; i++)
            //		{
            //			curCamData = _cameraRenderDataList[i];
            //			if(!curCamData._camera.orthographic)
            //			{
            //				//하나라도 Orthographic이 아니라면..
            //				_isAllCameraOrthographic = false;
            //			}
            //			if(Mathf.Abs(curCamData._transform.forward.x - mainForward.x) > 0.01f ||
            //				Mathf.Abs(curCamData._transform.forward.y - mainForward.y) > 0.01f ||
            //				Mathf.Abs(curCamData._transform.forward.z - mainForward.z) > 0.01f)
            //			{
            //				//Forward가 하나라도 다르다면
            //				_isAllSameForward = false;
            //			}
            //		}
            //	}
            //	return;
            //}

            ////다시 Refresh를 해야한다.
            //if(_numberOfCameraType != NumberOfCameraType.None)
            //{
            //	//일단 초기화
            //	Clear();
            //}

            ////씬 카메라를 찾아서 추가하자
            //if (nSceneCameras > 0)
            //{
            //	Camera curSceneCamera = null;
            //	for (int i = 0; i < sceneCameras.Length; i++)
            //	{
            //		curSceneCamera = sceneCameras[i];
            //		if (curSceneCamera != null && IsLookMesh(curSceneCamera))
            //		{
            //			//바라보고 있는 카메라다. > 추가
            //			CameraRenderData newCamData = new CameraRenderData(_parentOptMesh, curSceneCamera);
            //			_cameraRenderDataList.Add(newCamData);
            //			_camera2RenderData.Add(curSceneCamera, newCamData);
            //		}
            //	}
            //}
            //_nCameras = _cameraRenderDataList.Count;
            //_prevNumSceneCamera = nSceneCameras;

            //if(_nCameras == 0)
            //{
            //	_numberOfCameraType = NumberOfCameraType.None;
            //	_mainData = null;
            //}
            //else if(_nCameras == 1)
            //{
            //	_numberOfCameraType = NumberOfCameraType.Single;
            //	_mainData = _cameraRenderDataList[0];
            //}
            //else
            //{
            //	_numberOfCameraType = NumberOfCameraType.Multiple;
            //	_mainData = _cameraRenderDataList[0];
            //}


            ////새로 갱신 후 카메라의 Forward와 Ortho타입만 비교하자.
            //_isAllSameForward = true;
            //_isAllCameraOrthographic = true;
            //if(_numberOfCameraType == NumberOfCameraType.Multiple)
            //{
            //	CameraRenderData curCamData = null;
            //	Vector3 mainForward = _mainData._transform.forward;
            //	for (int i = 0; i < _nCameras; i++)
            //	{
            //		curCamData = _cameraRenderDataList[i];
            //		if(!curCamData._camera.orthographic)
            //		{
            //			//하나라도 Orthographic이 아니라면..
            //			_isAllCameraOrthographic = false;
            //		}
            //		if(Mathf.Abs(curCamData._transform.forward.x - mainForward.x) > 0.01f ||
            //			Mathf.Abs(curCamData._transform.forward.y - mainForward.y) > 0.01f ||
            //			Mathf.Abs(curCamData._transform.forward.z - mainForward.z) > 0.01f)
            //		{
            //			//Forward가 하나라도 다르다면
            //			_isAllSameForward = false;
            //		}
            //	}
            //}
            #endregion
        }