
    j                         U d Z ddlmZmZmZmZ ddlmZ ddlm	Z	m
Z
mZmZ ed   Z G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Zeegef   Zede	eef   f   Zi Ze	ee	eef   f   ed<   de	de	ddfdZdededeegef   fdZdee	eef      dedefdZ edd      d edee	eef      fd!       Z ed"d#      d edee   fd$       Zy)%z
gltf_extensions.py
------------------

Extension registry for glTF import/export with scope-based handlers.
Each scope has a TypedDict defining the context passed to handlers.
    )AnyCallableOrderedDict	TypedDict   )log)DictListLiteralOptional)materialtexture_source	primitiveprimitive_preprocessprimitive_exportc                   N    e Zd ZU dZeeef   ed<   edeeef   f   ed<   e	ed<   y)MaterialContextz$Context for material scope handlers.data.parse_texturesimagesN)
__name__
__module____qualname____doc__r	   strr   __annotations__r   r
        M/DATA/.local/lib/python3.12/site-packages/trimesh/exchange/gltf/extensions.pyr   r   0   s0    .
sCx.S$sCx.011Lr   r   c                   &    e Zd ZU dZeeef   ed<   y)TextureSourceContextz*Context for texture_source scope handlers.r   N)r   r   r   r   r	   r   r   r   r   r   r   r!   r!   8   s    4
sCx.r   r!   c                   D    e Zd ZU dZeeef   ed<   eed<   eed<   eed<   y)PrimitiveContextz1Context for primitive scope handlers (post-load).r   r   mesh_kwargs	accessorsN	r   r   r   r   r	   r   r   r   r
   r   r   r   r#   r#   >   s#    ;
sCx.OOr   r#   c                   D    e Zd ZU dZeeef   ed<   eed<   eed<   eed<   y)PrimitivePreprocessContextz;Context for primitive_preprocess scope handlers (pre-load).r   r   r%   viewsNr&   r   r   r   r(   r(   G   s"    E
sCx.OOKr   r(   c                   N    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   e	ed<   y)	PrimitiveExportContextz<Context for primitive_export scope handlers (during export).meshnametreebuffer_itemsr   include_normalsN)
r   r   r   r   r   r   r   r	   r   boolr   r   r   r+   r+   P   s%    F
I
I
JOr   r+   .	_handlerstargetsourcereturnNc                     |j                         D ]A  \  }}t        |t              r'|| v r#t        | |   t              rt        | |   |       =|| |<   C y)z
    Recursively merge source dict into target dict.

    Parameters
    ----------
    target
      Dict to merge into (modified in place)
    source
      Dict to merge from
    N)items
isinstancedict_deep_merge)r3   r4   keyvalues       r   r:   r:   f   sO     lln
UeT"sf}F3KQU9VsU+  F3K %r   r-   scopec                 R     t         vr	i t         <   dt        dt        f fd}|S )a{  
    Decorator to register a handler for a glTF extension.

    Parameters
    ----------
    name
      Extension name, e.g. "KHR_materials_pbrSpecularGlossiness".
    scope
      Handler scope, e.g. "material", "texture_source", "primitive".

    Returns
    -------
    decorator
      Function that registers the handler and returns it unchanged.

    Example
    -------
    >>> @register_handler("MY_extension", scope="material")
    ... def my_handler(context: MaterialContext) -> Optional[Dict]:
    ...     data = context["data"]
    ...     images = context["images"]
    ...     return {"baseColorFactor": [1, 0, 0, 1]}
    funcr5   c                      | t            <   | S )N)r2   )r?   r-   r=   s    r   	decoratorz#register_handler.<locals>.decorator   s    !%	%r   )r2   Handler)r-   r=   rA   s   `` r   register_handlerrC   z   s2    0 I	% G  r   
extensionsc                    | r|t         vr|j                  d      si S dS i }| j                         D ]0  \  }}|t         |   vr	 d|i|}t        |   |   |      x}|||<   2 |j                  d      r#t        t        |j                               d      S |dk(  rud|v rq|d   }	|j                         D ]Y  }
t        |
t              s|
j                         D ]3  \  }}t        |t              r||	vri |	|<   t        |	|   |       /||	|<   5 [ |S # t        $ r&}t	        j
                  d| d|        Y d}~d}~ww xY w)aw  
    Process extensions dict for a given scope, calling registered handlers.

    Parameters
    ----------
    extensions
      The "extensions" dict from a glTF element, or None.
    scope
      Handler scope to invoke.
    **kwargs
      Scope-specific arguments that will be combined with extension data
      into a typed context dict. Required kwargs by scope:
        - material: parse_textures, images
        - texture_source: (none)
        - primitive: primitive, mesh_kwargs, accessors
        - primitive_preprocess: primitive, accessors, views
        - primitive_export: mesh, name, tree, buffer_items, primitive, include_normals

    Returns
    -------
    results
      Dict of {extension_name: result} for most scopes.
      For scopes ending in "_source", returns first non-None result.
      For "primitive" scope, automatically merges results into mesh_kwargs.
    _sourceNr   zfailed to process extension z: r   r$   )r2   endswithr7   	Exceptionr   warningnextitervaluesr8   r9   r:   )rD   r=   kwargsresultsext_namer   contextresulter$   
ext_resultr;   r<   s                r   handle_extensionsrT      sn   > i/	2r<<G$**,$9U++	Ht.v.G#E*84W==J$*! - ~~i D)*D11  7]+!..*Jj$/(..0
UeT*+-+-C(C 0%8',K$ 1	 + N-  	HKK6xj1#FGG	Hs   D	ED??E#KHR_materials_pbrSpecularGlossinessr   )r=   rP   c                     	 ddl m}  |d
i  | d   | d         S # t        $ r t        j                  dd       Y y	w xY w)a'  
    Convert specular-glossiness material to PBR metallic-roughness.

    Parameters
    ----------
    context
      MaterialContext with extension data, parse_textures function, and images.

    Returns
    -------
    pbr_dict
      PBR metallic-roughness parameters, or None on failure.
    r   )specular_to_pbrr   r   )r   z%failed to convert specular-glossinessT)exc_infoNr   )visual.glossrW   rH   r   debug)rP   rW   s     r   _specular_glossinessr[      sK    3Q!:)9!:!PQQ 		9DIs     A A EXT_texture_webpr   c                 *    | d   j                  d      S )z
    Return image source index from EXT_texture_webp.

    Parameters
    ----------
    context
      TextureSourceContext with extension data.

    Returns
    -------
    source_index
      Index into glTF images array, or None if not present.
    r   r4   )get)rP   s    r   _texture_webp_sourcer_      s     6?x((r   )r   typingr   r   r   r   	constantsr   typedr	   r
   r   r   Scoper   r!   r#   r(   r+   rB   r   ParseTexturesr2   r   r:   rC   rT   r[   intr_   r   r   r   <module>rf      s   9 8  2 2 	Y	8i 9 y  Y  C5#:
 d38n,- ,.	4T#w,''( -   d  t  (3 u 7)W:L1M DAc3h(A A
 	AR 7zJ/ htCH~6N  K. $,<=)"6 )8C= ) >)r   