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

///|
#external
pub type Material

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

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

///|
pub extern "js" fn Material::kind(self : Material) -> String =
  #| (self) => self.type

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

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

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

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

///|
pub extern "js" fn Material::transparent(self : Material) -> Bool =
  #| (self) => self.transparent

///|
pub extern "js" fn Material::set_transparent(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.transparent = value; }

///|
pub extern "js" fn Material::visible(self : Material) -> Bool =
  #| (self) => self.visible

///|
pub extern "js" fn Material::set_visible(self : Material, value : Bool) -> Unit =
  #| (self, value) => { self.visible = value; }

///|
pub extern "js" fn Material::depth_test(self : Material) -> Bool =
  #| (self) => self.depthTest

///|
pub extern "js" fn Material::set_depth_test(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.depthTest = value; }

///|
pub extern "js" fn Material::depth_write(self : Material) -> Bool =
  #| (self) => self.depthWrite

///|
pub extern "js" fn Material::set_depth_write(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.depthWrite = value; }

///|
pub extern "js" fn Material::side(self : Material) -> Side =
  #| (self) => self.side

///|
pub extern "js" fn Material::set_side(self : Material, value : Side) -> Unit =
  #| (self, value) => { self.side = value; }

///|
pub extern "js" fn Material::alpha_test(self : Material) -> Double =
  #| (self) => self.alphaTest

///|
pub extern "js" fn Material::set_alpha_test(
  self : Material,
  value : Double,
) -> Unit =
  #| (self, value) => { self.alphaTest = value; }

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

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

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

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

///|
extern "js" fn Material::ffi_as_standard_material(
  self : Material,
) -> Nullable[MeshStandardMaterial] =
  #| (self) => self.isMeshStandardMaterial ? self : null

///|
pub fn Material::as_standard_material(self : Material) -> MeshStandardMaterial? {
  self.ffi_as_standard_material().to_option()
}

///|
extern "js" fn Material::ffi_as_physical_material(
  self : Material,
) -> Nullable[MeshPhysicalMaterial] =
  #| (self) => self.isMeshPhysicalMaterial ? self : null

///|
pub fn Material::as_physical_material(self : Material) -> MeshPhysicalMaterial? {
  self.ffi_as_physical_material().to_option()
}

///|
extern "js" fn Material::ffi_as_basic_material(
  self : Material,
) -> Nullable[MeshBasicMaterial] =
  #| (self) => self.isMeshBasicMaterial ? self : null

///|
pub fn Material::as_basic_material(self : Material) -> MeshBasicMaterial? {
  self.ffi_as_basic_material().to_option()
}

///|
pub extern "js" fn Material::blending(self : Material) -> Blending =
  #| (self) => self.blending

///|
pub extern "js" fn Material::set_blending(
  self : Material,
  value : Blending,
) -> Unit =
  #| (self, value) => { self.blending = value; }

///|
pub extern "js" fn Material::blend_color(self : Material) -> Color =
  #| (self) => self.blendColor

///|
pub extern "js" fn Material::blend_alpha(self : Material) -> Double =
  #| (self) => self.blendAlpha

///|
pub extern "js" fn Material::set_blend_alpha(
  self : Material,
  value : Double,
) -> Unit =
  #| (self, value) => { self.blendAlpha = value; }

///|
pub extern "js" fn Material::blend_equation(self : Material) -> BlendEquation =
  #| (self) => self.blendEquation

///|
pub extern "js" fn Material::set_blend_equation(
  self : Material,
  value : BlendEquation,
) -> Unit =
  #| (self, value) => { self.blendEquation = value; }

///|
pub extern "js" fn Material::blend_src(self : Material) -> BlendFactor =
  #| (self) => self.blendSrc

///|
pub extern "js" fn Material::set_blend_src(
  self : Material,
  value : BlendFactor,
) -> Unit =
  #| (self, value) => { self.blendSrc = value; }

///|
pub extern "js" fn Material::blend_dst(self : Material) -> BlendFactor =
  #| (self) => self.blendDst

///|
pub extern "js" fn Material::set_blend_dst(
  self : Material,
  value : BlendFactor,
) -> Unit =
  #| (self, value) => { self.blendDst = value; }

///|
extern "js" fn Material::ffi_blend_src_alpha(
  self : Material,
) -> Nullable[BlendFactor] =
  #| (self) => self.blendSrcAlpha

///|
pub fn Material::blend_src_alpha(self : Material) -> BlendFactor? {
  self.ffi_blend_src_alpha().to_option()
}

///|
extern "js" fn Material::ffi_set_blend_src_alpha(
  self : Material,
  value : Nullable[BlendFactor],
) -> Unit =
  #| (self, value) => { self.blendSrcAlpha = value; }

///|
pub fn Material::set_blend_src_alpha(
  self : Material,
  value : BlendFactor?,
) -> Unit {
  self.ffi_set_blend_src_alpha(Nullable::from_option(value))
}

///|
extern "js" fn Material::ffi_blend_dst_alpha(
  self : Material,
) -> Nullable[BlendFactor] =
  #| (self) => self.blendDstAlpha

///|
pub fn Material::blend_dst_alpha(self : Material) -> BlendFactor? {
  self.ffi_blend_dst_alpha().to_option()
}

///|
extern "js" fn Material::ffi_set_blend_dst_alpha(
  self : Material,
  value : Nullable[BlendFactor],
) -> Unit =
  #| (self, value) => { self.blendDstAlpha = value; }

///|
pub fn Material::set_blend_dst_alpha(
  self : Material,
  value : BlendFactor?,
) -> Unit {
  self.ffi_set_blend_dst_alpha(Nullable::from_option(value))
}

///|
extern "js" fn Material::ffi_blend_equation_alpha(
  self : Material,
) -> Nullable[BlendEquation] =
  #| (self) => self.blendEquationAlpha

///|
pub fn Material::blend_equation_alpha(self : Material) -> BlendEquation? {
  self.ffi_blend_equation_alpha().to_option()
}

///|
extern "js" fn Material::ffi_set_blend_equation_alpha(
  self : Material,
  value : Nullable[BlendEquation],
) -> Unit =
  #| (self, value) => { self.blendEquationAlpha = value; }

///|
pub fn Material::set_blend_equation_alpha(
  self : Material,
  value : BlendEquation?,
) -> Unit {
  self.ffi_set_blend_equation_alpha(Nullable::from_option(value))
}

///|
pub extern "js" fn Material::depth_func(self : Material) -> DepthFunction =
  #| (self) => self.depthFunc

///|
pub extern "js" fn Material::set_depth_func(
  self : Material,
  value : DepthFunction,
) -> Unit =
  #| (self, value) => { self.depthFunc = value; }

///|
pub extern "js" fn Material::stencil_func(self : Material) -> StencilFunction =
  #| (self) => self.stencilFunc

///|
pub extern "js" fn Material::set_stencil_func(
  self : Material,
  value : StencilFunction,
) -> Unit =
  #| (self, value) => { self.stencilFunc = value; }

///|
pub extern "js" fn Material::stencil_fail(self : Material) -> StencilOperation =
  #| (self) => self.stencilFail

///|
pub extern "js" fn Material::set_stencil_fail(
  self : Material,
  value : StencilOperation,
) -> Unit =
  #| (self, value) => { self.stencilFail = value; }

///|
pub extern "js" fn Material::stencil_zfail(self : Material) -> StencilOperation =
  #| (self) => self.stencilZFail

///|
pub extern "js" fn Material::set_stencil_zfail(
  self : Material,
  value : StencilOperation,
) -> Unit =
  #| (self, value) => { self.stencilZFail = value; }

///|
pub extern "js" fn Material::stencil_zpass(self : Material) -> StencilOperation =
  #| (self) => self.stencilZPass

///|
pub extern "js" fn Material::set_stencil_zpass(
  self : Material,
  value : StencilOperation,
) -> Unit =
  #| (self, value) => { self.stencilZPass = value; }

///|
pub extern "js" fn Material::stencil_ref(self : Material) -> Int =
  #| (self) => self.stencilRef

///|
pub extern "js" fn Material::set_stencil_ref(
  self : Material,
  value : Int,
) -> Unit =
  #| (self, value) => { self.stencilRef = value; }

///|
pub extern "js" fn Material::stencil_func_mask(self : Material) -> Int =
  #| (self) => self.stencilFuncMask

///|
pub extern "js" fn Material::set_stencil_func_mask(
  self : Material,
  value : Int,
) -> Unit =
  #| (self, value) => { self.stencilFuncMask = value; }

///|
pub extern "js" fn Material::stencil_write_mask(self : Material) -> Int =
  #| (self) => self.stencilWriteMask

///|
pub extern "js" fn Material::set_stencil_write_mask(
  self : Material,
  value : Int,
) -> Unit =
  #| (self, value) => { self.stencilWriteMask = value; }

///|
pub extern "js" fn Material::stencil_write(self : Material) -> Bool =
  #| (self) => self.stencilWrite

///|
pub extern "js" fn Material::set_stencil_write(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.stencilWrite = value; }

///|
pub extern "js" fn Material::color_write(self : Material) -> Bool =
  #| (self) => self.colorWrite

///|
pub extern "js" fn Material::set_color_write(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.colorWrite = value; }

///|
pub extern "js" fn Material::vertex_colors(self : Material) -> Bool =
  #| (self) => self.vertexColors

///|
pub extern "js" fn Material::set_vertex_colors(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.vertexColors = value; }

///|
pub extern "js" fn Material::alpha_hash(self : Material) -> Bool =
  #| (self) => self.alphaHash

///|
pub extern "js" fn Material::set_alpha_hash(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.alphaHash = value; }

///|
pub extern "js" fn Material::alpha_to_coverage(self : Material) -> Bool =
  #| (self) => self.alphaToCoverage

///|
pub extern "js" fn Material::set_alpha_to_coverage(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.alphaToCoverage = value; }

///|
pub extern "js" fn Material::premultiplied_alpha(self : Material) -> Bool =
  #| (self) => self.premultipliedAlpha

///|
pub extern "js" fn Material::set_premultiplied_alpha(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.premultipliedAlpha = value; }

///|
pub extern "js" fn Material::dithering(self : Material) -> Bool =
  #| (self) => self.dithering

///|
pub extern "js" fn Material::set_dithering(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.dithering = value; }

///|
pub extern "js" fn Material::tone_mapped(self : Material) -> Bool =
  #| (self) => self.toneMapped

///|
pub extern "js" fn Material::set_tone_mapped(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.toneMapped = value; }

///|
pub extern "js" fn Material::polygon_offset(self : Material) -> Bool =
  #| (self) => self.polygonOffset

///|
pub extern "js" fn Material::set_polygon_offset(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.polygonOffset = value; }

///|
pub extern "js" fn Material::clip_intersection(self : Material) -> Bool =
  #| (self) => self.clipIntersection

///|
pub extern "js" fn Material::set_clip_intersection(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.clipIntersection = value; }

///|
pub extern "js" fn Material::clip_shadows(self : Material) -> Bool =
  #| (self) => self.clipShadows

///|
pub extern "js" fn Material::set_clip_shadows(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.clipShadows = value; }

///|
pub extern "js" fn Material::polygon_offset_factor(self : Material) -> Double =
  #| (self) => self.polygonOffsetFactor

///|
pub extern "js" fn Material::set_polygon_offset_factor(
  self : Material,
  value : Double,
) -> Unit =
  #| (self, value) => { self.polygonOffsetFactor = value; }

///|
pub extern "js" fn Material::polygon_offset_units(self : Material) -> Double =
  #| (self) => self.polygonOffsetUnits

///|
pub extern "js" fn Material::set_polygon_offset_units(
  self : Material,
  value : Double,
) -> Unit =
  #| (self, value) => { self.polygonOffsetUnits = value; }

///|
pub extern "js" fn Material::clipping_planes(
  self : Material,
) -> FixedArray[Plane] =
  #| (self) => self.clippingPlanes?.slice() ?? []

///|
pub extern "js" fn Material::set_clipping_planes(
  self : Material,
  planes : FixedArray[Plane],
) -> Unit =
  #| (self, planes) => { self.clippingPlanes = planes.length ? planes.slice() : null; }

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

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

///|
pub extern "js" fn Material::force_single_pass(self : Material) -> Bool =
  #| (self) => self.forceSinglePass

///|
pub extern "js" fn Material::set_force_single_pass(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.forceSinglePass = value; }

///|
pub extern "js" fn Material::allow_override(self : Material) -> Bool =
  #| (self) => self.allowOverride

///|
pub extern "js" fn Material::set_allow_override(
  self : Material,
  value : Bool,
) -> Unit =
  #| (self, value) => { self.allowOverride = value; }

///|
extern "js" fn Material::ffi_shadow_side(self : Material) -> Nullable[Side] =
  #| (self) => self.shadowSide

///|
pub fn Material::shadow_side(self : Material) -> Side? {
  self.ffi_shadow_side().to_option()
}

///|
extern "js" fn Material::ffi_set_shadow_side(
  self : Material,
  value : Nullable[Side],
) -> Unit =
  #| (self, value) => { self.shadowSide = value; }

///|
pub fn Material::set_shadow_side(self : Material, value : Side?) -> Unit {
  self.ffi_set_shadow_side(Nullable::from_option(value))
}

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

///|
pub extern "js" fn Material::custom_program_cache_key(
  self : Material,
) -> String =
  #| (self) => self.customProgramCacheKey()

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

///|
pub fn Material::to_json(self : Material) -> 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 Material::ffi_to_json_string(
  self : Material,
) -> JsResult[String] =
  #| (self) => { try { return { ok: true, value: (() => JSON.stringify(self.toJSON()))() }; } catch (error) { return { ok: false, error: String(error) }; } }

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

///|
extern "js" fn Material::ffi_as_phong_material(
  self : Material,
) -> Nullable[MeshPhongMaterial] =
  #| (self) => self.isMeshPhongMaterial === true ? self : null

///|
pub fn Material::as_phong_material(self : Material) -> MeshPhongMaterial? {
  self.ffi_as_phong_material().to_option()
}

///|
extern "js" fn Material::ffi_defines(
  self : Material,
) -> Nullable[ShaderDefines] =
  #| (self) => self.defines

///|
pub fn Material::defines(self : Material) -> ShaderDefines? {
  self.ffi_defines().to_option()
}

///|
pub extern "js" fn Material::set_defines(
  self : Material,
  defines : ShaderDefines,
) -> Unit =
  #| (self, defines) => { self.defines = {...defines}; self.needsUpdate = true; }

///|
pub extern "js" fn Material::set_on_before_compile(
  self : Material,
  callback : (ShaderProgram, WebGLRenderer) -> Unit,
  cache_key : String,
) -> Unit =
  #| (self, callback, cache_key) => { self.onBeforeCompile = callback; self.customProgramCacheKey = () => cache_key; self.needsUpdate = true; }

///|
pub extern "js" fn Material::clear_on_before_compile(self : Material) -> Unit =
  #| (self) => { self.onBeforeCompile = () => {}; self.customProgramCacheKey = () => ""; self.needsUpdate = true; }

///|
pub extern "js" fn Material::set_on_before_render(
  self : Material,
  callback : (RenderContext) -> Unit,
) -> Unit =
  #| (self, callback) => { self.onBeforeRender = (renderer,scene,camera,geometry,object,group) => callback({renderer,scene,camera,geometry,object,group,material:self}); }

///|
pub extern "js" fn Material::clear_on_before_render(self : Material) -> Unit =
  #| (self) => { self.onBeforeRender = () => {}; }