Example #1
0
        /// <summary>
        /// Shift scene towards (+) / away-from (-) camera.
        /// If bKeepTargetPos == false, then target shifts with scene
        /// </summary>
        public void SceneZoom(FScene scene, fCamera cam, float dz, bool bKeepTargetPos = true)
        {
            if (dz == 0.0f)
            {
                return;
            }

            float fScale = scene.GetSceneScale();

            //Vector3f fw = cam.gameObject.transform.forward;
            Vector3f fw          = cam.GetTarget() - cam.GetPosition();
            float    fTargetDist = fw.Length;

            fw.Normalize();

            float fMinTargetDist = 0.1f * fScale;

            if (dz > 0 && fTargetDist - dz < fMinTargetDist)
            {
                dz = fTargetDist - fMinTargetDist;
            }

            Vector3f delta = dz * fw;

            scene.RootGameObject.Translate(-delta, false);
            if (bKeepTargetPos)
            {
                cam.SetTarget(cam.GetTarget() - delta);
            }
        }
Example #2
0
        public CameraState GetCurrentState(FScene scene)
        {
            CameraState s = new CameraState();

            s.camPosition       = Camera.GetPosition();
            s.camRotation       = Camera.GetRotation();
            s.scenePosition     = scene.RootGameObject.GetPosition();
            s.sceneRotation     = scene.RootGameObject.GetRotation();
            s.target            = Camera.GetTarget();
            s.turntableAzimuth  = turntableAzimuthD;
            s.turntableAltitude = turntableAltitudeD;
            return(s);
        }
Example #3
0
        public void SceneAdaptivePan(FScene scene, fCamera cam, float xStepFraction, float yStepFraction)
        {
            float fScale = scene.GetSceneScale();

            Vector3f fw          = cam.GetTarget() - cam.GetPosition();
            float    fTargetDist = fw.Length;
            float    dx          = fTargetDist * xStepFraction;
            float    dy          = fTargetDist * yStepFraction;

            Frame3f  camFrame = cam.GetWorldFrame();
            Vector3f right    = camFrame.X;
            Vector3f up       = camFrame.Y;
            Vector3f delta    = dx * fScale * right + dy * fScale * up;
            Vector3f newPos   = scene.RootGameObject.GetPosition() + delta;

            scene.RootGameObject.SetPosition(newPos);
        }
Example #4
0
        /// <summary>
        /// translates scene so that focusPointS lies on camera forward axis. Also updates
        /// camera.Target to be at this point.
        /// </summary>
        public void PanFocusOnScenePoint(FScene scene, fCamera camera, Vector3f focusPointS)
        {
            Vector3f focusPointW = scene.ToWorldP(focusPointS);

            // figure out the pan that we would apply to camera, then apply the delta to the scene
            Vector3f camPosW    = camera.GetPosition();
            Vector3f camForward = camera.Forward();
            float    fDist      = Vector3.Dot((focusPointW - camPosW), camForward);

            if (fDist == 0)
            {
                fDist = 2.0f * ((Camera)camera).nearClipPlane;
            }
            Vector3f newCamPosW = focusPointW - fDist * camForward;
            Vector3f delta      = camPosW - newCamPosW;

            scene.RootGameObject.Translate(delta, false);
            camera.SetTarget(focusPointW + delta);
        }
Example #5
0
        public void ScenePanFocus(FScene scene, fCamera camera, Vector3f focusPointW, bool bAnimated)
        {
            CameraAnimator animator = camera.Animator();

            if (bAnimated == false || animator == null)
            {
                // figure out the pan that we would apply to camera, then apply the delta to the scene
                Vector3f camPosW    = camera.GetPosition();
                Vector3f camForward = camera.Forward();
                float    fDist      = Vector3.Dot((focusPointW - camPosW), camForward);
                Vector3f newCamPosW = focusPointW - fDist * camForward;
                Vector3f delta      = camPosW - newCamPosW;

                scene.RootGameObject.Translate(delta, false);
                camera.SetTarget(focusPointW + delta);
            }
            else
            {
                animator.PanFocus(focusPointW);
            }
        }
        public void ScenePanFocus(FScene scene, fCamera camera, Vector3f focusPoint, bool bAnimated)
        {
            CameraAnimator animator = camera.Animator();

            if (bAnimated == false || animator == null)
            {
                // figure out the pan that we would apply to camera, then apply the delta to the scene
                Vector3f curPos = camera.GetPosition();
                Vector3f curDir = camera.GetWorldFrame().Z;
                float    fDist  = Vector3.Dot((focusPoint - curPos), curDir);
                Vector3f newPos = focusPoint - fDist * curDir;
                Vector3f delta  = curPos - newPos;

                scene.RootGameObject.Translate(delta, false);
                camera.SetTarget(focusPoint);
            }
            else
            {
                animator.PanFocus(focusPoint);
            }
        }
Example #7
0
        /// <summary>
        /// Shift scene towards (+) / away-from (-) camera.
        /// If bKeepTargetPos == false, then target shifts with scene
        /// </summary>
        public void SceneZoom(FScene scene, fCamera cam, float dz, bool bKeepTargetPos = true)
        {
            if (dz == 0.0f)
            {
                return;
            }

            if (cam.IsOrthographic)
            {
                float f = cam.OrthoHeight;
                f = f - dz;
                if (f < 0)
                {
                    f = 0.01f;
                }
                cam.OrthoHeight = f;
                scene.Context.CameraManager.UpdateMainCamOrthoSize();
            }
            else
            {
                float fScale = scene.GetSceneScale();

                Vector3f fw          = cam.GetTarget() - cam.GetPosition();
                float    fTargetDist = fw.Length;
                fw.Normalize();

                float fMinTargetDist = 0.1f * fScale;
                if (dz > 0 && fTargetDist - dz < fMinTargetDist)
                {
                    dz = fTargetDist - fMinTargetDist;
                }

                Vector3f delta = dz * fw;
                scene.RootGameObject.Translate(-delta, false);
                if (bKeepTargetPos)
                {
                    cam.SetTarget(cam.GetTarget() - delta);
                }
            }
        }
Example #8
0
        public override void PreRender()
        {
            fCamera  cam         = Parent.Context.ActiveCamera;
            float    zNear       = 2 * cam.NearClipPlane;
            Vector3f forwardW    = cam.Forward();
            Vector3f gridCenterW = cam.GetPosition() + zNear * forwardW;

            Vector3f inCenterW = (Parent as FScene).ToWorldP(Center);

            //Vector3f gridDirS = (Parent as FScene).ToSceneN(forwardW);

            //Frame3f gridFrame = new Frame3f(gridCenter, gridDir);
            //Frame3f gridFrame = new Frame3f(Center, gridDirS);

            //Frame3f gridFrameW = new Frame3f(inCenterW, forwardW);
            Frame3f gridFrameW = new Frame3f(gridCenterW, forwardW);

            RootGameObject.SetWorldFrame(gridFrameW);

            if (grids_valid == false)
            {
                update_grids();
            }
        }
Example #9
0
        // Use this for initialization
        public void Initialize(FContext controller)
        {
            this.controller = controller;

            // find main camera
            GameObject[] mainCameras = GameObject.FindGameObjectsWithTag("MainCamera");
            if (mainCameras.Length == 0)
            {
                throw new MissingComponentException("CameraTracking.Initialize: could not find camera with tag MainCamera");
            }
            var mainCameraObj = mainCameras[0];

            if (mainCameras.Length > 1)
            {
                DebugUtil.Log(2, "CameraTracking.Initialize: there are multiple objects with tag MainCamera. Using the one named " + mainCameraObj.GetName());
            }
            mainCamera = new fCamera(mainCameraObj.GetComponent <Camera> () as Camera);

            // on Vive the MainCamera will have some child cameras that are a problem,
            // so get rid of them
            if (gs.VRPlatform.CurrentVRDevice == gs.VRPlatform.Device.HTCVive)
            {
                List <GameObject> children = new List <GameObject>(mainCameraObj.Children());
                foreach (var child in children)
                {
                    mainCameraObj.RemoveChild(child);
                    child.Destroy();
                }
            }

            List <Camera> newCameras = new List <Camera>();

            Vector3f    mainPos = mainCamera.GetPosition();
            Quaternionf mainRot = mainCamera.GetRotation();

            // create camera for 3D widgets layer
            widgetCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot));
            widgetCamera.SetName("WidgetCamera");
            newCameras.Add(widgetCamera);

            // create camera for HUD layer
            hudCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot));
            hudCamera.SetName("HUDCamera");
            newCameras.Add(hudCamera);

            // create camera for UI
            uiCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot));
            uiCamera.SetName("UICamera");
            ((Camera)uiCamera).orthographic     = true;
            ((Camera)uiCamera).orthographicSize = 0.5f;
            newCameras.Add(uiCamera);

            // create camera for cursor
            cursorCamera = new fCamera(Camera.Instantiate((Camera)mainCamera, mainPos, mainRot));
            cursorCamera.SetName("CursorCamera");
            newCameras.Add(cursorCamera);

            // configure these cameras
            //   - must disable audio listener if it exists
            //   - do depth clear so we can draw on top of other layers
            foreach (Camera cam in newCameras)
            {
                AudioListener listener = cam.GetComponent <AudioListener>();
                if (listener != null)
                {
                    listener.enabled = false;
                }

                cam.clearFlags = CameraClearFlags.Depth;

                cam.tag = "Untagged";
            }


            // set up camera masks

            // this camera only renders 3DWidgetOverlay layer, and mainCam does not!
            int nWidgetLayer = FPlatform.WidgetOverlayLayer;
            int nHUDLayer    = FPlatform.HUDLayer;
            int nUILayer     = FPlatform.UILayer;
            int nCursorLayer = FPlatform.CursorLayer;

            ((Camera)widgetCamera).cullingMask = (1 << nWidgetLayer);
            ((Camera)hudCamera).cullingMask    = (1 << nHUDLayer);
            ((Camera)uiCamera).cullingMask     = (1 << nUILayer);
            ((Camera)cursorCamera).cullingMask = (1 << nCursorLayer);

            ((Camera)mainCamera).cullingMask &= ~(1 << nWidgetLayer);
            ((Camera)mainCamera).cullingMask &= ~(1 << nHUDLayer);
            ((Camera)mainCamera).cullingMask &= ~(1 << nUILayer);
            ((Camera)mainCamera).cullingMask &= ~(1 << nCursorLayer);

            // attach camera animation object to main camera
            CameraAnimator anim = mainCamera.AddComponent <CameraAnimator>();

            anim.UseCamera = mainCamera;
            anim.UseScene  = this.controller.Scene;

            // add target point to camera
            CameraTarget target = mainCamera.AddComponent <CameraTarget>();

            target.TargetPoint = new Vector3f(0.0f, mainCamera.GetPosition().y, 0.0f);
            target.context     = this.controller;

            // add camera manipulator to camera
            // TODO: this does not need to be a monobehavior...
            var manipulator = mainCamera.AddComponent <CameraManipulator>();

            manipulator.Camera = mainCamera;


            // initialize FPlatform
            FPlatform.MainCamera    = mainCamera;
            FPlatform.WidgetCamera  = widgetCamera;
            FPlatform.HUDCamera     = hudCamera;
            FPlatform.OrthoUICamera = uiCamera;
            FPlatform.CursorCamera  = cursorCamera;
        }