§
     ’Þj­  ã                   ó�   — d Z ddlZddlZddlmZ ddlmZ dZd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zdddddddœd„Zd„ Zd„ Zd„ Zd„ Zdd„ZdS )aÀ  3D gallery files and their preview render `<stem>.png`:
- meshes: GLB with the generation settings in the glTF `asset.extras["wangp"]`;
- Gaussian splats: INRIA 3DGS PLY with the settings in a `comment wangp <json>` header line. Every PLY in the 3D gallery is
  a splat file: mesh PLYs are converted to GLB on import.

The preview is the 3D gallery thumbnail and the image shown where a 3D asset cannot be viewed interactively (Deepy, workspaces).
é    N)ÚPath)Úpersist_gallery_importÚwangpc                 óR   — t           j                             | ¦  «        d         dz   S )Nr   z.png)ÚosÚpathÚsplitext©r   s    úAC:\Users\johnn\OneDrive\Documents\AI\shared\utils\mesh_outputs.pyÚpreview_pathr      s"   € ÝŒ7×Ò˜DÑ!Ô! !Ô$ vÑ-Ð-ó    c                 óV   — t          | ¦  «        j                             ¦   «         dk    S )Nú.ply)r   ÚsuffixÚlowerr
   s    r   Úis_splat_filer      s"   € Ý�‰:Œ:Ô×"Ò"Ñ$Ô$¨Ò.Ð.r   c                 ót   — t          | ¦  «        rddlm} ddi || ¦  «        ¥S ddlm} ddi || ¦  «        ¥S )zˆHeader-level description of a 3D gallery file: {"kind": "splats", "gaussians", "sh_degree", ...} or {"kind": "mesh", **mesh_file_stats}.r   )Úsplat_file_statsÚkindÚsplats)Úmesh_file_statsÚmesh)r   Úshared.mesh3d.splatsr   Úshared.mesh3d.glbr   )r   r   r   s      r   Úasset_statsr      sl   € å�TÑÔð <Ø9Ð9Ð9Ð9Ð9Ð9Ø˜Ð;Ð$4Ð$4°TÑ$:Ô$:Ð;Ð;Ø1Ð1Ð1Ð1Ð1Ð1Ø�FÐ4˜o˜o¨dÑ3Ô3Ð4Ð4r   c                 óf  — t          | ¦  «        }|d         dk    rd|d         ddœS d|d         |d         t          |d	         ¦  «        dd
œ}|d         }|rX|d         rP|                     |d         |d         rt          |d         d¦  «        ndt          |d         d¦  «        ¬¦  «         |S )zÌCompact facts of a 3D gallery file for Deepy and MCP: kind (mesh or splats), faces / vertices / textured or
    gaussians, frame_count (1 unless animated), and fps / duration_seconds for an animated mesh.r   r   Ú	gaussiansé   )r   r   Úframe_countr   ÚfacesÚverticesÚtextures)r   r    r!   Útexturedr   Ú	animationÚframesÚfpsé   NÚduration)r   r&   Úduration_seconds)r   ÚboolÚupdateÚround)r   ÚstatsÚsummaryr$   s       r   Úasset_summaryr/   #   s	  € õ ˜ÑÔ€EØˆV„}˜Ò Ð Ø ¨u°[Ô/AÐRSÐTÐTÐTØ¨¨g¬ÀEÈ*ÔDUÕcgÐhmÐnxÔhyÑczÔczð  LMð  Nð  N€GØ�kÔ"€IØð h�Y˜xÔ(ð hØ�Š 9¨XÔ#6ÐZcÐdiÔZjÐ<t½EÀ)ÈEÔBRÐTUÑ<VÔ<VÐ<VÐptõ  HMð  NWð  Xbô  Ncð  efñ  Hgô  Hgˆñ  	hô  	hð  	hØ€Nr   c                 ó<  — t          | ¦  «        rdnt          | ¦  «        d         }|r|d         st          d¦  «        ‚d|cxk    r|d         k     s'n t          d|d         dz
  › d|d         › d	�¦  «        ‚|d
         r|d         ||d
         z  z   n|d         S )zhAnimation time (seconds) of frame `frame_no` of a 3D gallery file; ValueError when it has no such frame.Nr$   r%   z&This 3D asset has no animation frames.r   zframe_no must be between 0 and r   z (the animation has z	 frames).r&   Ústart)r   r   Ú
ValueError)r   Úframe_nor$   s      r   Úanimation_timer4   0   sí   € å% dÑ+Ô+ÐO��µ¸TÑ1BÔ1BÀ;Ô1O€IØð C˜I hÔ/ð CÝÐAÑBÔBÐBØ�Ð.Ð.Ò.Ð.˜9 XÔ.Ò.Ð.Ð.Ð.Ýð  G¸9ÀXÔ;NÐQRÑ;Rð  Gð  GÐhqÐrzÔh{ð  Gð  Gð  Gñ  Hô  Hð  	HØ?HÈÔ?OÐgˆ9�WÔ ¨9°UÔ+;Ñ ;Ñ;Ð;ÐU^Ð_fÔUgÐgr   c           	      óX   — t          t          | ||fdt          |¦  «        i|¤Ž¦  «        S )zÊViews of a 3D gallery file (mesh or Gaussian splats) as PIL images, one scale shared by every view (angles: names
    of shared.mesh3d.render.VIEWS or (azimuth, elevation); options of iter_asset_views).Úchunk)ÚlistÚiter_asset_viewsÚlen)r   ÚanglesÚ
resolutionÚoptionss       r   Úrender_asset_viewsr=   :   s3   € õ Õ   v¨zÐXÐXÅÀVÁÄÐXÐPWÐXÐXÑYÔYÐYr   ÚshadedÚorthographicg      ð?)ç      à?r@   r@   )r3   ÚmodeÚ
projectionÚzoomÚfocusÚ
backgroundc             #   óˆ  ‡‡‡‡K  — ddl }
ddlmŠ ddlmŠm}m}m} |
j         	                    ¦   «         rdnd}ˆfd„|D ¦   «         }|€dnt          | |¦  «        }|
                     ¦   «         5  t          | ¦  «        rddlm}  || |¬	¦  «        |}}ndd
lm}  || ||¬¦  «        |}} |||||||¬¦  «        }ddd¦  «         n# 1 swxY w Y   t#          dt%          |¦  «        ‰¦  «        D ]ÏŠ|
                     ¦   «         5   ||d|||	t'          ˆˆfd„|D ¦   «         ¦  «        ¬¦  «        }|                     dd¦  «        dz                       ¦   «                              ¦   «                              ¦   «                              ¦   «         }ddd¦  «         n# 1 swxY w Y   ~ˆfd„|D ¦   «         E d{V —† ŒÐdS )a  Views of a 3D gallery file as a stream of PIL images rendered `chunk` at a time, every view keeping the scale of
    the whole sequence, so a long one (a turntable) holds only a few views in memory; depth views are normalized per
    chunk. See orbit_cameras for zoom and focus: RGBA with a transparent background for the colour modes unless
    background is given. frame_no poses an animated mesh at that frame (rest pose without it). Rendered on the GPU when
    there is one (a few hundred MB for typical assets).r   N©ÚImage)ÚVIEWSÚasset_camerasÚrender_splat_viewsÚrender_viewsÚcudaÚcpuc                 óN   •— g | ]!}t          |t          ¦  «        r‰|         n|‘Œ"S © )Ú
isinstanceÚstr)Ú.0ÚanglerI   s     €r   ú
<listcomp>z$iter_asset_views.<locals>.<listcomp>J   s0   ø€ ÐTÐTÐTÀE�j¨µÑ4Ô4Ð?ˆe�EŒlˆl¸%ÐTÐTÐTr   ©Úply_to_splats)Údevice©Ú	load_mesh)rX   Útime)rB   rC   rD   c              3   ó2   •K  — | ]}|‰‰‰z   …         V — Œd S ©NrP   )rS   Úcamerar6   r1   s     €€r   ú	<genexpr>z#iter_asset_views.<locals>.<genexpr>V   s[   øè è € ð  `Sð  `Sð  AGÐ`fÐglÐmrÐuzÑmzÐgzÔ`{ð  `Sð  `Sð  `Sð  `Sð  `Sð  `Sr   )rE   Úcamerasr   éÿ   c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r]   )Ú	fromarray)rS   ÚarrayrH   s     €r   r_   z#iter_asset_views.<locals>.<genexpr>Y   s/   øè è € Ð?Ð?¨u�E—O’O EÑ*Ô*Ð?Ð?Ð?Ð?Ð?Ð?r   )ÚtorchÚPILrH   Úshared.mesh3d.renderrI   rJ   rK   rL   rM   Úis_availabler4   Úinference_moder   r   rW   r   rZ   Úranger9   ÚtupleÚclampr,   ÚbyterN   Únumpy)r   r:   r;   r6   r3   rA   rB   rC   rD   rE   re   rJ   rK   rL   rX   r[   rW   ÚassetÚrenderrZ   r`   ÚimagesÚarraysrH   rI   r1   s      `                   @@@r   r8   r8   @   s0  øøøøè è € ð €L€L€LØÐÐÐÐÐØ[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ø”z×.Ò.Ñ0Ô0Ð;ˆVˆV°e€FØTÐTÐTÐTÈVÐTÑTÔT€FØÐ#ˆ4ˆ4­¸¸hÑ)GÔ)G€DØ	×	Ò	Ñ	Ô	ð jð jÝ˜ÑÔð 	TØ:Ð:Ð:Ð:Ð:Ð:Ø)˜M¨$°vÐ>Ñ>Ô>Ð@R�6ˆEˆEà3Ð3Ð3Ð3Ð3Ð3Ø%˜I d°6ÀÐEÑEÔEÀ|�6ˆEØ�-  v¨zÀjÐW[ÐchÐiÑiÔiˆðjð jð jñ jô jð jð jð jð jð jð jøøøð jð jð jð jõ �q�#˜f™+œ+ uÑ-Ô-ð @ð @ˆØ×!Ò!Ñ#Ô#ð 	Mð 	MØ�V˜E 4¨°TÀjÕZ_ð  `Sð  `Sð  `Sð  `Sð  `Sð  KRð  `Sñ  `Sô  `Sñ  [Sô  [Sð  Tñ  Tô  TˆFØ—l’l 1 aÑ(Ô(¨3Ñ.×5Ò5Ñ7Ô7×<Ò<Ñ>Ô>×BÒBÑDÔD×JÒJÑLÔLˆFð	Mð 	Mð 	Mñ 	Mô 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Møøøð 	Mð 	Mð 	Mð 	Mð Ø?Ð?Ð?Ð?¸Ð?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ð@ð @s&   Á0AC	Ã	CÃCÄBF!Æ!F%	Æ(F%	c                 ó”  — t          | ¦  «        rOddlm}  |t          | ¦  «                             ¦   «         t
          › dt          j        |¦  «        › �g¦  «        }nGddlm	}m
}  |t          | ¦  «                             ¦   «         i  || ¦  «        ¥t
          |i¥¦  «        }t          | ¦  «                             |¦  «         d S )Nr   )Úply_write_commentsú )Úglb_read_extrasÚglb_write_extras)r   r   rt   r   Ú
read_bytesÚSETTINGS_KEYÚjsonÚdumpsr   rv   rw   Úwrite_bytes)r   Úsettingsrt   Údatarv   rw   s         r   Úsave_mesh_metadatar   \   sß   € Ý�TÑÔð lØ;Ð;Ð;Ð;Ð;Ð;Ø!Ð!¥$ t¡*¤*×"7Ò"7Ñ"9Ô"9½|Ð<dÐ<dÍdÌjÐYaÑNbÔNbÐ<dÐ<dÐ;eÑfÔfˆˆàGÐGÐGÐGÐGÐGÐGÐGØÐ¥ T¡
¤
× 5Ò 5Ñ 7Ô 7Ð9j¸O¸OÈDÑ<QÔ<QÐ9jÕS_ÐaiÐ9jÐ9jÑkÔkˆÝˆ�J„J×Ò˜4Ñ Ô Ð Ð Ð r   c                 óf  ‡— t          | ¦  «        j                             ¦   «         dvrd S t          | ¦  «        r6ddlm} t          dz   Št          ˆfd„ || ¦  «        D ¦   «         d ¦  «        }n)ddlm	}  || ¦  «         
                    t          ¦  «        }t          |t          ¦  «        r|nd S )N)ú.glbz.gltfr   r   )Úply_commentsru   c              3   ó”   •K  — | ]B}|                      ‰¦  «        ¯t          j        |t          ‰¦  «        d …         ¦  «        V — ŒCd S r]   )Ú
startswithrz   Úloadsr9   )rS   ÚcommentÚprefixs     €r   r_   z%read_mesh_metadata.<locals>.<genexpr>l   sQ   øè è € Ð{Ð{¸wÐ`g×`rÒ`rÐsyÑ`zÔ`zÐ{�œ G­C°©K¬K¨L¨LÔ$9Ñ:Ô:Ð{Ð{Ð{Ð{Ð{Ð{r   )rv   )r   r   r   r   r   r‚   ry   Únextr   rv   ÚgetrQ   Údict)r   r‚   r}   rv   r‡   s       @r   Úread_mesh_metadatar‹   f   sÙ   ø€ ÝˆD�z„zÔ×ÒÑ Ô Ð(AÐAÐAØˆtÝ�TÑÔð ;Ø5Ð5Ð5Ð5Ð5Ð5Ý Ñ#ˆÝÐ{Ð{Ð{Ð{È,È,ÐW[ÑJ\ÔJ\Ð{Ñ{Ô{ð  ~Bñ  Cô  Cˆˆà5Ð5Ð5Ð5Ð5Ð5Ø"�? 4Ñ(Ô(×,Ò,­\Ñ:Ô:ˆÝ! (­DÑ1Ô1Ð;ˆ8ˆ8°tÐ;r   c                 ó’  — ddl m} |                      ¦   «                              dd¦  «        dz   dz                       ¦   «                              ¦   «                              ddd¦  «                             ¦   «                              ¦   «         }| 	                    |¦  «         
                    t          |¦  «        ¦  «         dS )z]Writes a [C, H, W] preview in [-1, 1] (C = 3 or 4) as the PNG preview of the asset at `path`.r   rG   éÿÿÿÿr   g     à_@é   N)rf   rH   Úfloatrl   r,   rm   ÚpermuterN   rn   rc   Úsaver   )Úpreviewr   rH   rd   s       r   Úsave_previewr“   s   s®   € àÐÐÐÐÐØ�mŠm‰oŒo×#Ò# B¨Ñ*Ô*¨QÑ.°%Ñ7×>Ò>Ñ@Ô@×EÒEÑGÔG×OÒOÐPQÐSTÐVWÑXÔX×\Ò\Ñ^Ô^×dÒdÑfÔf€EØ	‡O‚O�EÑÔ×Ò¥¨TÑ 2Ô 2Ñ3Ô3Ð3Ð3Ð3r   c                 ó<  — t           j                             t          | ¦  «        ¦  «        rdS t	          | ¦  «        r0ddlm} ddlm} t           | || ¦  «        ¦  «        | ¦  «         dS ddl
m} ddlm} t           | || ¦  «        ¦  «        | ¦  «         dS )zBRenders the preview of a 3D asset that has none (imported assets).Nr   )Úsplat_previewrV   rY   )r’   )r   r   Úisfiler   r   rg   r•   r   rW   r“   r   rZ   r’   )r   r•   rW   rZ   r’   s        r   Úensure_previewr—   z   sÏ   € å	„w‡~‚~•l 4Ñ(Ô(Ñ)Ô)ð ØˆÝ�TÑÔð 5Ø6Ð6Ð6Ð6Ð6Ð6Ø6Ð6Ð6Ð6Ð6Ð6Ý�]�] = =°Ñ#6Ô#6Ñ7Ô7¸Ñ>Ô>Ð>Ð>Ð>à/Ð/Ð/Ð/Ð/Ð/Ø0Ð0Ð0Ð0Ð0Ð0Ý�W�W˜Y˜Y t™_œ_Ñ-Ô-¨tÑ4Ô4Ð4Ð4Ð4r   c                 ó`  — ddl m} t          t          | d| ¦  «        ¦  «        } t	          | ¦  «        j                             ¦   «         }|dk    p|dk    o
 || ¦  «        }t	          |p| ¦  «        j        |r|ndz   }|rt          | ||¬¦  «        \  }}n†ddl	}	ddl
m}
m} |	                     ¦   «         5 }t	          |¦  «        |z  }|                      | |
| ¦  «        ¦  «        ¦  «         t          |||¬¦  «        \  }}ddd¦  «         n# 1 swxY w Y   t          |¦  «         ||fS )	z¼Copies a 3D file into the 3D gallery folder (splat PLYs as they are, other meshes converted to GLB) and makes sure
    it has a preview. Returns (path, reused) like persist_gallery_import.r   )Úis_splat_plyr   r�   r   )ÚfilenameN)rZ   Úmesh_to_glb)r   r™   rR   Úgetattrr   r   r   Ústemr   Útempfiler   rZ   r›   ÚTemporaryDirectoryr|   r—   )ÚsourceÚ
output_dirrš   r™   r   ÚkeepÚnamer   Úreusedrž   rZ   r›   Ú	temporaryÚ	converteds                 r   Úimport_mesh_filer§   ˆ   s²  € ð 2Ð1Ð1Ð1Ð1Ð1Ý•˜ ¨Ñ0Ô0Ñ1Ô1€FÝ�&‰\Œ\Ô ×&Ò&Ñ(Ô(€FØ�VÒÐH˜v¨Ò/ÐH°L°LÀÑ4HÔ4H€DÝ�Ð"˜FÑ#Ô#Ô(°dÐ,F¨F¨FÀÑG€DØð XÝ-¨f°jÈ4ÐPÑPÔP‰ˆˆfˆfàˆˆˆØ<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø×(Ò(Ñ*Ô*ð 	X¨iÝ˜Y™œ¨$Ñ.ˆIØ×!Ò! + +¨i¨i¸Ñ.?Ô.?Ñ"@Ô"@ÑAÔAÐAÝ1°)¸ZÐRVÐWÑWÔW‰LˆD�&ð	Xð 	Xð 	Xñ 	Xô 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xøøøð 	Xð 	Xð 	Xð 	Xõ �4ÑÔÐØ�ˆ<Ðs   Â7ADÄDÄDr]   )Ú__doc__rz   r   Úpathlibr   Úshared.utils.media_importsr   ry   r   r   r   r/   r4   r=   r8   r   r‹   r“   r—   r§   rP   r   r   ú<module>r«      sA  ððð ð €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð à =Ð =Ð =Ð =Ð =Ð =à€ð.ð .ð .ð/ð /ð /ð5ð 5ð 5ð
ð 
ð 
ðhð hð hðZð Zð Zð CGÈXÐbpÐwzð  CRð  _cð @ð @ð @ð @ð @ð8!ð !ð !ð
<ð 
<ð 
<ð4ð 4ð 4ð5ð 5ð 5ðð ð ð ð ð r   