o
    GZh                     @   s
  zd dl mZmZmZ W n	 ey   Y nw d dlmZ d dlm	Z	 eej
fddZeej
f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 Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd1d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Z dS )2    )c_floatc_intc_doubleN)Sc                 C      | d  }|t j| |S z/
    Returns the current modelview matrix.
       )pglZGL_MODELVIEW_MATRIXZ
array_typeZglGetMethodm r   M/var/www/auris/lib/python3.10/site-packages/sympy/plotting/pygletplot/util.pyget_model_matrix
      
r   c                 C   r   r   )r	   ZGL_PROJECTION_MATRIXr
   r   r   r   get_projection_matrix   r   r   c                  C   s   t d  } ttj|  | S )z'
    Returns the current viewport.
       )r   r	   ZglGetIntegervZGL_VIEWPORTr   r   r   r   get_viewport   s   
r   c                  C   F   t  } | d | d | d f| d | d | d f| d | d | d	 ffS )
Nr   r            	         
   r   r   r   r   r   get_direction_vectors%   
   r   c                  C   r   )
Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   get_view_direction_vectors,   r   r   c                   C   s   dS )N))r   r   r   )r   r   r   )r   r   r   r   r   r   r   r   get_basis_vectors3   s   r    c           	      C   j   t ttj}tttj}t }t t t }}}t| ||||||||	 t|jt|jt|jfS N)	r   r   r	   glGetDoublevr   r   ZgluUnProjectfloatvalue	xyzr   pwZmxZmyZmzr   r   r   screen_to_model7      r,   c           	      C   r!   r"   )	r   r   r	   r#   r   r   Z
gluProjectr$   r%   r&   r   r   r   model_to_screen@   r-   r.   c                    s    t  fddtt D S )Nc                 3        | ]} | |  V  qd S r"   r   .0iabr   r   	<genexpr>J       zvec_subs.<locals>.<genexpr>)tuplerangelenr3   r   r3   r   vec_subsI   s    r;   c                  C   s\   t  } d| d< d| d< d| d< d| d< d| d< d| d< d| d< d| d< d| d	< t|  d
S )z
    Removes rotational components of
    current matrix so that primitives
    are always drawn facing the viewer.

    |1|0|0|x|
    |0|1|0|x|
    |0|0|1|x| (x means left unchanged)
    |x|x|x|x|
    r   r   r   r   r   r   r   r   r   N)r   r	   ZglLoadMatrixfr   r   r   r   billboard_matrixM   s   r<   c                   C   s(   t jt jdgt jt jdgt jt jdggS )Nr   )r   InfinityNegativeInfinityr   r   r   r   create_boundsf   s   r?   c                 C   s^   |d u rd S t dD ]"}t| | d || g| | d< t| | d || g| | d< q
d S )N   r   r   )r9   minmax)r5   vZaxisr   r   r   update_boundsl   s    "rD   c                 C   s   | |||    S r"   r   )a_mina_maxZa_ratior   r   r   interpolatet   s   rG   c                 C   s$   ||  }|| kr
d}||  t | S )Ng      ?)r$   )rE   rF   Za_valueZa_ranger   r   r   rinterpolatex   s   rH   c                    s   t  fddtdD S )Nc                 3   s$    | ]}t  | | V  qd S r"   )rG   r0   color1color2ratior   r   r6      s   " z$interpolate_color.<locals>.<genexpr>r@   r8   r9   rI   r   rI   r   interpolate_color      rN   c                 C   s   | | | S r"   r   )rC   v_minv_lenr   r   r   scale_value   s   rR   c                    s.   t | t| }|   fdd| D S )Nc                    s   g | ]}t | qS r   )rR   )r1   frQ   rP   r   r   
<listcomp>       z$scale_value_list.<locals>.<listcomp>)rA   rB   )flistZv_maxr   rT   r   scale_value_list   s   rX   2   c           	   	      s    |}}t  | dk rg S z
tt |  W n ttfy&   g  Y S w  |kr/td  }|  }t | dk rCd} |8  ||7 }t|   }|ra||krat||d S  g fddtd|d D  |g S )NgMbP?z"r_min cannot be greater than r_maxg        r   c                    s   g | ]} |  qS r   r   )r1   er_minstrider   r   rU      rV   z!strided_range.<locals>.<listcomp>r   )absr9   int	TypeErrorOverflowError
ValueErrorstrided_range)	r\   Zr_maxr]   Z	max_stepsZo_minZo_maxZr_min_sZr_max_sZr_stepsr   r[   r   rc      s(   
*rc   c                 C   s~   t | tsd S i }| dD ].}|d}t|dkr#|d d}}nt|dkr.|\}}ntd|  | || < q|S )N;=r   r    r   z%Plot option string '%s' is malformed.)
isinstancestrsplitr:   rb   strip)soptionstokenpiecesoptionr%   r   r   r   parse_option_string   s   


rp   c                       t  fddtdD S )Nc                 3   s     | ]} | |  V  qd S r"   r   r0   v1v2r   r   r6      r7   zdot_product.<locals>.<genexpr>r@   sumr9   rr   r   rr   r   dot_product      rw   c                    rq   )Nc                 3   r/   r"   r   r0   rr   r   r   r6      r7   zvec_sub.<locals>.<genexpr>r@   rM   rr   r   rr   r   vec_sub   rx   ry   c                    s   t  fddtdD d S )Nc                 3   s    | ]	} | d  V  qdS )r   Nr   r0   rC   r   r   r6      s    zvec_mag.<locals>.<genexpr>r@   g      ?ru   rz   r   rz   r   vec_mag   rO   r{   )rY   )!ctypesr   r   r   ImportErrorZ	pyglet.glglr	   Z
sympy.corer   ZglGetFloatvr   r   r   r   r   r    r,   r.   r;   r<   r?   rD   rG   rH   rN   rR   rX   rc   rp   rw   ry   r{   r   r   r   r   <module>   s:    					
