+#A Class that acts as an OpenGL shader, but in reality is not none.
+class GLFakeShader(GLReferenceCounter):
+ def __init__(self):
+ super(GLFakeShader, self).__init__()
+
+ def bind(self):
+ glEnable(GL_LIGHTING)
+ glEnable(GL_LIGHT0)
+ glEnable(GL_COLOR_MATERIAL)
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, [1,1,1,1])
+ glLightfv(GL_LIGHT0, GL_AMBIENT, [0,0,0,0])
+ glLightfv(GL_LIGHT0, GL_SPECULAR, [0,0,0,0])
+
+ def unbind(self):
+ glDisable(GL_LIGHTING)
+
+ def release(self):
+ pass
+
+ def setUniform(self, name, value):
+ pass
+
+ def isValid(self):
+ return True
+
+ def getVertexShader(self):
+ return ''
+
+ def getFragmentShader(self):
+ return ''
+
+class GLVBO(GLReferenceCounter):
+ def __init__(self, renderType, vertexArray, normalArray = None, indicesArray = None):
+ super(GLVBO, self).__init__()
+ self._renderType = renderType
+ if not bool(glGenBuffers):
+ self._vertexArray = vertexArray
+ self._normalArray = normalArray
+ self._indicesArray = indicesArray
+ self._size = len(vertexArray)
+ self._buffer = None
+ self._hasNormals = self._normalArray is not None
+ self._hasIndices = self._indicesArray is not None
+ else:
+ self._buffer = glGenBuffers(1)
+ self._size = len(vertexArray)
+ self._hasNormals = normalArray is not None
+ self._hasIndices = indicesArray is not None
+ glBindBuffer(GL_ARRAY_BUFFER, self._buffer)
+ if self._hasNormals:
+ glBufferData(GL_ARRAY_BUFFER, numpy.concatenate((vertexArray, normalArray), 1), GL_STATIC_DRAW)
+ else:
+ glBufferData(GL_ARRAY_BUFFER, vertexArray, GL_STATIC_DRAW)
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
+ if self._hasIndices:
+ self._size = len(indicesArray)
+ self._bufferIndices = glGenBuffers(1)
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self._bufferIndices)
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, numpy.array(indicesArray, numpy.uint32), GL_STATIC_DRAW)
+
+ def render(self):
+ glEnableClientState(GL_VERTEX_ARRAY)
+ if self._buffer is None:
+ glVertexPointer(3, GL_FLOAT, 0, self._vertexArray)
+ if self._hasNormals:
+ glEnableClientState(GL_NORMAL_ARRAY)
+ glNormalPointer(GL_FLOAT, 0, self._normalArray)
+ else:
+ glBindBuffer(GL_ARRAY_BUFFER, self._buffer)
+ if self._hasNormals:
+ glEnableClientState(GL_NORMAL_ARRAY)
+ glVertexPointer(3, GL_FLOAT, 2*3*4, c_void_p(0))
+ glNormalPointer(GL_FLOAT, 2*3*4, c_void_p(3 * 4))
+ else:
+ glVertexPointer(3, GL_FLOAT, 3*4, c_void_p(0))
+ if self._hasIndices:
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self._bufferIndices)
+
+ if self._hasIndices:
+ glDrawElements(self._renderType, self._size, GL_UNSIGNED_INT, c_void_p(0))
+ else:
+ batchSize = 996 #Warning, batchSize needs to be dividable by 4, 3 and 2
+ extraStartPos = int(self._size / batchSize) * batchSize
+ extraCount = self._size - extraStartPos
+ for i in xrange(0, int(self._size / batchSize)):
+ glDrawArrays(self._renderType, i * batchSize, batchSize)
+ glDrawArrays(self._renderType, extraStartPos, extraCount)
+
+ if self._buffer is not None:
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
+ if self._hasIndices:
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
+
+ glDisableClientState(GL_VERTEX_ARRAY)
+ if self._hasNormals:
+ glDisableClientState(GL_NORMAL_ARRAY)
+
+ def release(self):
+ if self._buffer is not None:
+ glBindBuffer(GL_ARRAY_BUFFER, self._buffer)
+ glBufferData(GL_ARRAY_BUFFER, None, GL_STATIC_DRAW)
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
+ glDeleteBuffers(1, [self._buffer])
+ self._buffer = None
+ self._vertexArray = None
+ self._normalArray = None
+
+ def __del__(self):
+ if self._buffer is not None and bool(glDeleteBuffers):
+ print "VBO was not properly released!"
+
+def glDrawStringCenter(s):
+ glRasterPos2f(0, 0)
+ glBitmap(0,0,0,0, -glGetStringSize(s)[0]/2, 0, None)
+ for c in s:
+ glutBitmapCharacter(OpenGL.GLUT.GLUT_BITMAP_HELVETICA_18, ord(c))
+
+def glGetStringSize(s):
+ width = 0
+ for c in s:
+ width += glutBitmapWidth(OpenGL.GLUT.GLUT_BITMAP_HELVETICA_18, ord(c))
+ height = 18
+ return width, height
+
+def glDrawStringLeft(s):
+ glRasterPos2f(0, 0)
+ n = 1
+ for c in s:
+ if c == '\n':
+ glPushMatrix()
+ glTranslate(0, 18 * n, 0)
+ n += 1
+ glRasterPos2f(0, 0)
+ glPopMatrix()
+ else:
+ glutBitmapCharacter(OpenGL.GLUT.GLUT_BITMAP_HELVETICA_18, ord(c))
+
+def glDrawStringRight(s):
+ glRasterPos2f(0, 0)
+ glBitmap(0,0,0,0, -glGetStringSize(s)[0], 0, None)
+ for c in s:
+ glutBitmapCharacter(OpenGL.GLUT.GLUT_BITMAP_HELVETICA_18, ord(c))