///|
pub fn Group::as_object3d(self : Group) -> Object3D = "%identity"

///|
pub fn Scene::as_object3d(self : Scene) -> Object3D = "%identity"

///|
#external
priv type NullableObject3D

///|
extern "js" fn NullableObject3D::nullable_object_is_null(
  self : NullableObject3D,
) -> Bool =
  #| (self) => self == null

///|
fn NullableObject3D::nullable_object_value(self : NullableObject3D) -> Object3D = "%identity"

///|
fn NullableObject3D::to_option(self : NullableObject3D) -> Object3D? {
  if self.nullable_object_is_null() {
    None
  } else {
    Some(self.nullable_object_value())
  }
}

///|
extern "js" fn Object3D::object_parent(self : Object3D) -> NullableObject3D =
  #| (self) => self.parent

///|
pub fn Object3D::parent(self : Object3D) -> Object3D? {
  self.object_parent().to_option()
}

///|
extern "js" fn Object3D::object_by_name(
  self : Object3D,
  name : String,
) -> NullableObject3D =
  #| (self, name) => self.getObjectByName(name)

///|
/// Includes the receiver in the search. Missing names return None.
pub fn Object3D::get_object_by_name(
  self : Object3D,
  name : String,
) -> Object3D? {
  self.object_by_name(name).to_option()
}

///|
extern "js" fn Object3D::clone_object(
  self : Object3D,
  recursive : Bool,
) -> Object3D =
  #| (self, recursive) => self.clone(recursive)

///|
pub fn Object3D::clone(self : Object3D, recursive? : Bool = true) -> Object3D {
  self.clone_object(recursive)
}

///|
#external
priv type NullableColor

///|
extern "js" fn Scene::scene_background(self : Scene) -> NullableColor =
  #| (self) => self.background?.isColor ? self.background : null

///|
extern "js" fn NullableColor::nullable_color_is_null(
  self : NullableColor,
) -> Bool =
  #| (self) => self == null

///|
fn NullableColor::nullable_color_value(self : NullableColor) -> Color = "%identity"

///|
/// Returns the background only when it is a Color; use background_texture() for textures.
pub fn Scene::background(self : Scene) -> Color? {
  let background = self.scene_background()
  if background.nullable_color_is_null() {
    None
  } else {
    Some(background.nullable_color_value())
  }
}

///|
extern "js" fn Scene::set_scene_background(self : Scene, color : Color) -> Unit =
  #| (self, color) => { self.background = color; }

///|
extern "js" fn Scene::clear_scene_background(self : Scene) -> Unit =
  #| (self) => { self.background = null; }

///|
pub fn Scene::set_background(self : Scene, color : Color?) -> Unit {
  match color {
    Some(color) => self.set_scene_background(color)
    None => self.clear_scene_background()
  }
}