// Generated by scripts/generate.mjs from bindings/api.mjs. Do not edit.

///|
#external
pub type Texture

///|
#module("@mizchi/three-mbt/constructors")
pub extern "js" fn Texture::Texture() -> Texture = "texture"

///|
pub extern "js" fn Texture::user_data(self : Texture) -> UserData =
  #| (self) => self.userData

///|
pub extern "js" fn Texture::mapping(self : Texture) -> TextureMapping =
  #| (self) => self.mapping

///|
pub extern "js" fn Texture::set_mapping(
  self : Texture,
  value : TextureMapping,
) -> Unit =
  #| (self, value) => { self.mapping = value; }

///|
pub extern "js" fn Texture::same_reference(
  self : Texture,
  other : Texture,
) -> Bool =
  #| (self, other) => self === other

///|
pub extern "js" fn Texture::clone(self : Texture) -> Texture =
  #| (self) => self.clone()

///|
pub extern "js" fn Texture::name(self : Texture) -> String =
  #| (self) => self.name

///|
pub extern "js" fn Texture::set_name(self : Texture, value : String) -> Unit =
  #| (self, value) => { self.name = value; }

///|
pub extern "js" fn Texture::offset(self : Texture) -> Vector2 =
  #| (self) => self.offset

///|
pub extern "js" fn Texture::repeat(self : Texture) -> Vector2 =
  #| (self) => self.repeat

///|
pub extern "js" fn Texture::center(self : Texture) -> Vector2 =
  #| (self) => self.center

///|
pub extern "js" fn Texture::rotation(self : Texture) -> Double =
  #| (self) => self.rotation

///|
pub extern "js" fn Texture::set_rotation(
  self : Texture,
  value : Double,
) -> Unit =
  #| (self, value) => { self.rotation = value; }

///|
pub extern "js" fn Texture::flip_y(self : Texture) -> Bool =
  #| (self) => self.flipY

///|
pub extern "js" fn Texture::set_flip_y(self : Texture, value : Bool) -> Unit =
  #| (self, value) => { self.flipY = value; }

///|
pub extern "js" fn Texture::anisotropy(self : Texture) -> Int =
  #| (self) => self.anisotropy

///|
pub extern "js" fn Texture::set_anisotropy(self : Texture, value : Int) -> Unit =
  #| (self, value) => { self.anisotropy = value; }

///|
pub extern "js" fn Texture::wrap_s(self : Texture) -> Wrapping =
  #| (self) => self.wrapS

///|
pub extern "js" fn Texture::set_wrap_s(
  self : Texture,
  value : Wrapping,
) -> Unit =
  #| (self, value) => { self.wrapS = value; }

///|
pub extern "js" fn Texture::wrap_t(self : Texture) -> Wrapping =
  #| (self) => self.wrapT

///|
pub extern "js" fn Texture::set_wrap_t(
  self : Texture,
  value : Wrapping,
) -> Unit =
  #| (self, value) => { self.wrapT = value; }

///|
pub extern "js" fn Texture::mag_filter(self : Texture) -> MagnificationFilter =
  #| (self) => self.magFilter

///|
pub extern "js" fn Texture::set_mag_filter(
  self : Texture,
  value : MagnificationFilter,
) -> Unit =
  #| (self, value) => { self.magFilter = value; }

///|
pub extern "js" fn Texture::min_filter(self : Texture) -> MinificationFilter =
  #| (self) => self.minFilter

///|
pub extern "js" fn Texture::set_min_filter(
  self : Texture,
  value : MinificationFilter,
) -> Unit =
  #| (self, value) => { self.minFilter = value; }

///|
pub extern "js" fn Texture::mark_needs_update(self : Texture) -> Unit =
  #| (self) => { self.needsUpdate = true; }

///|
pub extern "js" fn Texture::update_matrix(self : Texture) -> Unit =
  #| (self) => self.updateMatrix()

///|
pub extern "js" fn Texture::dispose(self : Texture) -> Unit =
  #| (self) => self.dispose()

///|
extern "js" fn Texture::ffi_format(self : Texture) -> Nullable[TextureFormat] =
  #| (self) => [1023,1028,1030].includes(self.format) ? self.format : null

///|
pub fn Texture::format(self : Texture) -> TextureFormat? {
  self.ffi_format().to_option()
}

///|
pub extern "js" fn Texture::set_format(
  self : Texture,
  value : TextureFormat,
) -> Unit =
  #| (self, value) => { self.format = value; }

///|
pub extern "js" fn Texture::generate_mipmaps(self : Texture) -> Bool =
  #| (self) => self.generateMipmaps

///|
pub extern "js" fn Texture::set_generate_mipmaps(
  self : Texture,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.generateMipmaps = value; }

///|
pub extern "js" fn Texture::unpack_alignment(self : Texture) -> Int =
  #| (self) => self.unpackAlignment

///|
pub extern "js" fn Texture::set_unpack_alignment(
  self : Texture,
  value : Int,
) -> Unit =
  #| (self, value) => { self.unpackAlignment = value; }

///|
pub extern "js" fn Texture::uuid(self : Texture) -> String =
  #| (self) => self.uuid

///|
extern "js" fn Texture::ffi_to_json(self : Texture) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.toJSON()))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn Texture::to_json(self : Texture) -> Json raise SerializationError {
  match self.ffi_to_json().into_result() {
    Ok(value) =>
      @json.parse(value) catch {
        error => raise SerializationError((error : Error).to_string())
      }
    Err(message) => raise SerializationError(message)
  }
}

///|
extern "js" fn Texture::ffi_to_json_string(self : Texture) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.toJSON()))() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn Texture::to_json_string(
  self : Texture,
) -> String raise SerializationError {
  match self.ffi_to_json_string().into_result() {
    Ok(value) => value
    Err(message) => raise SerializationError(message)
  }
}

///|
pub extern "js" fn Texture::channel(self : Texture) -> Int =
  #| (self) => self.channel

///|
pub extern "js" fn Texture::set_channel(self : Texture, value : Int) -> Unit =
  #| (self, value) => { self.channel = value; }

///|
pub extern "js" fn Texture::matrix(self : Texture) -> Matrix3 =
  #| (self) => self.matrix

///|
pub extern "js" fn Texture::matrix_auto_update(self : Texture) -> Bool =
  #| (self) => self.matrixAutoUpdate

///|
pub extern "js" fn Texture::set_matrix_auto_update(
  self : Texture,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.matrixAutoUpdate = value; }

///|
pub extern "js" fn Texture::transform_uv(
  self : Texture,
  uv : Vector2,
) -> Vector2 =
  #| (self, uv) => self.transformUv(uv)

///|
pub extern "js" fn Texture::copy(self : Texture, source : Texture) -> Texture =
  #| (self, source) => self.copy(source)

///|
pub extern "js" fn Texture::source(self : Texture) -> Source =
  #| (self) => self.source

///|
pub extern "js" fn Texture::set_source(self : Texture, source : Source) -> Unit =
  #| (self, source) => { self.source = source; self.needsUpdate = true; }

///|
pub extern "js" fn Texture::add_update_range(
  self : Texture,
  start : Int,
  count : Int,
) -> Unit =
  #| (self, start, count) => self.addUpdateRange(start, count)

///|
pub extern "js" fn Texture::clear_update_ranges(self : Texture) -> Unit =
  #| (self) => self.clearUpdateRanges()

///|
pub extern "js" fn Texture::update_ranges(
  self : Texture,
) -> FixedArray[BufferUpdateRange] =
  #| (self) => self.updateRanges.map(range=>({...range}))

///|
extern "js" fn Texture::ffi_write_rgba(
  self : Texture,
  start : Int,
  data : Bytes,
) -> JsResult[Unit] =
  #| (self, start, data) => { try { return { ok: true, value: (() => { const target = self.source.data?.data; if (!(target instanceof Uint8Array) || self.format !== 1023 || self.type !== 1009 || start < 0 || start + data.length > target.length) throw new RangeError("RGBA8 texture update is out of bounds or has incompatible storage"); target.set(data,start); self.addUpdateRange(start,data.length); self.needsUpdate = true; })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn Texture::write_rgba(
  self : Texture,
  start : Int,
  data : Bytes,
) -> Unit raise ModelingError {
  match self.ffi_write_rgba(start, data).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
extern "js" fn Texture::ffi_set_rgba_mipmaps(
  self : Texture,
  levels : FixedArray[TextureMipLevel],
) -> JsResult[Unit] =
  #| (self, levels) => { try { return { ok: true, value: (() => { if (self.format !== 1023 || self.type !== 1009) throw new TypeError("RGBA8 texture required"); self.mipmaps = levels.map(level=>({data:level.data.slice(),width:level.width,height:level.height})); self.generateMipmaps = false; self.needsUpdate = true; })() }; } catch (error) { return { ok: false, error: String(error) }; } }

///|
pub fn Texture::set_rgba_mipmaps(
  self : Texture,
  levels : FixedArray[TextureMipLevel],
) -> Unit raise ModelingError {
  match self.ffi_set_rgba_mipmaps(levels).into_result() {
    Ok(value) => value
    Err(message) => raise ModelingError(message)
  }
}

///|
pub extern "js" fn Texture::rgba_mipmaps(
  self : Texture,
) -> FixedArray[TextureMipLevel] =
  #| (self) => self.mipmaps.filter(m=>m.data instanceof Uint8Array).map(m=>({data:m.data.slice(),width:m.width,height:m.height}))