Ë
    CiÆjä  ã            	       óÄ   — d Z ddlZddlZddlZd\  ZZZd„ Zd„ Zd„ Z	d„ Z
d„ Zed	k(  r8ddlZej                  d
d D ]!  Z ee ej"                   ee«      «      «       Œ# yy)aY  Measure a .glb without any dependency: world bounds, triangles, draw calls, materials, textures, nodes, rig, clips.

Bounds come from the POSITION accessor min/max (mandatory in glTF) pushed through each node's world matrix, so they
are the box around the transformed accessor boxes (exact for unrotated parts, a little loose for rotated ones).
é    N)é   é   é   c                 ó˜  — t        | d«      j                  «       }t        j                  d|d«      \  }}}|dk7  rt	        | › d�«      ‚d\  }}}|t        |«      k  rat        j                  d||«      \  }}	||dz   |dz   |z    }
|	d	k(  rt        j                  |
«      }n|	d
k(  r|
}|d|z   z  }|t        |«      k  rŒa||t        |«      fS )NÚrbz<4sIIr   s   glTFz: not a GLB)é   Nó    z<I4sé   s   JSONs   BIN )ÚopenÚreadÚstructÚunpack_fromÚ
ValueErrorÚlenÚjsonÚloads)ÚpathÚdataÚmagicÚversionÚlengthÚoffÚdocÚbincÚclenÚctypeÚchunks              ú6/home/claude-agent/forge-build/forge-assets/lib/glb.pyr   r      sâ   € Ü��dÓ× Ñ Ó"€DÜ#×/Ñ/°¸¸qÓAÑ€Eˆ7�FØ�ÒÜ˜D˜6 Ð-Ó.Ð.Ø"�N€CˆˆdØ
”�D“	Š/Ü×(Ñ(¨°°sÓ;‰ˆˆeØ�S˜1‘W˜c A™g¨™nÐ-ˆØ�GÒÜ—*‘*˜UÓ#‰CØ�jÒ ØˆDØˆq�4‰x‰ˆð ”�D“	‹/ð �”c˜$“iÐÐr	   c           
      óÊ  — d| v r@| d   }t        d«      D ��cg c]$  }t        d«      D �cg c]  }||dz  |z      ‘Œ c}‘Œ& c}}S | j                  dg d¢«      }| j                  dg d¢«      }| j                  dg d¢«      }|\  }}}	}
d	d
||z  |	|	z  z   z  z
  d
||z  |	|
z  z
  z  d
||	z  ||
z  z   z  gd
||z  |	|
z  z   z  d	d
||z  |	|	z  z   z  z
  d
||	z  ||
z  z
  z  gd
||	z  ||
z  z
  z  d
||	z  ||
z  z   z  d	d
||z  ||z  z   z  z
  gg}t        d«      D �cg c]/  }||   d   |d   z  ||   d	   |d	   z  ||   d
   |d
   z  ||   g‘Œ1 c}g d¢gz   S c c}w c c}}w c c}w )NÚmatrixr   Útranslation©r   r   r   Úrotation)r   r   r   é   Úscale)r$   r$   r$   r$   é   é   r   )ÚrangeÚget)ÚnÚmÚrÚcÚtÚqÚsÚxÚyÚzÚwÚis               r   Ú_matr6      s¾  € Ø�1�}Øˆh‰KˆÜ:?À»(×C°Q¤u¨Q£xÖ0 !��1�q‘5˜1‘9“Ô0ÓCÐCØ	�‰ˆmšYÓ'€A¨Q¯U©U°:º|Ó-L¨ÐRS×RWÑRWÐX_ÒajÓRkÈaØ�J€A€qˆ!ˆQØ
ˆa�1�q‘5˜1˜q™5‘=Ñ!Ñ
! 1¨¨A©°°A±©Ñ#6¸¸QÀ¹UÀQÈÁU¹]Ñ8KÐ	LØ
ˆq�1‰u�q˜1‘u‰}Ñ
˜q 1¨¨A©°°A±©Ñ#6Ñ6¸¸QÀ¹UÀQÈÁU¹]Ñ8KÐ	LØ
ˆq�1‰u�q˜1‘u‰}Ñ
˜q A¨¡E¨A°©E¡MÑ2°A¸¸QÀ¹UÀQÈÁU¹]Ñ8KÑ4KÐ	Lð	N€Aô MRÐRSËHÖUÀqˆQˆq‰T�!‰W�q˜‘t‰^˜Q˜q™T !™W q¨¡t™^¨Q¨q©T°!©W°q¸±t©^¸Q¸q¹TÒBÒUÒYeÐXfÑfÐfùò 1ùÓCùò Vs   ˜EªE¼EÄ4E ÅEc                 óÆ   ‡ ‡‡‡— t        d«      D �‡�‡cg c]:  Št        d«      D �‡cg c]"  Št        ˆ ˆˆˆfd„t        d«      D «       «      ‘Œ$ c}‘Œ< c}}S c c}w c c}}w )Nr   c              3   ó@   •K  — | ]  }‰‰   |   ‰|   ‰   z  –— Œ y ­w)N© )Ú.0ÚkÚaÚbr5   Újs     €€€€r   ú	<genexpr>z_mul.<locals>.<genexpr>)   s&   øè ø€ Ò5 q��1‘�a‘˜1˜Q™4 ™7Õ"Ñ5ùs   ƒ)r(   Úsum)r<   r=   r5   r>   s   ````r   Ú_mulrA   (   sA   û€ ÜRWÐXYÓRZ×[Ñ[ÈQ¼uÀQ»x×H¸!ŒSÖ5¬E°!«HÔ5Õ5ÔHÓ[Ð[ùÒHùÓ[s   •A¨'AÁAÁAc           	      ó  — d|vry| d   |d      }||j                  dd«      |j                  dd«      |d   z    }|j                  dd«      }	 |dd	 d
k(  r!t        j                  d|dd «      \  }}||dfS |dd dk(  rˆd}|t        |«      k  rx||   dk7  r|dz  }Œ||dz      }	|	dv r't        j                  d||dz   |dz    «      \  }}||dfS |dt        j                  d||dz   |dz    «      d   z   z  }|t        |«      k  rŒx|dd dk(  r°|d	d dk(  r¨|dd }
|
dk(  r't        j                  d|dd  «      \  }}|d!z  |d!z  d"fS |
d#k(  r0t        j                  d$|d%d& «      d   }|d!z  dz   |d'z	  d!z  dz   d"fS |
d(k(  r=t        j                  |dd) d*«      dz   }t        j                  |d)d  d*«      dz   }||d"fS |dd d+k(  r!t        j                  d,|d-d. «      \  }}||d/fS 	 dd|xs d0fS # t        $ r Y Œw xY w)1z;(w, h, mime) from the image header bytes (PNG, JPEG, WebP).Ú
bufferViewNÚbufferViewsÚ
byteOffsetr   Ú
byteLengthÚmimeTypeÚ r
   s   ‰PNG

z>IIé   é   Úpngr&   s   ÿØéÿ   r$   )éÀ   éÁ   éÂ   z>HHr   é	   Újpegz>Hr   s   RIFFr   s   WEBPs   VP8 z<HHé   é   iÿ?  Úwebps   VP8Lz<Ié   é   é   s   VP8Xé   Úlittles   «KTX 20»

z<IIé   é   Úktx2ú?)r)   r   Úunpackr   ÚintÚ
from_bytesÚ	Exception)r   r   ÚimgÚbvr=   Úmimer4   Úhr5   ÚmkÚkindÚvs               r   Ú	_img_sizeri   ,   sž  € à˜3ÑØØ	ˆ]Ñ	˜C Ñ-Ñ	.€BØˆR�V‰V�L !Ó$ b§f¡f¨\¸1Ó&=ÀÀ<Ñ@PÑ&PÐQ€AØ�7‰7�:˜rÓ"€DðØˆRˆaˆ5Ð(Ò(Ü—=‘= ¨¨"¨R¨Ó1‰DˆAˆq¸!¸QÀ¸+Ð3EØˆRˆaˆ5�KÒØˆAØ”c˜!“f’*Ø�Q‘4˜4’<  a¡ ¨Ø�q˜1‘u‘X�ØÐ+Ñ+Ü!Ÿ=™=¨°°!°a±%¸¸A¹°Ó?‘D�A�qÈÈ1ÈfÈÐATØ�QœŸ™ t¨Q¨q°1©u°Q¸±U¨^Ó<¸QÑ?Ñ?Ñ?�ð ”c˜!“f“*ð ˆRˆaˆ5�GÒ  ! B ¨7Ò 2Ø�R˜�8ˆDØ�wŠÜ—}‘} U¨A¨b°¨HÓ5‘��1¸aÀ&¹jÈ!ÈfÉ*ÐV\Ð>\Ð7\Ø�wŠÜ—M‘M $¨¨"¨R¨Ó1°!Ñ4�¸aÀ&¹jÈAÑ=MÐQRÐVXÑQXÐ\bÑPbÐfgÑOgÐioÐ=oÐ6oØ�wŠÜ—N‘N 1 R¨ 8¨XÓ6¸Ñ:�ÄÇÁÈqÐQSÐTVÈxÐYaÓ@bÐefÑ@f¸AÐopÐrsÐu{Ðo{Ðh{ØˆSˆbˆ6Ð0Ò0Ü—=‘= ¨¨"¨R¨Ó1‰DˆAˆq¸!¸QÀ¸,Ð3Fð 1ð ��t’{˜sÐ"Ð"øô ò Ùðús9   Á(G3 Á8AG3 Ã6G3 ÄA G3 Å	4G3 Å>AG3 Ç (G3 Ç3	G?Ç>G?c                 ó  ‡‡‡‡‡‡‡‡‡‡‡ ‡!— t        | «      \  }}}|j                  dg «      Š|j                  dg «      Š|j                  dg «      Š|j                  d«      r&|j                  di g«      |j                  dd«         ndt        t        t	        ‰«      «      «      i}t
        j                  gdz  Št
        j                   gdz  ŠdxŠxŠ Št        «       Šg Ši Šˆˆˆˆˆˆˆˆˆˆˆ ˆ!fd„Š!t        d	«      D ��cg c]"  }t        d	«      D �cg c]  }||k(  rd
nd‘Œ c}‘Œ$ }}}|j                  dg «      D ]  } ‰!||«       Œ g }	d}
|j                  dg «      D ]J  }t        |||«      \  }}}|	j                  ||g|dœ«       |sŒ-|sŒ0|
||z  |dk(  rd
nd	z  d	z  dz  dz  z  }
ŒL t        t        |j                  dg «      «      «      }|j                  dg «      }‰d   t
        j                  k(  rg d¢xŠŠt        d«      D �cg c]  }t        ‰|   ‰|   z
  d«      ‘Œ }}i d|“d‰D �cg c]  }t        |d«      ‘Œ c}‰D �cg c]  }t        |d«      ‘Œ c}dœ“d|“d‰“d‰ “d‰“dt	        ‰«      xs t	        |j                  dg «      «      “d|j                  dg «      D �cg c]  }|j                  dd«      ‘Œ c}d d “d|	“d t        |
d
«      “d‰d d! “d"‰“d#|r t	        |«      t        d$„ |D «       d¬%«      d&œnd “d't        |j                  d'g «      «      D ��cg c]  \  }}|j                  dd(|› �«      ‘Œ c}}“d)|“d*d+|v rd,“S d-|v rd.“S d/“S c c}w c c}}w c c}w c c}w c c}w c c}w c c}}w )0NÚ	accessorsÚmeshesÚnodesÚscenesÚscener   r'   c           
      ó  •— ‰|    }t        |t        |«      «      }|j                  d«      rQ‰j                  |d   «       t	        ‰«      dk  r/t        d«      D �cg c]  }t        ||   d   d«      ‘Œ c}‰|d   <   d|v �rÑ‰|d      j                  dg «      D �]µ  }|j                  dt        «      }‰|d   d      }d	|v r‰|d	      d
   n|d
   }|t        k(  r|dz  n|t        t        fv rt        d|dz
  «      nd}	‰|	z  Š‰|d
   z  Š‰dz  Šd|v r‰j                  |d   «       |j                  d«      |j                  d«      }}
|
rQ|rO|j                  d«      r>dddddœj                  |d   d«      }|
D �cg c]  }||z  ‘Œ	 }
}|D �cg c]  }||z  ‘Œ	 }}|
s�Œ	|s�Œ|
d   |d   fD ]œ  }|
d   |d   fD ]�  }|
d   |d   fD ]~  }t        d«      D �cg c].  }||   d   |z  ||   d   |z  z   ||   d   |z  z   ||   d   z   ‘Œ0 }}t        d«      D ],  }t        ‰|   ||   «      ‰|<   t        ‰|   ||   «      ‰|<   Œ. Œ€ Œ� Œž �Œ¸ |j                  dg «      D ]  } ‰||«       Œ y c c}w c c}w c c}w c c}w )NÚnameéÈ   r'   ÚmeshÚ
primitivesÚmodeÚ
attributesÚPOSITIONÚindicesÚcountr   r&   r$   ÚmaterialÚminÚmaxÚ
normalizedé   rL   iÿ  iÿÿ  )i   i  i  i  ÚcomponentTypeÚchildren)rA   r6   r)   Úappendr   r(   ÚroundÚGL_TRIANGLESÚGL_STRIPÚGL_FANr|   Úaddr{   )r5   Úparentr*   r+   r,   Úpru   ÚposÚcntr.   r<   r=   Údrh   ÚcxÚcyÚczr;   r-   ÚaccÚhiÚloÚ	mats_usedrl   ÚnamesÚnode_posrm   ÚprimsÚtrisÚvertsÚwalks                      €€€€€€€€€€€€r   r˜   zmeasure.<locals>.walkW   sð  ø€ à�!‰Hˆœ$˜v¤t¨A£wÓ/�aØ�5‰5�Œ=Ø�L‰L˜˜6™Ô#Ü�8‹}˜sÒ"ÔV[Ð\]ÓV^Ö:_ÐQR¼5ÀÀ1ÁÀaÁÈ!Õ;LÒ:_ H¨Q¨v©YÑ$7Ø�QŠ;Ø˜A˜f™IÑ&×*Ñ*¨<¸Ó<ó W�Ø—u‘u˜V¤\Ó2�Ø˜!˜L™/¨*Ñ5Ñ6�Ø4=À±N�c˜!˜I™,Ñ'¨Ò0ÈÈGÉ�Ø $¬Ò 4�C˜1’HÈTÔV^Ô`fÐUgÑMg¼#¸aÀÀqÁ¼/Ðmn�Ø˜‘	�˜5 C¨¡LÑ0˜5°%¸1±*°%Ø ‘? I§M¡M°!°J±-Ô$@Ø—w‘w˜u“~ s§w¡w¨u£~�1�Ù™˜sŸw™w |Ô4Ø"¨#°UÀ%ÑH×LÑLÈSÐQ`ÑMaÐcdÓe�AØ()Ö* 1˜˜Q›Ð*�AÐ*ÀÖ0B¸1°°Q³Ð0B¨AÐ0BÛ›Ø  ™t Q q¡T˜lò W˜Ø#$ Q¡4¨¨1© ,ò W˜BØ'(¨¡t¨Q¨q©T lò W ÜchÐijÓckÖ$lÐ^_ Q q¡T¨!¡W¨r¡\°A°a±D¸±G¸b±LÑ%@À1ÀQÁ4ÈÁ7ÈRÁ<Ñ%OÐRSÐTUÑRVÐWXÑRYÓ%YÐ$l Ð$lÜ).¨q«ò !W AÜ,/°°1±°q¸±tÓ,< B q¡EÄcÈ"ÈQÉ%ÐQRÐSTÑQUÓFV¸bÀºeñ!WñWñWòWðWð$ —‘�z 2Ó&ò 	ˆAÙ��A�Jñ	ùò) ;`ùò +ùÒ0Bùò
 %ms   ÁI5Æ I:ÆI?Ç3Jr   r$   g        Úimages)ÚpxÚfmtr\   g    €„.AÚextensionsUsedÚskinsr"   ÚbytesÚbounds)r{   r|   Úsize_xyzr–   r—   Ú
draw_callsÚ	materialsÚmaterial_namesrq   rH   rJ   ÚtexturesÚgpu_mb_decodedrr   r”   Úrigc              3   óR   K  — | ]  }t        |j                  d g «      «      –— Œ! y­w)ÚjointsN)r   r)   )r:   r0   s     r   r?   zmeasure.<locals>.<genexpr>‹   s!   è ø€ Ò3\ÐQR´C¸¿¹¸hÈÓ8K×4LÑ3\ùs   ‚%')Údefault)r�   r¨   Ú
animationsÚclipÚ
extensionsÚcodecÚKHR_draco_mesh_compressionÚdracoÚEXT_meshopt_compressionÚmeshoptÚnone)r   r)   Úlistr(   r   ÚmathÚinfÚsetri   r�   Úsortedr‚   r|   Ú	enumerate)"r   r   r   Únbytesro   r5   r>   Úidentr,   ÚtexsÚgpurb   r4   re   r›   Úextr�   r;   Úsizerh   r+   r<   r�   r�   r‘   r’   rl   r“   r”   rm   r•   r–   r—   r˜   s"                         @@@@@@@@@@@@r   Úmeasurer¿   M   sú  ÿû€ Ü˜T›
Ñ€CˆˆvØ
�'‰'�+˜rÓ
"€C¨S¯W©W°X¸rÓ-B FÈCÏGÉGÐT[Ð]_ÓL`ÀEØ<?¿G¹GÀHÔ<MˆC�G‰G�H˜r˜dÓ# C§G¡G¨G°QÓ$7Ò8ÐT[Ô]aÔbgÔhkÐlqÓhrÓbsÓ]tÐSu€EÜ
�(‰(ˆ�a‰€B¤§¡˜y˜k¨A™o˜ØÐ€DÐˆ5�5Ü“€IØ€EØ€H÷÷ ô8 >CÀ1»X×F¸¬%°«(Ö3 Q�1˜’6‰a˜qÑ Ô3ÐF€EÑFØ�Y‰Y�w Ó#ò ˆÙˆQ��ðà€DØ
€CØ�w‰w�x Ó$ò EˆÜ˜c 4¨Ó-‰	ˆˆ1ˆcØ�‰˜A˜q˜6¨#Ñ.Ô/Ú’Ø�1�q‘5 ¨¢™A°AÑ6¸Ñ:¸QÑ>ÀÑDÑD‰Cð	Eô
 ”�S—W‘WÐ-¨rÓ2Ó3Ó
4€CØ�G‰G�G˜RÓ €EØ	ˆ!�u”—‘ÒÚÐˆˆRÜ-2°1«XÖ6¨ŒE�"�Q‘%˜"˜Q™%‘- Õ#Ð6€DÐ6ðØ�ðà°Ö3¨1œ5  A�;Ò3ÐRTÖ<UÈQ¼UÀ1Àa½[Ò<UÑVðð 	�Dðð 	�ð	ð ˜uð	ð '3°Eð	ð
 	”S˜“^ÒD¤s¨3¯7©7°;ÀÓ+CÓ'Dðð 	°c·g±g¸kÈ2Ó6NÖO°˜1Ÿ5™5 ¨Õ,ÒOÐPSÐQSÐTðð 	�Dðð +¬E°#°q«Mðð 	��t˜�ðð )¨(ðð 	Ñmrœ˜U›¬sÑ3\ÐV[Ô3\ÐfgÔ/hÒiÐx|ðð 	¼YÀsÇwÁwÈ|Ð]_ÓG`Ó=a×b±T°Q¸�q—u‘u˜V t¨A¨3 ZÕ0Óbðð 	�cðð 	Ð8¸CÑ?�ðð ð SlÐorÑRrÀYðð ð yðð ùò 4ùÓFùò 7ùò 4ùÒ<Uùò Pùó cs6   ÄM*ÄM%Ä%M*ÈM0È6M5ÉM:
Ê1M?Ì-N
Í%M*Ú__main__r$   )Ú__doc__r   r´   r   rƒ   r„   r…   r   r6   rA   ri   r¿   Ú__name__ÚsysÚargvrˆ   ÚprintÚdumpsr9   r	   r   ú<module>rÇ      s€   ðñ÷
 Ó à!(Ñ €ˆh˜ò ò"	gò\ò#òBBðJ ˆzÒÛØ�X‰X�a�bˆ\ò )ˆÙˆa��—‘™G A›JÓ'Õ(ñ)ð r	   