/// <summary> /// Loops through all currently detected planes and randomly chooses objects /// to place out of the pool of objects that have met the criteria of fitting /// on said plane. /// </summary> private void PlaceContent() { CleanContent(); #if PLATFORM_LUMIN foreach (MLPlanes.Plane plane in _planes.PlanesResult) { ContentObject[] candidates = GetCandidateObjects(plane); if (candidates.Length == 0) { continue; } // Now select a random object from the candidate list. int candidateIndex = Random.Range(0, candidates.Length); ContentObject prefabReference = candidates[candidateIndex]; // Save a reference to the local bounds of our new obj Bounds bounds = prefabReference.LocalBounds; // Instantiate candidate as a game object GameObject newObject = GameObject.Instantiate(prefabReference.gameObject); // Add the new object to the placedContent list _placedContent.Add(newObject); // Center the new object on the plane. newObject.transform.position = plane.Center; // If the object is on the wall, rotate it // to the correct wall orientation. if (MLPlanesStarterKit.DoesPlaneHaveFlag(plane, (MLPlanes.QueryFlags)SurfaceType.Wall)) { newObject.transform.rotation = Quaternion.LookRotation(plane.Rotation * Vector3.back); } // If the object is on the floor, rotate it to face // the main camera. This isn't required but it's a nice touch. if (MLPlanesStarterKit.DoesPlaneHaveFlag(plane, (MLPlanes.QueryFlags)SurfaceType.Floor)) { Vector3 lookPos = _mainCamera.transform.position - plane.Center; lookPos.y = 0; Quaternion rotation = Quaternion.LookRotation(lookPos.normalized); newObject.transform.rotation = rotation; } } #endif }
/// <summary> /// Based on the passed in SurfaceType, returns a list of ContentObjects /// that meet the same flag requirements. /// </summary> /// <param name="flag">The SurfaceType to be checked</param> private ContentObject[] GetCandidateObjects(MLPlanes.Plane plane) { var candidates = new List <ContentObject>(); var flags = System.Enum.GetValues(typeof(SurfaceType)) as SurfaceType[]; // Get all of the ContentObject refs that match these flags for (int i = 0; i < flags.Length; ++i) { if (MLPlanesStarterKit.DoesPlaneHaveFlag(plane, (MLPlanes.QueryFlags)flags[i])) { candidates.AddRange(_sortedContentObjects[(uint)flags[i]]); } } return(candidates.ToArray()); }
/// <summary> /// Queries for planes via MLPlanesStarterKit with all of the set query flags and parameters /// and sets the PlanesResult[] when finished. Based on the query flags that /// are passed in, extraction and calculation times may vary. /// </summary> private void QueryPlanes() { // Construct flag data. _queryFlags = (MLPlanes.QueryFlags)orientationFlags; _queryFlags |= (MLPlanes.QueryFlags)semanticFlags; _queryFlags |= (MLPlanes.QueryFlags)systemFlags; #if PLATFORM_LUMIN _queryParams.Flags = _queryFlags; _queryParams.BoundsCenter = transform.position; _queryParams.MaxResults = MaxPlaneCount; _queryParams.BoundsExtents = transform.localScale; _queryParams.BoundsRotation = transform.rotation; _queryParams.MinHoleLength = minHoleLength; _queryParams.MinPlaneArea = minPlaneArea; MLPlanesStarterKit.QueryPlanes(_queryParams, HandleOnQueriedPlanes); #endif }
/// <summary> /// Clean up. /// </summary> void OnDestroy() { MLPlanesStarterKit.Stop(); }
/// <summary> /// Starts up MLPlanesStarterKit. /// </summary> void Start() { #if PLATFORM_LUMIN MLPlanesStarterKit.Start(); #endif }