/*** Autogenerated by WIDL 8.17 from include/windows.perception.spatial.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_perception_spatial_h__
#define __windows_perception_spatial_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume ABI::Windows::Perception::Spatial::ISpatialBoundingVolume
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolume;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics ABI::Windows::Perception::Spatial::ISpatialBoundingVolumeStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolumeStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialCoordinateSystem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialBoundingVolume;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingVolume_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                class SpatialCoordinateSystem;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CPerception_CSpatial_CSpatialCoordinateSystem_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_SpatialPerceptionAccessStatus __FIAsyncOperation_1_SpatialPerceptionAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingBox __FIReference_1_SpatialBoundingBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingFrustum __FIReference_1_SpatialBoundingFrustum;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingFrustum ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingOrientedBox __FIReference_1_SpatialBoundingOrientedBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingOrientedBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.foundation.numerics.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingBox SpatialBoundingBox;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingFrustum SpatialBoundingFrustum;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingOrientedBox SpatialBoundingOrientedBox;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                typedef struct SpatialBoundingSphere SpatialBoundingSphere;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume ABI::Windows::Perception::Spatial::ISpatialBoundingVolume
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolume;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics ABI::Windows::Perception::Spatial::ISpatialBoundingVolumeStatics
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialBoundingVolumeStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem;
#ifdef __cplusplus
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                interface ISpatialCoordinateSystem;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
#define ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_SpatialPerceptionAccessStatus __FIAsyncOperation_1_SpatialPerceptionAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingBox __FIReference_1_SpatialBoundingBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingFrustum_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingFrustum __FIReference_1_SpatialBoundingFrustum;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingFrustum ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
#define ____FIReference_1_SpatialBoundingOrientedBox_FWD_DEFINED__
typedef interface __FIReference_1_SpatialBoundingOrientedBox __FIReference_1_SpatialBoundingOrientedBox;
#ifdef __cplusplus
#define __FIReference_1_SpatialBoundingOrientedBox ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                enum SpatialPerceptionAccessStatus {
                    SpatialPerceptionAccessStatus_Unspecified = 0,
                    SpatialPerceptionAccessStatus_Allowed = 1,
                    SpatialPerceptionAccessStatus_DeniedByUser = 2,
                    SpatialPerceptionAccessStatus_DeniedBySystem = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus {
    SpatialPerceptionAccessStatus_Unspecified = 0,
    SpatialPerceptionAccessStatus_Allowed = 1,
    SpatialPerceptionAccessStatus_DeniedByUser = 2,
    SpatialPerceptionAccessStatus_DeniedBySystem = 3
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialPerceptionAccessStatus __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingBox {
                    struct Vector3 Center;
                    struct Vector3 Extents;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox {
    struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Center;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Extents;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingFrustum {
                    struct Plane Near;
                    struct Plane Far;
                    struct Plane Right;
                    struct Plane Left;
                    struct Plane Top;
                    struct Plane Bottom;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum {
    struct __x_ABI_CWindows_CFoundation_CNumerics_CPlane Near;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CPlane Far;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CPlane Right;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CPlane Left;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CPlane Top;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CPlane Bottom;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingFrustum __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingOrientedBox {
                    struct Vector3 Center;
                    struct Vector3 Extents;
                    struct Quaternion Orientation;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox {
    struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Center;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Extents;
    struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion Orientation;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingOrientedBox __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                struct SpatialBoundingSphere {
                    struct Vector3 Center;
                    FLOAT Radius;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere {
    struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 Center;
    FLOAT Radius;
};
#ifdef WIDL_using_Windows_Perception_Spatial
#define SpatialBoundingSphere __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
/*****************************************************************************
 * ISpatialBoundingVolume interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume, 0xfb2065da, 0x68c3, 0x33df, 0xb7,0xaf, 0x4c,0x78,0x72,0x07,0x99,0x9c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("fb2065da-68c3-33df-b7af-4c787207999c")
                ISpatialBoundingVolume : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume, 0xfb2065da, 0x68c3, 0x33df, 0xb7,0xaf, 0x4c,0x78,0x72,0x07,0x99,0x9c)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialBoundingVolume IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume
#define ISpatialBoundingVolumeVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeVtbl
#define ISpatialBoundingVolume __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume
#define ISpatialBoundingVolume_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_QueryInterface
#define ISpatialBoundingVolume_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_AddRef
#define ISpatialBoundingVolume_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_Release
#define ISpatialBoundingVolume_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetIids
#define ISpatialBoundingVolume_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetRuntimeClassName
#define ISpatialBoundingVolume_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_GetTrustLevel
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialBoundingVolumeStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics, 0x05889117, 0xb3e1, 0x36d8, 0xb0,0x17, 0x56,0x61,0x81,0xa5,0xb1,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("05889117-b3e1-36d8-b017-566181a5b196")
                ISpatialBoundingVolumeStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE FromBox(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        struct SpatialBoundingBox box,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromOrientedBox(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        struct SpatialBoundingOrientedBox box,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromSphere(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        struct SpatialBoundingSphere sphere,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FromFrustum(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *system,
                        struct SpatialBoundingFrustum frustum,
                        ABI::Windows::Perception::Spatial::ISpatialBoundingVolume **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics, 0x05889117, 0xb3e1, 0x36d8, 0xb0,0x17, 0x56,0x61,0x81,0xa5,0xb1,0x96)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        TrustLevel *trustLevel);

    /*** ISpatialBoundingVolumeStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *FromBox)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox box,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *FromOrientedBox)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox box,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *FromSphere)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere sphere,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *FromFrustum)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum frustum,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialBoundingVolumeStatics methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromBox(This,system,box,value) (This)->lpVtbl->FromBox(This,system,box,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromOrientedBox(This,system,box,value) (This)->lpVtbl->FromOrientedBox(This,system,box,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromSphere(This,system,sphere,value) (This)->lpVtbl->FromSphere(This,system,sphere,value)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromFrustum(This,system,frustum,value) (This)->lpVtbl->FromFrustum(This,system,frustum,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialBoundingVolumeStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromBox(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox box,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromBox(This,system,box,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromOrientedBox(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox box,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromOrientedBox(This,system,box,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromSphere(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingSphere sphere,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromSphere(This,system,sphere,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromFrustum(__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *system,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum frustum,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->FromFrustum(This,system,frustum,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialBoundingVolumeStatics IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics
#define ISpatialBoundingVolumeStaticsVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStaticsVtbl
#define ISpatialBoundingVolumeStatics __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics
#define ISpatialBoundingVolumeStatics_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_QueryInterface
#define ISpatialBoundingVolumeStatics_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_AddRef
#define ISpatialBoundingVolumeStatics_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_Release
#define ISpatialBoundingVolumeStatics_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetIids
#define ISpatialBoundingVolumeStatics_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetRuntimeClassName
#define ISpatialBoundingVolumeStatics_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_GetTrustLevel
#define ISpatialBoundingVolumeStatics_FromBox __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromBox
#define ISpatialBoundingVolumeStatics_FromOrientedBox __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromOrientedBox
#define ISpatialBoundingVolumeStatics_FromSphere __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromSphere
#define ISpatialBoundingVolumeStatics_FromFrustum __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_FromFrustum
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolumeStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpatialCoordinateSystem interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem, 0x69ebca4b, 0x60a3, 0x3586, 0xa6,0x53, 0x59,0xa7,0xbd,0x67,0x6d,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Perception {
            namespace Spatial {
                MIDL_INTERFACE("69ebca4b-60a3-3586-a653-59a7bd676d07")
                ISpatialCoordinateSystem : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TryGetTransformTo(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *target,
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::Numerics::Matrix4x4 > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem, 0x69ebca4b, 0x60a3, 0x3586, 0xa6,0x53, 0x59,0xa7,0xbd,0x67,0x6d,0x07)
#endif
#else
typedef struct __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        TrustLevel *trustLevel);

    /*** ISpatialCoordinateSystem methods ***/
    HRESULT (STDMETHODCALLTYPE *TryGetTransformTo)(
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *target,
        __FIReference_1_Matrix4x4 **value);

    END_INTERFACE
} __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl;

interface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem {
    CONST_VTBL __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpatialCoordinateSystem methods ***/
#define __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_TryGetTransformTo(This,target,value) (This)->lpVtbl->TryGetTransformTo(This,target,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_QueryInterface(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_AddRef(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_Release(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetIids(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetRuntimeClassName(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetTrustLevel(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpatialCoordinateSystem methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_TryGetTransformTo(__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *target,__FIReference_1_Matrix4x4 **value) {
    return This->lpVtbl->TryGetTransformTo(This,target,value);
}
#endif
#ifdef WIDL_using_Windows_Perception_Spatial
#define IID_ISpatialCoordinateSystem IID___x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem
#define ISpatialCoordinateSystemVtbl __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystemVtbl
#define ISpatialCoordinateSystem __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem
#define ISpatialCoordinateSystem_QueryInterface __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_QueryInterface
#define ISpatialCoordinateSystem_AddRef __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_AddRef
#define ISpatialCoordinateSystem_Release __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_Release
#define ISpatialCoordinateSystem_GetIids __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetIids
#define ISpatialCoordinateSystem_GetRuntimeClassName __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetRuntimeClassName
#define ISpatialCoordinateSystem_GetTrustLevel __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_GetTrustLevel
#define ISpatialCoordinateSystem_TryGetTransformTo __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_TryGetTransformTo
#endif /* WIDL_using_Windows_Perception_Spatial */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Perception.Spatial.SpatialBoundingVolume
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialBoundingVolume_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialBoundingVolume_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialBoundingVolume[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','B','o','u','n','d','i','n','g','V','o','l','u','m','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialBoundingVolume[] = L"Windows.Perception.Spatial.SpatialBoundingVolume";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialBoundingVolume[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','B','o','u','n','d','i','n','g','V','o','l','u','m','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialBoundingVolume_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Perception.Spatial.SpatialCoordinateSystem
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Perception_Spatial_SpatialCoordinateSystem_DEFINED
#define RUNTIMECLASS_Windows_Perception_Spatial_SpatialCoordinateSystem_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialCoordinateSystem[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','C','o','o','r','d','i','n','a','t','e','S','y','s','t','e','m',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialCoordinateSystem[] = L"Windows.Perception.Spatial.SpatialCoordinateSystem";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Perception_Spatial_SpatialCoordinateSystem[] = {'W','i','n','d','o','w','s','.','P','e','r','c','e','p','t','i','o','n','.','S','p','a','t','i','a','l','.','S','p','a','t','i','a','l','C','o','o','r','d','i','n','a','t','e','S','y','s','t','e','m',0};
#endif
#endif /* RUNTIMECLASS_Windows_Perception_Spatial_SpatialCoordinateSystem_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > interface
 */
#ifndef ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0x89e8f1ee, 0x3a2a, 0x5b69, 0xa7,0x86, 0xcd,0xdc,0xf7,0x45,0x6a,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("89e8f1ee-3a2a-5b69-a786-cddcf7456a3a")
                IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialBoundingVolume*, ABI::Windows::Perception::Spatial::ISpatialBoundingVolume* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0x89e8f1ee, 0x3a2a, 0x5b69, 0xa7,0x86, 0xcd,0xdc,0xf7,0x45,0x6a,0x3a)
#endif
#else
typedef struct __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume **value);

    END_INTERFACE
} __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl;

interface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume {
    CONST_VTBL __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
#define __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_First(__FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_SpatialBoundingVolume IID___FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterable_SpatialBoundingVolumeVtbl __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl
#define IIterable_SpatialBoundingVolume __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterable_SpatialBoundingVolume_QueryInterface __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface
#define IIterable_SpatialBoundingVolume_AddRef __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef
#define IIterable_SpatialBoundingVolume_Release __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release
#define IIterable_SpatialBoundingVolume_GetIids __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids
#define IIterable_SpatialBoundingVolume_GetRuntimeClassName __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName
#define IIterable_SpatialBoundingVolume_GetTrustLevel __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel
#define IIterable_SpatialBoundingVolume_First __FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > interface
 */
#ifndef ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0xeb8385c5, 0x0775, 0x5415, 0x8f,0x76, 0x32,0x7e,0x6e,0x38,0x8a,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("eb8385c5-0775-5415-8f76-327e6e388ac5")
                IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Perception::Spatial::SpatialBoundingVolume*, ABI::Windows::Perception::Spatial::ISpatialBoundingVolume* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume, 0xeb8385c5, 0x0775, 0x5415, 0x8f,0x76, 0x32,0x7e,0x6e,0x38,0x8a,0xc5)
#endif
#else
typedef struct __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume *This,
        UINT32 items_size,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl;

interface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume {
    CONST_VTBL __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Perception::Spatial::SpatialBoundingVolume* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_Current(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_HasCurrent(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,WINBOOL *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_MoveNext(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,WINBOOL *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetMany(__FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume* This,UINT32 items_size,__x_ABI_CWindows_CPerception_CSpatial_CISpatialBoundingVolume **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_SpatialBoundingVolume IID___FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterator_SpatialBoundingVolumeVtbl __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolumeVtbl
#define IIterator_SpatialBoundingVolume __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume
#define IIterator_SpatialBoundingVolume_QueryInterface __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_QueryInterface
#define IIterator_SpatialBoundingVolume_AddRef __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_AddRef
#define IIterator_SpatialBoundingVolume_Release __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_Release
#define IIterator_SpatialBoundingVolume_GetIids __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetIids
#define IIterator_SpatialBoundingVolume_GetRuntimeClassName __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetRuntimeClassName
#define IIterator_SpatialBoundingVolume_GetTrustLevel __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetTrustLevel
#define IIterator_SpatialBoundingVolume_get_Current __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_Current
#define IIterator_SpatialBoundingVolume_get_HasCurrent __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_get_HasCurrent
#define IIterator_SpatialBoundingVolume_MoveNext __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_MoveNext
#define IIterator_SpatialBoundingVolume_GetMany __FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CPerception__CSpatial__CSpatialBoundingVolume_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus, 0x6ced54c8, 0x7689, 0x525a, 0x80,0xe1, 0x95,0x6a,0x9d,0x85,0xcd,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6ced54c8-7689-525a-80e1-956a9d85cd83")
            IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus, 0x6ced54c8, 0x7689, 0x525a, 0x80,0xe1, 0x95,0x6a,0x9d,0x85,0xcd,0x83)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *This,
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl;

interface __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
#define __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_QueryInterface(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_AddRef(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Release(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Invoke(__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus* This,__FIAsyncOperation_1_SpatialPerceptionAccessStatus *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus IID___FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatusVtbl __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatusVtbl
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_QueryInterface __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_QueryInterface
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_AddRef __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_AddRef
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_Release __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Release
#define IAsyncOperationCompletedHandler_SpatialPerceptionAccessStatus_Invoke __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > interface
 */
#ifndef ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_SpatialPerceptionAccessStatus, 0xb425d126, 0x1069, 0x563f, 0xa8,0x63, 0x44,0xa3,0x0a,0x8f,0x07,0x1d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b425d126-1069-563f-a863-44a30a8f071d")
            IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > : IAsyncOperation_impl<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_SpatialPerceptionAccessStatus, 0xb425d126, 0x1069, 0x563f, 0xa8,0x63, 0x44,0xa3,0x0a,0x8f,0x07,0x1d)
#endif
#else
typedef struct __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_SpatialPerceptionAccessStatus *This,
        enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus *results);

    END_INTERFACE
} __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl;

interface __FIAsyncOperation_1_SpatialPerceptionAccessStatus {
    CONST_VTBL __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_QueryInterface(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_SpatialPerceptionAccessStatus_AddRef(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_SpatialPerceptionAccessStatus_Release(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetIids(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetRuntimeClassName(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetTrustLevel(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Perception::Spatial::SpatialPerceptionAccessStatus > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_put_Completed(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_get_Completed(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,__FIAsyncOperationCompletedHandler_1_SpatialPerceptionAccessStatus **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetResults(__FIAsyncOperation_1_SpatialPerceptionAccessStatus* This,enum __x_ABI_CWindows_CPerception_CSpatial_CSpatialPerceptionAccessStatus *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_SpatialPerceptionAccessStatus IID___FIAsyncOperation_1_SpatialPerceptionAccessStatus
#define IAsyncOperation_SpatialPerceptionAccessStatusVtbl __FIAsyncOperation_1_SpatialPerceptionAccessStatusVtbl
#define IAsyncOperation_SpatialPerceptionAccessStatus __FIAsyncOperation_1_SpatialPerceptionAccessStatus
#define IAsyncOperation_SpatialPerceptionAccessStatus_QueryInterface __FIAsyncOperation_1_SpatialPerceptionAccessStatus_QueryInterface
#define IAsyncOperation_SpatialPerceptionAccessStatus_AddRef __FIAsyncOperation_1_SpatialPerceptionAccessStatus_AddRef
#define IAsyncOperation_SpatialPerceptionAccessStatus_Release __FIAsyncOperation_1_SpatialPerceptionAccessStatus_Release
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetIids __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetIids
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetRuntimeClassName __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetRuntimeClassName
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetTrustLevel __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetTrustLevel
#define IAsyncOperation_SpatialPerceptionAccessStatus_put_Completed __FIAsyncOperation_1_SpatialPerceptionAccessStatus_put_Completed
#define IAsyncOperation_SpatialPerceptionAccessStatus_get_Completed __FIAsyncOperation_1_SpatialPerceptionAccessStatus_get_Completed
#define IAsyncOperation_SpatialPerceptionAccessStatus_GetResults __FIAsyncOperation_1_SpatialPerceptionAccessStatus_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_SpatialPerceptionAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > interface
 */
#ifndef ____FIReference_1_SpatialBoundingBox_INTERFACE_DEFINED__
#define ____FIReference_1_SpatialBoundingBox_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SpatialBoundingBox, 0xab3274d9, 0x9b82, 0x5396, 0xbb,0x00, 0xd7,0x0c,0x53,0x97,0x96,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ab3274d9-9b82-5396-bb00-d70c539796b3")
            IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > : IReference_impl<ABI::Windows::Perception::Spatial::SpatialBoundingBox >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SpatialBoundingBox, 0xab3274d9, 0x9b82, 0x5396, 0xbb,0x00, 0xd7,0x0c,0x53,0x97,0x96,0xb3)
#endif
#else
typedef struct __FIReference_1_SpatialBoundingBoxVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIReference_1_SpatialBoundingBox *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIReference_1_SpatialBoundingBox *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIReference_1_SpatialBoundingBox *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SpatialBoundingBox *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SpatialBoundingBox *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SpatialBoundingBox *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SpatialBoundingBox *This,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox *value);

    END_INTERFACE
} __FIReference_1_SpatialBoundingBoxVtbl;

interface __FIReference_1_SpatialBoundingBox {
    CONST_VTBL __FIReference_1_SpatialBoundingBoxVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SpatialBoundingBox_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SpatialBoundingBox_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SpatialBoundingBox_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SpatialBoundingBox_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SpatialBoundingBox_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SpatialBoundingBox_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > methods ***/
#define __FIReference_1_SpatialBoundingBox_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingBox_QueryInterface(__FIReference_1_SpatialBoundingBox* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIReference_1_SpatialBoundingBox_AddRef(__FIReference_1_SpatialBoundingBox* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIReference_1_SpatialBoundingBox_Release(__FIReference_1_SpatialBoundingBox* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingBox_GetIids(__FIReference_1_SpatialBoundingBox* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingBox_GetRuntimeClassName(__FIReference_1_SpatialBoundingBox* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingBox_GetTrustLevel(__FIReference_1_SpatialBoundingBox* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingBox > methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingBox_get_Value(__FIReference_1_SpatialBoundingBox* This,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingBox *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SpatialBoundingBox IID___FIReference_1_SpatialBoundingBox
#define IReference_SpatialBoundingBoxVtbl __FIReference_1_SpatialBoundingBoxVtbl
#define IReference_SpatialBoundingBox __FIReference_1_SpatialBoundingBox
#define IReference_SpatialBoundingBox_QueryInterface __FIReference_1_SpatialBoundingBox_QueryInterface
#define IReference_SpatialBoundingBox_AddRef __FIReference_1_SpatialBoundingBox_AddRef
#define IReference_SpatialBoundingBox_Release __FIReference_1_SpatialBoundingBox_Release
#define IReference_SpatialBoundingBox_GetIids __FIReference_1_SpatialBoundingBox_GetIids
#define IReference_SpatialBoundingBox_GetRuntimeClassName __FIReference_1_SpatialBoundingBox_GetRuntimeClassName
#define IReference_SpatialBoundingBox_GetTrustLevel __FIReference_1_SpatialBoundingBox_GetTrustLevel
#define IReference_SpatialBoundingBox_get_Value __FIReference_1_SpatialBoundingBox_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SpatialBoundingBox_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > interface
 */
#ifndef ____FIReference_1_SpatialBoundingFrustum_INTERFACE_DEFINED__
#define ____FIReference_1_SpatialBoundingFrustum_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SpatialBoundingFrustum, 0xf434face, 0x0c36, 0x5749, 0xa8,0xa0, 0x0b,0xb6,0xce,0x78,0xa6,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f434face-0c36-5749-a8a0-0bb6ce78a614")
            IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > : IReference_impl<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SpatialBoundingFrustum, 0xf434face, 0x0c36, 0x5749, 0xa8,0xa0, 0x0b,0xb6,0xce,0x78,0xa6,0x14)
#endif
#else
typedef struct __FIReference_1_SpatialBoundingFrustumVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIReference_1_SpatialBoundingFrustum *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIReference_1_SpatialBoundingFrustum *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIReference_1_SpatialBoundingFrustum *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SpatialBoundingFrustum *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SpatialBoundingFrustum *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SpatialBoundingFrustum *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SpatialBoundingFrustum *This,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum *value);

    END_INTERFACE
} __FIReference_1_SpatialBoundingFrustumVtbl;

interface __FIReference_1_SpatialBoundingFrustum {
    CONST_VTBL __FIReference_1_SpatialBoundingFrustumVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SpatialBoundingFrustum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SpatialBoundingFrustum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SpatialBoundingFrustum_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SpatialBoundingFrustum_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SpatialBoundingFrustum_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SpatialBoundingFrustum_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > methods ***/
#define __FIReference_1_SpatialBoundingFrustum_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingFrustum_QueryInterface(__FIReference_1_SpatialBoundingFrustum* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIReference_1_SpatialBoundingFrustum_AddRef(__FIReference_1_SpatialBoundingFrustum* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIReference_1_SpatialBoundingFrustum_Release(__FIReference_1_SpatialBoundingFrustum* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingFrustum_GetIids(__FIReference_1_SpatialBoundingFrustum* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingFrustum_GetRuntimeClassName(__FIReference_1_SpatialBoundingFrustum* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingFrustum_GetTrustLevel(__FIReference_1_SpatialBoundingFrustum* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingFrustum_get_Value(__FIReference_1_SpatialBoundingFrustum* This,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingFrustum *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SpatialBoundingFrustum IID___FIReference_1_SpatialBoundingFrustum
#define IReference_SpatialBoundingFrustumVtbl __FIReference_1_SpatialBoundingFrustumVtbl
#define IReference_SpatialBoundingFrustum __FIReference_1_SpatialBoundingFrustum
#define IReference_SpatialBoundingFrustum_QueryInterface __FIReference_1_SpatialBoundingFrustum_QueryInterface
#define IReference_SpatialBoundingFrustum_AddRef __FIReference_1_SpatialBoundingFrustum_AddRef
#define IReference_SpatialBoundingFrustum_Release __FIReference_1_SpatialBoundingFrustum_Release
#define IReference_SpatialBoundingFrustum_GetIids __FIReference_1_SpatialBoundingFrustum_GetIids
#define IReference_SpatialBoundingFrustum_GetRuntimeClassName __FIReference_1_SpatialBoundingFrustum_GetRuntimeClassName
#define IReference_SpatialBoundingFrustum_GetTrustLevel __FIReference_1_SpatialBoundingFrustum_GetTrustLevel
#define IReference_SpatialBoundingFrustum_get_Value __FIReference_1_SpatialBoundingFrustum_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SpatialBoundingFrustum_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > interface
 */
#ifndef ____FIReference_1_SpatialBoundingOrientedBox_INTERFACE_DEFINED__
#define ____FIReference_1_SpatialBoundingOrientedBox_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_SpatialBoundingOrientedBox, 0x09f88309, 0x9f81, 0x5207, 0xbd,0xb2, 0xab,0xef,0x92,0x6d,0xb1,0x8f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("09f88309-9f81-5207-bdb2-abef926db18f")
            IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > : IReference_impl<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_SpatialBoundingOrientedBox, 0x09f88309, 0x9f81, 0x5207, 0xbd,0xb2, 0xab,0xef,0x92,0x6d,0xb1,0x8f)
#endif
#else
typedef struct __FIReference_1_SpatialBoundingOrientedBoxVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIReference_1_SpatialBoundingOrientedBox *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIReference_1_SpatialBoundingOrientedBox *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        TrustLevel *trustLevel);

    /*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_SpatialBoundingOrientedBox *This,
        struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox *value);

    END_INTERFACE
} __FIReference_1_SpatialBoundingOrientedBoxVtbl;

interface __FIReference_1_SpatialBoundingOrientedBox {
    CONST_VTBL __FIReference_1_SpatialBoundingOrientedBoxVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_SpatialBoundingOrientedBox_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_SpatialBoundingOrientedBox_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_SpatialBoundingOrientedBox_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_SpatialBoundingOrientedBox_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_SpatialBoundingOrientedBox_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_SpatialBoundingOrientedBox_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > methods ***/
#define __FIReference_1_SpatialBoundingOrientedBox_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingOrientedBox_QueryInterface(__FIReference_1_SpatialBoundingOrientedBox* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIReference_1_SpatialBoundingOrientedBox_AddRef(__FIReference_1_SpatialBoundingOrientedBox* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIReference_1_SpatialBoundingOrientedBox_Release(__FIReference_1_SpatialBoundingOrientedBox* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingOrientedBox_GetIids(__FIReference_1_SpatialBoundingOrientedBox* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingOrientedBox_GetRuntimeClassName(__FIReference_1_SpatialBoundingOrientedBox* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingOrientedBox_GetTrustLevel(__FIReference_1_SpatialBoundingOrientedBox* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Perception::Spatial::SpatialBoundingOrientedBox > methods ***/
static __WIDL_INLINE HRESULT __FIReference_1_SpatialBoundingOrientedBox_get_Value(__FIReference_1_SpatialBoundingOrientedBox* This,struct __x_ABI_CWindows_CPerception_CSpatial_CSpatialBoundingOrientedBox *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_SpatialBoundingOrientedBox IID___FIReference_1_SpatialBoundingOrientedBox
#define IReference_SpatialBoundingOrientedBoxVtbl __FIReference_1_SpatialBoundingOrientedBoxVtbl
#define IReference_SpatialBoundingOrientedBox __FIReference_1_SpatialBoundingOrientedBox
#define IReference_SpatialBoundingOrientedBox_QueryInterface __FIReference_1_SpatialBoundingOrientedBox_QueryInterface
#define IReference_SpatialBoundingOrientedBox_AddRef __FIReference_1_SpatialBoundingOrientedBox_AddRef
#define IReference_SpatialBoundingOrientedBox_Release __FIReference_1_SpatialBoundingOrientedBox_Release
#define IReference_SpatialBoundingOrientedBox_GetIids __FIReference_1_SpatialBoundingOrientedBox_GetIids
#define IReference_SpatialBoundingOrientedBox_GetRuntimeClassName __FIReference_1_SpatialBoundingOrientedBox_GetRuntimeClassName
#define IReference_SpatialBoundingOrientedBox_GetTrustLevel __FIReference_1_SpatialBoundingOrientedBox_GetTrustLevel
#define IReference_SpatialBoundingOrientedBox_get_Value __FIReference_1_SpatialBoundingOrientedBox_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_SpatialBoundingOrientedBox_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_perception_spatial_h__ */
