
    Ui$                         S SK r S SKJrJrJrJr  S SKrS SKJr  S SK	J
r
Jr  S SKJr  S SKJrJr  S SKrS SKJr  S SKJr    " S	 S
\5      r " S S\5      rg)    N)castc_floatc_void_psizeof)GL)compileShadercompileProgram)vbo)GL_TEXTURE_MAX_ANISOTROPY_EXT!GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)matrixForOpenVrMatrix)shader_stringc                   2    \ rS rSrS rS rS rS rS rSr	g)	TrackedDeviceMesh   c                 v    Xl         SU l        SU l        SU l        SU l        U R                  5         SU l        g)z?This constructor must only be called with a live OpenGL contextFN)
model_namemodel_is_loadedtexture_is_loadedvaor
   _try_load_modelvertexPositions)selfr   s     V/home/james-whalen/.local/lib/python3.13/site-packages/openvr/tracked_devices_actor.py__init__TrackedDeviceMesh.__init__   s9    $$!&#    c                 	    [         R                  " 5       R                  U R                  5      n[        5       n[        5       nUGb  [        UR                  5       GH  nUR                  U   nUR                  [        UR                  R                  S   5      5        UR                  [        UR                  R                  S   5      5        UR                  [        UR                  R                  S   5      5        UR                  [        UR                  R                  S   5      5        UR                  [        UR                  R                  S   5      5        UR                  [        UR                  R                  S   5      5        UR                  [        UR                  S   5      5        UR                  [        UR                  S   5      5        GM     [        UR                   S-  5       H,  nUR"                  U   nUR                  [%        U5      5        M.     [&        R(                  " U[&        R*                  S9n[&        R(                  " U[&        R,                  S9n[.        R0                  " U5      U l        [.        R0                  " U[4        R6                  S9U l        [4        R:                  " S5      U l        [4        R>                  " U R<                  5        U R2                  RA                  5         U R8                  RA                  5         [4        RB                  " S5        [E        [F        5      n[4        RH                  " SS[4        RJ                  SSU-  [M        SU-  [N        5      5        [4        RB                  " S5        [4        RH                  " SS[4        RJ                  SSU-  [M        SU-  [N        5      5        [4        RB                  " S5        [4        RH                  " SS[4        RJ                  SSU-  [M        S	U-  [N        5      5        [4        R>                  " S5        Xl(        S
U l)        U RU                  5         g ! [         R                  R
                   a     g f = f)Nr            dtype)targetF      T)+openvrVRRenderModelsloadRenderModel_Asyncr   
error_codeRenderModelError_LoadinglistrangeunVertexCountrVertexDataappendfloat	vPositionvvNormalrfTextureCoordunTriangleCount
rIndexDataintnumpyarrayfloat32uint32r
   VBOr   r   GL_ELEMENT_ARRAY_BUFFERindexPositionsglGenVertexArraysr   glBindVertexArraybindglEnableVertexAttribArrayr   r   glVertexAttribPointerGL_FLOATr   r   modelr   _try_load_texture)	r   rF   	vertices0indices0r3   vdiindexfsizes	            r   r   !TrackedDeviceMesh._try_load_model"   s/   	))+AA$//RE F	65../&&q)  r||~~a'8!9:  r||~~a'8!9:  r||~~a'8!9:  rzz||A!78  rzz||A!78  rzz||A!78  r'8'8';!<=  r'8'8';!<= 0 500145((+E
+ 6 KK	?	;;xu||<"wwy1!gghr7Q7QR''*
TXX&!!#  "
$$Q'w
  Ar{{E1u9d1u9V^F_`
$$Q'
  Ar{{E1u9d1u9V^F_`
$$Q'
  Ar{{E1u9d1u9V^F_`
Q
# S   99 		s   .Q% %RRc                     [         R                  " 5       R                  U R                  R                  5      nXl        [        R                  " S5      U l
        [        R                  " [        R                  U R                  5        [        R                  " [        R                  S[        R                  U R                  R                  U R                  R                   S[        R                  [        R"                  U R                  R$                  5	        [        R&                  " [        R                  5        [        R(                  " [        R                  [        R*                  [        R,                  5        [        R(                  " [        R                  [        R.                  [        R,                  5        [        R(                  " [        R                  [        R0                  [        R2                  5        [        R(                  " [        R                  [        R4                  [        R6                  5        [        R8                  " [:        5      n[        R<                  " [        R                  [>        U5        [        R                  " [        R                  S5        SU l         g ! [         R
                  R                   a     g f = f)Nr   r   T)!r'   r(   loadTexture_AsyncrF   diffuseTextureIdr*   r+   texture_mapr   glGenTexturesdiffuse_textureglBindTextureGL_TEXTURE_2DglTexImage2DGL_RGBAunWidthunHeightGL_UNSIGNED_BYTErubTextureMapDataglGenerateMipmapglTexParameteriGL_TEXTURE_WRAP_SGL_CLAMP_TO_EDGEGL_TEXTURE_WRAP_TGL_TEXTURE_MAG_FILTER	GL_LINEARGL_TEXTURE_MIN_FILTERGL_LINEAR_MIPMAP_LINEARglGetFloatvr   glTexParameterfr   r   )r   rR   fLargests      r   rG   #TrackedDeviceMesh._try_load_textureP   s   	 //1CCDJJD_D_`K '!//2
))4+?+?@
((!RZZ9I9I9Q9QSWScScSlSl2::++T-=-=-O-O	Q 	B,,-
2++R-A-A2CVCVW
2++R-A-A2CVCVW
2++R-E-Er||T
2++R-E-ErGaGab>>"CD
2++-JHU
))1-!%!   99 		s   8J9 9KKc                 b   U R                   (       d  U R                  5         g U R                  (       d  U R                  5         g UR                  n[        U5      nXA-  n[        R                  " [        R                  " U[        R                  S95      n[        R                  " SSSU5        [        R                  " U5      n[        R                  " SSSU5        [        R                  " [        R                  5        [        R                  " [        R                  U R                   5        [        R"                  " U R$                  5        [        R&                  " [        R(                  [+        U R,                  5      [        R.                  S 5        [        R"                  " S5        g )Nr"      r   Fr%   r   )r   r   r   rG   mDeviceToAbsoluteTrackingr   r9   asarraymatrixr;   r   glUniformMatrix4fvglActiveTextureGL_TEXTURE0rU   rV   rT   rA   r   glDrawElementsGL_TRIANGLESlenr?   GL_UNSIGNED_INT)r   	modelview
projectionposecontroller_X_room
modelview0normal_matrixs          r   
display_glTrackedDeviceMesh.display_glf   s   ##  "%%""$ ::12CD&2
]]5<<
%--#PQ

aE:6&78
aE=9
2>>*
))4+?+?@
TXX&
"//3t/B/B+CREWEWY]^
Qr   c                    U R                   b)  [        R                  " SU R                   45        S U l         S U l        U R                  bC  U R                  R                  5         S U l        U R                  R                  5         S U l        g g )Nr   )r   r   glDeleteVertexArraysr
   r   deleter?   )r   s    r   
dispose_glTrackedDeviceMesh.dispose_gl{   su    88##A{3DH+  '')#'D &&("&D	 ,r   )
rT   r?   rF   r   r   r   rR   r   r
   r   N)
__name__
__module____qualname____firstlineno__r   r   rG   r|   r   __static_attributes__ r   r   r   r      s    $,!\&, *	'r   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TrackedDevicesActor   z)
Draws Vive controllers and lighthouses.
c                 J    SU l         Xl        [        5       U l        SU l        g )Nr   T)shaderposesdictmeshesshow_controllers_only)r   
pose_arrays     r   r   TrackedDevicesActor.__init__   s    
f%)"r   c                    [        S[        U R                  5      5       H  nU R                  U   nUR                  (       d  M%  UR                  (       d  M8  U R
                  (       a:  [        R                  " 5       R                  U5      nU[        R                  :X  d  M  [        R                  " 5       R                  U[        R                  5      nX@R                  ;  d  M  [        U5      U R                  U'   M     g)zMEnumerate OpenVR tracked devices and check whether any need to be initializedr   N)r-   rt   r   bDeviceIsConnectedbPoseIsValidr   r'   VRSystemgetTrackedDeviceClassTrackedDeviceClass_ControllergetStringTrackedDevicePropertyProp_RenderModelName_Stringr   r   )r   rK   rx   device_classr   s        r   _check_devices"TrackedDevicesActor._check_devices   s    q#djj/*A::a=D**$$))%0FFqI#v'K'KK*II!VMoMopJ,*;J*GJ' +r   c                    [        [        S5      [        R                  5      n[        [        S5      [        R                  5      n[        X5      U l        U R                  5         [        R                  " [        R                  5        g )Naj  
            layout(location = 0) in vec3 in_Position;
            layout(location = 1) in vec3 in_Normal;
            layout(location = 2) in vec2 in_TexCoord;
            
            layout(location = 0) uniform mat4 projection = mat4(1);
            layout(location = 4) uniform mat4 model_view = mat4(1);
            layout(location = 8) uniform mat4 normal_matrix = mat4(1);
            
            out vec3 color;
            out vec2 fragTexCoord;
            
            void main() {
              gl_Position = projection * model_view * vec4(in_Position, 1.0);
              vec3 normal = normalize((normal_matrix * vec4(in_Normal, 0)).xyz);
              color = (normal + vec3(1,1,1)) * 0.5; // color by normal
              fragTexCoord = in_TexCoord;
              // color = vec3(in_TexCoord, 0.5); // color by texture coordinate
            }
            a/  
            uniform sampler2D diffuse;
            in vec3 color;
            in vec2 fragTexCoord;
            out vec4 fragColor;
            
            void main() {
              // fragColor = vec4(color, 1.0);
              fragColor = texture(diffuse, fragTexCoord);
            }
            )
r   r   r   GL_VERTEX_SHADERGL_FRAGMENT_SHADERr	   r   r   glEnableGL_DEPTH_TEST)r   vertex_shaderfragment_shaders      r   init_glTrackedDevicesActor.init_gl   st    %  ( +!, ( 
 
 !!# %]D
B$$%r   c                 8   U R                  5         [        R                  " [        R                  5        [        R                  " U R
                  5        [        R                  " SSSU5        [        S[        U R                  5      5       H  nU R                  U   nUR                  (       d  M%  [        R                  " 5       R                  U[        R                  5      nXPR                  ;  a  Mi  U R                  U   nUR!                  XU5        M     g )Nr   r   F)r   r   r   r   glUseProgramr   ro   r-   rt   r   r   r'   r   r   r   r   r|   )r   rv   rw   rK   rx   r   meshs          r   r|   TrackedDevicesActor.display_gl   s    
B$$%
$
aE:6q#djj/*A::a=D$$*II!VMoMopJ,;;z*DOOI48 +r   c                     [         R                  " U R                  5        SU l        [        U R                  5       H/  nU R                  U   nUR                  5         U R                  U	 M1     g )Nr   )r   glDeleteProgramr   r,   r   r   )r   keyr   s      r   r   TrackedDevicesActor.dispose_gl   sR    
4;;'$C;;s#DOOC  %r   )r   r   r   r   N)r   r   r   r   __doc__r   r   r   r|   r   r   r   r   r   r   r      s"    *H"&&P9!r   r   )timectypesr   r   r   r   r9   OpenGLr   OpenGL.GL.shadersr   r	   OpenGL.arraysr
   (OpenGL.GL.EXT.texture_filter_anisotropicr   r   r'   openvr.gl_rendererr   openvr.glframeworkr   objectr   r   r   r   r   <module>r      sJ   
  2 2   ;  u  4 ,
m' m'`Y!& Y!r   