
    kc}jY-                    P   S r SSKJr  SSKrSSKrSSKrSSKJr  SSKrSSK	r	SSK
Jr  SSSS.SSSS.S	SSS.S
SSS.S.rSS jrSS jrSS jrSS jrS S jrS!S jrS!S jrS"S jrS!S jrS#S jrS$S jr              S%S jrS&S jrS&S jrSS jr\S:X  a  \" 5         gg)'zEBuild and render web-ready polished-silver GLB variants with Blender.    )annotationsN)Path)VectorF)target_trianglesreplace_materialexportTiE i_ )sourcereviewwebmobilec                 h   / n S[        S5      R                  ;   a=  [        S5      R                  [        S5      R                  R                  S5      S-   S  n [        R                  " 5       nUR                  SSS9  UR                  SSS9  UR                  SS[        S	9  UR                  U 5      $ )
Nz--sys   z--inputT)requiredz--outdirz	--variant)r   choices)
__import__argvindexargparseArgumentParseradd_argumentVARIANTS
parse_args)r   parsers     a/home/vela/workspace/domain/tn-silver/web/tn-site/.runtime/model-silver-web/build_silver_model.pyr   r      s    Dz% %%%% %%j&7&<&<&B&B4&H1&L&NO$$&F
	D1

T2
dHET""    c                    [         R                  R                  R                  SS9  [         R                  R                  R	                  SS9  [         R
                  R                  [         R
                  R                  [         R
                  R                  [         R
                  R                  [         R
                  R                  4 H8  n [        U 5       H&  nUR                  S:X  d  M  U R                  U5        M(     M:     g )NSELECTactionF)
use_globalr   )bpyopsobject
select_alldeletedatameshescurves	materialscameraslightslistusersremove)
datablocks	datablocks     r   clear_scener2   #   s    GGNNX.GGNNU+
 j)I!#!!), *r   c                   [         R                  R                  R                  [	        U 5      S9  [         R
                  R                  R                   Vs/ s H  oR                  S:X  d  M  UPM     nnU(       d  [        S5      e[         R                  R                  R                  SS9  U H  nUR                  S5        M     US   [         R
                  R                  R                  l        [        U5      S:  a(  [         R                  R                  R!                  5         [         R
                  R                  R                  R                  n[         R                  R                  R#                  S	SSS
9  UR$                  R'                  S	S	S9  UR$                  R(                   H
  nSUl        M     UR,                   Vs/ s H  oAR.                  [1        U5      -  PM     nn[3        U[1        5       5      S-  nU=R4                  U-  sl        [         R
                  R                  R7                  5         SUl        SUR$                  l        U$ s  snf s  snf )N)filepathMESHzNo mesh object was importedDESELECTr   Tr   r   F)locationrotationscale)verboseclean_customdata       @TN_Silver_ProductTN_Silver_Product_Mesh)r"   r#   import_scenegltfstrcontextsceneobjectstypeRuntimeErrorr$   r%   
select_set
view_layeractivelenjointransform_applyr'   validatepolygons
use_smooth	bound_boxmatrix_worldr   sumr7   updatename)pathobjr(   polygoncornercornerscenters          r   import_and_preparer[   2   s   GGs4y1 [[..66M6c((f:Lc6FM899GGNNZ0t ,21ICKK"")
6{Q
++
 
 
(
(
/
/CGGNN""ED"MHHee<88$$! % @C}}M}V&.0}GM&(#c)FLLFLKK!!#"CH,CHHMJ/ N" Ns   I .I !I%c                t    U R                   R                  5         [        U R                   R                  5      $ N)r'   calc_loop_trianglesrJ   loop_triangles)rV   s    r   triangle_countr`   N   s'    HH  "sxx&&''r   c                   U(       d  g [        U 5      nX!::  a  g U R                  R                  SSS9nSUl        [	        S[        SX-  5      5      Ul        SUl        U [        R                  R                  R                  l        [        R                  R                  R                  UR                   S9  U R"                  R$                   H
  nSUl        M     g )	NzWeb silhouette optimizationDECIMATErT   rE   COLLAPSEgMbP?      ?Tmodifier)r`   	modifiersnewdecimate_typemaxminratiouse_collapse_triangulater"   rB   rH   rD   rI   r#   r$   modifier_applyrT   r'   rN   rO   )rV   targetcurrentrg   rW   s        r   decimate_torr   S   s    S!G}}  &C* UH'HC)9 :;HN(,H%,/CKK"")GGNN!!8==!988$$! %r   c                2   U R                   R                  SSS9nSUl        SUl        SUl        SUl        SUl        U [        R                  R                  R                  l        [        R                  R                  R                  UR                  S9  g )	NzGenerated surface cleanupLAPLACIANSMOOTHrc   gQ?g{Gz?   Trf   )rh   ri   lambda_factorlambda_border
iterationsuse_volume_preserveuse_normalizedr"   rB   rH   rD   rI   r#   r$   ro   rT   )rV   rg   s     r   smooth_generated_surfacer{   c   sz    }}  &AHY ZH!H!HH#'H "H,/CKK"")GGNN!!8==!9r   c                r   U R                   n[        UR                  UR                  UR                  5      S-  nU R
                  n[        R                  " 5       nUR                  U5        [        R                  R                  U[        UR                  5      US9  [        R                  R                  U[        UR                  5      S9  UR                  U5        UR!                  5         UR#                  5         [        UR$                  5       H  nUR$                  R'                  U5        M      g )Ngư>)vertsdist)faces)
dimensionsrk   xyzr'   bmeshri   	from_meshr#   remove_doublesr-   r}   recalc_face_normalsr   to_meshfreerS   	uv_layersr/   )rV   r   weld_distancemesheditablelayers         r   weld_generated_seamsr   n   s    J
jllJLLADHM88Dyy{Ht	IIXT(..-AV	II!!($x~~2F!GTMMOKKMdnn%e$ &r   c                    [         R                  R                  R                  S5      n SU l        SU l        SU l        U R                  R                  R                  S5      nSUR                  S   l        SUR                  S   l        SUR                  S	   l        S
UR                  ;   a  SUR                  S
   l        U $ )NTN Polished SilverTgv?gQ?gHzG?re   Principled BSDF
Base Colorre   Metallic)\(?	RoughnesszCoat Weight        )r"   r'   r*   ri   	use_nodesuse_backface_cullingdiffuse_color	node_treenodesgetinputsdefault_value)materialnodes     r   polished_silver_materialr   }   s    xx!!%%&:;HH$(H!7H##''(9:D.HDKK+,/DKK
)-2DKK*#36M"0Or   c                    [        5       nU R                  R                  R                  5         U R                  R                  R	                  U5        g r]   )r   r'   r*   clearappend)rV   r   s     r   r   r      s8    ')HHHHHh'r   c                   U R                    Vs/ s H  oR                  [        U5      -  PM     nn[        [        S U 5       5      [        S U 5       5      [        S U 5       5      45      n[        [	        S U 5       5      [	        S U 5       5      [	        S U 5       5      45      nX4-   S-  n[	        XC-
  R
                  S-  S5      nX4XV4$ s  snf )	Nc              3  8   #    U  H  oR                   v   M     g 7fr]   r   .0ps     r   	<genexpr> object_bounds.<locals>.<genexpr>        /w!##w   c              3  8   #    U  H  oR                   v   M     g 7fr]   r   r   s     r   r   r           4J'QSS'r   c              3  8   #    U  H  oR                   v   M     g 7fr]   r   r   s     r   r   r           Oe]dXYPSPS]dr   c              3  8   #    U  H  oR                   v   M     g 7fr]   r   r   s     r   r   r      r   r   c              3  8   #    U  H  oR                   v   M     g 7fr]   r   r   s     r   r   r      r   r   c              3  8   #    U  H  oR                   v   M     g 7fr]   r   r   s     r   r   r      r   r   g      ?g?)rP   rQ   r   rl   rk   length)rV   rX   rY   minimummaximumrZ   radiuss          r   object_boundsr      s    ?B}}M}V&.0}GMc/w//4J'4J1JCOe]dOeLefgGc/w//4J'4J1JCOe]dOeLefgG3&F'#++c137FV++ Ns   !Cc                f    XR                   -
  R                  SS5      R                  5       U l        g )Nz-ZY)r7   to_track_quatto_eulerrotation_euler)rV   rp   s     r   point_atr      s'     <</>>tSIRRTCr   c                `   [         R                  R                  R                  U SS9nX&l        SUl        X6l        XFl        [         R                  R                  R                  X5      n[         R                  R                  R                  R                  U5        Xl        [        Xu5        g )NAREArc   DISK)r"   r'   r,   ri   energyshapesizecolorrD   rB   
collectionlinkr7   r   )rT   r7   r   r   r   rp   r'   lights           r   add_area_lightr      s|     88??Dv6DKDJIJHH  ,EKK""''.NUr   c                d
   [         R                  R                  nSUR                  l        SUR                  l        SUR                  l        SUR                  l        SUR                  R                  l	        SUR                  l
        [        U5      UR                  l        SUR                  R                  l        SUR                  l        SUR                  l        SUR                  R                  l        SUR                   l        UR                   R$                  R&                  nUR                   R$                  R(                  nUR+                  5         UR-                  S	5      n[         R.                  R0                  R3                  [        [5        [6        5      R9                  S
5      5      SS9Ul        SUl        UR-                  S5      nSUR>                  S   l         UR-                  S5      nUR-                  URB                  S   UR>                  S   5        UR-                  URB                  S   UR>                  S   5         SURD                  l#        SURD                  l%        [M        U 5      u  pp[         R.                  RN                  R-                  S5      n[         R.                  RP                  R-                  SU5      n[         R                  RR                  RP                  RU                  U5        U
[W        SSU-  SU-  45      -   Ul,        SUR.                  l-        SUR.                  l.        [_        X[W        SSSU-  45      -   5        Xl0        [c        S[e        U
[W        SU-  SU-  S U-  45      -   5      S!SU-  S"U
5        [c        S#[e        U
[W        S$U-  S%U-  S&U-  45      -   5      S'S(U-  S)U
5        [c        S*[e        U
[W        S+U-  S,U-  S,U-  45      -   5      S-S.U-  S/U
5        US0-  n[         Rf                  Rh                  Rk                  XRl                  U
Rn                  URp                  S1U-  -
  4S29  [         R                  Rr                  nS3Ul:        [         R.                  Rv                  R-                  S45      nSUl        UR$                  R&                  Ry                  S55      nS6UR>                  S7   l         S8UR>                  S9   l         UR.                  Rv                  R{                  U5        g ! [H         a     GNf = f):NBLENDER_EEVEEi  d   PNGFRGBAT8ShaderNodeTexEnvironmentzhighkey-studio-env.png)check_existingLinearShaderNodeBackgroundg=
ףp=?StrengthShaderNodeOutputWorldColor
BackgroundSurfacezAgX - Medium High Contrastg?zStudio Camerar   gg333333@:   $   gQzKey softboxgffffff@ggffffff@i~  )re   gGz?g)\(?zFill softboxg333333gg @iR  g@)gRQ?gQ?re   z
Edge stripg?g      @i  g      ?)re   re   re   r<   r   )r   r7   zStudio FloorzStudio Floor Materialr   )gzG?g)\(?gQ?re   r   gHzG?r   )>r"   rB   rC   renderengineresolution_xresolution_yresolution_percentageimage_settingsfile_formatfilm_transparentrA   r4   
color_modeuse_file_extensioncolor_depthworldr   r   r   linksr   ri   r'   imagesloadr   __file__	with_nameimageinterpolationr   r   outputsview_settingslook	TypeErrorexposurer   r+   rD   r   r   r   r7   lenssensor_widthr   camerar   tupler#   r   primitive_plane_addr   r   r   r$   rT   r*   r   r   )rV   output_pathrC   world_nodesworld_linksenvironment
backgroundworld_outputr   r   rZ   r   camera_datar   
plane_sizefloorfloor_material
floor_bsdfs                     r   setup_studior	     sN   KKE)ELL $ELL $ELL),ELL&.3ELL+$)ELL!,ELL-3ELL*&*ELL#),ELL&.1ELL+ EKK++''--K++''--K//"<=K,,DN$$%=>?PT - K !)K!78J26Jj!/??#:;LOOK''0*2C2CG2LMOOJ&&|4l6I6I)6TU#?  $(E '4S'9$Gf((""&&7KXX!!/;?FKK""''/vsEFND6M&JKKFOFKK!FKKVfc3%?@@ALfvsV|TF]C&LIJJKf fvtf}dVmS6\JKKLf fvsV|S6\3<HIIJf #JGGLL$$*&((T[T]T]`ehn`nTn?o$pKKEEJXX''++,CDN#N))//334EFJ4KJl#137Jk"0	JJ/a  s   T! !
T/.T/c                >   [         R                  R                  R                  SS9  U R	                  S5        U [         R
                  R                  R                  l        [         R                  R                  R                  [        U5      SSSSSSSSSSSSS9  g )Nr6   r   TGLBFEXPORT)r4   export_formatuse_selectionexport_apply
export_yupexport_normalsexport_tangentsexport_texcoordsexport_materialsexport_animationsexport_camerasexport_lights$export_draco_mesh_compression_enable)r"   r#   r$   r%   rG   rB   rH   rD   rI   export_scener@   rA   )rV   r   s     r   
export_glbr    s    GGNNZ0NN4,/CKK"")GG[!!-2  r   c                    [        5       n [        U R                  5      R                  5       n[        U R                  5      R                  5       nUR                  SSS9  [        U R                     n[        5         [        U5      n[        U5      nUS   (       a  [        U5        [        U5        [        XCS   5        US   (       a  [        U5        [        U5      nS nUS   (       a  USU R                   S3-  n[        XG5        USU R                   S	3-  n[!        XH5        ["        R$                  R&                  R'                  SS
9  [)        U5      u  p  nU R                  [+        U5      UU[-        UR.                  R0                  5      X-
   Vs/ s H  n[3        US5      PM     snU(       a  [+        U5      OS U(       a  UR5                  5       R6                  OS [+        U5      US   (       d  SOS/ SQSSS.S.
nUSU R                   S3-  nUR9                  [:        R<                  " USS9SS9  [?        S[:        R<                  " U5      5        g s  snf )NT)parentsexist_okr   r   r   zmodel-silver-z.glbzpreview-z.png)write_still   r	   r   r   re   r   )rT   
base_colormetallic	roughness)
variantr	   source_triangles	trianglesverticesr   glb	glb_bytespreviewr   z	manifest-z.json   )indentzutf-8)encoding	TN_RESULT) r   r   inputresolveoutdirmkdirr   r#  r2   r[   r`   r   r{   rr   r   r  r	  r"   r#   r   r   rA   rJ   r'   r&  roundstatst_size
write_textjsondumpsprint)argssource_path
output_dirconfigrV   r$  final_trianglesglb_pathpreview_pathr   r   _valueresultmanifest_paths                  r   mainrD    s   <Dtzz"**,Kdkk"**,JTD1dll#FM
[
)C%c* !S! %./0 !$S)OHh-~T BB3!(4<<. ==L#GGNNd+*3/Ga<<k",$))*5<5FH5F5uUA5FH (s8}d08X]]_,,d|$$*+=$>H(4	E
F" 9T\\N%!@@MTZZq9GL	+tzz&)* Is   I __main__)returnzargparse.Namespace)rF  None)rU   r   rF  bpy.types.Object)rV   rH  rF  int)rV   rH  rp   z
int | NonerF  rG  )rV   rH  rF  rG  )rF  zbpy.types.Material)rV   rH  rF  z$tuple[Vector, Vector, Vector, float])rV   rH  rp   r   rF  rG  )rT   rA   r7   tuple[float, float, float]r   floatr   rK  r   rJ  rp   r   rF  rG  )rV   rH  r   r   rF  rG  )__doc__
__future__r   r   r6  mathpathlibr   r"   r   	mathutilsr   r   r   r2   r[   r`   rr   r{   r   r   r   r   r   r   r	  r  rD  __name__ r   r   <module>rS     s    K "     
   $(UeT#'TUS 'TTR#)ttT	#-8(
" :%(,U
(  	
 &  
&O0d*/+d zF r   