public bool TryPlaceOnPlatform(out Vector3 position, float minHeight, float maxHeight, float minWidth) { position = Vector3.zero; IntPtr resultsTopologyPtr = SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(m_topologyResults); int numResults = SpatialUnderstandingDllTopology.QueryTopology_FindLargePositionsSittable(minHeight, maxHeight, 1, minWidth, m_topologyResults.Length, resultsTopologyPtr); if (numResults == 0) { return(false); } // Pick randomly by shuffling indices int[] placementIdxs = new int[numResults]; for (int i = 0; i < placementIdxs.Length; i++) { placementIdxs[i] = i; } Shuffle(placementIdxs); // We have to keep track of our own placements foreach (int idx in placementIdxs) { SpatialUnderstandingDllTopology.TopologyResult result = m_topologyResults[idx]; if (!Overlaps(result, minWidth)) { position = result.position; Vector3 size = new Vector3(minWidth, 0, minWidth); // we ignore height for now m_platformPlacements.Add(new Tuple <Vector3, Vector3>(position, size)); return(true); } } return(false); }
public void Query_Topology_FindLargePositionsSittable() { // Setup float minHeight = 0.125f; float maxHeight = 2.0f; float minFacingClearance = 1.0f; float minWidth = .5f; // Only if we're enabled if (!SpatialUnderstanding.Instance.AllowSpatialUnderstanding) { return; } // Query IntPtr resultsTopologyPtr = SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(resultsTopology); int locationCount = SpatialUnderstandingDllTopology.QueryTopology_FindLargePositionsSittable( minHeight, maxHeight, minFacingClearance, minWidth, resultsTopology.Length, resultsTopologyPtr); // Output HandleResults_Topology("Find Large Sittable Positions", locationCount, new Vector3(minWidth, 0.025f, minWidth), Color.cyan); }