Advertisement
Guest User

Mandelbrot

a guest
Aug 12th, 2011
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.00 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. from __future__ import division
  4.  
  5. from PyQt4 import QtCore, QtGui, QtOpenGL
  6. from PyQt4.QtCore import Qt
  7. import sys
  8.  
  9. try:
  10.     from OpenGL import GL
  11.     from OpenGL import GLU
  12. except ImportError:
  13.     app = QtGui.QApplication(sys.argv)
  14.     QtGui.QMessageBox.critical(None, "OpenGL hellogl",
  15.             "PyOpenGL must be installed to run this example.")
  16.     sys.exit(1)
  17.  
  18.  
  19. class Window(QtGui.QWidget):
  20.     def __init__(self):
  21.         super(Window, self).__init__()
  22.  
  23.         self.glWidget = GLWidget()
  24.         mainLayout = QtGui.QHBoxLayout()
  25.         mainLayout.addWidget(self.glWidget)
  26.         self.setLayout(mainLayout)
  27.  
  28.         self.setWindowTitle("Hello GL")
  29.  
  30.     def wheelEvent(self, event):
  31.         self.glWidget.wheelEvent(event)
  32.  
  33.     def keyPressEvent(self, event):
  34.         self.glWidget.keyPressEvent(event)
  35.  
  36. class GLWidget(QtOpenGL.QGLWidget):
  37.  
  38.     def __init__(self, parent=None):
  39.         super(GLWidget, self).__init__(parent)
  40.  
  41.         self.lastPos = QtCore.QPoint()
  42.         self.program =  QtOpenGL.QGLShaderProgram()
  43.  
  44.         self.iterations = 400
  45.         self.radius = 4.0
  46.         self.xpos = -0.5
  47.         self.ypos = 0.0
  48.         self.zoom = 128.0
  49.         self.w = float(self.width())
  50.         self.h = float(self.height())
  51.  
  52.     def minimumSizeHint(self):
  53.         return QtCore.QSize(50, 50)
  54.  
  55.     def sizeHint(self):
  56.         return QtCore.QSize(800, 800)
  57.  
  58.     def setZoom(self, amount):
  59.         self.zoom = amount
  60.         self.iterations += 5
  61.         self.updateGL()
  62.  
  63.     def initializeGL(self):
  64.         GL.glClearColor(0.25, 0.25, 0.4, 0.0)
  65.         GL.glDisable(GL.GL_DEPTH_TEST)
  66.         GL.glEnable(GL.GL_TEXTURE_2D)
  67.         self.addShaders("Basic.vsh", "FloatMandel.fsh")
  68.  
  69.     def addShaders(self, vertex_shader_file, fragment_shader_file):
  70.         vertex_shader = QtOpenGL.QGLShader(QtOpenGL.QGLShader.Vertex)
  71.         if not vertex_shader.compileSourceFile(vertex_shader_file):
  72.             print "vertex shader could not be loaded", vertex_shader.log()
  73.         else:
  74.             self.program.addShader(vertex_shader)
  75.  
  76.         fragment_shader = QtOpenGL.QGLShader(QtOpenGL.QGLShader.Fragment)
  77.         if not fragment_shader.compileSourceFile(fragment_shader_file):
  78.             print "fragment shader could not be loaded", fragment_shader.log()
  79.         else:
  80.             self.program.addShader(fragment_shader)
  81.  
  82.         self.program.link()
  83.         self.program.bind()
  84.  
  85.     def paintGL(self):
  86.         self.program.setUniformValue("iterations", self.iterations)
  87.         self.program.setUniformValue("radius", self.zoom)
  88.         self.program.setUniformValue("frame", 0)
  89.  
  90.         self.program.setUniformValue("f_cx", self.xpos)
  91.         self.program.setUniformValue("f_cy", self.ypos)
  92.  
  93.         self.program.setUniformValue("f_sx", -self.w/2/self.zoom)
  94.         self.program.setUniformValue("f_sy", -self.h/2/self.zoom)
  95.         self.program.setUniformValue("f_z", 1/self.zoom)
  96.  
  97.  
  98.         GL.glBegin(GL.GL_QUADS)
  99.         GL.glNormal3f(0.,0.,1.); GL.glColor3f(1.,0.,0.); GL.glTexCoord2f(0, 0); GL.glVertex3i(0, 0, 0)
  100.         GL.glNormal3f(0.,0.,1.); GL.glColor3f(1.,1.,0.); GL.glTexCoord2f(self.w, 0); GL.glVertex3i(self.w, 0, 0)
  101.         GL.glNormal3f(0.,0.,1.); GL.glColor3f(1.,1.,1.); GL.glTexCoord2f(self.w, self.h); GL.glVertex3i(self.w, self.h, 0)
  102.         GL.glNormal3f(0.,0.,1.); GL.glColor3f(1.,0.,1.); GL.glTexCoord2f(0, self.h); GL.glVertex3i(0, self.h, 0)
  103.         GL.glEnd()
  104.  
  105.  
  106.  
  107.  
  108.  
  109.     def resizeGL(self, width, height):
  110.         GL.glViewport(0, 0, width, height)
  111.         GL.glMatrixMode(GL.GL_PROJECTION)
  112.         GL.glLoadIdentity()
  113.         GL.glOrtho(0, width, 0, height, 0, 1)
  114.         GL.glMatrixMode(GL.GL_MODELVIEW)
  115.         GL.glLoadIdentity()
  116.  
  117.         self.w = width
  118.         self.h = height
  119.  
  120.     def mousePressEvent(self, event):
  121.         self.lastPos = event.pos()
  122.  
  123.     def wheelEvent(self, event):
  124.         sens = 1.25
  125.         if event.delta() >= 0:
  126.             self.setZoom(self.zoom*sens)
  127.         else:
  128.             self.setZoom(self.zoom/sens)
  129.  
  130.     def mouseMoveEvent(self, event):
  131.         pos = event.pos()
  132.         dx = event.x() - self.lastPos.x()
  133.         dy = event.y() - self.lastPos.y()
  134.  
  135.         self.lastPos = event.pos()
  136.  
  137.     def keyPressEvent(self, event):
  138.         sensitivity = 0.5
  139.         if event.key() == Qt.Key_W:
  140.             self.eye_translation.z -=sensitivity
  141.         elif event.key() == Qt.Key_S:
  142.             self.eye_translation.z +=sensitivity
  143.         elif event.key() == Qt.Key_A:
  144.             self.eye_translation.x +=sensitivity
  145.         elif event.key() == Qt.Key_D:
  146.             self.eye_translation.x-=sensitivity
  147.         elif event.key() == Qt.Key_Space:
  148.             self.eye_translation.y -= sensitivity
  149.         elif event.key() == Qt.Key_X:
  150.             self.eye_translation.y += sensitivity
  151.            
  152.         self.updateGL()
  153.  
  154.  
  155. if __name__ == '__main__':
  156.     app = QtGui.QApplication(sys.argv)
  157.  
  158.  
  159.  
  160.     window = Window()
  161.     window.show()
  162.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement