user: Explain ShaderNodeBsdfHairPrincipled(ShaderNode) in complete detail according to the official Blender documentation.

assistant: # ShaderNodeBsdfHairPrincipled(ShaderNode)

base classes — [`bpy_struct`](bpy.types.bpy_struct.html#bpy.types.bpy_struct "bpy.types.bpy_struct"), [`Node`](bpy.types.Node.html#bpy.types.Node "bpy.types.Node"), [`NodeInternal`](bpy.types.NodeInternal.html#bpy.types.NodeInternal "bpy.types.NodeInternal"), [`ShaderNode`](bpy.types.ShaderNode.html#bpy.types.ShaderNode "bpy.types.ShaderNode")

*class* bpy.types.ShaderNodeBsdfHairPrincipled(*ShaderNode*)
:   Physically-based, easy-to-use shader for rendering hair and fur

    model
    :   Select from Chiang or Huang model

        - `CHIANG`
          Chiang – Near-field hair scattering model by Chiang et al. 2016, suitable for close-up looks, but is more noisy when viewing from a distance..
        - `HUANG`
          Huang – Multi-scale hair scattering model by Huang et al. 2022, suitable for viewing both up close and from a distance, supports elliptical cross-sections and has more precise highlight in forward scattering directions..

        Type:
        :   enum in [`'CHIANG'`, `'HUANG'`], default `'HUANG'`

    parametrization
    :   Select the shader’s color parametrization

        - `ABSORPTION`
          Absorption Coefficient – Directly set the absorption coefficient “sigma_a” (this is not the most intuitive way to color hair).
        - `MELANIN`
          Melanin Concentration – Define the melanin concentrations below to get the most realistic-looking hair (you can get the concentrations for different types of hair online).
        - `COLOR`
          Direct Coloring – Choose the color of your preference, and the shader will approximate the absorption coefficient to render lookalike hair.

        Type:
        :   enum in [`'ABSORPTION'`, `'MELANIN'`, `'COLOR'`], default `'COLOR'`

    *classmethod* is_registered_node_type()
    :   True if a registered node type

        Returns:
        :   Result

        Return type:
        :   boolean

    *classmethod* input_template(*index*)
    :   Input socket template

        Parameters:
        :   **index** (*int in* *[**0**,* *inf**]*) – Index

        Returns:
        :   result

        Return type:
        :   [`NodeInternalSocketTemplate`](bpy.types.NodeInternalSocketTemplate.html#bpy.types.NodeInternalSocketTemplate "bpy.types.NodeInternalSocketTemplate")

    *classmethod* output_template(*index*)
    :   Output socket template

        Parameters:
        :   **index** (*int in* *[**0**,* *inf**]*) – Index

        Returns:
        :   result

        Return type:
        :   [`NodeInternalSocketTemplate`](bpy.types.NodeInternalSocketTemplate.html#bpy.types.NodeInternalSocketTemplate "bpy.types.NodeInternalSocketTemplate")

    *classmethod* bl_rna_get_subclass(*id*, *default=None*, */*)
    :   Parameters:
        :   **id** (*str*) – The RNA type identifier.

        Returns:
        :   The RNA type or default when not found.

        Return type:
        :   [`bpy.types.Struct`](bpy.types.Struct.html#bpy.types.Struct "bpy.types.Struct") subclass

    *classmethod* bl_rna_get_subclass_py(*id*, *default=None*, */*)
    :   Parameters:
        :   **id** (*str*) – The RNA type identifier.

        Returns:
        :   The class or default when not found.

        Return type:
        :   type