
    _e%                        d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZ ej                  ZddlmZ dd	lZ G d
 de	j$                  ej&                        Zd	xZZ eej.                  j1                         D  cg c]2  \  } }|  eded	 ej2                  e      ej4                  |gdd      f4 c}}       e_        	 [[d Zd ZddZ  e ede ej2                  e      d            d        Z! eejD                        dd       Z" ej                  ej@                        jG                  dd      Z$dZ%y	c c}} w # e$ r
ZY d	Z[d	Z[ww xY w)zBWrapper/Implementation of the GLU tessellator objects for PyOpenGL    )GLU)GL_1_1)createBaseFunction)	glustruct)arrayswrapper)PLATFORM)lazyNc                      e Zd ZdZ ej
                  ej                        Zej                   edej                        ej                   edej                  ej                        ej                   edej                        ej                    edej                  ej                        ej"                   edej                        ej$                   edej                  ej                        ej&                   ed      ej(                   edej                        ej*                   ed ej,                  ej.                         ej,                  ej                         ej,                  ej0                         ej,                  ej                              ej2                   ed ej,                  ej.                         ej,                  ej                         ej,                  ej0                         ej,                  ej                        ej                        ej4                   edej                        ej6                   edej                  ej                        ej8                   edej                        iZej                  dej                   dej"                  dej$                  dej(                  dej*                  dej2                  dej6                  diZddZd Z d Z!d	 Z"d
 Z#d Z$y)GLUtesselatorzCImplementation class for GLUTessellator structures in OpenGL-ctypesNdataWrappervertexWrappercombineWrapperc                    t        | dd      }|g | _        | j                  }t        j                  j	                  |t
        j                        }t        j                  j                  |      dk7  rt        d|      | j                  |      }t        j                  |      }| j                  j                  |       t        | ||      S )z?Add a vertex to this tessellator, storing data for later lookupvertexCacheN   z+Require 3 doubles for array location, got: )getattrr   r   GLdoubleArrayasArrayr   	GL_DOUBLE	arraySize
ValueError
noteObjectctypesc_void_pappendgluTessVertexBase)selflocationdatar   oorValuevps         1/usr/lib/python3/dist-packages/OpenGL/GLU/tess.pygluTessVertexzGLUtesselator.gluTessVertexB   s    dM48!D**K''//&:J:JK))(3q8GOQ  ??4(__X&) x44    c                 r    t        j                  | t        j                  | j	                  |                  S )z7Note the object pointer to return it as a Python object)_simplegluTessBeginPolygonr   r   r   )r   r    s     r#   r(   z!GLUtesselator.gluTessBeginPolygonR   s(    **4QUAV1WXXr%   c                 N     t        d      st        d       fd}|S )a-  Wrap a Python function with ctypes-compatible wrapper for combine callback

        For a Python combine callback, the signature looks like this:
            def combine(
                GLdouble coords[3],
                void *vertex_data[4],
                GLfloat weight[4]
            ):
                return data
        While the C signature looks like this:
            void combine(
                GLdouble coords[3],
                void *vertex_data[4],
                GLfloat weight[4],
                void **outData
            )
        __call__#Require a callable callback, got:  c                 @   j                  | dt        j                        } j                  |dt        j                        }t	        d      D cg c]  }j                  ||          }}t        |D cg c]  }j                  |       c}      }	  
| ||g| }t        j                  j                  |            }	|r|	|d	<   yt        d
      c c}w c c}w # t        $ r1}|j                  d
d| d|d|d|dt        |            d}~ww xY w)z(The run-time wrapper around the functionr      z Failure during combine callback z with args( ,z,*z):
Nr   zNull outData passed to callback)
ptrAsArrayr   r   GLfloatArrayrangeoriginalObjecttuple	Exception	__class__strr   r   r   RuntimeError)coordsvertex_dataweightoutDataargsixresulterroutPfunctionr   s             r#   wrapz*GLUtesselator.combineWrapper.<locals>.wrapk   s   __VQ0D0DEF__VQ0C0CDFHMaQ14..{1~>QKQ$?Q$--a0?@D!&+vEE ??4??6#:;D!
  ##DEE) R?  mm !#C
 
s$   C7CC# #	D,,DDhasattr	TypeErrorr   rB   rC   s   `` r#   r   zGLUtesselator.combineWrapperV   s.    $  78Z+H8UVV	8 r%   c                 N     t        d      st        d       fd}|S )z?Wrap a function which only has the one data-pointer as last argr*   r+   c                      | dd j                  | d         fz   } 	  |  S # t        $ r}|xj                  | fz  c_         d}~ww xY w)0Just return the original object for polygon_dataNr2   r4   r<   r<   r@   rB   r   s     r#   rC   z'GLUtesselator.dataWrapper.<locals>.wrap   sZ    9 3 3DH =??D& Xt,,s   # 	A	AA	rD   rG   s   `` r#   r   zGLUtesselator.dataWrapper   s,     78Z+H8UVV	 r%   c                 N     t        d      st        d       fd}|S )z8Wrap a function which has two data-pointers as last argsr*   r+   c                      | dd j                  | d         j                  | d         fz   } 	  |  S # t        $ r}|xj                  | fz  c_         d}~ww xY w)rJ   NrK   rL   rM   s     r#   rC   z(GLUtesselator.dataWrapper2.<locals>.wrap   sq    9##DH-##DH-  D& Xt,,s   6 	AAArD   rG   s   `` r#   dataWrapper2zGLUtesselator.dataWrapper2   s,     78Z+H8UVV
	 r%   c                 P     t        d      st        d      d fd	}|S )z;Converts a vertex-pointer into an OOR vertex for processingr*   r+   c                     j                  |       } 	 |j                  |      } | |      S  |       S # t        $ r}|xj                  | |ffz  c_         d}~ww xY w)rJ   NrL   )vertexr    r@   rB   r   s      r#   rC   z)GLUtesselator.vertexWrapper.<locals>.wrap   sp    ((0F#..t4D#FD11#F++ X~66s   8 8 	A AA NrD   rG   s   `` r#   r   zGLUtesselator.vertexWrapper   s,     78Z+H8UVV	 r%   rU   )%__name__
__module____qualname____doc__r	   functionTypeForr   FUNCTION_TYPEr'   GLU_TESS_BEGINGLenumGLU_TESS_BEGIN_DATAr   r   GLU_TESS_EDGE_FLAG	GLbooleanGLU_TESS_EDGE_FLAG_DATAGLU_TESS_VERTEXGLU_TESS_VERTEX_DATAGLU_TESS_ENDGLU_TESS_END_DATAGLU_TESS_COMBINEPOINTERGLdoubleGLfloatGLU_TESS_COMBINE_DATAGLU_TESS_ERRORGLU_TESS_ERROR_DATA	GLU_ERRORCALLBACK_TYPESWRAPPER_METHODSr$   r(   r   r   rQ   r    r%   r#   r   r      s   M,H,,X\\:M 	dGNN C##]'..&//&
 	""M$8I8I$J'''##V__*
 	tV__!E$$m&//6??'
 	mD1!!=v#G  -FNN7++,FNN6??+FNN7??+FNN6??+#
 	%%}FNN7++,FNN6??+FNN7??+FNN6??+OO(
 	dGNN C##]'..&//&
 	=w~~>G$NL 	##]''$$o!!=  "2%%'7##]	O5 Y1f &r%   r   gluTessCallbackzagluTessCallback( POINTER(GLUtesselator)(tess), GLenum(which), _GLUfuncptr(CallBackFunc) ) -> None)tesswhichCallBackFunc)dll
resultTypeargTypesdocargNamesc                 &    | j                  ||      S )z=Set a given gluTessellator callback for the given tessellator)addCallback)rr   rs   rB   s      r#   rq   rq      s    E8,,r%   c                 $    | j                  |      S )z.Start definition of polygon in the tessellator)r(   )rr   r    s     r#   r(   r(      s    ##D))r%   c                 &    | j                  ||      S )z1Add a vertex to the tessellator's current polygon)r$   )rr   r   r    s      r#   r$   r$      s    h--r%   
gluNewTessz(gluNewTess(  ) -> POINTER(GLUtesselator))ru   rv   rx   c                      |        d   S )z?Get a new tessellator object (just unpacks the pointer for you)r   rp   )baseFunctions    r#   r~   r~      s     >!r%   c                 p    |+t        j                  d      } | |||       |j                  S  | |||      S )z1Retrieve single double for a tessellator propertyg        )r'   rh   value)r   rr   rs   r    s       r#   gluGetTessPropertyr      s>     |$T5$'zzD%..r%   r   r   )r~   r   r(   rq   r$   rU   )&rY   
OpenGL.rawr   r'   OpenGL.raw.GL.VERSIONr   OpenGL.platformr   
OpenGL.GLUr   OpenGLr   r   r	   OpenGL.lazywrapperr
   _lazyr   	GLUStructr   cfuncTypedictrn   itemsrg   r]   CALLBACK_FUNCTION_REGISTRARS	NameErrorr@   rq   r(   r$   r~   r   setInputArraySizer   __all__)r   r   s   00r#   <module>r      s}   H % ( .   " $ll , pI'')>)> pf  H-1 +99??A Q !(&..7Rw:
	
. * 		8
-
*
. !6>>-06	
 w!!"/ #/ $GOOG$9$9:LL 
E"  		s   7E
E	 	EE