spacepaste

  1.  
  2. import ctypes
  3. import OpenGL.GL as gl
  4. from sdl2 import * #everything has a SDL_ prefix. ick!
  5. import numpy as np
  6. W,H=640,480
  7. FPS=60
  8. frame_minticks=1000/60
  9. # === SDL/OpenGL init ===
  10. SDL_Init(SDL_INIT_VIDEO)
  11. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
  12. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3);
  13. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
  14. SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
  15. window=SDL_CreateWindow("OpenGL test",100,100,W,H,SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN)
  16. context=SDL_GL_CreateContext(window)
  17. SDL_GL_SetSwapInterval(0)
  18. gl.glClearColor(1.0,1.0,1.0,1.0)
  19. gl.glClear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT)
  20. SDL_GL_SwapWindow(window)
  21. # === shader compilation ===
  22. shader_program=gl.glCreateProgram()
  23. shader_vertex=gl.glCreateShader(gl.GL_VERTEX_SHADER)
  24. shader_fragment=gl.glCreateShader(gl.GL_FRAGMENT_SHADER)
  25. gl.glShaderSource(shader_vertex, """
  26. #version 330
  27. attribute vec3 position;
  28. attribute vec4 color;
  29. varying vec4 v_color;
  30. void main()
  31. {
  32. gl_Position=vec4(position,1.0);
  33. v_color=color;
  34. }
  35. """)
  36. gl.glShaderSource(shader_fragment, """
  37. #version 330
  38. varying vec4 v_color;
  39. void main()
  40. {
  41. gl_FragColor=v_color;
  42. }
  43. """)
  44. gl.glCompileShader(shader_vertex)
  45. print "=== vertex shader log ==="
  46. if gl.glGetShaderiv(shader_vertex,gl.GL_COMPILE_STATUS):
  47. print "OK"
  48. else:
  49. log=gl.glGetShaderInfoLog(shader_vertex)
  50. print log
  51. gl.glCompileShader(shader_fragment)
  52. print "=== fragment shader log ==="
  53. if gl.glGetShaderiv(shader_fragment,gl.GL_COMPILE_STATUS):
  54. print "OK"
  55. else:
  56. log=gl.glGetShaderInfoLog(shader_fragment)
  57. print log
  58. print "=== end shader logs ==="
  59. gl.glAttachShader(shader_program,shader_vertex)
  60. gl.glAttachShader(shader_program,shader_fragment)
  61. gl.glLinkProgram(shader_program)
  62. gl.glUseProgram(shader_program)
  63. # === buffer creation ===
  64. vertex_data=np.zeros(4,dtype=[("position",np.float32,3),("color",np.float32,4)])
  65. vertex_data[1]=((-1,-1,1),(1,0,0,1))
  66. vertex_data[0]=(( 1,-1,1),(0,1,0,1))
  67. vertex_data[2]=(( 1, 1,1),(0,0,1,1))
  68. vertex_data[3]=((-1, 1,1),(1,1,0,1))
  69. vertex_buffer=gl.glGenBuffers(1)
  70. gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer)
  71. gl.glBufferData(gl.GL_ARRAY_BUFFER,vertex_data.nbytes,vertex_data,gl.GL_DYNAMIC_DRAW)
  72. # === buffer binding ===
  73. stride=vertex_data.strides[0]
  74. offset=ctypes.c_void_p(0)
  75. loc=gl.glGetAttribLocation(shader_program,"position")
  76. gl.glEnableVertexAttribArray(loc)
  77. gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer)
  78. gl.glVertexAttribPointer(loc,3,gl.GL_FLOAT,False,stride,offset)
  79. offset=ctypes.c_void_p(vertex_data.dtype["position"].itemsize)
  80. loc=gl.glGetAttribLocation(shader_program,"color")
  81. gl.glEnableVertexAttribArray(loc)
  82. gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer)
  83. gl.glVertexAttribPointer(loc,4,gl.GL_FLOAT,False,stride,offset)
  84. # === main loop ===
  85. event=SDL_Event()
  86. while True:
  87. frame_startticks=SDL_GetTicks()
  88. while SDL_PollEvent(ctypes.byref(event))!=0:
  89. if event.type==SDL_QUIT:
  90. SDL_DestroyWindow(window)
  91. SDL_Quit()
  92. raise SystemExit("clean exit")
  93. gl.glClear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT)
  94. gl.glDrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4)
  95. SDL_GL_SwapWindow(window)
  96. frame_endticks=SDL_GetTicks()
  97. frame_spentticks=frame_endticks-frame_startticks
  98. if(frame_spentticks<frame_minticks):
  99. SDL_Delay(frame_minticks-frame_spentticks)
  100.