
    kj              
         d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlZd dlmZ d dlmZ d d	lmZ d d
lmZmZ d dl m!Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z'  ej(        e)          Z*dZ+dZ,dZ-dZ.ej/        ej0        ej1        ej2        dZ3 edg d          Z4 e4ddd           e4ddd           e4ddd           e4ddd           e4ddd            e4d!d"d           d#Z5ej/        d$ej0        d%ej1        d&ej2        d'iZ6ddd(d d)Z7 G d* d+e          Z8 G d, d-          Z9 G d. d/          Z: G d0 d1          Z; G d2 d3          Z< G d4 d5          Z= G d6 d7          Z> G d8 d9          Z? G d: d;          Z@ G d< d=          ZA G d> d?          ZB G d@ dA          ZC G dB dC          ZD G dD dE          ZE G dF dG          ZFdS )H    )annotationsN)
namedtuple)Path)AnyOptionalUnion)Image)ImproperlyConfigured)
BaseLoader)t2d)SceneDescriptionTextureDescription)VAO)MaterialMaterialTextureMeshNodeScenes   glTFi)  i/  ip  )        ComponentType)namevaluesizeBYTE      UNSIGNED_BYTEr   SHORT     UNSIGNED_SHORTr   UNSIGNED_INTr      FLOATr   )r   r   r"   r   r   r   u1u2u4f4   )SCALARVEC2VEC3VEC4c                       e Zd ZU dZdZdgdggZddgZded<   d	ed
<   d fdZddZ	d dZ
d dZd dZd dZd dZd dZd dZd dZd!d"dZ xZS )#LoaderzLoader for GLTF 2.0 filesgltf.gltf.glbKHR_draco_mesh_compressionKHR_materials_unlit	list[str]supported_extensionsr   metac                    t                                          |           g | _        g | _        g | _        g | _        g | _        g | _        g | _        d| _	        |  |  dS )zInitialize loading GLTF 2 scene.

        Supported formats:

        - gltf json format with external resources
        - gltf embedded buffers
        - glb Binary format
        N)
super__init__scenesnodesmeshes	materialsimagessamplerstexturespath)selfr:   	__class__s     ^/home/agentuser/manim-venv/lib/python3.11/site-packages/moderngl_window/loaders/scene/gltf2.pyr=   zLoader.__init__X   sg     	#%!#
(*)+.002/1$(	    returnr   c                   | j         j        
J d            |                     | j         j                  | _        | j        s,t          d                    | j         j                            t          t          | j                            | _        | j        j        dk    r| 	                                 | j        j        dk    r| 
                                 | j        
J d            | j                                         | j                            | j                   |                                  |                                  |                                  |                                  |                                  |                                  | j                                         | j                                         | j        S )zsLoad a GLTF 2 scene including referenced textures.

        Returns:
            Scene: The scene instance
        Nz"The path to this resource is emptyzScene '{}' not foundr4   r5   z6There is a problem with your file, could not load gltf)r:   rE   
find_scener
   formatr   strscenesuffix	load_gltfload_glbr3   check_versioncheck_extensionsr9   load_imagesload_samplersload_texturesload_materialsload_meshes
load_nodescalc_scene_bboxpreparerF   s    rH   loadzLoader.loadn   s    y~))+O)))OODIN33	y 	V&'='D'DTY^'T'TUUU3ty>>**
 9w&&NN 9v%%MMOOOy$$&^$$$	!!!	""4#<===
""$$$
zrI   Nonec                    t          t          | j                            5 }t          t          | j                  t	          j        |          | j                  | _        ddd           dS # 1 swxY w Y   dS )z+Loads a gltf json file parsing its contentsN)openrN   rE   GLTFMetajsonr^   r:   r3   rF   fds     rH   rQ   zLoader.load_gltf   s    #di..!! 	KR TY2	JJDI	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	Ks   A A//A36A3c           	        t          t          | j                  d          5 }|                    d          }|t          k    r.t          d                    | j        |t                              t          j        d|                    d                    d         }|dk    rt          | j         d|           t          j        d|                    d                    d         }t          j        d|                    d                    d         }|                    d          }|dk    r(t          d	                    || j                            |                    |          	                                }t          j        d|                    d                    d         }|                    d          }	|	d
k    r(t          d                    |	| j                            t          t          | j                  t          j        |          | j        |                    |                    | _        ddd           dS # 1 swxY w Y   dS )z-Loads a binary gltf file parsing its contentsrbr&   z${} has incorrect header {!r} != {!r}z<Ir   r#   z has unsupported version s   JSONz(Expected JSON chunk, not {!r} in file {}s   BIN z'Expected BIN chunk, not {!r} in file {})binary_bufferN)ra   rN   rE   readGLTF_MAGIC_HEADER
ValueErrorrM   structunpackdecoderb   rc   loadsr:   r3   )
rF   re   magicversion_chunk_0_lengthchunk_0_type	json_metachunk_1_lengthchunk_1_types
             rH   rR   zLoader.load_glb   s^   #di..$'' (	2GGAJJE))) :AA	5*;    mD"''!**55a8G!|| DI!Q!Q!Q!QRRR dBGGAJJ//2A $]4<<Q?N771::Lw&& >EElTXT]^^   //6688I $]4<<Q?N771::Lz)) =DD\SWS\]]   !DI
9%%	 ggn55	  DIG(	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	s   H'IIIc                    | j         j        D ]9}| j                            |                    | j        j                             :dS )z'Load images referenced in gltf metadataN)r3   rB   appendr^   rE   parent)rF   images     rH   rU   zLoader.load_images   sJ    Y% 	= 	=EKuzz$)*:;;<<<<	= 	=rI   c           
        | j         j        D ]}|j        |j        cxu rPn nM| j                            | j                            t          j        t          j	        fddd                     c| j                            | j                            |j        |j        f|j
        t          t          fv |j        t          t          fv d                     dS )z)Load samplers referenced in gltf metadataNF      0@)filterrepeat_xrepeat_y
anisotropy)r3   rC   	minFilter	magFilterry   ctxsamplermodernglLINEAR_MIPMAP_LINEARLINEARwrapSREPEATMIRRORED_REPEATwrapT)rF   r   s     rH   rV   zLoader.load_samplers   s    y) 	 	G  G$5========$$H$$ ( =xO!&!&#'	 %      $$H$$ ' 173DE!(6?2K!K!(6?2K!K#'	 %     	 	rI   c                    | j         j        D ]f}t                      }|j        | j        |j                 |_        |j        | j        |j                 |_        | j                            |           gdS )z)Load textures referenced in gltf metadataN)	r3   rD   r   sourcerB   texturer   rC   ry   )rF   texture_metar   s      rH   rW   zLoader.load_textures   sx     I. 		* 		*L%''G"."&+l.A"B#/"&-0D"EM  ))))		* 		*rI   c                    | j         j        D ]Z}|                    | j                  }| j                            |           |D ]!}| j        j                            |           "[dS )z'Load meshes referenced in gltf metadataN)r3   r@   r^   rA   ry   rO   )rF   	meta_meshr@   meshs       rH   rY   zLoader.load_meshes   sy    ) 	/ 	/I^^DN33FKv&&& / /
!((..../	/ 	/rI   c                :   | j         j        D ]}t          |j                  }|j        pd|_        |j        |_        |j        | j	        |j        d                  |_
        | j                            |           | j        j                            |           dS )z*Load materials referenced in gltf metadata)      ?r   r   r   Nindex)r3   rA   r   r   baseColorFactorcolordoubleSideddouble_sidedbaseColorTexturerD   mat_texturery   rO   )rF   meta_matmats      rH   rX   zLoader.load_materials   s     	+ 		- 		-H8=))C 0H4HCI'3C(4"&-0I'0R"SN!!#&&&J '',,,,		- 		-rI   c                    | j         j        d         j        D ]F}|                     | j         j        |                   }| j        j                            |           GdS )z&Load nodes referenced in gltf metadatar   N)r3   r>   r?   	load_noderO   
root_nodesry   )rF   node_idnodes      rH   rZ   zLoader.load_nodes  s`     y'*0 	/ 	/G>>$)/'":;;DJ!((....	/ 	/rI   NGLTFNoderz   Optional[Node]r   c                   t          |j        |j                  }| j        j                            |           |j        t          | j        |j                           dk    r| j        |j                 d         |_        n[t          | j        |j                           dk    r8| j        |j                 D ]%}|	                    t          |                     &|j
        | j        j        |j
                 |_
        |r|	                    |           |j        r1|j        D ])}|                     | j        j        |         |           *|S )zLoad a single node)r   matrixNr   r   )r   )rz   )r   r   r   rO   r?   ry   r   lenr@   	add_childcamerar3   camerashas_childrenchildrenr   )rF   r:   rz   r   r   r   s         rH   r   zLoader.load_node  s@    4;777
%%%9  4;ty)**a// K	215		T[+,,q00 K	2 4 4DNN4T???3333;")+DK8DK 	#T"""  	F= F Ftyw7EEEErI   )r:   r   )rJ   r   rJ   r_   N)r:   r   rz   r   rJ   r   )__name__
__module____qualname____doc__kindfile_extensionsr9   __annotations__r=   r^   rQ   rR   rU   rV   rW   rY   rX   rZ   r   __classcell__)rG   s   @rH   r2   r2   G   s`        ##D			O 	%'    
      ,# # # #JK K K K
* * * *X= = = =
   0* * * */ / / /- - - -/ / / /        rI   r2   c                  `    e Zd ZdZ	 dddZddZedd            ZdddZddZ	ddZ
ddZdS ) rb   zContainer for gltf metadataNrE   Union[Path, str]datadict[Any, Any]r:   r   rh   Optional[bytes]rJ   r_   c                    t          |t                    rt          |          n| _        | _        | _        t          |d                    _        |                    d          rd |d         D             ng  _	        |                    d          rd |d         D             ng  _
        |                    d          rd |d         D             ng  _        |                    d          rd	 |d         D             ng  _        |                    d
          rd |d
         D             ng  _        |                    d          rd |d         D             ng  _        |                    d          r fd|d         D             ng  _        |                    d          rd |d         D             ng  _        |                    d          rd t#          |d                   D             ng  _        |                    d          r! fdt#          |d                   D             ng  _        |                    d          rd t#          |d                   D             ng  _        |r| j        d         _                                                                                                              dS )z
        :param file: GLTF file name loaded
        :param data: Metadata (json loaded)
        :param binary_buffer: Binary buffer when loading glb files
        assetrA   c                ,    g | ]}t          |          S  )GLTFMaterial).0ms     rH   
<listcomp>z%GLTFMeta.__init__.<locals>.<listcomp>A  s    888\!__888rI   rB   c                ,    g | ]}t          |          S r   )	GLTFImage)r   is     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>C      <<<y||<<<rI   rC   c                ,    g | ]}t          |          S r   )GLTFSamplerr   ss     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>D      BBBAQBBBrI   rD   c                ,    g | ]}t          |          S r   )GLTFTexture)r   ts     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>E  r   rI   r>   c                ,    g | ]}t          |          S r   )	GLTFScener   s     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>F  r   rI   r?   c                ,    g | ]}t          |          S r   )r   )r   ns     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>G  s    999ahqkk999rI   r@   c                :    g | ]}t          |j                  S r   )GLTFMeshr:   )r   r   rF   s     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>H  s%    FFF!x49--FFFrI   r   c                ,    g | ]}t          |          S r   )
GLTFCamera)r   cs     rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>I  s    ???!
1???rI   bufferViewsc                4    g | ]\  }}t          ||          S r   )GLTFBufferView)r   r   vs      rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>K  s&    MMMda^Aq!!MMMrI   buffersc                L    g | ] \  }}t          ||j        j                  !S r   )
GLTFBufferrE   rz   )r   r   brF   s      rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>P  s.    WWWDAqZ1di.//WWWrI   	accessorsc                4    g | ]\  }}t          ||          S r   )GLTFAccessor)r   r   as      rH   r   z%GLTFMeta.__init__.<locals>.<listcomp>U  s&    IIIDAq\!QIIIrI   r   N)
isinstancerN   r   rE   r   r:   	GLTFAssetr   getrA   rB   rC   rD   r>   r?   r@   r   	enumeratebuffer_viewsr   r   
_link_databuffers_existimages_exist)rF   rE   r   r:   rh   s   `    rH   r=   zGLTFMeta.__init__/  s    #-T3"7"7ADJJJT			tG}--
<@HH[<Q<QY88d;&78888WY 	 AE@R@RZ<<T(^<<<<XZFJhhzFZFZbBBj1ABBBB`bFJhhzFZFZbBBj1ABBBB`b@D@R@RZ<<T(^<<<<XZ=AXXg=N=NV994=9999TV
JN((S[J\J\dFFFFtH~FFFFbdCG88ICVCV^??tI????\^ xx&&MMi]8K.L.LMMMM 	 xx	""WWWWId9o<V<VWWWW 	 xx$$IIId;6G,H,HIIII 	  	1#0DLO rI   c                $   | j         D ]}| j        |j                 |_        | j        D ]}| j        |j                 |_        | j        D ]}|j        D ]}|j	        
                    d          r%|j	        d         }|d         }| j        |         |d<   |j        | j         |j                 |_        |j                                        D ]\  }}| j         |         |j        |<   | j        D ] }	|	j        | j        |	j                 |	_        !dS )zAdd referencesr6   
bufferViewN)r   r   bufferViewIdr   r   bufferIdbufferr@   
primitives
extensionsr   indicesaccessor
attributesitemsrB   )
rF   accbuffer_viewr   	primitiveextbuffer_view_idr   r   r{   s
             rH   r   zGLTFMeta._link_datac  sa    > 	A 	AC!.s/?@CNN, 	D 	DK!%k.B!CK K 	G 	GD!_ 
G 
G	'++,HII J#./KLC%(%6N(,(9.(IC%$0)-	8I)JI&#,#7#=#=#?#? G GKD%151FI(..G
G [ 	I 	IE!-#'#4U5G#H 	I 	IrI   rN   c                    | j         j        S r   )r   rq   r]   s    rH   rq   zGLTFMeta.version  s    z!!rI   2.0requiredc                ^    | j         |k    s!d| j          d| j         }t          |          d S )Nz0GLTF Format version is not 2.0. Version states 'z
' in file )rq   rE   rk   )rF   r   msgs      rH   rS   zGLTFMeta.check_version  sL    |x'''4< ' '9' '  S//! ('rI   	supportedr8   c                    | j                             d          }||D ]}||vrt          d| d          | j                             d          }||D ]}||vrt          d| d          dS dS )z
        "extensionsRequired": ["KHR_draco_mesh_compression"],
        "extensionsUsed": ["KHR_draco_mesh_compression"]
        extensionsRequiredNzExtension 'z' not supportedextensionsUsed)r   r   rk   )rF   r  extReqr   extUses        rH   rT   zGLTFMeta.check_extensions  s    
 344 I Ii''$%G3%G%G%GHHH (/00 I Ii''$%G3%G%G%GHHH ( I IrI   c                    | j         D ]M}|j        s
| j        j        |j        z  }|                                st          d| d| j         d          NdS )z(Checks if the bin files referenced existzBuffer z referenced in z
 not foundN)r   is_separate_filerE   rz   uriexistsFileNotFoundError)rF   buffrE   s      rH   r   zGLTFMeta.buffers_exist  s{    L 	 	D( 9#dh.D;;== 'HdHH49HHH  	 	rI   c                    dS )z1checks if the images references in textures existNr   r]   s    rH   r   zGLTFMeta.images_exist  s    rI   r   )
rE   r   r   r   r:   r   rh   r   rJ   r_   r   rJ   rN   )r   )r   rN   rJ   r_   )r  r8   rJ   r_   )r   r   r   r   r=   r   propertyrq   rS   rT   r   r   r   rI   rH   rb   rb   ,  s        %% *.2 2 2 2 2hI I I I8 " " " X"" " " " "I I I I 
 
 
 
     rI   rb   c                      e Zd ZdZddZdS )r   zAsset Informationr   dict[str, Any]c                    |                     d          | _        |                     d          | _        |                     d          | _        d S )Nrq   	generator	copyright)r   rq   r  r  rF   r   s     rH   r=   zGLTFAsset.__init__  s?    xx	**+..+..rI   Nr   r  )r   r   r   r   r=   r   rI   rH   r   r     s.        / / / / / /rI   r   c                  P    e Zd Z G d d          ZddZddZddZddZddZdS )r   c                      e Zd ZddZdS )GLTFMesh.Primitivesr   r  c                   |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        |                     di           | _        |  d S )Nr   r   modematerialr   )r   r   r   r  r  r   r  s     rH   r=   zGLTFMesh.Primitives.__init__  so    .2hh|.D.DDO $ 3 3DL!XXf--DI HHZ00DM"hh|R88DO'''rI   Nr  r   r   r   r=   r   rI   rH   
Primitivesr    s(        	( 	( 	( 	( 	( 	(rI   r   r   r  r:   r   c                x    || _         |                    dd          | _        d |d         D             | _        d S )Nr    c                B    g | ]}t                               |          S r   )r   r   )r   ps     rH   r   z%GLTFMesh.__init__.<locals>.<listcomp>  s&    NNNa8..q11NNNrI   r   )r:   r   r   r   )rF   r   r:   s      rH   r=   zGLTFMesh.__init__  s<    	HHVR((	NN4;MNNNrI   rA   list[Material]rJ   
list[Mesh]c                X
   | j         j        j        | j         j        j        | j         j        j        | j         j        j        | j         j        j        | j         j        j        | j         j        j        dt          j
                    }g }| j        D ]}|j                            d          r|j        d         d         }|                                }	 dd l}n# t           $ r t!          d          w xY w|                    |          }dd         ddd	i}	t%          | j        |j        pt*          j        
          }
|j        Y|j                                        r@|
                    |                    |j                            d                               |
                    |j                            d          dd                    |j        p|j                                        rW|
                    |                    |j                            d                    dd                    d         ddd	|	d<   |j        p|j                                        rW|
                    |                    |j                            d                    dd                    d         ddd	|	d<   |j        p|j                                        rW|
                    |                    |j                            d                    dd                    d         ddd	|	d<   |                      |          \  }}|!                    tE          | j        |
|	|j#        ||j#                 nd ||                     t%          | j        |j        pt*          j        
          }
| $                    |          \  }}|A|
                    |                    |%                                          |j&                   i }	| '                    |          }|D ]}|(                                \  }|
                    |d)                    fd|j*        D                       fd|j*        D                        |j*        D ]-}|d                  |d         |j+        j,        d	|	|d         <   .|                      |          \  }}|!                    tE          | j        |
|	|j#        ||j#                 nd ||                     |S )N)POSITIONNORMAL
TEXCOORD_0TANGENTJOINTS_0	WEIGHTS_0COLOR_0r6   r   r   z3DracoPy is required to load draco compressed meshesr(  r,   r   )r   
componentstype)r  i4r+   3f2fr*  r#   r)  4fr.  r&   )vaor   r  bbox_minbbox_max)index_element_size c                ^    g | ])}d                      |d         t                             *S )z{}{}r   )rM   DTYPE_BUFFER_TYPE)r   attrdtypes     rH   r   z!GLTFMesh.load.<locals>.<listcomp>)  sA       $( !'d1g7H7O P P  rI   c                ,    g | ]}|d                   S r   r   )r   r<  name_maps     rH   r   z!GLTFMesh.load.<locals>.<listcomp>.  s"    KKKt$q'*KKKrI   r   )-r:   
attr_namesr(  r)  r*  r+  r,  r-  r.  moderngl_windowr   r   r   r   read_rawDracoPyImportErrorrn   r   r   r  r   	TRIANGLESfacesanyindex_bufferr   astypepoints	tex_coordnormalscolorsget_bboxry   r   r  load_indicestobytesr   prepare_attrib_mappingcreatejoinr   component_typer   )rF   rA   r   r@   r   r   r   rD  r   r   r5  r6  r7  rU  	index_vbovbosvbo_infor   r<  r=  r@  s                      @@rH   r^   zGLTFMesh.load  s   	,5i*1).9y+3	,5-7y+3
 
 !##
  p	 p	I#''(DEE n'23OPQ]^"++--]"NNNN" ] ] ]%&[\\\]~~d++  ( 4&' $! !
 $)).*NH<NOOO:)djnn.>.>)$$SZZ
0A0A$0G0G%H%HIII

4;--d33T8J;OPPP>-$.2D2D2F2F-JJ

4>#8#8#>#>?? .   !) 6&' $0 0J|,
 <+0@0@0B0B+JJszz$,*=*=d*C*CDDdHU]L^___ ( 2&' $, ,Jx(
 ;*t{/@/@*JJszz$+*<*<T*B*BCCT8T]K^___ ( 3&' $- -Jy) &*]]9%=%="(	#-  )1= &i&899CG!)!)
 
 
    $)).*NH<NOOO -1,=,=i,H,H)	($$

9#4#4#6#677+9+> %   
  
229== $  H$,OO$5$5ME6JJ   ,4,?    LKKKx7JKKK	 	 	 !) 3  $,T!W$5*.q'$,$;$A/ /
47++ &*]]9%=%="(	#-  )1= &i&899CG!)!)
 
 
    s   CC7r   :tuple[ComponentType, npt.NDArray[Any]] | tuple[None, None]c                d    |j         |j        dS |j                                        \  }}}||fS )z5Loads the index buffer / polygon list for a primitiveN)NN)r   r   ri   )rF   r   rr   rU  r   s        rH   rP  zGLTFMesh.load_indicesI  s@     $	(:(B:$-$6$;$;$=$=!>6v%%rI   list[VBOInfo]c                   g }|j                                         D ]\  }}t          |                                 }|j                             ||j        f           |rM|d         j        |j        k    r7|d                             |          r|d                             |           |                    |           |S )zQPre-parse buffer mappings for each VBO to detect interleaved data for a primitive)	r   r   VBOInfoinfory   r/  r   interleavesmerge)rF   r   buffer_infor   r   r_  s         rH   rR  zGLTFMesh.prepare_attrib_mappingS  s    %''288:: 		% 		%ND(HMMOO,DO""D$/#:;;; {2:d>NNNr?..t44 O))$///t$$$$rI   tuple[glm.vec3, glm.vec3]c                    |j                             d          }t          j        |j                  t          j        |j                  fS )z!Get the bounding box for the meshr(  )r   r   glmvec3minmax)rF   r   r   s      rH   rO  zGLTFMesh.get_bboxc  s;    '++J77x%%sx'='===rI   N)r   r  r:   r   )rA   r%  rJ   r&  )r   r   rJ   rY  )r   r   rJ   r[  )r   r   rJ   rc  )	r   r   r   r   r=   r^   rP  rR  rO  r   rI   rH   r   r     s        ( ( ( ( ( ( ( (O O O O
C C C CJ& & & &    > > > > > >rI   r   c            	      h    e Zd ZdZdddd eddd          ddfddZddZddZddZddZ	ddZ
dS ) r^  zResolved data about each VBONr   r"  r   Optional[GLTFBuffer]r   byte_lengthintbyte_offsetrU  r   r/  countc                v    || _         || _        || _        || _        || _        || _        || _        g | _        d S r   )r   r   rk  rm  rU  r/  rn  r   )rF   r   r   rk  rm  rU  r/  rn  s           rH   r=   zVBOInfo.__init__l  sF     &&&,$
 &(rI   r_  rJ   boolc                V    t          |j        | j        j        | j        z  k              S )z)Does the buffer interleave with this one?)rp  rm  rU  r   r/  rF   r_  s     rH   r`  zVBOInfo.interleaves  s%    D$)<)ADO)STUUUrI   r_   c                Z    | xj         |j         z  c_         | xj        |j        z  c_        d S r   )r/  r   rr  s     rH   ra  zVBOInfo.merge  s*    4?*4?*rI   %tuple[type[object], npt.NDArray[Any]]c                    | j         
J d            t          | j        j                 }t	          j        | j                             | j        | j                  | j	        | j
        z  |          }||fS )zCreate the VBONNo buffer defined)rk  rm  rn  r=  )r   NP_COMPONENT_DTYPErU  r   numpy
frombufferri   rk  rm  rn  r/  )rF   r=  r   s      rH   rS  zVBOInfo.create  sy    {&&(;&&&"4#6#<=K)9tGWXX*t.
 
 

 d{rI   rN   c           
         | j         
J d            | j        
J d            d                    | j         j        | j        j        | j        | j        | j        | j        j        | j	        | j
                  S )Nrv  zNo buffer_view definedzVBOInfo<buffer={}, buffer_view={},
        length={}, offset={}, count={}
        component_type={}, components={}, 
        attribs={})r   r   rM   idrk  rm  rn  rU  r   r/  r   r]   s    rH   __str__zVBOInfo.__str__  s    {&&(;&&&++-E+++! "( #  
#)	" 	"		
rI   c                     t          |           S r   )rN   r]   s    rH   __repr__zVBOInfo.__repr__  s    4yyrI   )r   rj  r   rj  rk  rl  rm  rl  rU  r   r/  rl  rn  rl  )r_  r^  rJ   rp  )r_  r^  rJ   r_   )rJ   rt  r  )r   r   r   r   r   r=   r`  ra  rS  r}  r  r   rI   rH   r^  r^  i  s        && (,,0(5b!Q(?(?( ( ( ( (*V V V V+ + + +
	 	 	 	
 
 
 
&     rI   r^  c                  6    e Zd ZddZddZdd
ZddZddZdS )r   accessor_idrl  r   r  c                   || _         |                    dd          | _        |  |                    dd          | _        t          |d                  | _        |                    dd          | _        |                    dd          | _        t          j	        |                    d	          pg d
d          | _
        t          j	        |                    d          pg dd          | _        d S )Nr   r   
byteOffsetcomponentTypern  r   r0  r"  rg  )      r  r  r+   )r=  rh  )      ?r  r  )r|  r   r   r  COMPONENT_TYPEr  rn  r0  ry  arrayrg  rh  )rF   r  r   s      rH   r=   zGLTFAccessor.__init__  s     HH\155'((<33+D,ABXXgq))
&"--	;txxD2D2D2DDQQQ;txxA///NNNrI   rJ   +tuple[int, ComponentType, npt.NDArray[Any]]c           	         t           | j        j                 }t          | j                 | j        | j                            | j        || j        t          | j                 z            fS )zf
        Reads buffer data

        Return:
            component count, component type, data
        )rm  r=  rn  )	rx  r  r   ACCESSOR_TYPEr0  r   ri   r  rn  )rF   r=  s     rH   ri   zGLTFAccessor.read  sa     #4#5#;<$)$O   Oj=#;; !  
 	
rI   bytesc                B    | j                             | j                  S )z
        Read the raw bytes. Useful for draco compressed meshes or any data that
        is not a simple vertex buffer.
        rm  )r   rC  r  r]   s    rH   rC  zGLTFAccessor.read_raw  s    
 ''DO'DDDrI   Dtuple[GLTFBuffer, GLTFBufferView, int, int, ComponentType, int, int]c                    | j                             | j                  \  }}}|| j         ||| j        t          | j                 | j        fS )z
        Get underlying buffer info for this accessor

        Return:
            buffer, byte_length, byte_offset, component_type, count
        r  )r   r_  r  r  r  r0  rn  )rF   r   rk  rm  s       rH   r_  zGLTFAccessor.info  sR     ,0?+?+?DO+?+\+\([O$)$J
 	
rI   rN   c                p    d                     | j        | j        | j        | j        j        | j                  S )NzIAccessor<id={}, bufferView={}, byteOffset={}, componentType={}, count={}>)rM   r|  r   r  r  r   rn  r]   s    rH   r}  zGLTFAccessor.__str__  s6    ZaaGT&9K9PRVR\
 
 	
rI   N)r  rl  r   r  )rJ   r  )rJ   r  )rJ   r  r  r   r   r   r=   ri   rC  r_  r}  r   rI   rH   r   r     s        
O 
O 
O 
O
 
 
 
&E E E E
 
 
 
$
 
 
 
 
 
rI   r   c                  >    e Zd ZddZ	 dddZdddZdddZddZdS )r   view_idrl  r   r  c                    || _         |                    dd          | _        |  |                    dd          | _        |                    dd          | _        |                    dd          | _        d S )Nr   r   r  
byteLength
byteStride)r|  r   r   r  r  r  )rF   r  r   s      rH   r=   zGLTFBufferView.__init__  sg    1--((<33((<33((<33rI   r   Nrm  r=  Optional[type[object]]rn  rJ   npt.NDArray[Any]c                    | j                             || j        z   | j                  }t	          j        |||          }|S )Nrm  rk  rw  )r   ri   r  r  ry  rz  )rF   rm  r=  rn  r   vbos         rH   ri   zGLTFBufferView.read  sM     {#do5   
 
 t5>>>
rI   r  c                T    | j                             | j        |z   | j                  S )Nr  )r   ri   r  r  rF   rm  s     rH   rC  zGLTFBufferView.read_raw  s0    {+5   
 
 	
rI   tuple[GLTFBuffer, int, int]c                0    | j         | j        || j        z   fS )z
        Get the underlying buffer info
        :param byte_offset: byte offset from accessor
        :return: buffer, byte_length, byte_offset
        )r   r  r  r  s     rH   r_  zGLTFBufferView.info  s     {DO[4?-JJJrI   rN   c                Z    d                     | j        | j        | j        | j                  S )Nz:BufferView<id={}, buffer={}, byteOffset={}, byteLength={}>)rM   r|  r   r  r  r]   s    rH   r}  zGLTFBufferView.__str__  s+    KRRGT]DOT_
 
 	
rI   )r  rl  r   r  )r   Nr   )rm  rl  r=  r  rn  rl  rJ   r  r?  )rm  rl  rJ   r  )rm  rl  rJ   r  r  r  r   rI   rH   r   r     s        4 4 4 4 XY    
 
 
 
 
K K K K K
 
 
 
 
 
rI   r   c                  X    e Zd ZddZedd
            Zedd            ZddZdddZdS )r   	buffer_idrl  r   dict[str, str]rE   r   c                    || _         || _        |                    d          | _        |                    d          }|d}|| _        d| _        d S )Nr  r  r"  rI   )r|  rE   r   r  r  r   )rF   r  r   rE   r  s        rH   r=   zGLTFBuffer.__init__  sN    	((<00hhuoo;C			rI   rJ   rp  c                P    | j         dk    rdS | j                             d          S )zIs data embedded in json?r"  Fdata:)r  
startswithr]   s    rH   has_data_urizGLTFBuffer.has_data_uri  s*     8r>>5x""7+++rI   c                $    | j         duo| j         S )z*Buffer represents an independent bin file?N)r  r  r]   s    rH   r
  zGLTFBuffer.is_separate_file&  s     xt#=D,=(==rI   r_   c                ~   | j         dk    rd S | j        rCt          j        | j        | j                            d          dz   d                    | _         d S t          t          | j        | j        | j        ndz            d          5 }|	                                | _         d d d            d S # 1 swxY w Y   d S )NrI   ,r   r"  rg   )
r   r  base64	b64decoder  findra   rN   rE   ri   rd   s     rH   ra   zGLTFBuffer.open+  s    9F 	($(--2D2Dq2H2J2J)KLLDIF#ditx/C488LMMtTT 	"XZ		DI	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   B22B69B6r   rm  rk  r  c                N    |                                   | j        |||z            S r   )ra   r   )rF   rm  rk  s      rH   ri   zGLTFBuffer.read6  s&    		y{['@@AArI   N)r  rl  r   r  rE   r   rJ   rp  r   )r   r   )rm  rl  rk  rl  rJ   r  )	r   r   r   r=   r  r  r
  ra   ri   r   rI   rH   r   r     s            , , , X, > > > X>	" 	" 	" 	"B B B B B B BrI   r   c                      e Zd ZddZdS )r   r   dict[str, list[int]]c                     |d         | _         d S )Nr?   )r?   r  s     rH   r=   zGLTFScene.__init__<  s    ']


rI   N)r   r  r  r   rI   rH   r   r   ;  s(        # # # # # #rI   r   c                  F    e Zd Zd
dZedd            Zedd            Zd	S )r   r   r  rJ   r_   c                   |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        |                     d          }|t          j        | nt          j                    | _        |                     d          | _        |                     d          | _	        |                     d          | _
        | j        0t          j        | j        t          j        | j                   | _        | j	        et          j        | j	        d	         | j	        d
         | j	        d         | j	        d                   }| j        t          j        |          z  | _        | j
        2t          j
        | j        t          j        | j
                   | _        d S d S )Nr   r   r   r   r   translationrotationscaler   r   r#   r,   )xyzw)r   r   r   r   r   re  mat4r   r  r  r  	translaterf  quat	mat4_cast)rF   r   _matrixr  s       rH   r=   zGLTFNode.__init__A  sq   HHV$$	,,HHV$$	hhx((((8$$,3,?ch((SXZZ88M22,,XXg&&
'-SXt?O5PQQDK=$8-"-"-"-"	  D +d(;(;;DK:!)DK4:1FGGDKKK "!rI   rp  c                D    | j         d uot          | j                   dk    S )Nr   )r   r   r]   s    rH   r   zGLTFNode.has_children]  s#    }D(CS-?-?!-CCrI   c                &    | j         dup| j        duS )z,Is this just a reference node to a resource?N)r   r   r]   s    rH   is_resource_nodezGLTFNode.is_resource_nodea  s     {$&?$)4*??rI   N)r   r  rJ   r_   r  )r   r   r   r=   r  r   r  r   rI   rH   r   r   @  sv        H H H H8 D D D XD @ @ @ X@ @ @rI   r   c                      e Zd ZddZdS )r   r   r  c                R   |                     d          | _        |                     d          pd| _        |d         }|                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        d S )	Nr   r   TpbrMetallicRoughnessr   r   metallicFactoremissiveFactor)r   r   r   r   r   r  r  )rF   r   pbrs      rH   r=   zGLTFMaterial.__init__h  s    HHV$$	88M22:d)*"ww'899 #(: ; ;!gg&677"hh'788rI   Nr  r  r   rI   rH   r   r   g  s(        	9 	9 	9 	9 	9 	9rI   r   c                  "    e Zd ZdZddZdd	Zd
S )r   zc
    Represent texture data.
    May be a file, embedded data or pointer to data in bufferview
    r   r  c                    |                     d          | _        |                     d          | _        d | _        |                     d          | _        d S )Nr  r   mimeType)r   r  r   r   r  r  s     rH   r=   zGLTFImage.__init__z  sE    88E?? HH\22,,rI   rE   r   rJ   moderngl.Texturec           	        | j         >t          j        t          j        | j                                                             }n| j        r| j                            d          r}| j        | j                            d          dz   d          }t          j        t          j        t          j
        |                              }t                              d           nT|t          | j        | j        nd          z  }t                              d| j                   t          j        |          }t          j        t!          d|dd	d
                                                    }|S )Nr  r  r   zLoading embedded imager"  zLoading: %sr3   FTr}   )labelr{   flipmipmapr   )r   r	   ra   ioBytesIOrC  r  r  r  r  r  loggerr_  r   r   r2   r   r^   )rF   rE   r{   r   r   s        rH   r^   zGLTFImage.load  s@    ?&Jrz$/*B*B*D*DEEFFEEX 	%$(--g66 	%8DHMM#..2445DJrz&*:4*@*@AABBEKK01111$48+?txxRHHHDKKtx000Jt$$E*  
 
 $&& 	 rI   Nr  )rE   r   rJ   r  )r   r   r   r   r=   r^   r   rI   rH   r   r   t  sF         
- - - -     rI   r   c                      e Zd ZddZdS )r   r   dict[str, int]c                n    |                     d          | _        |                     d          | _        d S )Nr   r   )r   r   r   r  s     rH   r=   zGLTFTexture.__init__  s,    &*hhy&9&9%)XXh%7%7rI   N)r   r  r  r   rI   rH   r   r     s(        8 8 8 8 8 8rI   r   c                      e Zd Zd ZdS )r   c                    |                     d          | _        |                     d          | _        |                     d          | _        |                     d          | _        d S )Nr   r   r   r   )r   r   r   r   r   r  s     rH   r=   zGLTFSampler.__init__  sR    +..+..XXg&&
XXg&&


rI   Nr  r   rI   rH   r   r     s#        ' ' ' ' 'rI   r   c                      e Zd ZddZdS )r   r   r  c                    || _         d S r   )r   r  s     rH   r=   zGLTFCamera.__init__  s    			rI   N)r   r  r  r   rI   rH   r   r     s(             rI   r   )G
__future__r   r  r  rc   loggingrl   collectionsr   pathlibr   typingr   r   r   re  r   ry  numpy.typingnptPILr	   rB  moderngl_window.exceptionsr
   moderngl_window.loaders.baser   moderngl_window.loaders.texturer   moderngl_window.metar   r   moderngl_window.opengl.vaor   moderngl_window.scener   r   r   r   r   	getLoggerr   r  rj   r   CLAMP_TO_EDGEr   uint8uint16uint32float32rx  r   r  r;  r  r2   rb   r   r   r^  r   r   r   r   r   r   r   r   r   r   r   rI   rH   <module>r     s   " " " " " "  				    " " " " " "       ' ' ' ' ' ' ' ' ' ' 



                   ; ; ; ; ; ; 3 3 3 3 3 3 / / / / / / E E E E E E E E * * * * * * N N N N N N N N N N N N N N		8	$	$  
 +
,
,
-	   
?,E,E,EFF -a
(
(
-q
1
1
-q
)
)
-($
2
2
-a
0
0
-q
)
)  
K	L$	L$	M4	  	 b b b b bZ b b bJ} } } } } } } }@/ / / / / / / /q> q> q> q> q> q> q> q>h@ @ @ @ @ @ @ @F<
 <
 <
 <
 <
 <
 <
 <
~%
 %
 %
 %
 %
 %
 %
 %
P%B %B %B %B %B %B %B %BP# # # # # # # #
$@ $@ $@ $@ $@ $@ $@ $@N
9 
9 
9 
9 
9 
9 
9 
9& & & & & & & &R8 8 8 8 8 8 8 8' ' ' ' ' ' ' '         rI   