public bool TryPlaceOnFloor(out Vector3 position, Vector3 size, Vector3 nearPosition, float minDistance, float maxDistance, float minDistanceFromOtherObjects = 0.25f) { position = Vector3.zero; if (useSpatialUnderstanding) { PlacementQuery query = new PlacementQuery( SpatialUnderstandingDllObjectPlacement.ObjectPlacementDefinition.Create_OnFloor(0.5f * size), minDistanceFromOtherObjects <= 0 ? null : new List <SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule>() { SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule.Create_AwayFromOtherObjects(minDistanceFromOtherObjects) }, new List <SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint>() { SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint.Create_NearPoint(nearPosition, minDistance, maxDistance) }); SpatialUnderstandingDllObjectPlacement.ObjectPlacementResult placementResult; if (TryPlaceObject(out placementResult, "changeMeToSomethingUnique", query)) { position = placementResult.Position; return(true); } } else { // An incomplete fallback for Spatial Mapping pathway that just places at // random point on largest floor for now. Constraints are ignored. List <GameObject> floors = GetFloors(SortOrder.Descending); if (floors.Count == 0) { return(false); } List <Vector2> points = FindFloorSpawnPoints(size, size, size.y, floors[0].GetComponent <SurfacePlane>()); } return(false); }
private bool TryPlaceObject( out SpatialUnderstandingDllObjectPlacement.ObjectPlacementResult placementResult, string placementName, PlacementQuery query) { placementResult = null; if (!useSpatialUnderstanding) { return(false); } int result = SpatialUnderstandingDllObjectPlacement.Solver_PlaceObject( placementName, SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(query.placementDefinition), (query.placementRules != null) ? query.placementRules.Count : 0, ((query.placementRules != null) && (query.placementRules.Count > 0)) ? SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(query.placementRules.ToArray()) : IntPtr.Zero, (query.placementConstraints != null) ? query.placementConstraints.Count : 0, ((query.placementConstraints != null) && (query.placementConstraints.Count > 0)) ? SpatialUnderstanding.Instance.UnderstandingDLL.PinObject(query.placementConstraints.ToArray()) : IntPtr.Zero, SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticObjectPlacementResultPtr()); if (result > 0) { placementResult = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticObjectPlacementResult(); return(true); } return(false); }
public bool TryPlaceOnFloor(out Vector3 position, Vector3 size, Vector3 nearPosition, float minDistance, float maxDistance, float minDistanceFromOtherObjects = 0.25f) { position = Vector3.zero; PlacementQuery query = new PlacementQuery( SpatialUnderstandingDllObjectPlacement.ObjectPlacementDefinition.Create_OnFloor(0.5f * size), minDistanceFromOtherObjects <= 0 ? null : new List <SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule>() { SpatialUnderstandingDllObjectPlacement.ObjectPlacementRule.Create_AwayFromOtherObjects(minDistanceFromOtherObjects) }, new List <SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint>() { SpatialUnderstandingDllObjectPlacement.ObjectPlacementConstraint.Create_NearPoint(nearPosition, minDistance, maxDistance) }); SpatialUnderstandingDllObjectPlacement.ObjectPlacementResult placementResult; if (TryPlaceObject(out placementResult, "changeMeToSomethingUnique", query)) { position = placementResult.Position; return(true); } return(false); }