joric

shadertoy.py (for http://www.iquilezles.org/apps/shadertoy/)

Jul 16th, 2011
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.34 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. # see http://www.iquilezles.org/apps/shadertoy/
  4.  
  5. import sys
  6. import array
  7. import random
  8. import time
  9. import struct
  10.  
  11. try:
  12.     from OpenGL.GLUT import *
  13.     from OpenGL.GL import *
  14.     from OpenGL.GLU import *
  15. except:
  16.     print "Cannot find PyOpenGL module"
  17.     sys.exit()
  18.  
  19. try:
  20.     from OpenGL.GL.ARB.shader_objects import *
  21.     from OpenGL.GL.ARB.fragment_shader import *
  22.     from OpenGL.GL.ARB.vertex_shader import *
  23. except:
  24.     print "Shaders are not supported (need opengl 2.0+)"
  25.     sys.exit()
  26.  
  27. start_time = 0
  28.  
  29. width = 256
  30. height = 256
  31.  
  32. txw = 256
  33. txh = 256
  34.  
  35. size = txw * txh
  36. texture = 0
  37.  
  38. buf = (GLuint * size)(0)
  39.  
  40. def dump():
  41.     a = (GLuint * size)(0)
  42.     glReadPixels(0, 0, txw, txh, GL_RGBA, GL_UNSIGNED_BYTE, a);
  43.     for i in range(txw):
  44.         v = a[i]
  45. #       print "%08x" % (v),
  46. #   print
  47.  
  48. def gen(param):
  49.  
  50.     if (param):
  51.         for i in range( size ):
  52.              buf[i] = random.randint(0, 0xffffffff)
  53.     else:
  54.         return
  55.         buf.pop(0)
  56.         buf.append( random.randint(0,0xffffffff) )
  57.  
  58.     data = array.array("I", buf).tostring()
  59.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, txw, txh, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
  60.  
  61. def mouse(button, state, x, y):
  62.     motion(x, y)
  63.  
  64. def motion(x, y):
  65.  
  66.     flx = x
  67.     fly = height-y
  68.  
  69.     try:
  70.         glUniform4fvARB( Sp.indexOfUniformVariable("mouse"), 1, struct.pack("ffff", flx,fly,0,0))
  71.     except:
  72.         pass
  73.  
  74. def keyboard(ch,x,y):
  75.  
  76.     global buf
  77.     global texture
  78.  
  79.     if (ch == chr(27) or ch == chr(3)):
  80.         sys.exit(0)
  81.  
  82.     dump()
  83.     gen(0)
  84.     glutPostRedisplay( )
  85.     return 0
  86.  
  87. def reshape(w, h):
  88.     width = w
  89.     height = h
  90.     glViewport(0, 0, width, height);
  91.     glMatrixMode(GL_PROJECTION);
  92.     glLoadIdentity();
  93.     glOrtho(0, 1, 1, 0, -1, 1);
  94.     glMatrixMode(GL_MODELVIEW);
  95.  
  96.     try:
  97.         glUniform2fvARB( Sp.indexOfUniformVariable("resolution"), 1, struct.pack("ff", width, height))
  98.     except:
  99.         pass
  100.  
  101. def animation():
  102.     dump()
  103.     gen(0)
  104.     time.sleep(1/10)
  105.  
  106.     ftime = time.time() - start_time
  107.  
  108.     glUniform1fvARB( Sp.indexOfUniformVariable("time"), 1, struct.pack("f", ftime))
  109.  
  110.     glutPostRedisplay()
  111.  
  112. def init():
  113.  
  114.     global buf
  115.     global texture
  116.  
  117.     texture = glGenTextures(1)
  118.     glBindTexture(GL_TEXTURE_2D, texture)
  119.     glPixelStorei(GL_UNPACK_ALIGNMENT,1)
  120.  
  121.     for i in range( size ):
  122.          buf[i] = random.randint(0, 0xffffffff)
  123.  
  124.     gen(1)
  125.  
  126.     glEnableClientState( GL_TEXTURE_COORD_ARRAY )
  127.     glEnableClientState( GL_VERTEX_ARRAY )
  128.     vertices = array.array('h', [0,0, 1,0, 0,1, 1,1])
  129.     texcoord = array.array('f', [0,0, 1,0, 0,1, 1,1])
  130.     glVertexPointer(2,GL_SHORT, 0, vertices.tostring())
  131.     glTexCoordPointer(2,GL_FLOAT, 0, texcoord.tostring())
  132.  
  133.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
  134.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
  135.     glEnable(GL_TEXTURE_2D);
  136.  
  137.  
  138. def display( ):
  139. #   glEnable(GL_SCISSOR_TEST);
  140. #   glScissor( 0,0,txw, txh);
  141.     glDisable(GL_DEPTH_TEST);
  142.     glClearColor ( 0.0, 0.0, 0.0, 0.0 )
  143.     glClear(GL_COLOR_BUFFER_BIT)
  144.     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  145.     glutSwapBuffers()
  146.  
  147. class ShaderProgram ( object ):
  148.     """Manage GLSL programs."""
  149.     def __init__( self ):
  150.         self.__requiredExtensions = ["GL_ARB_fragment_shader",
  151.             "GL_ARB_vertex_shader",
  152.             "GL_ARB_shader_objects",
  153.             "GL_ARB_shading_language_100",
  154.             "GL_ARB_vertex_shader",
  155.             "GL_ARB_fragment_shader"]
  156.         self.checkExtensions( self.__requiredExtensions )
  157.         self.__shaderProgramID = glCreateProgramObjectARB()
  158.         self.__checkOpenGLError()
  159.         self.__programReady = False
  160.         self.__isEnabled = False
  161.         self.__shaderObjectList = []
  162.  
  163.     def checkExtensions( self, extensions ):
  164.         """Check if all extensions in a list are present."""
  165.         for ext in extensions:
  166.             if ( not ext ):
  167.                 print "Driver does not support ", ext
  168.                 sys.exit()
  169.  
  170.     def __checkOpenGLError( self ):
  171.         """Print OpenGL error message."""
  172.         err = glGetError()
  173.         if ( err != GL_NO_ERROR ):
  174.             print 'GLERROR: ', gluErrorString( err )
  175.             sys.exit()
  176.  
  177.     def reset( self ):
  178.         """Disable and remove all shader programs"""
  179.         for shaderID in self.__shaderObjectList:
  180.             glDetachObjectARB( self.__shaderProgramID, shaderID )
  181.             glDeleteObjectARB( shaderID )
  182.             self.__shaderObjectList.remove( shaderID )
  183.             self.__checkOpenGLError( )
  184.         glDeleteObjectARB( self.__shaderProgramID )
  185.         self.__checkOpenGLError( )
  186.         self.__shaderProgramID = glCreateProgramObjectARB()
  187.         self.__checkOpenGLError( )
  188.         self.__programReady = False
  189.  
  190.     def addShader( self, shaderType, fileName ):
  191.         """Read a shader program from a file.
  192.  
  193.         The program is load and compiled"""
  194.         shaderHandle = glCreateShaderObjectARB( shaderType )
  195.         self.__checkOpenGLError( )
  196.         sourceString = open(fileName, 'r').read()
  197.         glShaderSourceARB(shaderHandle, [sourceString] )
  198.         self.__checkOpenGLError( )
  199.         glCompileShaderARB( shaderHandle )
  200.         success = glGetObjectParameterivARB( shaderHandle,
  201.             GL_OBJECT_COMPILE_STATUS_ARB)
  202.         if (not success):
  203.             print glGetInfoLogARB( shaderHandle )
  204.             sys.exit( )
  205.         glAttachObjectARB( self.__shaderProgramID, shaderHandle )
  206.         self.__checkOpenGLError( )
  207.         self.__shaderObjectList.append( shaderHandle )
  208.  
  209.     def linkShaders( self ):
  210.         """Link compiled shader programs."""
  211.         glLinkProgramARB( self.__shaderProgramID )
  212.         self.__checkOpenGLError( )
  213.         success = glGetObjectParameterivARB( self.__shaderProgramID,
  214.             GL_OBJECT_LINK_STATUS_ARB )
  215.         if (not success):
  216.             print glGetInfoLogARB(self.__shaderProgramID)
  217.             sys.exit()
  218.         else:
  219.             self.__programReady = True
  220.    
  221.     def enable( self ):
  222.         """Activate shader programs."""
  223.         if self.__programReady:
  224.             glUseProgramObjectARB( self.__shaderProgramID )
  225.             self.__isEnabled=True
  226.             self.__checkOpenGLError( )
  227.         else:
  228.             print "Shaders not compiled/linked properly, enable() failed"
  229.  
  230.     def disable( self ):
  231.         """De-activate shader programs."""
  232.         glUseProgramObjectARB( 0 )
  233.         self.__isEnabled=False
  234.         self.__checkOpenGLError( )
  235.  
  236.     def indexOfUniformVariable( self, variableName ):
  237.         """Find the index of a uniform variable."""
  238.         if not self.__programReady:
  239.             print "\nShaders not compiled/linked properly"
  240.             result = -1
  241.         else:
  242.             result = glGetUniformLocationARB( self.__shaderProgramID, variableName)
  243.             self.__checkOpenGLError( )
  244.         if result < 0:
  245.             print 'Variable "%s" not known to the shader' % ( variableName )
  246.             sys.exit( )
  247.         else:
  248.             return result
  249.  
  250.     def indexOfVertexAttribute( self, attributeName ):
  251.         """Find the index of an attribute variable."""
  252.         if not self.__programReady:
  253.             print "\nShaders not compiled/linked properly"
  254.             result = -1
  255.         else:
  256.             result = glGetAttribLocationARB( self.__shaderProgramID, attributeName )
  257.             self.__checkOpenGLError( )
  258.         if result < 0:
  259.             print 'Attribute "%s" not known to the shader' % ( attributeName )
  260.             sys.exit( )
  261.         else:
  262.             return result
  263.    
  264.     def isEnabled( self ):
  265.         return self.__isEnabled
  266.  
  267. if __name__ == '__main__':
  268.  
  269.     if len(sys.argv) > 1:
  270.         filename = sys.argv[1]
  271.     else:
  272.         filename = "deform.glsl"
  273.    
  274.     glutInit()
  275.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
  276.     glutInitWindowSize( width, height )
  277.     glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH)-width)/2, (glutGet(GLUT_SCREEN_HEIGHT)-height)/2);
  278.     glutCreateWindow("shadertoy")
  279.  
  280.     init()
  281.  
  282.     Sp = ShaderProgram()
  283.     Sp.addShader(GL_FRAGMENT_SHADER_ARB, filename)
  284.     Sp.linkShaders()
  285.     Sp.enable()
  286.  
  287.     start_time = time.time()
  288.  
  289.     glutDisplayFunc(display)
  290.     glutKeyboardFunc(keyboard)
  291.     glutMouseFunc(mouse);
  292.     glutMotionFunc(motion);
  293.     glutReshapeFunc(reshape);
  294.     glutIdleFunc(animation)
  295.     glutMainLoop()
Add Comment
Please, Sign In to add comment