From 83d8baeb8e68e4023845685920af6768ebd95cc2 Mon Sep 17 00:00:00 2001 From: Quantum Date: Sun, 2 Feb 2014 16:47:05 -0500 Subject: [PATCH] Used context managers to control GL attributes and matrices. No more stray GL_BLEND, much faster! --- punyverse/game.py | 130 ++++++-------- punyverse/glgeom.py | 420 ++++++++++++++++++++++---------------------- 2 files changed, 268 insertions(+), 282 deletions(-) diff --git a/punyverse/game.py b/punyverse/game.py index eae67bf..0e06f34 100644 --- a/punyverse/game.py +++ b/punyverse/game.py @@ -365,7 +365,7 @@ class Applet(pyglet.window.Window): progress_bar(10, self.height - 240, self.width - 20, 50, progress) self._info_label.draw() - def on_draw(self, glMatrix=GLfloat * 16): + def on_draw(self, glMatrixBuffer=GLfloat * 16): if not self.loaded: return self.draw_loading() @@ -392,79 +392,67 @@ class Applet(pyglet.window.Window): x, y, z = entity.location pitch, yaw, roll = entity.rotation - glPushMatrix() - glTranslatef(x, y, z) - glRotatef(pitch, 1, 0, 0) - glRotatef(yaw, 0, 1, 0) - glRotatef(roll, 0, 0, 1) - glPushAttrib(GL_CURRENT_BIT) - glCallList(entity.id) - if self.debug: - glPushMatrix() - glLineWidth(0.25) - glPolygonOffset(1, 1) - glDisable(GL_LIGHTING) - glDisable(GL_TEXTURE_2D) - glColor3f(0, 1, 0) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + with glMatrix(), glRestore(GL_CURRENT_BIT): + glTranslatef(x, y, z) + glRotatef(pitch, 1, 0, 0) + glRotatef(yaw, 0, 1, 0) + glRotatef(roll, 0, 0, 1) glCallList(entity.id) - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) - glEnable(GL_LIGHTING) - glEnable(GL_TEXTURE_2D) - glPopMatrix() - glPopAttrib() - glPopMatrix() + if self.debug: + with glMatrix(), glRestore(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_LINE_BIT): + glLineWidth(0.25) + glPolygonOffset(1, 1) + glDisable(GL_LIGHTING) + glDisable(GL_TEXTURE_2D) + glColor3f(0, 1, 0) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + glCallList(entity.id) has_corona = hasattr(entity, 'corona') and entity.corona has_atmosphere = hasattr(entity, 'atmosphere') and entity.atmosphere if self.atmosphere and (has_corona or has_atmosphere): - glPushMatrix() - x0, y0, z0 = entity.location - - glTranslatef(x0, y0, z0) - matrix = glMatrix() - glGetFloatv(GL_MODELVIEW_MATRIX, matrix) - matrix[0: 3] = [1, 0, 0] - matrix[4: 7] = [0, 1, 0] - matrix[8:11] = [0, 0, 1] - glLoadMatrixf(matrix) - if has_atmosphere: - glCallList(entity.atmosphere) - if has_corona: - x, y, z = c.direction() - glTranslatef(-x, -y, -z) - glCallList(entity.corona) - glPopMatrix() + with glMatrix(), glRestore(GL_ENABLE_BIT): + x0, y0, z0 = entity.location + glTranslatef(x0, y0, z0) + matrix = glMatrixBuffer() + glGetFloatv(GL_MODELVIEW_MATRIX, matrix) + matrix[0: 3] = [1, 0, 0] + matrix[4: 7] = [0, 1, 0] + matrix[8:11] = [0, 0, 1] + glLoadMatrixf(matrix) + glEnable(GL_BLEND) + if has_atmosphere: + glCallList(entity.atmosphere) + if has_corona: + x, y, z = c.direction() + glTranslatef(-x, -y, -z) + glCallList(entity.corona) if self.cloud and hasattr(entity, 'cloudmap') and entity.cloudmap: - glPushMatrix() - glEnable(GL_BLEND) - glEnable(GL_ALPHA_TEST) - glTranslatef(*entity.location) - pitch, yaw, roll = entity.rotation - glRotatef(pitch, 1, 0, 0) - glRotatef(yaw, 0, 1, 0) - glRotatef(roll, 0, 0, 1) - glCallList(entity.cloudmap) - glDisable(GL_ALPHA_TEST) - glDisable(GL_BLEND) - glPopMatrix() + with glMatrix(), glRestore(GL_ENABLE_BIT): + glEnable(GL_BLEND) + glEnable(GL_ALPHA_TEST) + glTranslatef(*entity.location) + pitch, yaw, roll = entity.rotation + glRotatef(pitch, 1, 0, 0) + glRotatef(yaw, 0, 1, 0) + glRotatef(roll, 0, 0, 1) + glCallList(entity.cloudmap) if self.orbit and hasattr(entity, 'get_orbit') and hasattr(entity, 'parent'): parent = entity.parent distance = get_distance(parent) if distance < parent.orbit_show: - glPushMatrix() - glTranslatef(*entity.parent.location) - glDisable(GL_LIGHTING) - glPushAttrib(GL_LINE_BIT | GL_CURRENT_BIT) - glColor4f(1, 1, 1, 1 if distance < parent.orbit_opaque else - (1 - (distance - parent.orbit_opaque) / parent.orbit_blend)) - glLineWidth(1) - glCallList(entity.get_orbit()) - glPopAttrib() - glEnable(GL_LIGHTING) - glPopMatrix() + with glMatrix(), glRestore(GL_ENABLE_BIT | GL_LINE_BIT | GL_CURRENT_BIT): + glTranslatef(*entity.parent.location) + glDisable(GL_LIGHTING) + solid = distance < parent.orbit_opaque + glColor4f(1, 1, 1, 1 if solid else + (1 - (distance - parent.orbit_opaque) / parent.orbit_blend)) + if not solid: + glEnable(GL_BLEND) + glLineWidth(1) + glCallList(entity.get_orbit()) glColor4f(1, 1, 1, 1) glDisable(GL_TEXTURE_2D) @@ -473,7 +461,6 @@ class Applet(pyglet.window.Window): if self.info: ortho(width, height) - if self.info_precise: info = ('%d FPS @ (x=%.2f, y=%.2f, z=%.2f) @ %s, %s/s\n' 'Direction(pitch=%.2f, yaw=%.2f, roll=%.2f)\nTick: %d' % @@ -484,15 +471,10 @@ class Applet(pyglet.window.Window): (pyglet.clock.get_fps(), c.x, c.y, c.z, self.speed, self.get_time_per_second())) self.label.text = info self.label.draw() - - glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT) - - glLineWidth(2) - - cx, cy = width / 2, height / 2 - - glColor4f(0, 1, 0, 1) - circle(10, 20, (cx, cy)) - glPopAttrib() - + with glRestore(GL_CURRENT_BIT | GL_LINE_BIT): + glLineWidth(2) + cx, cy = width / 2, height / 2 + glColor4f(0, 1, 0, 1) + circle(10, 20, (cx, cy)) + glPopAttrib() frustrum() diff --git a/punyverse/glgeom.py b/punyverse/glgeom.py index 350b1f2..97f644b 100644 --- a/punyverse/glgeom.py +++ b/punyverse/glgeom.py @@ -5,7 +5,7 @@ from random import random, gauss, choice TWOPI = pi * 2 __all__ = ['compile', 'ortho', 'frustrum', 'crosshair', 'circle', 'disk', 'sphere', 'colourball', 'torus', 'belt', - 'flare', 'normal_sphere', 'glSection', 'progress_bar'] + 'flare', 'normal_sphere', 'glSection', 'glMatrix', 'glRestore', 'progress_bar'] class glSection(object): @@ -19,6 +19,25 @@ class glSection(object): glEnd() +class glRestore(object): + def __init__(self, flags): + self.flags = flags + + def __enter__(self): + glPushAttrib(self.flags) + + def __exit__(self, exc_type, exc_val, exc_tb): + glPopAttrib() + + +class glMatrix(object): + def __enter__(self): + glPushMatrix() + + def __exit__(self, exc_type, exc_val, exc_tb): + glPopMatrix() + + def compile(pointer, *args, **kwargs): display = glGenLists(1) glNewList(display, GL_COMPILE) @@ -49,126 +68,117 @@ def frustrum(): def crosshair(size, (cx, cy)): - glBegin(GL_LINES) - glVertex2f(cx - size, cy) - glVertex2f(cx + size, cy) - glVertex2f(cx, cy - size) - glVertex2f(cx, cy + size) - glEnd() + with glSection(GL_LINES): + glVertex2f(cx - size, cy) + glVertex2f(cx + size, cy) + glVertex2f(cx, cy - size) + glVertex2f(cx, cy + size) def circle(r, seg, (cx, cy)): - glBegin(GL_LINE_LOOP) - for i in xrange(seg): - theta = TWOPI * i / seg - glVertex2f(cx + cos(theta) * r, cy + sin(theta) * r) - glEnd() + with glSection(GL_LINE_LOOP): + for i in xrange(seg): + theta = TWOPI * i / seg + glVertex2f(cx + cos(theta) * r, cy + sin(theta) * r) def disk(rinner, router, segs, tex): - glEnable(GL_TEXTURE_2D) - glDisable(GL_LIGHTING) - glBindTexture(GL_TEXTURE_2D, tex) - res = segs * 5 + with glRestore(GL_ENABLE_BIT): + glEnable(GL_TEXTURE_2D) + glEnable(GL_BLEND) + glDisable(GL_LIGHTING) + glBindTexture(GL_TEXTURE_2D, tex) + res = segs * 5 - glBegin(GL_TRIANGLE_STRIP) - texture = 0 - factor = TWOPI / res - theta = 0 - for n in xrange(res + 1): - theta += factor - x = cos(theta) - y = sin(theta) - glTexCoord2f(0, texture) - glVertex2f(rinner * x, rinner * y) - glTexCoord2f(1, texture) - glVertex2f(router * x, router * y) - texture ^= 1 - glEnd() - glEnable(GL_LIGHTING) - glDisable(GL_TEXTURE_2D) + with glSection(GL_TRIANGLE_STRIP): + factor = TWOPI / res + theta = 0 + for n in xrange(res + 1): + theta += factor + x = cos(theta) + y = sin(theta) + glTexCoord2f(0, 0) + glVertex2f(rinner * x, rinner * y) + glTexCoord2f(1, 0) + glVertex2f(router * x, router * y) def flare(rinner, router, res, prob, tex): - glEnable(GL_TEXTURE_2D) - glDisable(GL_LIGHTING) - glBindTexture(GL_TEXTURE_2D, tex) - last_x = 1 - last_y = 0 - last_theta = 0 - factor = TWOPI / res - rdelta = (router - rinner) - glBegin(GL_QUADS) - for i in xrange(res + 1): - theta = last_theta + factor - x = cos(theta) - y = sin(theta) - if random() > prob: - distance = rinner + rdelta * random() - avg_theta = (last_theta + theta) / 2 - x0, y0 = rinner * last_x, rinner * last_y - x1, y1 = rinner * x, rinner * y - x2, y2 = distance * cos(avg_theta), distance * sin(avg_theta) - glTexCoord2f(0, 0) - glVertex2f(x0, y0) - glTexCoord2f(0, 1) - glVertex2f(x1, y1) - glTexCoord2f(1, 0) - glVertex2f(x2, y2) - glTexCoord2f(1, 1) - glVertex2f(x2, y2) - last_theta = theta - last_x = x - last_y = y - glEnd() - glEnable(GL_LIGHTING) - glDisable(GL_TEXTURE_2D) + with glRestore(GL_ENABLE_BIT): + glEnable(GL_TEXTURE_2D) + glDisable(GL_LIGHTING) + glBindTexture(GL_TEXTURE_2D, tex) + last_x = 1 + last_y = 0 + last_theta = 0 + factor = TWOPI / res + rdelta = (router - rinner) + with glSection(GL_QUADS): + for i in xrange(res + 1): + theta = last_theta + factor + x = cos(theta) + y = sin(theta) + if random() > prob: + distance = rinner + rdelta * random() + avg_theta = (last_theta + theta) / 2 + x0, y0 = rinner * last_x, rinner * last_y + x1, y1 = rinner * x, rinner * y + x2, y2 = distance * cos(avg_theta), distance * sin(avg_theta) + glTexCoord2f(0, 0) + glVertex2f(x0, y0) + glTexCoord2f(0, 1) + glVertex2f(x1, y1) + glTexCoord2f(1, 0) + glVertex2f(x2, y2) + glTexCoord2f(1, 1) + glVertex2f(x2, y2) + last_theta = theta + last_x = x + last_y = y def sphere(r, lats, longs, tex, lighting=True, fv4=GLfloat * 4): """ Sphere function from the OpenGL red book. """ - sphere = gluNewQuadric() - gluQuadricDrawStyle(sphere, GLU_FILL) - gluQuadricTexture(sphere, True) - if lighting: - gluQuadricNormals(sphere, GLU_SMOOTH) + with glRestore(GL_ENABLE_BIT | GL_TEXTURE_BIT): + sphere = gluNewQuadric() + gluQuadricDrawStyle(sphere, GLU_FILL) + gluQuadricTexture(sphere, True) + if lighting: + gluQuadricNormals(sphere, GLU_SMOOTH) - glEnable(GL_TEXTURE_2D) - if lighting: - glDisable(GL_BLEND) - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(1, 1, 1, 0)) - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 0)) - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 125) - else: - glDisable(GL_LIGHTING) - glBindTexture(GL_TEXTURE_2D, tex) + glEnable(GL_TEXTURE_2D) + if lighting: + glDisable(GL_BLEND) + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(1, 1, 1, 0)) + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 0)) + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 125) + else: + glDisable(GL_LIGHTING) + glBindTexture(GL_TEXTURE_2D, tex) - gluSphere(sphere, r, lats, longs) + gluSphere(sphere, r, lats, longs) - glBindTexture(GL_TEXTURE_2D, 0) - glDisable(GL_TEXTURE_2D) - glEnable(GL_LIGHTING) - glEnable(GL_BLEND) - gluDeleteQuadric(sphere) + gluDeleteQuadric(sphere) def colourball(r, lats, longs, colour, fv4=GLfloat * 4): """ Sphere function from the OpenGL red book. """ - sphere = gluNewQuadric() + with glRestore(GL_ENABLE_BIT): + sphere = gluNewQuadric() - glDisable(GL_BLEND) - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(*colour)) - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 1)) - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 125) + glDisable(GL_BLEND) + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(*colour)) + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 1)) + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 125) - gluSphere(sphere, r, lats, longs) + gluSphere(sphere, r, lats, longs) - glEnable(GL_BLEND) - gluDeleteQuadric(sphere) + glEnable(GL_BLEND) + gluDeleteQuadric(sphere) try: @@ -186,60 +196,56 @@ except ImportError: width, height = normal_map.size gray_scale = len(normal[0, 0]) == 1 - glEnable(GL_TEXTURE_2D) - if lighting: - glDisable(GL_BLEND) - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(1, 1, 1, 0)) - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 0)) - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 125) - else: - glDisable(GL_LIGHTING) - glBindTexture(GL_TEXTURE_2D, tex) + with glRestore(GL_ENABLE_BIT | GL_TEXTURE_BIT): + glEnable(GL_TEXTURE_2D) + if lighting: + glDisable(GL_BLEND) + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(1, 1, 1, 0)) + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 0)) + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 125) + else: + glDisable(GL_LIGHTING) + glBindTexture(GL_TEXTURE_2D, tex) - twopi_divide = TWOPI / divide - pi_divide = pi / divide - glBegin(GL_TRIANGLE_STRIP) - for j in xrange(divide + 1): - phi1 = j * twopi_divide - phi2 = (j + 1) * twopi_divide + twopi_divide = TWOPI / divide + pi_divide = pi / divide + with glSection(GL_TRIANGLE_STRIP): + for j in xrange(divide + 1): + phi1 = j * twopi_divide + phi2 = (j + 1) * twopi_divide - for i in xrange(divide + 1): - theta = i * pi_divide + for i in xrange(divide + 1): + theta = i * pi_divide - s = phi2 / TWOPI - u = min(int(s * width), width - 1) - t = theta / pi - v = min(int(t * height), height - 1) - if gray_scale: - x = y = z = normal[u, v] - else: - x, y, z = normal[u, v] - dx, dy, dz = sin(theta) * cos(phi2), sin(theta) * sin(phi2), cos(theta) - nx, ny, nz = x / 127.5 - 1, y / 127.5 - 1, z / 127.5 - 1 # Make into [-1, 1] - nx, nz = cos(theta) * nx + sin(theta) * nz, -sin(theta) * nx + cos(theta) * nz - nx, ny = cos(phi2) * nx - sin(phi2) * ny, sin(phi2) * nx + cos(phi2) * ny - glNormal3f(nx, ny, nz) - glTexCoord2f(s, 1 - t) # GL is bottom up - glVertex3f(r * dx, r * dy, r * dz) + s = phi2 / TWOPI + u = min(int(s * width), width - 1) + t = theta / pi + v = min(int(t * height), height - 1) + if gray_scale: + x = y = z = normal[u, v] + else: + x, y, z = normal[u, v] + dx, dy, dz = sin(theta) * cos(phi2), sin(theta) * sin(phi2), cos(theta) + nx, ny, nz = x / 127.5 - 1, y / 127.5 - 1, z / 127.5 - 1 # Make into [-1, 1] + nx, nz = cos(theta) * nx + sin(theta) * nz, -sin(theta) * nx + cos(theta) * nz + nx, ny = cos(phi2) * nx - sin(phi2) * ny, sin(phi2) * nx + cos(phi2) * ny + glNormal3f(nx, ny, nz) + glTexCoord2f(s, 1 - t) # GL is bottom up + glVertex3f(r * dx, r * dy, r * dz) - s = phi1 / TWOPI # x - u = min(int(s * width), width - 1) - if gray_scale: - x = y = z = normal[u, v] - else: - x, y, z = normal[u, v] - dx, dy = sin(theta) * cos(phi1), sin(theta) * sin(phi1) - nx, ny, nz = x / 127.5 - 1, y / 127.5 - 1, z / 127.5 - 1 - nx, nz = cos(theta) * nx + sin(theta) * nz, -sin(theta) * nx + cos(theta) * nz - nx, ny = cos(phi1) * nx - sin(phi1) * ny, sin(phi1) * nx + cos(phi1) * ny - glNormal3f(nx, ny, nz) - glTexCoord2f(s, 1 - t) - glVertex3f(r * dx, r * dy, r * dz) - glEnd() - - glDisable(GL_TEXTURE_2D) - glEnable(GL_LIGHTING) - glEnable(GL_BLEND) + s = phi1 / TWOPI # x + u = min(int(s * width), width - 1) + if gray_scale: + x = y = z = normal[u, v] + else: + x, y, z = normal[u, v] + dx, dy = sin(theta) * cos(phi1), sin(theta) * sin(phi1) + nx, ny, nz = x / 127.5 - 1, y / 127.5 - 1, z / 127.5 - 1 + nx, nz = cos(theta) * nx + sin(theta) * nz, -sin(theta) * nx + cos(theta) * nz + nx, ny = cos(phi1) * nx - sin(phi1) * ny, sin(phi1) * nx + cos(phi1) * ny + glNormal3f(nx, ny, nz) + glTexCoord2f(s, 1 - t) + glVertex3f(r * dx, r * dy, r * dz) def belt(radius, cross, object, count): @@ -248,14 +254,13 @@ def belt(radius, cross, object, count): r = gauss(radius, cross) x, y, z = cos(theta) * r, gauss(0, cross), sin(theta) * r - glPushMatrix() - glTranslatef(x, y, z) - scale = gauss(1, 0.5) - if scale < 0: - scale = 1 - glScalef(scale, scale, scale) - glCallList(choice(object)) - glPopMatrix() + with glMatrix(): + glTranslatef(x, y, z) + scale = gauss(1, 0.5) + if scale < 0: + scale = 1 + glScalef(scale, scale, scale) + glCallList(choice(object)) try: @@ -265,72 +270,71 @@ except ImportError: """ Torus function from the OpenGL red book. """ - glPushAttrib(GL_CURRENT_BIT) - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(*material)) - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 1)) - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess) + with glRestore(GL_CURRENT_BIT): + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, fv4(*material)) + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, fv4(1, 1, 1, 1)) + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess) - major_s = TWOPI / n_major - minor_s = TWOPI / n_minor + major_s = TWOPI / n_major + minor_s = TWOPI / n_minor - def n(x, y, z): - m = 1.0 / sqrt(x * x + y * y + z * z) - return x * m, y * m, z * m + def n(x, y, z): + m = 1.0 / sqrt(x * x + y * y + z * z) + return x * m, y * m, z * m - for i in xrange(n_major): - a0 = i * major_s - a1 = a0 + major_s - x0 = cos(a0) - y0 = sin(a0) - x1 = cos(a1) - y1 = sin(a1) + for i in xrange(n_major): + a0 = i * major_s + a1 = a0 + major_s + x0 = cos(a0) + y0 = sin(a0) + x1 = cos(a1) + y1 = sin(a1) - glBegin(GL_TRIANGLE_STRIP) + with glSection(GL_TRIANGLE_STRIP): + for j in xrange(n_minor + 1): + b = j * minor_s + c = cos(b) + r = minor_radius * c + major_radius + z = minor_radius * sin(b) - for j in xrange(n_minor + 1): - b = j * minor_s - c = cos(b) - r = minor_radius * c + major_radius - z = minor_radius * sin(b) + glNormal3f(*n(x0 * c, y0 * c, z / minor_radius)) + glVertex3f(x0 * r, y0 * r, z) - glNormal3f(*n(x0 * c, y0 * c, z / minor_radius)) - glVertex3f(x0 * r, y0 * r, z) - - glNormal3f(*n(x1 * c, y1 * c, z / minor_radius)) - glVertex3f(x1 * r, y1 * r, z) - - glEnd() - glPopAttrib() + glNormal3f(*n(x1 * c, y1 * c, z / minor_radius)) + glVertex3f(x1 * r, y1 * r, z) def progress_bar(x, y, width, height, filled): - x1 = x - x2 = x + width - y1 = y - y2 = y - height - y3 = 0.65 * y1 + 0.35 * y2 - y4 = 0.25 * y1 + 0.75 * y2 + with glRestore(GL_ENABLE_BIT): + glDisable(GL_TEXTURE_2D) + glDisable(GL_BLEND) + x1 = x + x2 = x + width + y1 = y + y2 = y - height + y3 = 0.65 * y1 + 0.35 * y2 + y4 = 0.25 * y1 + 0.75 * y2 - glColor3f(0.6, 0.6, 0.6) - with glSection(GL_LINE_LOOP): - glVertex2f(x1, y1) - glVertex2f(x1, y2) - glVertex2f(x2, y2) - glVertex2f(x2, y1) + glColor3f(0.6, 0.6, 0.6) + with glSection(GL_LINE_LOOP): + glVertex2f(x1, y1) + glVertex2f(x1, y2) + glVertex2f(x2, y2) + glVertex2f(x2, y1) - x1 += 1 - y1 -= 1 - x2 = x + width * filled - 1 + x1 += 1 + y1 -= 1 + x2 = x + width * filled - 1 - with glSection(GL_TRIANGLE_STRIP): - glColor3f(0.81, 1, 0.82) - glVertex2f(x1, y1) - glVertex2f(x2, y1) - glColor3f(0, 0.83, 0.16) - glVertex2f(x1, y3) - glVertex2f(x2, y3) - glVertex2f(x1, y4) - glVertex2f(x2, y4) - glColor3f(0.37, 0.92, 0.43) - glVertex2f(x1, y2) - glVertex2f(x2, y2) \ No newline at end of file + with glSection(GL_TRIANGLE_STRIP): + glColor3f(0.81, 1, 0.82) + glVertex2f(x1, y1) + glVertex2f(x2, y1) + glColor3f(0, 0.83, 0.16) + glVertex2f(x1, y3) + glVertex2f(x2, y3) + glVertex2f(x1, y4) + glVertex2f(x2, y4) + glColor3f(0.37, 0.92, 0.43) + glVertex2f(x1, y2) + glVertex2f(x2, y2)