o
    8Va                     @   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   @/usr/lib/python3/dist-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   ZInfinityZ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    "rB   c                 C   s   | |||    S r"   r   )a_mina_maxZa_ratior   r   r   interpolatet   s   rE   c                 C   s$   ||  }|| kr
d}||  t | S )Ng      ?)r$   )rC   rD   Za_valueZa_ranger   r   r   rinterpolatex   s   rF   c                    s   t  fddtdD S )Nc                 3   s$    | ]}t  | | V  qd S r"   )rE   r0   Zcolor1Zcolor2Zratior   r   r6      s   " z$interpolate_color.<locals>.<genexpr>r>   r8   r9   rG   r   rG   r   interpolate_color      rI   c                 C   s   | | | S r"   r   )rA   v_minv_lenr   r   r   scale_value   s   rM   c                    s2   t | t| }|  t fdd| D S )Nc                 3   s    | ]	}t | V  qd S r"   )rM   )r1   frL   rK   r   r   r6          z#scale_value_list.<locals>.<genexpr>)r?   r@   list)ZflistZv_maxr   rO   r   scale_value_list   s   rR   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t fddtd|d D  |g S )NgMbP?z#r_min can not be greater than r_maxg        r   c                 3   s    | ]	} |  V  qd S r"   r   )r1   er_minstrider   r   r6      rP   z strided_range.<locals>.<genexpr>r   )absr9   int	TypeErrorOverflowError
ValueErrorstrided_rangerQ   )	rV   Zr_maxrW   Z	max_stepsZo_minZo_maxZr_min_sZr_max_sZr_stepsr   rU   r   r]      s(   
.r]   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:   r\   strip)soptionstokenpiecesoptionr%   r   r   r   parse_option_string   s   


rj   c                       t  fddtdD S )Nc                 3   s     | ]} | |  V  qd S r"   r   r0   Zv1Zv2r   r   r6      r7   zdot_product.<locals>.<genexpr>r>   sumr9   rl   r   rl   r   dot_product      ro   c                    rk   )Nc                 3   r/   r"   r   r0   rl   r   r   r6      r7   zvec_sub.<locals>.<genexpr>r>   rH   rl   r   rl   r   vec_sub   rp   rq   c                    s   t  fddtdD d S )Nc                 3   s    | ]	} | d  V  qdS )r   Nr   r0   rA   r   r   r6      rP   zvec_mag.<locals>.<genexpr>r>   g      ?rm   rr   r   rr   r   vec_mag   rJ   rs   )rS   )!Zctypesr   r   r   ImportErrorZ	pyglet.glglr	   Z
sympy.corer   ZglGetFloatvr   r   r   r   r   r    r,   r.   r;   r<   r=   rB   rE   rF   rI   rM   rR   r]   rj   ro   rq   rs   r   r   r   r   <module>   s:    					
