// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/webxrlayers

///|
/// XRLayerLayout enum
pub(all) enum XRLayerLayout {
  Default
  Mono
  Stereo
  StereoLeftRight
  StereoTopBottom
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRLayerLayout::to_string(self : XRLayerLayout) -> String {
  match self {
    XRLayerLayout::Default => "default"
    XRLayerLayout::Mono => "mono"
    XRLayerLayout::Stereo => "stereo"
    XRLayerLayout::StereoLeftRight => "stereo-left-right"
    XRLayerLayout::StereoTopBottom => "stereo-top-bottom"
  }
}

///|
/// Parse from string value
pub fn XRLayerLayout::from_string(s : String) -> XRLayerLayout? {
  match s {
    "default" => Some(XRLayerLayout::Default)
    "mono" => Some(XRLayerLayout::Mono)
    "stereo" => Some(XRLayerLayout::Stereo)
    "stereo-left-right" => Some(XRLayerLayout::StereoLeftRight)
    "stereo-top-bottom" => Some(XRLayerLayout::StereoTopBottom)
    _ => None
  }
}

///|
/// XRLayerQuality enum
pub(all) enum XRLayerQuality {
  Default
  TextOptimized
  GraphicsOptimized
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRLayerQuality::to_string(self : XRLayerQuality) -> String {
  match self {
    XRLayerQuality::Default => "default"
    XRLayerQuality::TextOptimized => "text-optimized"
    XRLayerQuality::GraphicsOptimized => "graphics-optimized"
  }
}

///|
/// Parse from string value
pub fn XRLayerQuality::from_string(s : String) -> XRLayerQuality? {
  match s {
    "default" => Some(XRLayerQuality::Default)
    "text-optimized" => Some(XRLayerQuality::TextOptimized)
    "graphics-optimized" => Some(XRLayerQuality::GraphicsOptimized)
    _ => None
  }
}

///|
/// XRTextureType enum
pub(all) enum XRTextureType {
  Texture
  TextureArray
} derive(Eq, Show)

///|
/// Convert to string value
pub fn XRTextureType::to_string(self : XRTextureType) -> String {
  match self {
    XRTextureType::Texture => "texture"
    XRTextureType::TextureArray => "texture-array"
  }
}

///|
/// Parse from string value
pub fn XRTextureType::from_string(s : String) -> XRTextureType? {
  match s {
    "texture" => Some(XRTextureType::Texture)
    "texture-array" => Some(XRTextureType::TextureArray)
    _ => None
  }
}

///|
/// XRProjectionLayerInit dictionary
pub(all) struct XRProjectionLayerInit {
  textureType : XRTextureType?
  colorFormat : GLenum?
  depthFormat : GLenum?
  scaleFactor : Double?
  clearOnAccess : Bool?
}

///|
/// Create a new XRProjectionLayerInit with default values
pub fn XRProjectionLayerInit::default() -> XRProjectionLayerInit {
  XRProjectionLayerInit::{
    textureType: None,
    colorFormat: None,
    depthFormat: None,
    scaleFactor: None,
    clearOnAccess: None,
  }
}

///|
extern "js" fn XRProjectionLayerInit::to_js_ffi(
  self : XRProjectionLayerInit,
) -> JsValue =
  #| (self) => ({
  #|   textureType: ((() => { const v = self.textureType; if (v === undefined) return undefined; return ['texture', 'texture-array'][v]; })()),
  #|   colorFormat: ((() => { const v = self.colorFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFormat: ((() => { const v = self.depthFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   scaleFactor: ((() => { const v = self.scaleFactor; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   clearOnAccess: (self.clearOnAccess === -1 ? undefined : self.clearOnAccess)
  #| })

///|
/// Convert to JsValue
pub fn XRProjectionLayerInit::to_js(self : XRProjectionLayerInit) -> JsValue {
  XRProjectionLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRProjectionLayerInit::from_js_ffi(
  value : JsValue,
) -> XRProjectionLayerInit =
  #| (v) => ({
  #|   textureType: (v.textureType === undefined ? undefined : ['texture', 'texture-array'].indexOf(v.textureType)),
  #|   colorFormat: (v.colorFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.colorFormat }),
  #|   depthFormat: (v.depthFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.depthFormat }),
  #|   scaleFactor: (v.scaleFactor === undefined ? { $tag: 0 } : { $tag: 1, _0: v.scaleFactor }),
  #|   clearOnAccess: (v.clearOnAccess === undefined ? -1 : v.clearOnAccess)
  #| })

///|
/// Convert from JsValue
pub fn XRProjectionLayerInit::from_js(value : JsValue) -> XRProjectionLayerInit {
  XRProjectionLayerInit::from_js_ffi(value)
}

///|
/// XRLayerInit dictionary
pub(all) struct XRLayerInit {
  space : XRSpace
  textureType : XRTextureType?
  colorFormat : GLenum?
  depthFormat : Nullable[GLenum]
  mipLevels : Int?
  viewPixelWidth : Int
  viewPixelHeight : Int
  layout : XRLayerLayout?
  isStatic : Bool?
  clearOnAccess : Bool?
}

///|
/// Create a new XRLayerInit
pub fn XRLayerInit::new(space~ : XRSpace) -> XRLayerInit {
  XRLayerInit::{
    space,
    textureType: None,
    colorFormat: None,
    depthFormat: Nullable::Undefined,
    mipLevels: None,
    viewPixelWidth: 0,
    viewPixelHeight: 0,
    layout: None,
    isStatic: None,
    clearOnAccess: None,
  }
}

///|
extern "js" fn XRLayerInit::to_js_ffi(self : XRLayerInit) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   textureType: ((() => { const v = self.textureType; if (v === undefined) return undefined; return ['texture', 'texture-array'][v]; })()),
  #|   colorFormat: ((() => { const v = self.colorFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFormat: ((() => { const v = self.depthFormat; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   mipLevels: self.mipLevels,
  #|   viewPixelWidth: self.viewPixelWidth,
  #|   viewPixelHeight: self.viewPixelHeight,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   isStatic: (self.isStatic === -1 ? undefined : self.isStatic),
  #|   clearOnAccess: (self.clearOnAccess === -1 ? undefined : self.clearOnAccess)
  #| })

///|
/// Convert to JsValue
pub fn XRLayerInit::to_js(self : XRLayerInit) -> JsValue {
  XRLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRLayerInit::from_js_ffi(value : JsValue) -> XRLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   textureType: (v.textureType === undefined ? undefined : ['texture', 'texture-array'].indexOf(v.textureType)),
  #|   colorFormat: (v.colorFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.colorFormat }),
  #|   depthFormat: (v.depthFormat === undefined ? { $tag: 0 } : v.depthFormat === null ? { $tag: 1 } : { $tag: 2, _0: v.depthFormat }),
  #|   mipLevels: v.mipLevels,
  #|   viewPixelWidth: v.viewPixelWidth,
  #|   viewPixelHeight: v.viewPixelHeight,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   isStatic: (v.isStatic === undefined ? -1 : v.isStatic),
  #|   clearOnAccess: (v.clearOnAccess === undefined ? -1 : v.clearOnAccess)
  #| })

///|
/// Convert from JsValue
pub fn XRLayerInit::from_js(value : JsValue) -> XRLayerInit {
  XRLayerInit::from_js_ffi(value)
}

///|
/// XRQuadLayerInit dictionary
pub(all) struct XRQuadLayerInit {
  space : XRSpace
  textureType : XRTextureType?
  colorFormat : GLenum?
  depthFormat : Nullable[GLenum]
  mipLevels : Int?
  viewPixelWidth : Int
  viewPixelHeight : Int
  layout : XRLayerLayout?
  isStatic : Bool?
  clearOnAccess : Bool?
  transform : Nullable[XRRigidTransform]
  width : Double?
  height : Double?
}

///|
/// Create a new XRQuadLayerInit
pub fn XRQuadLayerInit::new(space~ : XRSpace) -> XRQuadLayerInit {
  XRQuadLayerInit::{
    space,
    textureType: None,
    colorFormat: None,
    depthFormat: Nullable::Undefined,
    mipLevels: None,
    viewPixelWidth: 0,
    viewPixelHeight: 0,
    layout: None,
    isStatic: None,
    clearOnAccess: None,
    transform: Nullable::Undefined,
    width: None,
    height: None,
  }
}

///|
extern "js" fn XRQuadLayerInit::to_js_ffi(self : XRQuadLayerInit) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   textureType: ((() => { const v = self.textureType; if (v === undefined) return undefined; return ['texture', 'texture-array'][v]; })()),
  #|   colorFormat: ((() => { const v = self.colorFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFormat: ((() => { const v = self.depthFormat; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   mipLevels: self.mipLevels,
  #|   viewPixelWidth: self.viewPixelWidth,
  #|   viewPixelHeight: self.viewPixelHeight,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   isStatic: (self.isStatic === -1 ? undefined : self.isStatic),
  #|   clearOnAccess: (self.clearOnAccess === -1 ? undefined : self.clearOnAccess),
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   width: ((() => { const v = self.width; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   height: ((() => { const v = self.height; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRQuadLayerInit::to_js(self : XRQuadLayerInit) -> JsValue {
  XRQuadLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRQuadLayerInit::from_js_ffi(value : JsValue) -> XRQuadLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   textureType: (v.textureType === undefined ? undefined : ['texture', 'texture-array'].indexOf(v.textureType)),
  #|   colorFormat: (v.colorFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.colorFormat }),
  #|   depthFormat: (v.depthFormat === undefined ? { $tag: 0 } : v.depthFormat === null ? { $tag: 1 } : { $tag: 2, _0: v.depthFormat }),
  #|   mipLevels: v.mipLevels,
  #|   viewPixelWidth: v.viewPixelWidth,
  #|   viewPixelHeight: v.viewPixelHeight,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   isStatic: (v.isStatic === undefined ? -1 : v.isStatic),
  #|   clearOnAccess: (v.clearOnAccess === undefined ? -1 : v.clearOnAccess),
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform }),
  #|   width: (v.width === undefined ? { $tag: 0 } : { $tag: 1, _0: v.width }),
  #|   height: (v.height === undefined ? { $tag: 0 } : { $tag: 1, _0: v.height })
  #| })

///|
/// Convert from JsValue
pub fn XRQuadLayerInit::from_js(value : JsValue) -> XRQuadLayerInit {
  XRQuadLayerInit::from_js_ffi(value)
}

///|
/// XRCylinderLayerInit dictionary
pub(all) struct XRCylinderLayerInit {
  space : XRSpace
  textureType : XRTextureType?
  colorFormat : GLenum?
  depthFormat : Nullable[GLenum]
  mipLevels : Int?
  viewPixelWidth : Int
  viewPixelHeight : Int
  layout : XRLayerLayout?
  isStatic : Bool?
  clearOnAccess : Bool?
  transform : Nullable[XRRigidTransform]
  radius : Double?
  centralAngle : Double?
  aspectRatio : Double?
}

///|
/// Create a new XRCylinderLayerInit
pub fn XRCylinderLayerInit::new(space~ : XRSpace) -> XRCylinderLayerInit {
  XRCylinderLayerInit::{
    space,
    textureType: None,
    colorFormat: None,
    depthFormat: Nullable::Undefined,
    mipLevels: None,
    viewPixelWidth: 0,
    viewPixelHeight: 0,
    layout: None,
    isStatic: None,
    clearOnAccess: None,
    transform: Nullable::Undefined,
    radius: None,
    centralAngle: None,
    aspectRatio: None,
  }
}

///|
extern "js" fn XRCylinderLayerInit::to_js_ffi(
  self : XRCylinderLayerInit,
) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   textureType: ((() => { const v = self.textureType; if (v === undefined) return undefined; return ['texture', 'texture-array'][v]; })()),
  #|   colorFormat: ((() => { const v = self.colorFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFormat: ((() => { const v = self.depthFormat; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   mipLevels: self.mipLevels,
  #|   viewPixelWidth: self.viewPixelWidth,
  #|   viewPixelHeight: self.viewPixelHeight,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   isStatic: (self.isStatic === -1 ? undefined : self.isStatic),
  #|   clearOnAccess: (self.clearOnAccess === -1 ? undefined : self.clearOnAccess),
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   radius: ((() => { const v = self.radius; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   centralAngle: ((() => { const v = self.centralAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   aspectRatio: ((() => { const v = self.aspectRatio; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRCylinderLayerInit::to_js(self : XRCylinderLayerInit) -> JsValue {
  XRCylinderLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRCylinderLayerInit::from_js_ffi(
  value : JsValue,
) -> XRCylinderLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   textureType: (v.textureType === undefined ? undefined : ['texture', 'texture-array'].indexOf(v.textureType)),
  #|   colorFormat: (v.colorFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.colorFormat }),
  #|   depthFormat: (v.depthFormat === undefined ? { $tag: 0 } : v.depthFormat === null ? { $tag: 1 } : { $tag: 2, _0: v.depthFormat }),
  #|   mipLevels: v.mipLevels,
  #|   viewPixelWidth: v.viewPixelWidth,
  #|   viewPixelHeight: v.viewPixelHeight,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   isStatic: (v.isStatic === undefined ? -1 : v.isStatic),
  #|   clearOnAccess: (v.clearOnAccess === undefined ? -1 : v.clearOnAccess),
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform }),
  #|   radius: (v.radius === undefined ? { $tag: 0 } : { $tag: 1, _0: v.radius }),
  #|   centralAngle: (v.centralAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.centralAngle }),
  #|   aspectRatio: (v.aspectRatio === undefined ? { $tag: 0 } : { $tag: 1, _0: v.aspectRatio })
  #| })

///|
/// Convert from JsValue
pub fn XRCylinderLayerInit::from_js(value : JsValue) -> XRCylinderLayerInit {
  XRCylinderLayerInit::from_js_ffi(value)
}

///|
/// XREquirectLayerInit dictionary
pub(all) struct XREquirectLayerInit {
  space : XRSpace
  textureType : XRTextureType?
  colorFormat : GLenum?
  depthFormat : Nullable[GLenum]
  mipLevels : Int?
  viewPixelWidth : Int
  viewPixelHeight : Int
  layout : XRLayerLayout?
  isStatic : Bool?
  clearOnAccess : Bool?
  transform : Nullable[XRRigidTransform]
  radius : Double?
  centralHorizontalAngle : Double?
  upperVerticalAngle : Double?
  lowerVerticalAngle : Double?
}

///|
/// Create a new XREquirectLayerInit
pub fn XREquirectLayerInit::new(space~ : XRSpace) -> XREquirectLayerInit {
  XREquirectLayerInit::{
    space,
    textureType: None,
    colorFormat: None,
    depthFormat: Nullable::Undefined,
    mipLevels: None,
    viewPixelWidth: 0,
    viewPixelHeight: 0,
    layout: None,
    isStatic: None,
    clearOnAccess: None,
    transform: Nullable::Undefined,
    radius: None,
    centralHorizontalAngle: None,
    upperVerticalAngle: None,
    lowerVerticalAngle: None,
  }
}

///|
extern "js" fn XREquirectLayerInit::to_js_ffi(
  self : XREquirectLayerInit,
) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   textureType: ((() => { const v = self.textureType; if (v === undefined) return undefined; return ['texture', 'texture-array'][v]; })()),
  #|   colorFormat: ((() => { const v = self.colorFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFormat: ((() => { const v = self.depthFormat; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   mipLevels: self.mipLevels,
  #|   viewPixelWidth: self.viewPixelWidth,
  #|   viewPixelHeight: self.viewPixelHeight,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   isStatic: (self.isStatic === -1 ? undefined : self.isStatic),
  #|   clearOnAccess: (self.clearOnAccess === -1 ? undefined : self.clearOnAccess),
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   radius: ((() => { const v = self.radius; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   centralHorizontalAngle: ((() => { const v = self.centralHorizontalAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   upperVerticalAngle: ((() => { const v = self.upperVerticalAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   lowerVerticalAngle: ((() => { const v = self.lowerVerticalAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XREquirectLayerInit::to_js(self : XREquirectLayerInit) -> JsValue {
  XREquirectLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XREquirectLayerInit::from_js_ffi(
  value : JsValue,
) -> XREquirectLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   textureType: (v.textureType === undefined ? undefined : ['texture', 'texture-array'].indexOf(v.textureType)),
  #|   colorFormat: (v.colorFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.colorFormat }),
  #|   depthFormat: (v.depthFormat === undefined ? { $tag: 0 } : v.depthFormat === null ? { $tag: 1 } : { $tag: 2, _0: v.depthFormat }),
  #|   mipLevels: v.mipLevels,
  #|   viewPixelWidth: v.viewPixelWidth,
  #|   viewPixelHeight: v.viewPixelHeight,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   isStatic: (v.isStatic === undefined ? -1 : v.isStatic),
  #|   clearOnAccess: (v.clearOnAccess === undefined ? -1 : v.clearOnAccess),
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform }),
  #|   radius: (v.radius === undefined ? { $tag: 0 } : { $tag: 1, _0: v.radius }),
  #|   centralHorizontalAngle: (v.centralHorizontalAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.centralHorizontalAngle }),
  #|   upperVerticalAngle: (v.upperVerticalAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.upperVerticalAngle }),
  #|   lowerVerticalAngle: (v.lowerVerticalAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.lowerVerticalAngle })
  #| })

///|
/// Convert from JsValue
pub fn XREquirectLayerInit::from_js(value : JsValue) -> XREquirectLayerInit {
  XREquirectLayerInit::from_js_ffi(value)
}

///|
/// XRCubeLayerInit dictionary
pub(all) struct XRCubeLayerInit {
  space : XRSpace
  textureType : XRTextureType?
  colorFormat : GLenum?
  depthFormat : Nullable[GLenum]
  mipLevels : Int?
  viewPixelWidth : Int
  viewPixelHeight : Int
  layout : XRLayerLayout?
  isStatic : Bool?
  clearOnAccess : Bool?
  orientation : Nullable[DOMPointReadOnly]
}

///|
/// Create a new XRCubeLayerInit
pub fn XRCubeLayerInit::new(space~ : XRSpace) -> XRCubeLayerInit {
  XRCubeLayerInit::{
    space,
    textureType: None,
    colorFormat: None,
    depthFormat: Nullable::Undefined,
    mipLevels: None,
    viewPixelWidth: 0,
    viewPixelHeight: 0,
    layout: None,
    isStatic: None,
    clearOnAccess: None,
    orientation: Nullable::Undefined,
  }
}

///|
extern "js" fn XRCubeLayerInit::to_js_ffi(self : XRCubeLayerInit) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   textureType: ((() => { const v = self.textureType; if (v === undefined) return undefined; return ['texture', 'texture-array'][v]; })()),
  #|   colorFormat: ((() => { const v = self.colorFormat; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   depthFormat: ((() => { const v = self.depthFormat; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   mipLevels: self.mipLevels,
  #|   viewPixelWidth: self.viewPixelWidth,
  #|   viewPixelHeight: self.viewPixelHeight,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   isStatic: (self.isStatic === -1 ? undefined : self.isStatic),
  #|   clearOnAccess: (self.clearOnAccess === -1 ? undefined : self.clearOnAccess),
  #|   orientation: ((() => { const v = self.orientation; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRCubeLayerInit::to_js(self : XRCubeLayerInit) -> JsValue {
  XRCubeLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRCubeLayerInit::from_js_ffi(value : JsValue) -> XRCubeLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   textureType: (v.textureType === undefined ? undefined : ['texture', 'texture-array'].indexOf(v.textureType)),
  #|   colorFormat: (v.colorFormat === undefined ? { $tag: 0 } : { $tag: 1, _0: v.colorFormat }),
  #|   depthFormat: (v.depthFormat === undefined ? { $tag: 0 } : v.depthFormat === null ? { $tag: 1 } : { $tag: 2, _0: v.depthFormat }),
  #|   mipLevels: v.mipLevels,
  #|   viewPixelWidth: v.viewPixelWidth,
  #|   viewPixelHeight: v.viewPixelHeight,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   isStatic: (v.isStatic === undefined ? -1 : v.isStatic),
  #|   clearOnAccess: (v.clearOnAccess === undefined ? -1 : v.clearOnAccess),
  #|   orientation: (v.orientation === undefined ? { $tag: 0 } : v.orientation === null ? { $tag: 1 } : { $tag: 2, _0: v.orientation })
  #| })

///|
/// Convert from JsValue
pub fn XRCubeLayerInit::from_js(value : JsValue) -> XRCubeLayerInit {
  XRCubeLayerInit::from_js_ffi(value)
}

///|
/// XRMediaLayerInit dictionary
pub(all) struct XRMediaLayerInit {
  space : XRSpace
  layout : XRLayerLayout?
  invertStereo : Bool?
}

///|
/// Create a new XRMediaLayerInit
pub fn XRMediaLayerInit::new(space~ : XRSpace) -> XRMediaLayerInit {
  XRMediaLayerInit::{ space, layout: None, invertStereo: None }
}

///|
extern "js" fn XRMediaLayerInit::to_js_ffi(self : XRMediaLayerInit) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   invertStereo: (self.invertStereo === -1 ? undefined : self.invertStereo)
  #| })

///|
/// Convert to JsValue
pub fn XRMediaLayerInit::to_js(self : XRMediaLayerInit) -> JsValue {
  XRMediaLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRMediaLayerInit::from_js_ffi(
  value : JsValue,
) -> XRMediaLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   invertStereo: (v.invertStereo === undefined ? -1 : v.invertStereo)
  #| })

///|
/// Convert from JsValue
pub fn XRMediaLayerInit::from_js(value : JsValue) -> XRMediaLayerInit {
  XRMediaLayerInit::from_js_ffi(value)
}

///|
/// XRMediaQuadLayerInit dictionary
pub(all) struct XRMediaQuadLayerInit {
  space : XRSpace
  layout : XRLayerLayout?
  invertStereo : Bool?
  transform : Nullable[XRRigidTransform]
  width : Nullable[Double]
  height : Nullable[Double]
}

///|
/// Create a new XRMediaQuadLayerInit
pub fn XRMediaQuadLayerInit::new(space~ : XRSpace) -> XRMediaQuadLayerInit {
  XRMediaQuadLayerInit::{
    space,
    layout: None,
    invertStereo: None,
    transform: Nullable::Undefined,
    width: Nullable::Undefined,
    height: Nullable::Undefined,
  }
}

///|
extern "js" fn XRMediaQuadLayerInit::to_js_ffi(
  self : XRMediaQuadLayerInit,
) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   invertStereo: (self.invertStereo === -1 ? undefined : self.invertStereo),
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   width: ((() => { const v = self.width; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   height: ((() => { const v = self.height; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRMediaQuadLayerInit::to_js(self : XRMediaQuadLayerInit) -> JsValue {
  XRMediaQuadLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRMediaQuadLayerInit::from_js_ffi(
  value : JsValue,
) -> XRMediaQuadLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   invertStereo: (v.invertStereo === undefined ? -1 : v.invertStereo),
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform }),
  #|   width: (v.width === undefined ? { $tag: 0 } : v.width === null ? { $tag: 1 } : { $tag: 2, _0: v.width }),
  #|   height: (v.height === undefined ? { $tag: 0 } : v.height === null ? { $tag: 1 } : { $tag: 2, _0: v.height })
  #| })

///|
/// Convert from JsValue
pub fn XRMediaQuadLayerInit::from_js(value : JsValue) -> XRMediaQuadLayerInit {
  XRMediaQuadLayerInit::from_js_ffi(value)
}

///|
/// XRMediaCylinderLayerInit dictionary
pub(all) struct XRMediaCylinderLayerInit {
  space : XRSpace
  layout : XRLayerLayout?
  invertStereo : Bool?
  transform : Nullable[XRRigidTransform]
  radius : Double?
  centralAngle : Double?
  aspectRatio : Nullable[Double]
}

///|
/// Create a new XRMediaCylinderLayerInit
pub fn XRMediaCylinderLayerInit::new(
  space~ : XRSpace,
) -> XRMediaCylinderLayerInit {
  XRMediaCylinderLayerInit::{
    space,
    layout: None,
    invertStereo: None,
    transform: Nullable::Undefined,
    radius: None,
    centralAngle: None,
    aspectRatio: Nullable::Undefined,
  }
}

///|
extern "js" fn XRMediaCylinderLayerInit::to_js_ffi(
  self : XRMediaCylinderLayerInit,
) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   invertStereo: (self.invertStereo === -1 ? undefined : self.invertStereo),
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   radius: ((() => { const v = self.radius; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   centralAngle: ((() => { const v = self.centralAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   aspectRatio: ((() => { const v = self.aspectRatio; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRMediaCylinderLayerInit::to_js(
  self : XRMediaCylinderLayerInit,
) -> JsValue {
  XRMediaCylinderLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRMediaCylinderLayerInit::from_js_ffi(
  value : JsValue,
) -> XRMediaCylinderLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   invertStereo: (v.invertStereo === undefined ? -1 : v.invertStereo),
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform }),
  #|   radius: (v.radius === undefined ? { $tag: 0 } : { $tag: 1, _0: v.radius }),
  #|   centralAngle: (v.centralAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.centralAngle }),
  #|   aspectRatio: (v.aspectRatio === undefined ? { $tag: 0 } : v.aspectRatio === null ? { $tag: 1 } : { $tag: 2, _0: v.aspectRatio })
  #| })

///|
/// Convert from JsValue
pub fn XRMediaCylinderLayerInit::from_js(
  value : JsValue,
) -> XRMediaCylinderLayerInit {
  XRMediaCylinderLayerInit::from_js_ffi(value)
}

///|
/// XRMediaEquirectLayerInit dictionary
pub(all) struct XRMediaEquirectLayerInit {
  space : XRSpace
  layout : XRLayerLayout?
  invertStereo : Bool?
  transform : Nullable[XRRigidTransform]
  radius : Double?
  centralHorizontalAngle : Double?
  upperVerticalAngle : Double?
  lowerVerticalAngle : Double?
}

///|
/// Create a new XRMediaEquirectLayerInit
pub fn XRMediaEquirectLayerInit::new(
  space~ : XRSpace,
) -> XRMediaEquirectLayerInit {
  XRMediaEquirectLayerInit::{
    space,
    layout: None,
    invertStereo: None,
    transform: Nullable::Undefined,
    radius: None,
    centralHorizontalAngle: None,
    upperVerticalAngle: None,
    lowerVerticalAngle: None,
  }
}

///|
extern "js" fn XRMediaEquirectLayerInit::to_js_ffi(
  self : XRMediaEquirectLayerInit,
) -> JsValue =
  #| (self) => ({
  #|   space: self.space,
  #|   layout: ((() => { const v = self.layout; if (v === undefined) return undefined; return ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'][v]; })()),
  #|   invertStereo: (self.invertStereo === -1 ? undefined : self.invertStereo),
  #|   transform: ((() => { const v = self.transform; if (v.$tag === 0) return undefined; if (v.$tag === 1) return null; return v._0; })()),
  #|   radius: ((() => { const v = self.radius; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   centralHorizontalAngle: ((() => { const v = self.centralHorizontalAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   upperVerticalAngle: ((() => { const v = self.upperVerticalAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   lowerVerticalAngle: ((() => { const v = self.lowerVerticalAngle; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })())
  #| })

///|
/// Convert to JsValue
pub fn XRMediaEquirectLayerInit::to_js(
  self : XRMediaEquirectLayerInit,
) -> JsValue {
  XRMediaEquirectLayerInit::to_js_ffi(self)
}

///|
extern "js" fn XRMediaEquirectLayerInit::from_js_ffi(
  value : JsValue,
) -> XRMediaEquirectLayerInit =
  #| (v) => ({
  #|   space: v.space,
  #|   layout: (v.layout === undefined ? undefined : ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(v.layout)),
  #|   invertStereo: (v.invertStereo === undefined ? -1 : v.invertStereo),
  #|   transform: (v.transform === undefined ? { $tag: 0 } : v.transform === null ? { $tag: 1 } : { $tag: 2, _0: v.transform }),
  #|   radius: (v.radius === undefined ? { $tag: 0 } : { $tag: 1, _0: v.radius }),
  #|   centralHorizontalAngle: (v.centralHorizontalAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.centralHorizontalAngle }),
  #|   upperVerticalAngle: (v.upperVerticalAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.upperVerticalAngle }),
  #|   lowerVerticalAngle: (v.lowerVerticalAngle === undefined ? { $tag: 0 } : { $tag: 1, _0: v.lowerVerticalAngle })
  #| })

///|
/// Convert from JsValue
pub fn XRMediaEquirectLayerInit::from_js(
  value : JsValue,
) -> XRMediaEquirectLayerInit {
  XRMediaEquirectLayerInit::from_js_ffi(value)
}

///|
/// XRLayerEventInit dictionary
pub(all) struct XRLayerEventInit {
  layer : XRLayer
}

///|
/// Create a new XRLayerEventInit
pub fn XRLayerEventInit::new(layer~ : XRLayer) -> XRLayerEventInit {
  XRLayerEventInit::{ layer, }
}

///|
extern "js" fn XRLayerEventInit::to_js_ffi(self : XRLayerEventInit) -> JsValue =
  #| (self) => ({
  #|   layer: self.layer
  #| })

///|
/// Convert to JsValue
pub fn XRLayerEventInit::to_js(self : XRLayerEventInit) -> JsValue {
  XRLayerEventInit::to_js_ffi(self)
}

///|
extern "js" fn XRLayerEventInit::from_js_ffi(
  value : JsValue,
) -> XRLayerEventInit =
  #| (v) => ({
  #|   layer: v.layer
  #| })

///|
/// Convert from JsValue
pub fn XRLayerEventInit::from_js(value : JsValue) -> XRLayerEventInit {
  XRLayerEventInit::from_js_ffi(value)
}

///|
/// XRCompositionLayer interface
pub type XRCompositionLayer

///|
pub extern "js" fn XRCompositionLayer::to_js_value(
  self : XRCompositionLayer,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRCompositionLayer (unchecked)
pub extern "js" fn XRCompositionLayer::from_js_value(
  v : JsValue,
) -> XRCompositionLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRCompositionLayer (checked with instanceof)
pub extern "js" fn XRCompositionLayer::from_js_value_opt(
  v : JsValue,
) -> XRCompositionLayer? =
  #| (v) => (v instanceof XRCompositionLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRCompositionLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_composition_layer(
  self : JsValue,
) -> XRCompositionLayer? =
  #| (self) => (self instanceof XRCompositionLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRCompositionLayer (unchecked)
pub extern "js" fn JsValue::to_xr_composition_layer(
  self : JsValue,
) -> XRCompositionLayer =
  #| (self) => self

///|
pub extern "js" fn XRCompositionLayer::to_xr_layer(
  self : XRCompositionLayer,
) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRCompositionLayer::to_event_target(
  self : XRCompositionLayer,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRCompositionLayer::as_xr_projection_layer(
  self : XRCompositionLayer,
) -> XRProjectionLayer? =
  #| (self) => (self instanceof XRProjectionLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRCompositionLayer::as_xr_quad_layer(
  self : XRCompositionLayer,
) -> XRQuadLayer? =
  #| (self) => (self instanceof XRQuadLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRCompositionLayer::as_xr_cylinder_layer(
  self : XRCompositionLayer,
) -> XRCylinderLayer? =
  #| (self) => (self instanceof XRCylinderLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRCompositionLayer::as_xr_equirect_layer(
  self : XRCompositionLayer,
) -> XREquirectLayer? =
  #| (self) => (self instanceof XREquirectLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRCompositionLayer::as_xr_cube_layer(
  self : XRCompositionLayer,
) -> XRCubeLayer? =
  #| (self) => (self instanceof XRCubeLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRCompositionLayer::get_layout(
  self : XRCompositionLayer,
) -> XRLayerLayout =
  #| (self) => ['default', 'mono', 'stereo', 'stereo-left-right', 'stereo-top-bottom'].indexOf(self.layout)

///|
pub extern "js" fn XRCompositionLayer::get_blend_texture_source_alpha(
  self : XRCompositionLayer,
) -> Bool =
  #| (self) => self.blendTextureSourceAlpha

///|
pub extern "js" fn XRCompositionLayer::set_blend_texture_source_alpha(
  self : XRCompositionLayer,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.blendTextureSourceAlpha = value }

///|
pub extern "js" fn XRCompositionLayer::get_force_mono_presentation(
  self : XRCompositionLayer,
) -> Bool =
  #| (self) => self.forceMonoPresentation

///|
pub extern "js" fn XRCompositionLayer::set_force_mono_presentation(
  self : XRCompositionLayer,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.forceMonoPresentation = value }

///|
pub extern "js" fn XRCompositionLayer::get_opacity(
  self : XRCompositionLayer,
) -> Double =
  #| (self) => self.opacity

///|
pub extern "js" fn XRCompositionLayer::set_opacity(
  self : XRCompositionLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.opacity = value }

///|
pub extern "js" fn XRCompositionLayer::get_mip_levels(
  self : XRCompositionLayer,
) -> Int =
  #| (self) => self.mipLevels

///|
pub extern "js" fn XRCompositionLayer::get_quality(
  self : XRCompositionLayer,
) -> XRLayerQuality =
  #| (self) => ['default', 'text-optimized', 'graphics-optimized'].indexOf(self.quality)

///|
pub extern "js" fn XRCompositionLayer::set_quality(
  self : XRCompositionLayer,
  value : XRLayerQuality,
) -> Unit =
  #| (self, value) => { self.quality = ['default', 'text-optimized', 'graphics-optimized'][value] }

///|
pub extern "js" fn XRCompositionLayer::get_needs_redraw(
  self : XRCompositionLayer,
) -> Bool =
  #| (self) => self.needsRedraw

///|
pub extern "js" fn XRCompositionLayer::destroy(
  self : XRCompositionLayer,
) -> Unit =
  #| (self) => self.destroy()

///|
/// XRProjectionLayer interface
pub type XRProjectionLayer

///|
pub extern "js" fn XRProjectionLayer::to_js_value(
  self : XRProjectionLayer,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRProjectionLayer (unchecked)
pub extern "js" fn XRProjectionLayer::from_js_value(
  v : JsValue,
) -> XRProjectionLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRProjectionLayer (checked with instanceof)
pub extern "js" fn XRProjectionLayer::from_js_value_opt(
  v : JsValue,
) -> XRProjectionLayer? =
  #| (v) => (v instanceof XRProjectionLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRProjectionLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_projection_layer(
  self : JsValue,
) -> XRProjectionLayer? =
  #| (self) => (self instanceof XRProjectionLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRProjectionLayer (unchecked)
pub extern "js" fn JsValue::to_xr_projection_layer(
  self : JsValue,
) -> XRProjectionLayer =
  #| (self) => self

///|
pub extern "js" fn XRProjectionLayer::to_xr_composition_layer(
  self : XRProjectionLayer,
) -> XRCompositionLayer =
  #| (self) => self

///|
pub extern "js" fn XRProjectionLayer::to_xr_layer(
  self : XRProjectionLayer,
) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRProjectionLayer::to_event_target(
  self : XRProjectionLayer,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRProjectionLayer::get_texture_width(
  self : XRProjectionLayer,
) -> Int =
  #| (self) => self.textureWidth

///|
pub extern "js" fn XRProjectionLayer::get_texture_height(
  self : XRProjectionLayer,
) -> Int =
  #| (self) => self.textureHeight

///|
pub extern "js" fn XRProjectionLayer::get_texture_array_length(
  self : XRProjectionLayer,
) -> Int =
  #| (self) => self.textureArrayLength

///|
pub extern "js" fn XRProjectionLayer::get_ignore_depth_values(
  self : XRProjectionLayer,
) -> Bool =
  #| (self) => self.ignoreDepthValues

///|
pub extern "js" fn XRProjectionLayer::get_fixed_foveation(
  self : XRProjectionLayer,
) -> Double? =
  #| (self) => (() => { const v = self.fixedFoveation; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRProjectionLayer::set_fixed_foveation(
  self : XRProjectionLayer,
  value : Double?,
) -> Unit =
  #| (self, value) => { self.fixedFoveation = value }

///|
pub extern "js" fn XRProjectionLayer::get_delta_pose(
  self : XRProjectionLayer,
) -> XRRigidTransform? =
  #| (self) => (() => { const v = self.deltaPose; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRProjectionLayer::set_delta_pose(
  self : XRProjectionLayer,
  value : XRRigidTransform?,
) -> Unit =
  #| (self, value) => { self.deltaPose = (value.$tag === 1 ? value._0 : null) }

///|
/// XRQuadLayer interface
pub type XRQuadLayer

///|
pub extern "js" fn XRQuadLayer::to_js_value(self : XRQuadLayer) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRQuadLayer (unchecked)
pub extern "js" fn XRQuadLayer::from_js_value(v : JsValue) -> XRQuadLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRQuadLayer (checked with instanceof)
pub extern "js" fn XRQuadLayer::from_js_value_opt(v : JsValue) -> XRQuadLayer? =
  #| (v) => (v instanceof XRQuadLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRQuadLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_quad_layer(self : JsValue) -> XRQuadLayer? =
  #| (self) => (self instanceof XRQuadLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRQuadLayer (unchecked)
pub extern "js" fn JsValue::to_xr_quad_layer(self : JsValue) -> XRQuadLayer =
  #| (self) => self

///|
pub extern "js" fn XRQuadLayer::to_xr_composition_layer(
  self : XRQuadLayer,
) -> XRCompositionLayer =
  #| (self) => self

///|
pub extern "js" fn XRQuadLayer::to_xr_layer(self : XRQuadLayer) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRQuadLayer::to_event_target(
  self : XRQuadLayer,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRQuadLayer::get_space(self : XRQuadLayer) -> XRSpace =
  #| (self) => self.space

///|
pub extern "js" fn XRQuadLayer::set_space(
  self : XRQuadLayer,
  value : XRSpace,
) -> Unit =
  #| (self, value) => { self.space = value }

///|
pub extern "js" fn XRQuadLayer::get_transform(
  self : XRQuadLayer,
) -> XRRigidTransform =
  #| (self) => self.transform

///|
pub extern "js" fn XRQuadLayer::set_transform(
  self : XRQuadLayer,
  value : XRRigidTransform,
) -> Unit =
  #| (self, value) => { self.transform = value }

///|
pub extern "js" fn XRQuadLayer::get_width(self : XRQuadLayer) -> Double =
  #| (self) => self.width

///|
pub extern "js" fn XRQuadLayer::set_width(
  self : XRQuadLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.width = value }

///|
pub extern "js" fn XRQuadLayer::get_height(self : XRQuadLayer) -> Double =
  #| (self) => self.height

///|
pub extern "js" fn XRQuadLayer::set_height(
  self : XRQuadLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.height = value }

///|
pub extern "js" fn XRQuadLayer::set_onredraw(
  self : XRQuadLayer,
  handler : (XRLayerEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onredraw = (e) => handler(e) }

///|
pub extern "js" fn XRQuadLayer::clear_onredraw(self : XRQuadLayer) -> Unit =
  #| (self) => { self.onredraw = null }

///|
/// XRCylinderLayer interface
pub type XRCylinderLayer

///|
pub extern "js" fn XRCylinderLayer::to_js_value(
  self : XRCylinderLayer,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRCylinderLayer (unchecked)
pub extern "js" fn XRCylinderLayer::from_js_value(
  v : JsValue,
) -> XRCylinderLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRCylinderLayer (checked with instanceof)
pub extern "js" fn XRCylinderLayer::from_js_value_opt(
  v : JsValue,
) -> XRCylinderLayer? =
  #| (v) => (v instanceof XRCylinderLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRCylinderLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_cylinder_layer(
  self : JsValue,
) -> XRCylinderLayer? =
  #| (self) => (self instanceof XRCylinderLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRCylinderLayer (unchecked)
pub extern "js" fn JsValue::to_xr_cylinder_layer(
  self : JsValue,
) -> XRCylinderLayer =
  #| (self) => self

///|
pub extern "js" fn XRCylinderLayer::to_xr_composition_layer(
  self : XRCylinderLayer,
) -> XRCompositionLayer =
  #| (self) => self

///|
pub extern "js" fn XRCylinderLayer::to_xr_layer(
  self : XRCylinderLayer,
) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRCylinderLayer::to_event_target(
  self : XRCylinderLayer,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRCylinderLayer::get_space(
  self : XRCylinderLayer,
) -> XRSpace =
  #| (self) => self.space

///|
pub extern "js" fn XRCylinderLayer::set_space(
  self : XRCylinderLayer,
  value : XRSpace,
) -> Unit =
  #| (self, value) => { self.space = value }

///|
pub extern "js" fn XRCylinderLayer::get_transform(
  self : XRCylinderLayer,
) -> XRRigidTransform =
  #| (self) => self.transform

///|
pub extern "js" fn XRCylinderLayer::set_transform(
  self : XRCylinderLayer,
  value : XRRigidTransform,
) -> Unit =
  #| (self, value) => { self.transform = value }

///|
pub extern "js" fn XRCylinderLayer::get_radius(
  self : XRCylinderLayer,
) -> Double =
  #| (self) => self.radius

///|
pub extern "js" fn XRCylinderLayer::set_radius(
  self : XRCylinderLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.radius = value }

///|
pub extern "js" fn XRCylinderLayer::get_central_angle(
  self : XRCylinderLayer,
) -> Double =
  #| (self) => self.centralAngle

///|
pub extern "js" fn XRCylinderLayer::set_central_angle(
  self : XRCylinderLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.centralAngle = value }

///|
pub extern "js" fn XRCylinderLayer::get_aspect_ratio(
  self : XRCylinderLayer,
) -> Double =
  #| (self) => self.aspectRatio

///|
pub extern "js" fn XRCylinderLayer::set_aspect_ratio(
  self : XRCylinderLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.aspectRatio = value }

///|
pub extern "js" fn XRCylinderLayer::set_onredraw(
  self : XRCylinderLayer,
  handler : (XRLayerEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onredraw = (e) => handler(e) }

///|
pub extern "js" fn XRCylinderLayer::clear_onredraw(
  self : XRCylinderLayer,
) -> Unit =
  #| (self) => { self.onredraw = null }

///|
/// XREquirectLayer interface
pub type XREquirectLayer

///|
pub extern "js" fn XREquirectLayer::to_js_value(
  self : XREquirectLayer,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XREquirectLayer (unchecked)
pub extern "js" fn XREquirectLayer::from_js_value(
  v : JsValue,
) -> XREquirectLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XREquirectLayer (checked with instanceof)
pub extern "js" fn XREquirectLayer::from_js_value_opt(
  v : JsValue,
) -> XREquirectLayer? =
  #| (v) => (v instanceof XREquirectLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XREquirectLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_equirect_layer(
  self : JsValue,
) -> XREquirectLayer? =
  #| (self) => (self instanceof XREquirectLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XREquirectLayer (unchecked)
pub extern "js" fn JsValue::to_xr_equirect_layer(
  self : JsValue,
) -> XREquirectLayer =
  #| (self) => self

///|
pub extern "js" fn XREquirectLayer::to_xr_composition_layer(
  self : XREquirectLayer,
) -> XRCompositionLayer =
  #| (self) => self

///|
pub extern "js" fn XREquirectLayer::to_xr_layer(
  self : XREquirectLayer,
) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XREquirectLayer::to_event_target(
  self : XREquirectLayer,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XREquirectLayer::get_space(
  self : XREquirectLayer,
) -> XRSpace =
  #| (self) => self.space

///|
pub extern "js" fn XREquirectLayer::set_space(
  self : XREquirectLayer,
  value : XRSpace,
) -> Unit =
  #| (self, value) => { self.space = value }

///|
pub extern "js" fn XREquirectLayer::get_transform(
  self : XREquirectLayer,
) -> XRRigidTransform =
  #| (self) => self.transform

///|
pub extern "js" fn XREquirectLayer::set_transform(
  self : XREquirectLayer,
  value : XRRigidTransform,
) -> Unit =
  #| (self, value) => { self.transform = value }

///|
pub extern "js" fn XREquirectLayer::get_radius(
  self : XREquirectLayer,
) -> Double =
  #| (self) => self.radius

///|
pub extern "js" fn XREquirectLayer::set_radius(
  self : XREquirectLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.radius = value }

///|
pub extern "js" fn XREquirectLayer::get_central_horizontal_angle(
  self : XREquirectLayer,
) -> Double =
  #| (self) => self.centralHorizontalAngle

///|
pub extern "js" fn XREquirectLayer::set_central_horizontal_angle(
  self : XREquirectLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.centralHorizontalAngle = value }

///|
pub extern "js" fn XREquirectLayer::get_upper_vertical_angle(
  self : XREquirectLayer,
) -> Double =
  #| (self) => self.upperVerticalAngle

///|
pub extern "js" fn XREquirectLayer::set_upper_vertical_angle(
  self : XREquirectLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.upperVerticalAngle = value }

///|
pub extern "js" fn XREquirectLayer::get_lower_vertical_angle(
  self : XREquirectLayer,
) -> Double =
  #| (self) => self.lowerVerticalAngle

///|
pub extern "js" fn XREquirectLayer::set_lower_vertical_angle(
  self : XREquirectLayer,
  value : Double,
) -> Unit =
  #| (self, value) => { self.lowerVerticalAngle = value }

///|
pub extern "js" fn XREquirectLayer::set_onredraw(
  self : XREquirectLayer,
  handler : (XRLayerEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onredraw = (e) => handler(e) }

///|
pub extern "js" fn XREquirectLayer::clear_onredraw(
  self : XREquirectLayer,
) -> Unit =
  #| (self) => { self.onredraw = null }

///|
/// XRCubeLayer interface
pub type XRCubeLayer

///|
pub extern "js" fn XRCubeLayer::to_js_value(self : XRCubeLayer) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRCubeLayer (unchecked)
pub extern "js" fn XRCubeLayer::from_js_value(v : JsValue) -> XRCubeLayer =
  #| (v) => v

///|
/// Safely cast JsValue to XRCubeLayer (checked with instanceof)
pub extern "js" fn XRCubeLayer::from_js_value_opt(v : JsValue) -> XRCubeLayer? =
  #| (v) => (v instanceof XRCubeLayer) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRCubeLayer (checked with instanceof)
pub extern "js" fn JsValue::as_xr_cube_layer(self : JsValue) -> XRCubeLayer? =
  #| (self) => (self instanceof XRCubeLayer) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRCubeLayer (unchecked)
pub extern "js" fn JsValue::to_xr_cube_layer(self : JsValue) -> XRCubeLayer =
  #| (self) => self

///|
pub extern "js" fn XRCubeLayer::to_xr_composition_layer(
  self : XRCubeLayer,
) -> XRCompositionLayer =
  #| (self) => self

///|
pub extern "js" fn XRCubeLayer::to_xr_layer(self : XRCubeLayer) -> XRLayer =
  #| (self) => self

///|
pub extern "js" fn XRCubeLayer::to_event_target(
  self : XRCubeLayer,
) -> EventTarget =
  #| (self) => self

///|
pub extern "js" fn XRCubeLayer::get_space(self : XRCubeLayer) -> XRSpace =
  #| (self) => self.space

///|
pub extern "js" fn XRCubeLayer::set_space(
  self : XRCubeLayer,
  value : XRSpace,
) -> Unit =
  #| (self, value) => { self.space = value }

///|
pub extern "js" fn XRCubeLayer::get_orientation(
  self : XRCubeLayer,
) -> DOMPointReadOnly =
  #| (self) => self.orientation

///|
pub extern "js" fn XRCubeLayer::set_orientation(
  self : XRCubeLayer,
  value : DOMPointReadOnly,
) -> Unit =
  #| (self, value) => { self.orientation = value }

///|
pub extern "js" fn XRCubeLayer::set_onredraw(
  self : XRCubeLayer,
  handler : (XRLayerEvent) -> Unit,
) -> Unit =
  #| (self, handler) => { self.onredraw = (e) => handler(e) }

///|
pub extern "js" fn XRCubeLayer::clear_onredraw(self : XRCubeLayer) -> Unit =
  #| (self) => { self.onredraw = null }

///|
/// XRSubImage interface
pub type XRSubImage

///|
pub extern "js" fn XRSubImage::to_js_value(self : XRSubImage) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRSubImage (unchecked)
pub extern "js" fn XRSubImage::from_js_value(v : JsValue) -> XRSubImage =
  #| (v) => v

///|
/// Safely cast JsValue to XRSubImage (checked with instanceof)
pub extern "js" fn XRSubImage::from_js_value_opt(v : JsValue) -> XRSubImage? =
  #| (v) => (v instanceof XRSubImage) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRSubImage (checked with instanceof)
pub extern "js" fn JsValue::as_xr_sub_image(self : JsValue) -> XRSubImage? =
  #| (self) => (self instanceof XRSubImage) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRSubImage (unchecked)
pub extern "js" fn JsValue::to_xr_sub_image(self : JsValue) -> XRSubImage =
  #| (self) => self

///|
pub extern "js" fn XRSubImage::as_xr_web_gl_sub_image(
  self : XRSubImage,
) -> XRWebGLSubImage? =
  #| (self) => (self instanceof XRWebGLSubImage) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
pub extern "js" fn XRSubImage::get_viewport(self : XRSubImage) -> XRViewport =
  #| (self) => self.viewport

///|
/// XRWebGLSubImage interface
pub type XRWebGLSubImage

///|
pub extern "js" fn XRWebGLSubImage::to_js_value(
  self : XRWebGLSubImage,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRWebGLSubImage (unchecked)
pub extern "js" fn XRWebGLSubImage::from_js_value(
  v : JsValue,
) -> XRWebGLSubImage =
  #| (v) => v

///|
/// Safely cast JsValue to XRWebGLSubImage (checked with instanceof)
pub extern "js" fn XRWebGLSubImage::from_js_value_opt(
  v : JsValue,
) -> XRWebGLSubImage? =
  #| (v) => (v instanceof XRWebGLSubImage) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRWebGLSubImage (checked with instanceof)
pub extern "js" fn JsValue::as_xr_web_gl_sub_image(
  self : JsValue,
) -> XRWebGLSubImage? =
  #| (self) => (self instanceof XRWebGLSubImage) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRWebGLSubImage (unchecked)
pub extern "js" fn JsValue::to_xr_web_gl_sub_image(
  self : JsValue,
) -> XRWebGLSubImage =
  #| (self) => self

///|
pub extern "js" fn XRWebGLSubImage::to_xr_sub_image(
  self : XRWebGLSubImage,
) -> XRSubImage =
  #| (self) => self

///|
pub extern "js" fn XRWebGLSubImage::get_color_texture(
  self : XRWebGLSubImage,
) -> WebGLTexture =
  #| (self) => self.colorTexture

///|
pub extern "js" fn XRWebGLSubImage::get_depth_stencil_texture(
  self : XRWebGLSubImage,
) -> WebGLTexture? =
  #| (self) => (() => { const v = self.depthStencilTexture; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRWebGLSubImage::get_motion_vector_texture(
  self : XRWebGLSubImage,
) -> WebGLTexture? =
  #| (self) => (() => { const v = self.motionVectorTexture; return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRWebGLSubImage::get_image_index(
  self : XRWebGLSubImage,
) -> Int? =
  #| (self) => (self.imageIndex) ?? undefined

///|
pub extern "js" fn XRWebGLSubImage::get_color_texture_width(
  self : XRWebGLSubImage,
) -> Int =
  #| (self) => self.colorTextureWidth

///|
pub extern "js" fn XRWebGLSubImage::get_color_texture_height(
  self : XRWebGLSubImage,
) -> Int =
  #| (self) => self.colorTextureHeight

///|
pub extern "js" fn XRWebGLSubImage::get_depth_stencil_texture_width(
  self : XRWebGLSubImage,
) -> Int? =
  #| (self) => (self.depthStencilTextureWidth) ?? undefined

///|
pub extern "js" fn XRWebGLSubImage::get_depth_stencil_texture_height(
  self : XRWebGLSubImage,
) -> Int? =
  #| (self) => (self.depthStencilTextureHeight) ?? undefined

///|
pub extern "js" fn XRWebGLSubImage::get_motion_vector_texture_width(
  self : XRWebGLSubImage,
) -> Int? =
  #| (self) => (self.motionVectorTextureWidth) ?? undefined

///|
pub extern "js" fn XRWebGLSubImage::get_motion_vector_texture_height(
  self : XRWebGLSubImage,
) -> Int? =
  #| (self) => (self.motionVectorTextureHeight) ?? undefined

///|
/// XRWebGLBinding interface
pub type XRWebGLBinding

///|
pub extern "js" fn XRWebGLBinding::to_js_value(
  self : XRWebGLBinding,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRWebGLBinding (unchecked)
pub extern "js" fn XRWebGLBinding::from_js_value(v : JsValue) -> XRWebGLBinding =
  #| (v) => v

///|
/// Safely cast JsValue to XRWebGLBinding (checked with instanceof)
pub extern "js" fn XRWebGLBinding::from_js_value_opt(
  v : JsValue,
) -> XRWebGLBinding? =
  #| (v) => (v instanceof XRWebGLBinding) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRWebGLBinding (checked with instanceof)
pub extern "js" fn JsValue::as_xr_web_gl_binding(
  self : JsValue,
) -> XRWebGLBinding? =
  #| (self) => (self instanceof XRWebGLBinding) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRWebGLBinding (unchecked)
pub extern "js" fn JsValue::to_xr_web_gl_binding(
  self : JsValue,
) -> XRWebGLBinding =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRWebGLBindingConstructorError {
  InvalidStateError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRWebGLBindingGetSubImageError {
  TypeError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRWebGLBindingGetViewSubImageError {
  TypeError(JsError)
  OtherError(JsError)
} derive(Show)

///|
/// Error type for throwing methods
pub(all) enum XRWebGLBindingGetDepthInformationError {
  InvalidStateError(JsError)
  NotSupportedError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRWebGLBinding::new(
  session : XRSession,
  context : XRWebGLRenderingContext,
) -> Result[XRWebGLBinding, XRWebGLBindingConstructorError] =
  #| (session, context) => (() => { try { return { $tag: 1, _0: new XRWebGLBinding(session, context) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLBinding::get_native_projection_scale_factor(
  self : XRWebGLBinding,
) -> Double =
  #| (self) => self.nativeProjectionScaleFactor

///|
pub extern "js" fn XRWebGLBinding::get_uses_depth_values(
  self : XRWebGLBinding,
) -> Bool =
  #| (self) => self.usesDepthValues

///|
pub extern "js" fn XRWebGLBinding::create_projection_layer(
  self : XRWebGLBinding,
) -> XRProjectionLayer =
  #| (self) => self.createProjectionLayer()

///|
extern "js" fn XRWebGLBinding::create_projection_layer_with_init_ffi(
  self : XRWebGLBinding,
  init_ : JsValue,
) -> XRProjectionLayer =
  #| (self, init_) => self.createProjectionLayer(init_)

///|
pub fn XRWebGLBinding::create_projection_layer_with_init(
  self : XRWebGLBinding,
  init_ : XRProjectionLayerInit,
) -> XRProjectionLayer {
  XRWebGLBinding::create_projection_layer_with_init_ffi(self, init_.to_js())
}

///|
pub extern "js" fn XRWebGLBinding::create_quad_layer(
  self : XRWebGLBinding,
) -> XRQuadLayer =
  #| (self) => self.createQuadLayer()

///|
extern "js" fn XRWebGLBinding::create_quad_layer_with_init_ffi(
  self : XRWebGLBinding,
  init_ : JsValue,
) -> XRQuadLayer =
  #| (self, init_) => self.createQuadLayer(init_)

///|
pub fn XRWebGLBinding::create_quad_layer_with_init(
  self : XRWebGLBinding,
  init_ : XRQuadLayerInit,
) -> XRQuadLayer {
  XRWebGLBinding::create_quad_layer_with_init_ffi(self, init_.to_js())
}

///|
pub extern "js" fn XRWebGLBinding::create_cylinder_layer(
  self : XRWebGLBinding,
) -> XRCylinderLayer =
  #| (self) => self.createCylinderLayer()

///|
extern "js" fn XRWebGLBinding::create_cylinder_layer_with_init_ffi(
  self : XRWebGLBinding,
  init_ : JsValue,
) -> XRCylinderLayer =
  #| (self, init_) => self.createCylinderLayer(init_)

///|
pub fn XRWebGLBinding::create_cylinder_layer_with_init(
  self : XRWebGLBinding,
  init_ : XRCylinderLayerInit,
) -> XRCylinderLayer {
  XRWebGLBinding::create_cylinder_layer_with_init_ffi(self, init_.to_js())
}

///|
pub extern "js" fn XRWebGLBinding::create_equirect_layer(
  self : XRWebGLBinding,
) -> XREquirectLayer =
  #| (self) => self.createEquirectLayer()

///|
extern "js" fn XRWebGLBinding::create_equirect_layer_with_init_ffi(
  self : XRWebGLBinding,
  init_ : JsValue,
) -> XREquirectLayer =
  #| (self, init_) => self.createEquirectLayer(init_)

///|
pub fn XRWebGLBinding::create_equirect_layer_with_init(
  self : XRWebGLBinding,
  init_ : XREquirectLayerInit,
) -> XREquirectLayer {
  XRWebGLBinding::create_equirect_layer_with_init_ffi(self, init_.to_js())
}

///|
pub extern "js" fn XRWebGLBinding::create_cube_layer(
  self : XRWebGLBinding,
) -> XRCubeLayer =
  #| (self) => self.createCubeLayer()

///|
extern "js" fn XRWebGLBinding::create_cube_layer_with_init_ffi(
  self : XRWebGLBinding,
  init_ : JsValue,
) -> XRCubeLayer =
  #| (self, init_) => self.createCubeLayer(init_)

///|
pub fn XRWebGLBinding::create_cube_layer_with_init(
  self : XRWebGLBinding,
  init_ : XRCubeLayerInit,
) -> XRCubeLayer {
  XRWebGLBinding::create_cube_layer_with_init_ffi(self, init_.to_js())
}

///|
pub extern "js" fn XRWebGLBinding::get_sub_image(
  self : XRWebGLBinding,
  layer : XRCompositionLayer,
  frame : XRFrame,
) -> Result[XRWebGLSubImage, XRWebGLBindingGetSubImageError] =
  #| (self, layer, frame) => (() => { try { return { $tag: 1, _0: self.getSubImage(layer, frame) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLBinding::get_sub_image_with_eye(
  self : XRWebGLBinding,
  layer : XRCompositionLayer,
  frame : XRFrame,
  eye : XREye,
) -> Result[XRWebGLSubImage, XRWebGLBindingGetSubImageError] =
  #| (self, layer, frame, eye) => (() => { try { return { $tag: 1, _0: self.getSubImage(layer, frame, ['none', 'left', 'right'][eye]) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLBinding::get_view_sub_image(
  self : XRWebGLBinding,
  layer : XRProjectionLayer,
  view : XRView,
) -> Result[XRWebGLSubImage, XRWebGLBindingGetViewSubImageError] =
  #| (self, layer, view) => (() => { try { return { $tag: 1, _0: self.getViewSubImage(layer, view) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'TypeError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLBinding::foveate_bound_texture(
  self : XRWebGLBinding,
  target : GLenum,
  fixed_foveation : Double,
) -> Unit =
  #| (self, target, fixed_foveation) => self.foveateBoundTexture(target, fixed_foveation)

///|
pub extern "js" fn XRWebGLBinding::get_camera_image(
  self : XRWebGLBinding,
  camera : XRCamera,
) -> WebGLTexture? =
  #| (self, camera) => (() => { const v = self.getCameraImage(camera); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRWebGLBinding::get_depth_information(
  self : XRWebGLBinding,
  view : XRView,
) -> Result[XRWebGLDepthInformation?, XRWebGLBindingGetDepthInformationError] =
  #| (self, view) => (() => { try { return { $tag: 1, _0: (() => { const v = self.getDepthInformation(view); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })() }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; if (n === 'NotSupportedError') return { $tag: 1, _0: e }; return { $tag: 2, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLBinding::get_reflection_cube_map(
  self : XRWebGLBinding,
  light_probe : XRLightProbe,
) -> WebGLTexture? =
  #| (self, light_probe) => (() => { const v = self.getReflectionCubeMap(light_probe); return v == null ? { $tag: 0 } : { $tag: 1, _0: v }; })()

///|
pub extern "js" fn XRWebGLBinding::new_with_web_gl_rendering_context(
  session : XRSession,
  context : WebGLRenderingContext,
) -> Result[XRWebGLBinding, XRWebGLBindingConstructorError] =
  #| (session, context) => (() => { try { return { $tag: 1, _0: new XRWebGLBinding(session, context) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRWebGLBinding::new_with_web_gl2_rendering_context(
  session : XRSession,
  context : WebGL2RenderingContext,
) -> Result[XRWebGLBinding, XRWebGLBindingConstructorError] =
  #| (session, context) => (() => { try { return { $tag: 1, _0: new XRWebGLBinding(session, context) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
/// XRMediaBinding interface
pub type XRMediaBinding

///|
pub extern "js" fn XRMediaBinding::to_js_value(
  self : XRMediaBinding,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRMediaBinding (unchecked)
pub extern "js" fn XRMediaBinding::from_js_value(v : JsValue) -> XRMediaBinding =
  #| (v) => v

///|
/// Safely cast JsValue to XRMediaBinding (checked with instanceof)
pub extern "js" fn XRMediaBinding::from_js_value_opt(
  v : JsValue,
) -> XRMediaBinding? =
  #| (v) => (v instanceof XRMediaBinding) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRMediaBinding (checked with instanceof)
pub extern "js" fn JsValue::as_xr_media_binding(
  self : JsValue,
) -> XRMediaBinding? =
  #| (self) => (self instanceof XRMediaBinding) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRMediaBinding (unchecked)
pub extern "js" fn JsValue::to_xr_media_binding(
  self : JsValue,
) -> XRMediaBinding =
  #| (self) => self

///|
/// Error type for throwing methods
pub(all) enum XRMediaBindingConstructorError {
  InvalidStateError(JsError)
  OtherError(JsError)
} derive(Show)

///|
pub extern "js" fn XRMediaBinding::new(
  session : XRSession,
) -> Result[XRMediaBinding, XRMediaBindingConstructorError] =
  #| (session) => (() => { try { return { $tag: 1, _0: new XRMediaBinding(session) }; } catch(e) { return { $tag: 0, _0: (() => { const n = (e && e.name) || ''; if (n === 'InvalidStateError') return { $tag: 0, _0: e }; return { $tag: 1, _0: e }; })() }; } })()

///|
pub extern "js" fn XRMediaBinding::create_quad_layer(
  self : XRMediaBinding,
  video : HTMLVideoElement,
) -> XRQuadLayer =
  #| (self, video) => self.createQuadLayer(video)

///|
extern "js" fn XRMediaBinding::create_quad_layer_with_init_ffi(
  self : XRMediaBinding,
  video : HTMLVideoElement,
  init_ : JsValue,
) -> XRQuadLayer =
  #| (self, video, init_) => self.createQuadLayer(video, init_)

///|
pub fn XRMediaBinding::create_quad_layer_with_init(
  self : XRMediaBinding,
  video : HTMLVideoElement,
  init_ : XRMediaQuadLayerInit,
) -> XRQuadLayer {
  XRMediaBinding::create_quad_layer_with_init_ffi(self, video, init_.to_js())
}

///|
pub extern "js" fn XRMediaBinding::create_cylinder_layer(
  self : XRMediaBinding,
  video : HTMLVideoElement,
) -> XRCylinderLayer =
  #| (self, video) => self.createCylinderLayer(video)

///|
extern "js" fn XRMediaBinding::create_cylinder_layer_with_init_ffi(
  self : XRMediaBinding,
  video : HTMLVideoElement,
  init_ : JsValue,
) -> XRCylinderLayer =
  #| (self, video, init_) => self.createCylinderLayer(video, init_)

///|
pub fn XRMediaBinding::create_cylinder_layer_with_init(
  self : XRMediaBinding,
  video : HTMLVideoElement,
  init_ : XRMediaCylinderLayerInit,
) -> XRCylinderLayer {
  XRMediaBinding::create_cylinder_layer_with_init_ffi(
    self,
    video,
    init_.to_js(),
  )
}

///|
pub extern "js" fn XRMediaBinding::create_equirect_layer(
  self : XRMediaBinding,
  video : HTMLVideoElement,
) -> XREquirectLayer =
  #| (self, video) => self.createEquirectLayer(video)

///|
extern "js" fn XRMediaBinding::create_equirect_layer_with_init_ffi(
  self : XRMediaBinding,
  video : HTMLVideoElement,
  init_ : JsValue,
) -> XREquirectLayer =
  #| (self, video, init_) => self.createEquirectLayer(video, init_)

///|
pub fn XRMediaBinding::create_equirect_layer_with_init(
  self : XRMediaBinding,
  video : HTMLVideoElement,
  init_ : XRMediaEquirectLayerInit,
) -> XREquirectLayer {
  XRMediaBinding::create_equirect_layer_with_init_ffi(
    self,
    video,
    init_.to_js(),
  )
}

///|
/// XRLayerEvent interface
pub type XRLayerEvent

///|
pub extern "js" fn XRLayerEvent::to_js_value(self : XRLayerEvent) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to XRLayerEvent (unchecked)
pub extern "js" fn XRLayerEvent::from_js_value(v : JsValue) -> XRLayerEvent =
  #| (v) => v

///|
/// Safely cast JsValue to XRLayerEvent (checked with instanceof)
pub extern "js" fn XRLayerEvent::from_js_value_opt(
  v : JsValue,
) -> XRLayerEvent? =
  #| (v) => (v instanceof XRLayerEvent) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to XRLayerEvent (checked with instanceof)
pub extern "js" fn JsValue::as_xr_layer_event(self : JsValue) -> XRLayerEvent? =
  #| (self) => (self instanceof XRLayerEvent) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to XRLayerEvent (unchecked)
pub extern "js" fn JsValue::to_xr_layer_event(self : JsValue) -> XRLayerEvent =
  #| (self) => self

///|
pub extern "js" fn XRLayerEvent::to_event(self : XRLayerEvent) -> Event =
  #| (self) => self

///|
extern "js" fn XRLayerEvent::new_ffi(
  type_ : String,
  event_init_dict : JsValue,
) -> XRLayerEvent =
  #| (type_, event_init_dict) => new XRLayerEvent(type_, event_init_dict)

///|
pub fn XRLayerEvent::new(
  type_ : String,
  event_init_dict : XRLayerEventInit,
) -> XRLayerEvent {
  XRLayerEvent::new_ffi(type_, event_init_dict.to_js())
}

///|
pub extern "js" fn XRLayerEvent::get_layer(self : XRLayerEvent) -> XRLayer =
  #| (self) => self.layer