Exemplo n.º 1
0
        /// <summary>
        /// Begin querying for planes.
        /// </summary>
        /// <param name="queryParams">All values are required, omitting values may result in unexpected behavior.</param>
        /// <param name="callback">Callback used to report query results.</param>
        /// <returns>
        /// MLResult.Result will be <c>MLResult.Code.Ok</c> if successful.
        /// MLResult.Result will be <c>MLResult.Code.InvalidParam</c> if failed due to invalid input parameter.
        /// MLResult.Result will be <c>MLResult.Code.UnspecifiedFailure</c> if failed due to internal error.
        /// </returns>
        private MLResult BeginPlaneQuery(QueryParams queryParams, QueryResultsDelegate callback)
        {
            if (!NativeBindings.MLHandleIsValid(this.planesTracker))
            {
                MLPluginLog.Error("MLPlanes.BeginPlaneQuery failed to request planes. Reason: Tracker handle is invalid");
                return(MLResult.Create(MLResult.Code.InvalidParam));
            }

            // Convert to native plane query parameters.
            NativeBindings.QueryParamsNative planeQuery = NativeBindings.QueryParamsNative.Create();
            planeQuery.Data = queryParams;

            // Register the query with the native library and store native handle.
            ulong handle = MagicLeapNativeBindings.InvalidHandle;

            MLResult.Code resultCode = NativeBindings.MLPlanesQueryBegin(this.planesTracker, ref planeQuery, ref handle);
            if (resultCode != MLResult.Code.Ok)
            {
                MLResult result = MLResult.Create(resultCode);
                MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed to request planes. Reason: {0}", result);
                return(result);
            }

            // Create query object to prepresent this newly registered plane query.
            NativeBindings.Query query = new NativeBindings.Query((QueryResultsDelegate)callback, planeQuery.MaxResults, this.IsRequestingBoundaries(planeQuery.Flags));
            this.pendingQueries.Add(handle, query);
            return(MLResult.Create(MLResult.Code.Ok));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Begin querying for planes.
        /// </summary>
        /// <param name="queryParams">All values are required, omitting values may result in unexpected behavior.</param>
        /// <param name="callback">Callback used to report query results.</param>
        /// <returns>
        /// MLResult.Result will be <c>MLResult.Code.Ok</c> if successful.
        /// MLResult.Result will be <c>MLResult.Code.InvalidParam</c> if failed due to invalid input parameter.
        /// MLResult.Result will be <c>MLResult.Code.UnspecifiedFailure</c> if failed due to internal error.
        /// </returns>
        private MLResult BeginPlaneQuery(QueryParams queryParams, QueryResultsDelegate callback)
        {
            try
            {
                if (!NativeBindings.MLHandleIsValid(_instance.planesTracker))
                {
                    MLPluginLog.Error("MLPlanes.BeginPlaneQuery failed to request planes. Reason: Tracker handle is invalid");
                    return(MLResult.Create(MLResult.Code.InvalidParam));
                }

                bool BeginQuery()
                {
                    if (MLPlanes.IsValidInstance())
                    {
                        NativeBindings.QueryParamsNative planeQuery = new NativeBindings.QueryParamsNative()
                        {
                            Data = queryParams
                        };

                        ulong queryHandle = MagicLeapNativeBindings.InvalidHandle;

                        MLResult.Code resultCode = NativeBindings.MLPlanesQueryBegin(_instance.planesTracker, ref planeQuery, ref queryHandle);
                        if (resultCode != MLResult.Code.Ok)
                        {
                            MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed to request planes. Reason: {0}", MLResult.CodeToString(resultCode));
                            return(true);
                        }

                        // Create query object to prepresent this newly registered plane query.
                        NativeBindings.Query query = new NativeBindings.Query((QueryResultsDelegate)callback, planeQuery.MaxResults, _instance.IsRequestingBoundaries(planeQuery.Flags));

                        bool GetPlanesResults()
                        {
                            if (MLPlanes.IsValidInstance())
                            {
                                // Request the update.
                                resultCode = NativeBindings.MLPlanesQueryGetResultsWithBoundaries(_instance.planesTracker, queryHandle, query.PlanesResultsUnmanaged, out uint numResults, ref query.PlaneBoundariesList);

                                if (resultCode == MLResult.Code.Pending)
                                {
                                    return(false);
                                }

                                if (resultCode == MLResult.Code.Ok)
                                {
                                    query.ExtractPlanesFromQueryResults(numResults);

                                    resultCode = NativeBindings.MLPlanesReleaseBoundariesList(_instance.planesTracker, ref query.PlaneBoundariesList);
                                    if (resultCode == MLResult.Code.Ok)
                                    {
                                        query.Result = MLResult.Create(resultCode);

                                        if (query.Planes == null)
                                        {
                                            query.Planes = new Plane[] { };
                                        }

                                        if (query.PlaneBoundaries == null)
                                        {
                                            query.PlaneBoundaries = new Boundaries[] { };
                                        }

                                        MLThreadDispatch.ScheduleMain(() =>
                                        {
                                            if (MLPlanes.IsValidInstance())
                                            {
                                                callback(query.Result, query.Planes, query.PlaneBoundaries);
                                            }
                                            else
                                            {
                                                MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed. Reason: No Instance for MLPlanes");
                                            }
                                        });
                                    }
                                    else
                                    {
                                        MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed to release boundaries list. Reason: {0}", MLResult.CodeToString(resultCode));
                                    }
                                }
                                else
                                {
                                    MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed to query planes. Reason: {0}", MLResult.CodeToString(resultCode));
                                }
                            }
                            else
                            {
                                MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed. Reason: No Instance for MLPlanes");
                            }

                            return(true);
                        }

                        MLThreadDispatch.ScheduleWork(GetPlanesResults);
                    }
                    else
                    {
                        MLPluginLog.ErrorFormat("MLPlanes.BeginPlaneQuery failed. Reason: No Instance for MLPlanes");
                    }

                    return(true);
                }

                MLThreadDispatch.ScheduleWork(BeginQuery);
                return(MLResult.Create(MLResult.Code.Ok));
            }
            catch (System.EntryPointNotFoundException)
            {
                MLPluginLog.Error("MLPlanes.BeginPlaneQuery failed. Reason: API symbols not found");
                return(MLResult.Create(MLResult.Code.UnspecifiedFailure, "MLPlanes.BeginPlaneQuery failed. Reason: API symbols not found"));
            }
        }