Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
    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);
    }