Advertisement
trishLEX

Untitled

May 29th, 2017
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.33 KB | None | 0 0
  1. import glfw
  2. from OpenGL.GL import *
  3. import OpenGL.GL.shaders
  4. import numpy
  5. import math
  6. import pyrr
  7. import ctypes
  8.  
  9.  
  10. def background():
  11.     glClearColor(0.8, 0.8, 0.8, 1.0)
  12.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  13.     glEnable(GL_DEPTH_TEST)
  14.  
  15.  
  16. class Torus:
  17.     def __init__(self):
  18.         self.isTextured = False
  19.         self.polygonMesh = []
  20.         self.normals = []
  21.         self.center = [0, 0, 0]
  22.         self.nsides = 3
  23.         self.rings = 3
  24.         self.r = 0.2
  25.         self.R = 0.4
  26.         self.rotate_x = 0
  27.         self.rotate_y = 0
  28.         self.isWire = False
  29.         self.vertexes = []
  30.         self.texes = []
  31.         self.indices = []
  32.         self.array = []
  33.         self.setMesh()
  34.  
  35.     def setMesh(self):
  36.         for i in range(self.rings):
  37.             theta = i * 2.0 * math.pi / self.rings
  38.             theta1 = ((i + 1) % self.rings) * 2.0 * math.pi / self.rings
  39.             for j in range(self.nsides):
  40.                 phi = j * 2.0 * math.pi / self.nsides
  41.                 phi1 = ((j + 1) % self.nsides) * 2.0 * math.pi / self.nsides
  42.  
  43.                 p0 = [math.cos(theta) * (self.R + self.r * math.cos(phi)),
  44.                       -math.sin(theta) * (self.R + self.r * math.cos(phi)),
  45.                       self.r * math.sin(phi)]
  46.                 p1 = [math.cos(theta1) * (self.R + self.r * math.cos(phi)),
  47.                       -math.sin(theta1) * (self.R + self.r * math.cos(phi)),
  48.                       self.r * math.sin(phi)]
  49.                 p2 = [math.cos(theta1) * (self.R + self.r * math.cos(phi1)),
  50.                       -math.sin(theta1) * (self.R + self.r * math.cos(phi1)),
  51.                       self.r * math.sin(phi1)]
  52.                 p3 = [math.cos(theta) * (self.R + self.r * math.cos(phi1)),
  53.                       -math.sin(theta) * (self.R + self.r * math.cos(phi1)),
  54.                       self.r * math.sin(phi1)]
  55.  
  56.                 p = [p0, p1, p2, p3]
  57.  
  58.                 n0 = [math.cos(theta) * (math.cos(phi)), -math.sin(theta) * (math.cos(phi)), math.sin(phi)]
  59.  
  60.                 n = [n0]
  61.  
  62.                 self.polygonMesh.append(p)
  63.                 self.normals.append(n)
  64.  
  65.         count = self.rings * self.nsides
  66.         k = 1
  67.         for i in range(count):
  68.             n = self.rings
  69.             if i % n == 0 and i != 0:
  70.                 k -= 1 / n
  71.  
  72.             for j in range(4):
  73.                 for l in range(3):
  74.                     self.vertexes.append(self.polygonMesh[i][j][l])
  75.  
  76.             # indices = [l for l in range(12)]
  77.  
  78.             self.texes.append(k)
  79.             self.texes.append((i % n) / n)
  80.             self.texes.append(k - 1 / n)
  81.             self.texes.append((i % n) / n)
  82.             self.texes.append(k - 1 / n)
  83.             self.texes.append((i % n + 1) / n)
  84.             self.texes.append(k)
  85.             self.texes.append((i % n + 1) / n)
  86.  
  87.             self.indices = [l for l in range(4 * count)]
  88.  
  89.         print(count * 4 * 3, len(self.vertexes))
  90.         k = 0
  91.         array = []
  92.         for i in range(0, count * 4 * 3, 3):
  93.             # for j in range(0, len(self.texes), 2):
  94.             array.append(self.vertexes[i])
  95.             array.append(self.vertexes[i + 1])
  96.             array.append(self.vertexes[i + 2])
  97.             array.append(1.0)
  98.             array.append(1.0)
  99.             array.append(1.0)
  100.             array.append(self.texes[k])
  101.             array.append(self.texes[k + 1])
  102.             k += 2
  103.         # print(array)
  104.         self.array = numpy.array(array, dtype='float32')
  105.  
  106.     def clear(self):
  107.         self.polygonMesh = []
  108.         self.normals = []
  109.         self.center = [0, 0, 0]
  110.         self.nsides = 4
  111.         self.rings = 4
  112.         self.r = 0.2
  113.         self.R = 0.4
  114.         self.rotate_x = 0
  115.         self.rotate_y = 0
  116.         self.isWire = False
  117.         self.vertexes = []
  118.         self.texes = []
  119.         self.indices = []
  120.         self.setMesh()
  121.  
  122.  
  123. def shader():
  124.     vertex_shader = """
  125.        #version 450 core
  126.            layout (location = 0) in vec3 position;
  127.            layout (location = 1) in vec3 color;
  128.            layout (location = 2) in vec2 texCoord;
  129.            uniform mat4 transform;
  130.            out vec3 ourColor;
  131.            out vec2 TexCoord;
  132.            void main()
  133.            {
  134.            gl_Position = transform * vec4(position.x, position.y, position.z, 1.0f);
  135.            ourColor = color;
  136.            TexCoord = vec2(texCoord.x, texCoord.y);
  137.            }
  138.        """
  139.  
  140.     fragment_shader = """
  141.        #version 450 core
  142.            in vec3 ourColor;
  143.            in vec2 TexCoord;
  144.            out vec4 color;
  145.            uniform sampler2D texture1;
  146.            void main()
  147.            {
  148.            color = texture(texture1, TexCoord);
  149.            }
  150.        """
  151.     global shader
  152.     shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER),
  153.                                               OpenGL.GL.shaders.compileShader(fragment_shader, GL_FRAGMENT_SHADER))
  154.  
  155.     global VAO
  156.     VAO = glGenVertexArrays(1)
  157.  
  158.     VBO = glGenBuffers(1)
  159.  
  160.     glBindVertexArray(VAO)
  161.  
  162.     glBindBuffer(GL_ARRAY_BUFFER, VBO)
  163.     size = 4 * len(torus.array)
  164.     glBufferData(GL_ARRAY_BUFFER, size, torus.array, GL_STATIC_DRAW)
  165.  
  166.     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(0))
  167.     # 32 = 8 * sizeof(float)
  168.     glEnableVertexAttribArray(0)
  169.  
  170.     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(12))
  171.     glEnableVertexAttribArray(1)
  172.  
  173.     glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(24))
  174.     glEnableVertexAttribArray(2)
  175.  
  176.     glBindBuffer(GL_ARRAY_BUFFER, 0)
  177.     glBindVertexArray(0)
  178.  
  179.  
  180. def draw():
  181.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  182.     # rotate, translate ...
  183.     result = pyrr.Matrix44.identity()
  184.     # print(result)
  185.  
  186.     transformLoc = glGetUniformLocation(shader, "transform")
  187.     glUniformMatrix4fv(transformLoc, 1, GL_FALSE, result)
  188.  
  189.     glUseProgram(shader)
  190.     glBindVertexArray(VAO)
  191.  
  192.     # textures
  193.     # glActiveTexture(GL_TEXTURE0)
  194.     # glBindTexture(GL_TEXTURE_2D, texture)
  195.     size = 4 * len(torus.array)
  196.     glDrawArrays(GL_QUADS, 0, size)
  197.  
  198.     glBindVertexArray(0)
  199.  
  200.  
  201. class Drawer:
  202.     window = False
  203.  
  204.     def __init__(self):
  205.         if not glfw.init():
  206.             return
  207.  
  208.         glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
  209.         glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 2)
  210.         glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
  211.         glfw.window_hint(glfw.RESIZABLE, GL_FALSE)
  212.         self.window = glfw.create_window(800, 800, "OpenGL", None, None)
  213.         # self.attrib = glfw.get_window_attrib(self.window, glfw.CONTEXT_VERSION_MAJOR)
  214.         # self.attrib = glfw.get_window_attrib(self.window, glfw.CONTEXT_VERSION_MINOR)
  215.         # self.attrib = glfw.get_window_attrib(self.window, glfw.OPENGL_PROFILE)
  216.         # glfw.set_key_callback(self.window, keyCallback)
  217.  
  218.         if not self.window:
  219.             glfw.terminate()
  220.             return
  221.  
  222.         glfw.make_context_current(self.window)
  223.  
  224.     def startLoop(self):
  225.         shader()
  226.         while not glfw.window_should_close(self.window):
  227.             background()
  228.             draw()
  229.  
  230.             glfw.swap_buffers(self.window)
  231.             glfw.poll_events()
  232.  
  233.         glfw.terminate()
  234.  
  235.  
  236. torus = Torus()
  237. drawer = Drawer()
  238. drawer.startLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement