a
    F­^ip  ã                   @   s^  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZ d dlZd dlZd dlmZ zd dlm  mZ W n ey¨   dZY n0 d dlZd dlZd dlZd dl Z da!dd„ Z"da#d	d
„ Z$dd„ Z%dd„ Z&G dd„ de'ƒZ(G dd„ de'ƒZ)i Z*G dd„ de'ƒZ+e  ,e+¡Z-dd„ Z.G dd„ dej/j0j1ƒZ2da3dd„ Z4dS )é    )ÚdivisionÚabsolute_importÚwith_statementÚprint_functionÚunicode_literals)ÚPY2Ú
basestringÚbchrÚbordÚchrÚopenÚpystrÚrangeÚroundÚstrÚtobytesÚunicode)ÚAnyN)Úregister_shaderFc                  C   s~   t rd S tjrd} ntjr d} nd} tj tj tj	¡| ¡}tj 
|¡rL|} tsZ|  d¡} tjj | ¡svtd | ¡ƒ‚da d S )NzLive2DCubismCore.dllzlibLive2DCubismCore.dylibzlibLive2DCubismCore.sozutf-8z(Could not load Live2D. {} was not found.T)Údid_onetime_initÚrenpyÚwindowsÚ	macintoshÚosÚpathÚjoinÚdirnameÚsysÚ
executableÚexistsr   ÚencodeÚgl2Úlive2dmodelÚloadÚ	ExceptionÚformat)ÚdllÚfn© r(   úTC:\Program Files (x86)\Steam\steamapps\common\Selene ~Apoptosis~\renpy\gl2\live2d.pyÚonetime_init-   s    
r*   c                   C   sr   t rdS tdu rtdƒ‚tjjs(tdƒ‚tƒ  tddddd td	ddd
d tdddd tjj 	t
¡ da dS )z1
    Called to initialize Live2D, if needed.
    NzLive2D has not been built.z(Live2D requires that config.gl2 be True.zlive2d.maskzÑ
        uniform sampler2D tex0;
        uniform sampler2D tex1;
        attribute vec4 a_position;
        attribute vec2 a_tex_coord;
        varying vec2 v_tex_coord;
        varying vec2 v_mask_coord;
    zx
        v_tex_coord = a_tex_coord;
        v_mask_coord = vec2(a_position.x / 2.0 + .5, -a_position.y / 2.0 + .5);
    z’
        vec4 color = texture2D(tex0, v_tex_coord);
        vec4 mask = texture2D(tex1, v_mask_coord);
        gl_FragColor = color * mask.a;
    )Ú	variablesZ
vertex_200Zfragment_200zlive2d.inverted_maskzš
        vec4 color = texture2D(tex0, v_tex_coord);
        vec4 mask = texture2D(tex1, v_mask_coord);
        gl_FragColor = color * (1.0 - mask.a);
    zlive2d.flip_texturez'
        varying vec2 v_tex_coord;
    z2
        v_tex_coord.y = 1.0 - v_tex_coord.y;
    )r+   Z
vertex_250T)Údid_initr"   r$   r   Úconfigr!   r*   r   Úinteract_callbacksÚappendÚupdate_statesr(   r(   r(   r)   ÚinitJ   s(    ööþr1   c                   C   s   da t ¡  dS )z<
    Resets this module when Ren'Py reloads the script.
    FN)r,   Úcommon_cacheÚclearr(   r(   r(   r)   Úreset‡   s    r4   c                   C   s   t  ¡  dS )zA
    Resets the Live2D states when Ren'Py restarts the game.
    N)Ústatesr3   r(   r(   r(   r)   Úreset_states’   s    r6   c                   @   s   e Zd ZdZdd„ ZdS )ÚLive2DExpressionz2
    The data corresponding to an expression.
    c                 C   s   || _ || _|| _d S ©N)Ú
parametersÚfadeinÚfadeout)Úselfr9   r:   r;   r(   r(   r)   Ú__init__Ÿ   s    zLive2DExpression.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   r(   r(   r(   r)   r7   š   s   r7   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚLive2DCommona  
    This object stores information that is common to all of the Live2D
    displayables that use the same .model3.json file, so this information
    only needs to be loaded once. This should not leak into the save games,
    but is loaded at init time.
    c              	      s†  t ƒ  | d¡s.| d¡d }|d | d }tjjrFtjj d|¡ tj	 
|¡s`td |¡ƒ‚| d¡d  d¡d  ¡ }| d¡d | _| jr |  jd7  _tj	 |¡}t |¡| _W d   ƒ n1 sÎ0    Y  tjj | j| jd	 d
  ¡| _g | _| jd	 d D ] }| j tj | j| ¡¡ qi }i }tj ¡ D ]n}| | j¡sVq@| d¡r‚|t| jƒd … }d|i||< n*| d¡r@|t| jƒd … }d|i||< q@‡ fdd„‰ ˆ | jd	  di ¡|ƒ ˆ | jd	  di ¡|ƒ t ddgƒ| _!dtjj" #¡ i| _$| %¡ D ]º}|d  ¡  d¡d  d¡d }	|	 d¡\}
}}|
|krV|}	tj	 
| j|d  ¡rtjjrŽtjj d|	|d ¡ tjj" &| j|d  | d|¡| d|¡¡| j$|	< | j! '|	¡ qdt(g ddƒi| _)| %¡ D ]}|d  ¡  d¡d  d¡d }	|	 d¡\}
}}|
|kr.|}	tj	 
| j|d  ¡rêtjjrftjj d|	|d ¡ |	| j!v r€td |	¡ƒ‚tj	 | j|d  ¡}t |¡}W d   ƒ n1 s¸0    Y  t(| dg ¡| d|¡| d|¡ƒ| j)|	< | j! '|	¡ qê| j dg ¡D ]L}|d }	|d }|d  d!kr:|| jj*|	< n|d  d"kr
|| jj+|	< q
t,| j)ƒ| _-i | _.d#| _/d | _0d | _1d | _2d S )$Nz.jsonú/é   z.model3.jsonzLoading Live2D from %r.zLive2D model {} does not exist.Ú.r   ZFileReferencesZMocZTextureszmotion3.jsonÚFilez
.exp3.jsonc                    sV   t | tƒr"| D ]}ˆ ||ƒ qd S d| v r:| || d < d S |  ¡ D ]}ˆ ||ƒ qBd S )NrF   )Ú
isinstanceÚlistÚvalues)ÚoÚdÚi©Úwalk_json_filesr(   r)   rN   ä   s    
z.Live2DCommon.__init__.<locals>.walk_json_filesZMotionsZExpressionsZstillÚnullÚ_z - motion %s -> %sZ
FadeInTimeZFadeOutTimeç        z - expression %s -> %sz+Name {!r} is already specified as a motion.Z
ParametersZGroupsÚNameZIdsZTargetÚ	ParameterZOpacityF)3r1   ÚendswithÚ
rpartitionr   r-   Úlog_live2d_loadingÚdisplayÚlogÚwriteÚloaderÚloadabler$   r%   Ú	partitionÚlowerÚbaser#   ÚjsonZ
model_jsonr!   r"   ZLive2DModelÚmodelÚtexturesr/   ÚeasyÚdisplayableÚexportsÚ
list_filesÚ
startswithÚlenÚgetÚsetÚ
attributesZlive2dmotionZ
NullMotionÚmotionsrI   ÚMotionÚaddr7   ÚexpressionsZparameter_groupsZopacity_groupsÚdictÚall_expressionsÚnonexclusiveÚseamlessÚattribute_functionÚattribute_filterÚupdate_function)r<   ÚfilenameÚdefault_fadeÚsuffixZ
model_nameÚfrL   Zmotion_filesZexpression_filesÚnameÚprefixrP   Zexpression_jsonÚidsr(   rM   r)   r=   ­   s     
*  



ý
 

*


ý
zLive2DCommon.__init__c                 C   sž   |  ¡ D ]\}}d }d}|| jv r*| j}n:|| jv r@| j}d}n$|| jv rV| j}d}ntd |¡ƒ‚||v rztd |¡ƒ‚|| ||< |r|| | j|< qd S )NFTz.Name {!r} is not a known motion or expression.z9Name {!r} is already specified as a motion or expression.)Úitemsrk   rn   rq   r$   r%   rp   )r<   ÚaliasesÚkÚvÚtargetÚ
expressionr(   r(   r)   Úapply_aliasesF  s"    


zLive2DCommon.apply_aliasesc                 C   s8   |D ].}|| j vr td |¡ƒ‚| j  |¡| j|< qd S )Nz$Name {!r} is not a known expression.)rn   r$   r%   Úpoprq   )r<   rq   rL   r(   r(   r)   Úapply_nonexclusiveb  s    
zLive2DCommon.apply_nonexclusivec                 C   s
   || _ d S r8   ©rr   )r<   Úvaluer(   r(   r)   Úapply_seamlessi  s    zLive2DCommon.apply_seamlessc                 C   s*   | j du rdS | j du rdS || j v S d S )NTFr†   )r<   Úmotionr(   r(   r)   Úis_seamlessl  s
    

zLive2DCommon.is_seamlessN)	r>   r?   r@   rA   r=   rƒ   r…   rˆ   rŠ   r(   r(   r(   r)   rB   ¥   s    rB   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚLive2DStatec                 C   s4   d| _ d| _d | _d | _d| _d| _g | _g | _d S )NFr   )ÚmarkÚ	cycle_newÚoldÚnewÚold_base_timeÚnew_base_timern   Úold_expressions©r<   r(   r(   r)   r=   {  s    zLive2DState.__init__c                    sx   t dd„ | jD ƒƒ‰ ‡fdd„| jD ƒ‡‡fdd„| jD ƒ | _‡fdd„| jD ƒ| _|  j‡ ‡fdd„ˆD ƒ7  _dS )	zÚ
        Updates the lists of new and old expressions.

        `expressions`
            A list of strings giving expression names.

        `now`
            The time the current displayable started showing.
        c                 s   s   | ]\}}|V  qd S r8   r(   )Ú.0rz   rP   r(   r(   r)   Ú	<genexpr>ž  ó    z1Live2DState.update_expressions.<locals>.<genexpr>c                    s$   g | ]\}}}|ˆ vr|||f‘qS r(   r(   ©r”   rz   ÚshownÚhidden©rn   r(   r)   Ú
<listcomp>¡  r–   z2Live2DState.update_expressions.<locals>.<listcomp>c                    s"   g | ]\}}|ˆ vr||ˆf‘qS r(   r(   ©r”   rz   r˜   )rn   Únowr(   r)   r›   ¢  r–   c                    s    g | ]\}}|ˆ v r||f‘qS r(   r(   rœ   rš   r(   r)   r›   ¤  r–   c                    s   g | ]}|ˆ vr|ˆf‘qS r(   r(   )r”   rz   )Úcurrentr   r(   r)   r›   ¥  r–   N)ri   rn   r’   )r<   rn   r   r(   )rž   rn   r   r)   Úupdate_expressions“  s    ÿÿzLive2DState.update_expressionsN)r>   r?   r@   r=   rŸ   r(   r(   r(   r)   r‹   y  s   r‹   c                  C   s\   dd„ } t jj ¡ }|jddD ]}|dur | | ¡ q t ¡ D ]}|jsPd|_	d|_q@dS )zo
    Called once per interact to walk the tree of displayables and find
    the old and new live2d states.
    c                 S   s¨   t | tƒsd S | jd u rd S t| j }|jr0d S d|_|j| u rDd S |j| u rRd S |jrj|j|_|j|_	nd |_d |_	g |_
g |_| |_| jr˜|j	|_nd |_d|_d S )NT)rG   ÚLive2Drz   r5   rŒ   r   rŽ   r   r‘   r   rn   r’   Úsustain)rK   Ústater(   r(   r)   Úvisit²  s0    






zupdate_states.<locals>.visitT)rž   NF)
r   rW   ÚcoreÚscene_listsÚget_all_displayablesÚ	visit_allr5   rI   rŒ   r   )r£   ÚslsrK   Úsr(   r(   r)   r0   ¬  s    'r0   c                       sª   e Zd ZdgZdZdZdZddd„Zedd„ ƒZ	dd	ddd
i ddddddd
ddddf‡ fdd„	Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Z‡  ZS )r    r2   NTç      ð?c                 C   s6   t  | jd ¡}|d u r,t| j|ƒ}|t | j< || _ |S r8   )r2   rh   rv   rB   )r<   rw   Úrvr(   r(   r)   Úcreate_commonî  s    
zLive2D.create_commonc                 C   s   | j d ur| j S |  | j¡S r8   )r2   r¬   rv   r“   r(   r(   r)   Úcommonú  s    
zLive2D.commonrQ   Fc                    sÄ   t t| ƒjf i |¤Ž || _|	| _|
| _|| _|| _|| _|| _	|| _
|| _|| _|| _d | _|  |¡}|rv| |¡ |r„| |¡ |d ur–| |¡ |d ur¤||_|d ur²||_|d urÀ||_d S r8   )Úsuperr    r=   rv   rk   r‚   Úused_nonexclusiveÚzoomÚtopr^   ÚheightÚloopÚfader¡   rz   r¬   r…   rƒ   rˆ   rs   rt   ru   )r<   rv   r°   r±   r^   r²   r³   r~   r´   rk   r‚   rq   r¯   rr   r¡   rs   rt   ru   rw   Ú
propertiesr­   ©Ú	__class__r(   r)   r=     s4    



zLive2D.__init__c           
      C   s$  | j s
| S |s| S | j}g }g }d }d}d|jv rLtdd„ |jD ƒƒ}d}n|j}|jd urf| |¡}|D ]z}||jv r„| |¡ qj||jv rš| |¡ qj||jv rÌ|d urÆt	d 
d |j¡||¡ƒ‚|}qjt	d 
d |j¡|¡ƒ‚qjt| j|| j| j| j| j| j| j|||d	}	|j|	_d|	_ |	S )
NFÚ_sustainc                 s   s   | ]}|d kr|V  qdS )r¸   Nr(   ©r”   rL   r(   r(   r)   r•   O  r–   z$Live2D._duplicate.<locals>.<genexpr>Tz7When showing {}, {} and {} are both live2d expressions.ú z-When showing {}, {} is not a known attribute.)
rk   r°   r±   r^   r²   r³   r´   r‚   r¯   r¡   )Ú_duplicatabler­   ÚargsÚtuplers   rk   r/   rq   rn   r$   r%   r   rz   r    rv   r°   r±   r^   r²   r³   r´   )
r<   r¼   r­   rk   r¯   r‚   r¡   rj   rL   r«   r(   r(   r)   Ú
_duplicate?  sX    







õzLive2D._duplicatec                    sR   | j }t|jƒ‰ |D ]}||jv rˆ t|jƒ8 ‰ qˆ t|ƒO ‰ ‡ fdd„|jD ƒS )Nc                    s   g | ]}|ˆ v r|‘qS r(   r(   r¹   ©Z	availabler(   r)   r›   ˆ  r–   z+Live2D._list_attributes.<locals>.<listcomp>)r­   ri   rj   rn   )r<   Útagrj   r­   rL   r(   r¿   r)   Ú_list_attributes|  s    

zLive2D._list_attributesc                    sÌ   | j ‰ ‡ fdd„|D ƒ}|s4d}‡ fdd„|D ƒ}nd}t|ƒt|ƒ D ]}|ˆ jv rH| d|¡  qhqHt|ƒt|ƒ D ]}|ˆ jv rx| |¡ qxt|ƒ}ˆ jr¼ˆ  |¡}t|tƒs¼t|ƒ}|rÈd| }|S )Nc                    s   g | ]}|ˆ j v r|‘qS r(   ©rk   r¹   ©r­   r(   r)   r›     r–   z-Live2D._choose_attributes.<locals>.<listcomp>Tc                    s   g | ]}|ˆ j v r|‘qS r(   rÂ   r¹   rÃ   r(   r)   r›   ”  r–   Fr   )r¸   )	r­   rH   rn   Úinsertrq   r/   r½   rt   rG   )r<   rÀ   rj   Úoptionalr«   r¡   rL   r(   rÃ   r)   Ú_choose_attributesŠ  s*    



zLive2D._choose_attributesc                 C   sx  | j s
dS d}d}d}d}d}|}	|dur2|| }	| j D ]d}
|j  |
d¡}|du rTq8|j|krf q
n|j|	kr€| |
¡s€ q
|	|j8 }	||j8 }|d7 }q8|du rªdS | j d }
| jrÀ|jsÌ|j}d}n>|dur
| |
¡s
|	|	|j  }|| |jkr
|j}d}|du rdS |t| j ƒk r4| j | }n
| j d }|dkrX| j |d  }nd}|t| j ƒd k r€| j |d  }n| jr”| j d }nd}||kr²| |¡r²d}||krÖ| |¡rÖ|du rÖd}| ||||¡}| ¡ D ]j\}}|\}}|\}}|dkr |j ||¡ n6|dkr<|j 	|||¡ n|d	krî|j 	|||¡ qî|rddS | 
||||¡S dS )
zö
        This updates the common model with the information taken from the
        motions associated with this object. It returns the delay until
        Ren'Py needs to cause a redraw to occur, or None if no delay
        should occur.
        NTFr   é   éÿÿÿÿZPartOpacityrS   ÚModel)rk   rh   ÚdurationrŠ   r³   rg   r}   r`   Zset_part_opacityZset_parameterÚwait)r<   r­   ÚstZst_fadeZ
do_fade_inZdo_fade_outZ
last_frameÚcurrent_indexr‰   Z	motion_stÚmZmotion_startÚcurrent_nameÚ	last_nameZ	next_nameZmotion_datar   r€   ÚkindÚkeyÚfactorr‡   r(   r(   r)   Úupdate¯  s|    








 


zLive2D.updatec                    sš  | j ‰ ˆ j}t| j }tjjj‰‡ ‡fdd„|jD ƒ|_t	| j
ƒ}| jrT| | j¡ | |ˆ| ¡ d }|jD ]¦\}}}d}	ˆ j| }
|
jdkr¶ˆ| |
jk r¶t|	ˆ| |
j ƒ}	d}|
jdkrêˆ| |
jk rêt|	dˆ| |
j  ƒ}	d}|
jD ]"}|j|d |d |d |	d qðqn|jD ]x\}}d}	ˆ j| }
|
jdkrfˆ| |
jk rft|	ˆ| |
j ƒ}	d}|
jD ]$}|j|d |d |d |	d qlq|S )	Nc                    s0   g | ](\}}}ˆ| ˆ j | jk r|||f‘qS r(   )rp   r;   r—   ©r­   r   r(   r)   r›   1  r–   z-Live2D.update_expressions.<locals>.<listcomp>rª   r   ZIdZBlendZValue)Úweight)r­   r`   r5   rz   r   rW   Ú	interfaceÚ
frame_timer’   rH   r¯   r‚   r/   rŸ   rp   r:   Úminr;   r9   Úblend_parameterrn   )r<   rÌ   r`   r¢   rn   Úredrawrz   r˜   r™   rÖ   ÚerL   r(   rÕ   r)   rŸ   (  s<    




"

&zLive2D.update_expressionsc                 C   s.   |dvrt d |¡ƒ‚| jj ||||¡ d S )N)ÚAddZMultiplyZ	OverwritezUnknown blend mode {!r})r$   r%   r­   r`   rÚ   )r<   rz   Úblendr‡   rÖ   r(   r(   r)   rÚ   Z  s    zLive2D.blend_parameterc                    s  | j }|j}| jd ur| jntjj}| js.d}|r–t| j }|j| urJd}|j	d u rdtj
jjˆ |_	|jd u rtd}n"|jd u r„d}n|jj | j ur–d}| ¡  |r´tj
jj|j	 }	nˆ}	|  ||	d ¡}
|rè|j |tj
jj|j ˆ¡}nd }| ¡  |  ˆ¡}|jd u rd }n| | ˆ¡}|
|||g}dd„ |D ƒ}|rPtj
j | t|ƒ¡ ‡ ‡‡‡fdd„|jD ƒ}| ¡ \}‰| j}‡fdd„}|d u rÌ|| jƒ}|| jƒ}t|| dƒ}d| j tjj | }nˆ}d}| ||¡}tj  !|| || ¡}| "|d| | f¡ |S )	NFc                 S   s   g | ]}|d ur|‘qS r8   r(   r¹   r(   r(   r)   r›   ˜  r–   z!Live2D.render.<locals>.<listcomp>c              	      s"   g | ]}t jj |ˆˆˆˆ ¡‘qS r(   )r   rW   Úrender)r”   rK   )Úatr²   rÌ   Úwidthr(   r)   r›   ž  r–   c                    s   t | tƒr| ˆ  S | S d S r8   )rG   Úfloat)Ún)Úshr(   r)   r©   ¤  s    
zLive2D.render.<locals>.srª   r   )#r­   r`   r´   r   ÚstoreZ_live2d_faderz   r5   r   r‘   rW   r×   rØ   rŽ   r   Zreset_parametersrÔ   Zfinish_parametersrŸ   ru   rß   rÛ   rÙ   ra   Úget_sizer°   r±   r^   Úmaxr²   r-   Úscreen_heightrd   ÚRenderÚblit)r<   rá   r²   rÌ   rà   r­   r`   r´   r¢   ÚtZ
new_redrawZ
old_redrawZexpression_redrawZuser_redrawZredrawsra   Úswr°   r©   r±   r^   ÚsizeÚrendr«   r(   )rà   r²   rä   rÌ   rá   r)   rß   `  sb    








zLive2D.renderc                 C   s   | j jS r8   )r­   ra   r“   r(   r(   r)   r£   ¾  s    zLive2D.visit)rª   )rª   )r>   r?   r@   Únosaver2   r»   r¯   r¬   Úpropertyr­   r=   r¾   rÁ   rÆ   rÔ   rŸ   rÚ   rß   r£   Ú__classcell__r(   r(   r¶   r)   r    æ  sB   


í==%y2
^r    c                   C   s2   t du r.ztƒ  da W n ty,   da Y n0 t S )zq
    :doc: live2d

    Returns True if Live2d is supported on the current platform, and
    False otherwise.
    NTF)Ú_has_live2dr1   r$   r(   r(   r(   r)   Ú
has_live2dÆ  s    

ró   )5Ú
__future__r   r   r   r   r   Úrenpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   Útypingr   r   Zrenpy.gl2.live2dmotionÚrenpy.gl2.gl2shadercacher   Zrenpy.gl2.live2dmodelr!   r"   ÚImportErrorr   r   r_   Úcollectionsr   r*   r,   r1   r4   r6   Úobjectr7   rB   r2   r‹   Údefaultdictr5   r0   rW   r¤   ÚDisplayabler    rò   ró   r(   r(   r(   r)   Ú<module>   s@   8
= R0
:   `