Advertisement
Guest User

Untitled

a guest
Jun 18th, 2014
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.30 KB | None | 0 0
  1. import pygame
  2. from pygame.locals import *
  3.  
  4. from OpenGL.GL import *
  5. from OpenGL.GLU import *
  6. from OpenGL.arrays import vbo
  7. from OpenGL.GL import shaders
  8. import numpy
  9. import transformations
  10. from math import pi, radians
  11. from PIL import Image
  12.  
  13. def init(screen_size):
  14.     screen = pygame.display.set_mode(screen_size, HWSURFACE | OPENGL | DOUBLEBUF)
  15.  
  16.     glViewport(0, 0, screen_size[0], screen_size[1])
  17.  
  18.     glShadeModel(GL_SMOOTH)
  19.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
  20.  
  21.     viewport = glGetIntegerv(GL_VIEWPORT)
  22.  
  23.     glEnable(GL_DEPTH_TEST)
  24.     glDepthFunc(GL_LESS)
  25.  
  26.     glMatrixMode(GL_PROJECTION)
  27.     glLoadIdentity()
  28.     #glFrustum(-1.0, 1.0,  1.0, -1.0,  1, 100.0)
  29.     gluPerspective(45, 1, 1, 100)
  30.  
  31.  
  32.     glMatrixMode(GL_MODELVIEW)
  33.     glLoadIdentity()
  34.    
  35.         VERTEX_SHADER = shaders.compileShader(
  36.     """
  37.     #version 130
  38.     in vec2 vertTexCoord;
  39.     out vec2 fragTexCoord;
  40.  
  41.        void main() {
  42.         fragTexCoord = vertTexCoord;
  43.            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  44.        }""", GL_VERTEX_SHADER)
  45.  
  46.  
  47.         FRAGMENT_SHADER = shaders.compileShader(
  48.     """#version 130
  49.     uniform sampler2D tex;
  50.     in vec2 fragTexCoord;
  51.     out vec4 finalColor;
  52.  
  53.        void main() {
  54.            finalColor = texture(tex, fragTexCoord);
  55.        }""", GL_FRAGMENT_SHADER)
  56.  
  57.  
  58.     return shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
  59.  
  60. def display(vertexbuffer, texturebuffer, texID, texloc, shader, zoom, x, y):
  61.     glLoadIdentity()
  62.     glClearColor(0.5, 0.5, 0.5, 1)
  63.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  64.     gluLookAt(x, y+2, 5 + 0.1*zoom, x, y, 0, 0, 1, 0)
  65.     shaders.glUseProgram(shader)
  66.    
  67.     vertexbuffer.bind()
  68.     glEnableClientState(GL_VERTEX_ARRAY)
  69.         glVertexPointer(3, GL_FLOAT, 16, vertexbuffer)
  70.  
  71.  
  72.     texturebuffer.bind()
  73.  
  74.  
  75.  
  76.     glEnableClientState(GL_TEXTURE_COORD_ARRAY)
  77.     glTexCoordPointer(2, GL_FLOAT, 0, texturebuffer)
  78.  
  79.     glActiveTexture(GL_TEXTURE0)
  80.     glBindTexture(GL_TEXTURE_2D, texID)
  81.     glUniform1i(texloc, 0)
  82.  
  83.  
  84.     glDrawArrays(GL_TRIANGLES, 0, 36)
  85.     vertexbuffer.unbind()
  86.     texturebuffer.unbind()
  87.         glDisableClientState(GL_VERTEX_ARRAY)
  88.     glDisableClientState(GL_TEXTURE_COORD_ARRAY)
  89.     shaders.glUseProgram(0)
  90.    
  91.     pygame.display.flip()
  92.  
  93.  
  94.        
  95.  
  96.  
  97. class Cube():
  98.     def __init__(self, center, size, colors):
  99.         self.v = numpy.array([
  100.         [ center[0]-size/2, center[1]-size/2, center[2]-size/2, 1], #0 bottom lower left
  101.         [ center[0]+size/2, center[1]-size/2, center[2]-size/2, 1], #1 bottom lower right
  102.         [ center[0]+size/2, center[1]+size/2, center[2]-size/2, 1], #2 bottom upper right
  103.         [ center[0]-size/2, center[1]+size/2, center[2]-size/2, 1], #3 bottom upper left
  104.         [ center[0]-size/2, center[1]-size/2, center[2]+size/2, 1], #4 top lower left
  105.         [ center[0]+size/2, center[1]-size/2, center[2]+size/2, 1], #5 top lower right
  106.         [ center[0]+size/2, center[1]+size/2, center[2]+size/2, 1], #6 top upper right
  107.         [ center[0]-size/2, center[1]+size/2, center[2]+size/2, 1]]) #7 top upper left
  108.         self.colors = colors
  109.  
  110.     def get_trivertices(s):
  111.         return numpy.array([
  112.         s.v[0], s.v[1], s.v[5], #front bottom
  113.         s.v[0], s.v[4], s.v[5], #front top
  114.        
  115.         s.v[1], s.v[2], s.v[5], #right bottom
  116.         s.v[2], s.v[6], s.v[5], #right top
  117.  
  118.         s.v[2], s.v[3], s.v[6], #back bottom
  119.         s.v[3], s.v[7], s.v[6], #back top
  120.  
  121.         s.v[0], s.v[4], s.v[7], #left bottom
  122.         s.v[0], s.v[3], s.v[7], #left top
  123.  
  124.         s.v[4], s.v[5], s.v[7], #top bottom
  125.         s.v[6], s.v[7], s.v[5], #top top
  126.  
  127.         s.v[0], s.v[1], s.v[3], #bottom bottom
  128.         s.v[2], s.v[3], s.v[1]]) #bottom top
  129.        
  130.  
  131. def main():
  132.     pygame.init()
  133.     shader = init([640, 640])
  134.  
  135.     Clock = pygame.time.Clock()
  136.  
  137.     camera_vel = [0, 0]
  138.     camera_pos = [0, 0]
  139.  
  140.     camera_maxvel = 0.1
  141.     camera_accel = 0.02
  142.     camera_damping = 0.9
  143.  
  144.     vel_threshold = 0.001
  145.  
  146.     zoom_level = 0
  147.     current_zoom = 0
  148.     zoom_time = 1
  149.     min_zoom = -35
  150.     max_zoom = 100
  151.     zoom_threshold = 0.01
  152.  
  153.  
  154.     rotmatrix = transformations.rotation_matrix(radians(1), [0, 1, 0], [0, 0, 0])
  155.  
  156.     cube = Cube([0, 0, 0], 2, [[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [0, 1, 1], [1, 0, 1]])
  157.  
  158.  
  159.     #TEXTURE STUFF START
  160.     pixels = numpy.array(list(Image.open("hazard.png").getdata()), 'B').astype('f')
  161.    
  162.     glEnable(GL_TEXTURE_2D)
  163.  
  164.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
  165.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
  166.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
  167.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
  168.  
  169.     glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, 256, 256, 0, GL_RGBA, GL_INT, pixels)
  170.     texturedata = [[0, 0], [1, 0], [0, 0.5]]*12
  171.  
  172.     texturebuffer = vbo.VBO(numpy.array(texturedata).astype('f'))
  173.  
  174.     texloc = glGetUniformLocation(shader, "tex")
  175.     texID = glGenTextures(1)
  176.     #TEXTURE STUFF END
  177.  
  178.  
  179.     while True:
  180.         events = pygame.event.get()
  181.         for event in events:
  182.             if event.type == MOUSEBUTTONUP:
  183.                 if event.button == 4:
  184.                     zoom_level = max(min_zoom, zoom_level-1)
  185.                 if event.button == 5:
  186.                     zoom_level = min(max_zoom, zoom_level+1)
  187.             elif event.type == KEYDOWN:
  188.                 if event.key == pygame.K_ESCAPE:
  189.                     exit() 
  190.         current_zoom -= (current_zoom - zoom_level)/float(zoom_time)
  191.  
  192.         if abs(current_zoom - zoom_level) < zoom_threshold:
  193.             current_zoom = zoom_level
  194.         keys = pygame.key.get_pressed()
  195.         keys = [k for k, x in enumerate(keys) if x]
  196.         if (K_LEFT in keys or K_RIGHT in keys) and not (K_LEFT in keys and K_RIGHT in keys):
  197.             if K_LEFT in keys:
  198.                 camera_vel[0] -= camera_accel
  199.             else:
  200.                 camera_vel[0] += camera_accel
  201.  
  202.         if (K_UP in keys or K_DOWN in keys) and not (K_UP in keys and K_DOWN in keys):
  203.             if K_UP in keys:
  204.                 camera_vel[1] += camera_accel
  205.             else:
  206.                 camera_vel[1] -= camera_accel
  207.  
  208.         camera_vel[0] *= camera_damping
  209.         camera_vel[1] *= camera_damping
  210.  
  211.                 if abs(camera_vel[0]) < vel_threshold:
  212.                         camera_vel[0] = 0
  213.                 if abs(camera_vel[1]) < vel_threshold:
  214.                         camera_vel[1] = 0
  215.  
  216.                 camera_vel = map(lambda x: max(min(camera_maxvel, x), -camera_maxvel), camera_vel)
  217.  
  218.         camera_pos[0] += camera_vel[0]
  219.         camera_pos[1] += camera_vel[1]
  220.        
  221.         cube.v = numpy.dot(cube.v, rotmatrix.T).astype('f')
  222.            
  223.         vertices = cube.get_trivertices()
  224.         vertexbuffer = vbo.VBO(vertices)
  225.    
  226.         display(vertexbuffer, texturebuffer, texID, texloc, shader, current_zoom, *camera_pos)
  227.         Clock.tick(60)
  228.  
  229. if __name__ == '__main__':
  230.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement