Exemple #1
0
        private static void ControllerUpdatePositions(
            PSMoveWorkerSettings WorkerSettings,
            IntPtr psmove_tracker, // PSMoveTracker*
            IntPtr psmove_fusion,  // PSMoveFusion*
            IntPtr psmove,         // PSMove*
            PSMoveRawControllerData_Base controllerData)
        {
            // Find the sphere position in the camera
            PSMoveAPI.psmove_tracker_update(psmove_tracker, psmove);

            PSMoveTracker_Status curr_status =
                PSMoveAPI.psmove_tracker_get_status(psmove_tracker, psmove);

            // Can we actually see the controller this frame?
            controllerData.IsSeenByTracker = curr_status == PSMoveTracker_Status.Tracker_TRACKING;

            // Update the position of the controller
            if (controllerData.IsSeenByTracker)
            {
                float xcm = 0.0f, ycm = 0.0f, zcm = 0.0f;

                PSMoveAPI.psmove_fusion_get_transformed_location(psmove_fusion, psmove, ref xcm, ref ycm, ref zcm);

                // [Store the controller position]
                // Remember the position the ps move controller in either its native space
                // or in a transformed space if a transform file existed.
                controllerData.PSMovePosition =
                    new Vector3(
                        xcm + WorkerSettings.PSMoveOffset.X,
                        ycm + WorkerSettings.PSMoveOffset.Y,
                        zcm + WorkerSettings.PSMoveOffset.Z);
            }
        }
Exemple #2
0
        private void WorkerSetup(PSMoveWorkerSettings workerSettings)
        {
#if LOAD_DLL_MANUALLY
            if (psmoveapiHandle == IntPtr.Zero)
            {
                if (IntPtr.Size == 8)
                {
                    psmoveapiHandle = LoadLib("Assets/Plugins/x86_64/psmoveapi.dll");
                }
                else
                {
                    psmoveapiHandle = LoadLib("/Includes/psmoveapi.dll");
                }
            }

            if (psmoveapiTrackerHandle == IntPtr.Zero)
            {
                if (IntPtr.Size == 8)
                {
                    psmoveapiTrackerHandle = LoadLib("Assets/Plugins/x86_64/psmoveapi_tracker.dll");
                }
                else
                {
                    psmoveapiTrackerHandle = LoadLib("/Includes/psmoveapi_tracker.dll");
                }
            }
#endif // LOAD_DLL_MANUALLY

            if (!WorkerThread.IsAlive)
            {
                WorkerSettings = workerSettings;
                WorkerThread.Start();
            }
        }
Exemple #3
0
        // Constructor
        public WorkerContext(PSMoveRawControllerData_TLS[] controllerDataArray, PSMoveWorkerSettings settings)
        {
            WorkerSettings            = settings;
            WorkerControllerDataArray = controllerDataArray;

            // This timestamp is used to throttle how frequently we poll for controller count changes
            moveCountCheckTimer = new Stopwatch();

            Reset();
        }
Exemple #4
0
        private PSMoveWorker()
        {
            WorkerSettings = new PSMoveWorkerSettings();

            HaltThreadSignal      = new ManualResetEvent(false);
            ThreadExitedSignal    = new ManualResetEvent(false);
            WorkerThread          = new Thread(() => { this.ThreadProc(); });
            WorkerThread.Priority = System.Threading.ThreadPriority.AboveNormal;

            WorkerControllerDataArray_Concurrent = new PSMoveRawControllerData_Concurrent[MAX_CONTROLLERS];
            WorkerControllerDataArray            = new PSMoveRawControllerData_TLS[MAX_CONTROLLERS];
            for (int i = 0; i < WorkerControllerDataArray_Concurrent.Length; i++)
            {
                WorkerControllerDataArray_Concurrent[i] = new PSMoveRawControllerData_Concurrent();
                WorkerControllerDataArray[i]            = new PSMoveRawControllerData_TLS(WorkerControllerDataArray_Concurrent[i]);
            }
            psmoveapiHandle        = IntPtr.Zero;
            psmoveapiTrackerHandle = IntPtr.Zero;
        }
Exemple #5
0
        private static bool WorkerContextSetupTracking(
            PSMoveWorkerSettings WorkerSettings,
            WorkerContext context)
        {
            bool success = true;

            // Clear out the tracking state
            // Reset the shared worker data
            context.Reset();

            Debug.WriteLine("Setting up PSMove Tracking Context");

            // Initialize and configure the psmove_tracker.
            {
                PSMoveAPI.PSMoveTrackerSettings settings = new PSMoveAPI.PSMoveTrackerSettings();
                PSMoveAPI.psmove_tracker_settings_set_default(ref settings);

                settings.color_mapping_max_age = 0; // Don't used cached color mapping file

                if (WorkerSettings.bUseManualExposure)
                {
                    settings.exposure_mode   = PSMoveTracker_Exposure.Exposure_MANUAL;
                    settings.camera_exposure =
                        (int)(Math.Max(Math.Min(WorkerSettings.ManualExposureValue, 1.0f), 0.0f) * 65535.0f);
                }
                else
                {
                    settings.exposure_mode = PSMoveTracker_Exposure.Exposure_LOW;
                }

                settings.use_fitEllipse       = 1;
                settings.camera_mirror        = PSMove_Bool.PSMove_True;
                settings.color_list_start_ind = (int)WorkerSettings.InitialTrackingColor;
                context.PSMoveTracker         = PSMoveAPI.psmove_tracker_new_with_settings(ref settings);
            }

            if (context.PSMoveTracker != IntPtr.Zero)
            {
                Debug.WriteLine("PSMove tracker initialized.");

                PSMoveAPI.PSMoveTrackerSmoothingSettings smoothing_settings = new PSMoveAPI.PSMoveTrackerSmoothingSettings();
                PSMoveAPI.psmove_tracker_get_smoothing_settings(context.PSMoveTracker, ref smoothing_settings);
                smoothing_settings.filter_do_2d_r  = 0;
                smoothing_settings.filter_do_2d_xy = 0;
                smoothing_settings.filter_3d_type  = WorkerSettings.Filter3DType;
                PSMoveAPI.psmove_tracker_set_smoothing_settings(context.PSMoveTracker, ref smoothing_settings);

                PSMoveAPI.psmove_tracker_get_size(context.PSMoveTracker, ref context.TrackerWidth, ref context.TrackerHeight);
                Debug.WriteLine("Camera Dimensions: {0} x {1}", context.TrackerWidth, context.TrackerHeight);
            }
            else
            {
                PSMoveTracker_ErrorCode errorCode = PSMoveAPI.psmove_tracker_get_last_error();

                Debug.WriteLine("PSMove tracker failed to initialize: {0}", errorCode.ToString());
                success = false;
            }

            // Initialize fusion API if the tracker started
            if (success)
            {
                context.PSMoveFusion = PSMoveAPI.psmove_fusion_new(context.PSMoveTracker, 1.0f, 1000.0f);

                if (context.PSMoveFusion != IntPtr.Zero)
                {
                    Debug.WriteLine("PSMove fusion initialized.");
                }
                else
                {
                    Debug.WriteLine("PSMove failed to initialize.");
                    success = false;
                }
            }

            if (!success)
            {
                WorkerContextTeardownTracking(context);
            }

            return(success);
        }
Exemple #6
0
 public void OnGameStarted(PSMoveWorkerSettings workerSettings)
 {
     // Start the worker thread in case it's not already running
     WorkerSetup(workerSettings);
 }