a
    ij%                  
   @   s<  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 de	jejZd	 ZZedd ej D e_z[[W n$ ey Z zW Y d	Z[n
d	Z[0 0 dd Zdd ZdddZeedeeedddd Z eej!dddZ!eej"ddZ#dZ$d	S )zBWrapper/Implementation of the GLU tessellator objects for PyOpenGL    )GLU)GL_1_1)createBaseFunction)	glustruct)arrayswrapper)PLATFORM)lazyNc                   @   s  e Zd ZdZe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ejeejeejeejejedeejeejeejeejejejedej
ejedej
ejej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jdejdiZdddZdd	 Z d
d Z!dd Z"dd Z#dd Z$dS )GLUtesselatorzCImplementation class for GLUTessellator structures in OpenGL-ctypesNdataWrappervertexWrappercombineWrapperc                 C   sz   t | dd}|du r g | _| j}tj|tj}tj|dkrNtd|f | 	|}t
|}| j| t| ||S )z?Add a vertex to this tessellator, storing data for later lookupvertexCacheN   z-Require 3 doubles for array location, got: %s)getattrr   r   GLdoubleArrayZasArrayr   Z	GL_DOUBLEZ	arraySize
ValueError
noteObjectctypesc_void_pappendgluTessVertexBase)selflocationdatar   ZoorValueZvp r   M/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/OpenGL/GLU/tess.pygluTessVertexB   s    

zGLUtesselator.gluTessVertexc                 C   s   t | t| |S )z7Note the object pointer to return it as a Python object)_simplegluTessBeginPolygonr   r   r   )r   r   r   r   r   r   R   s    z!GLUtesselator.gluTessBeginPolygonc                    s2    dur t  ds td f  fd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
            )
        N__call__%Require a callable callback, got:  %sc                    s    | dtj}  |dtj} fddtdD  tfdd|D }z|  |g|R  }W nB ty } z*|d|  ||t|f W Y d}~n
d}~0 0 t	
|}|r||d< ntd	dS )
z(The run-time wrapper around the functionr      c                    s   g | ]}  | qS r   originalObject).0i)r   vertex_datar   r   
<listcomp>p       z>GLUtesselator.combineWrapper.<locals>.wrap.<locals>.<listcomp>c                    s   g | ]}  |qS r   r#   )r%   x)r   r   r   r(   q   r)   z?Failure during combine callback %r with args( %s,%s,%s,*%s):
%sNr   zNull outData passed to callback)Z
ptrAsArrayr   r   ZGLfloatArrayrangetuple	Exception	__class__strr   r   r   RuntimeError)Zcoordsr'   weightZoutDataargsresulterrZoutPfunctionr   )r'   r   wrapk   s.    
z*GLUtesselator.combineWrapper.<locals>.wraphasattr	TypeErrorr   r6   r7   r   r5   r   r   V   s    zGLUtesselator.combineWrapperc                    s2    dur t  ds td f  fdd}|S )z?Wrap a function which only has the one data-pointer as last argNr    r!   c               
      sd   | dd  | d f } z
 |  W S  ty^ } z | j | f7  _ W Y d}~n
d}~0 0 dS )0Just return the original object for polygon_dataNr$   r-   r2   r2   r4   r5   r   r   r7      s    
z'GLUtesselator.dataWrapper.<locals>.wrapr8   r;   r   r5   r   r      s    	zGLUtesselator.dataWrapperc                    s2    dur t  ds td f  fdd}|S )z8Wrap a function which has two data-pointers as last argsNr    r!   c               
      sp   | dd  | d  | d f } z
 |  W S  tyj } z | j | f7  _ W Y d}~n
d}~0 0 dS )r<   Nr=   r>   r?   r5   r   r   r7      s    

z(GLUtesselator.dataWrapper2.<locals>.wrapr8   r;   r   r5   r   dataWrapper2   s    zGLUtesselator.dataWrapper2c                    s4    dur t  ds td f d fdd	}|S )z;Converts a vertex-pointer into an OOR vertex for processingNr    r!   c              
      sx    | } z,|dur* |} | |W S  | W S W n< tyr } z$| j | |ff7  _ W Y d}~n
d}~0 0 dS )r<   Nr>   )Zvertexr   r4   r5   r   r   r7      s    

z)GLUtesselator.vertexWrapper.<locals>.wrap)Nr8   r;   r   r5   r   r      s    zGLUtesselator.vertexWrapper)N)%__name__
__module____qualname____doc__r   ZfunctionTypeForr   ZFUNCTION_TYPEr   ZGLU_TESS_BEGINGLenumZGLU_TESS_BEGIN_DATAr   r   ZGLU_TESS_EDGE_FLAGZ	GLbooleanZGLU_TESS_EDGE_FLAG_DATAZGLU_TESS_VERTEXZGLU_TESS_VERTEX_DATAZGLU_TESS_ENDZGLU_TESS_END_DATAZGLU_TESS_COMBINEPOINTERGLdoubleZGLfloatZGLU_TESS_COMBINE_DATAZGLU_TESS_ERRORZGLU_TESS_ERROR_DATAZ	GLU_ERRORCALLBACK_TYPESZWRAPPER_METHODSr   r   r   r   rA   r   r   r   r   r   r
      sh   












&
3r
   c                 C   s6   g | ].\}}|t d tdtttj|gdddfqS )gluTessCallbackNzagluTessCallback( POINTER(GLUtesselator)(tess), GLenum(which), _GLUfuncptr(CallBackFunc) ) -> None)tesswhichZCallBackFunc)dll
resultTypeZargTypesdocZargNames)r   r   r   rG   r
   r   rF   )r%   cfuncTyper   r   r   r(      s   r(   c                 C   s   |  ||S )z=Set a given gluTessellator callback for the given tessellator)ZaddCallback)rK   rL   r6   r   r   r   rJ      s    rJ   c                 C   s
   |  |S )z.Start definition of polygon in the tessellator)r   )rK   r   r   r   r   r      s    r   c                 C   s   |  ||S )z1Add a vertex to the tessellator's current polygon)r   )rK   r   r   r   r   r   r      s    r   
gluNewTessz(gluNewTess(  ) -> POINTER(GLUtesselator))rM   rN   rO   c                 C   s
   |  d S )z?Get a new tessellator object (just unpacks the pointer for you)r   r   )baseFunctionr   r   r   rR      s    
c                 C   s4   |du r$t d}| ||| |jS | |||S dS )z1Retrieve single double for a tessellator propertyNg        )r   rH   value)rS   rK   rL   r   r   r   r   gluGetTessProperty   s
    
rU   r   r   )rR   rU   r   rJ   r   )N)N)%rE   Z
OpenGL.rawr   r   ZOpenGL.raw.GL.VERSIONr   ZOpenGL.platformr   Z
OpenGL.GLUr   ZOpenGLr   r   r   ZOpenGL.lazywrapperr	   Z_lazyr   Z	GLUStructr
   rP   rQ   dictrI   itemsZCALLBACK_FUNCTION_REGISTRARS	NameErrorr4   rJ   r   r   rG   rR   rU   ZsetInputArraySizer   __all__r   r   r   r   <module>   sP    4


