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. layout(location=0) in vec3 position;
  28. layout(location=1) in vec4 color;
  29. out 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. in vec4 v_color;
  39. out vec4 f_color;
  40. void main()
  41. {
  42. f_color=v_color;
  43. }
  44. """)
  45. gl.glCompileShader(shader_vertex)
  46. print "=== vertex shader log ==="
  47. if gl.glGetShaderiv(shader_vertex,gl.GL_COMPILE_STATUS):
  48. print "OK"
  49. else:
  50. log=gl.glGetShaderInfoLog(shader_vertex)
  51. print log
  52. gl.glCompileShader(shader_fragment)
  53. print "=== fragment shader log ==="
  54. if gl.glGetShaderiv(shader_fragment,gl.GL_COMPILE_STATUS):
  55. print "OK"
  56. else:
  57. log=gl.glGetShaderInfoLog(shader_fragment)
  58. print log
  59. print "=== end shader logs ==="
  60. gl.glAttachShader(shader_program,shader_vertex)
  61. gl.glAttachShader(shader_program,shader_fragment)
  62. gl.glLinkProgram(shader_program)
  63. gl.glUseProgram(shader_program)
  64. # === buffer creation ===
  65. vertex_data=np.zeros(4,dtype=[("position",np.float32,3),("color",np.float32,4)])
  66. vertex_data[1]=((-1,-1,1),(1,0,0,1))
  67. vertex_data[0]=(( 1,-1,1),(0,1,0,1))
  68. vertex_data[2]=(( 1, 1,1),(0,0,1,1))
  69. vertex_data[3]=((-1, 1,1),(1,1,0,1))
  70. vertex_buffer=gl.glGenBuffers(1)
  71. gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer)
  72. gl.glBufferData(gl.GL_ARRAY_BUFFER,vertex_data.nbytes,vertex_data,gl.GL_DYNAMIC_DRAW)
  73. # === buffer binding ===
  74. stride=vertex_data.strides[0]
  75. offset=ctypes.c_void_p(0)
  76. loc=gl.glGetAttribLocation(shader_program,"position")
  77. gl.glEnableVertexAttribArray(loc)
  78. gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer)
  79. gl.glVertexAttribPointer(loc,3,gl.GL_FLOAT,False,stride,offset)
  80. offset=ctypes.c_void_p(vertex_data.dtype["position"].itemsize)
  81. loc=gl.glGetAttribLocation(shader_program,"color")
  82. gl.glEnableVertexAttribArray(loc)
  83. gl.glBindBuffer(gl.GL_ARRAY_BUFFER,vertex_buffer)
  84. gl.glVertexAttribPointer(loc,4,gl.GL_FLOAT,False,stride,offset)
  85. # === main loop ===
  86. event=SDL_Event()
  87. while True:
  88. frame_startticks=SDL_GetTicks()
  89. while SDL_PollEvent(ctypes.byref(event))!=0:
  90. if event.type==SDL_QUIT:
  91. SDL_DestroyWindow(window)
  92. SDL_Quit()
  93. raise SystemExit("clean exit")
  94. gl.glClear(gl.GL_COLOR_BUFFER_BIT|gl.GL_DEPTH_BUFFER_BIT)
  95. gl.glDrawArrays(gl.GL_TRIANGLE_STRIP, 0, 4)
  96. SDL_GL_SwapWindow(window)
  97. frame_endticks=SDL_GetTicks()
  98. frame_spentticks=frame_endticks-frame_startticks
  99. if(frame_spentticks<frame_minticks):
  100. SDL_Delay(frame_minticks-frame_spentticks)
  101.