diff --git a/fragment.py b/fragment.py index cd0fead..0b90d73 100644 --- a/fragment.py +++ b/fragment.py @@ -29,7 +29,7 @@ try: except ImportError: gl = cdll.LoadLibrary('libGL.so') -GL_FRAGMENT_SHADER_ARB = 0x8B30 +GL_FRAGMENT_PROGRAM_ARB = 0x8804 GL_PROGRAM_ERROR_STRING_ARB = 0x8874 GL_PROGRAM_FORMAT_ASCII_ARB = 0x8875 @@ -37,14 +37,18 @@ GLint = c_int GLuint = c_uint glGenProgramsARB = gl.glGenProgramsARB -glGenProgramsARB.argtypes = [GLuint, POINTER (GLuint)] -glBindProgramARB = gl.glGenProgramsARB +glGenProgramsARB.argtypes = [GLuint, GLuint] +glBindProgramARB = gl.glBindProgramARB glBindProgramARB.argtypes = [GLuint, GLuint] glProgramStringARB = gl.glProgramStringARB -glProgramStringARB.argtypes = [GLuint, GLuint, c_void_p] +glProgramStringARB.argtypes = [GLuint, GLuint, GLuint, c_void_p] glDeleteProgramsARB = gl.glDeleteProgramsARB glDeleteProgramsARB.argtypes = [GLint, c_void_p] glGetError = gl.glGetError +glEnable = gl.glEnable +glEnable.argtypes = [GLuint] +glDisable = gl.glDisable +glDisable.argtypes = [GLuint] #resumbrae.com glGenProgramsARB @@ -54,22 +58,32 @@ class Program: def __init__ (self, source): self.source = source - self.id = c_uint () - glGenProgramsARB (c_uint (1), byref (self.id)) - print self.id - if self.id == 0: + self.id = c_uint(0) + glGenProgramsARB (c_uint (1), addressof(self.id)) + if self.id.value == 0: print "Could not create fragment program, aborting" raise SystemExit - glBindProgramARB (GL_FRAGMENT_SHADER_ARB, self.id) - glProgramStringARB (GL_PROGRAM_FORMAT_ASCII_ARB, - self.id, self.source) + self.check_error () + glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, self.id.value) + print len(self.source) + self.check_error () + glProgramStringARB (GL_FRAGMENT_PROGRAM_ARB, + GL_PROGRAM_FORMAT_ASCII_ARB, + len(self.source), self.source) self.check_error () def check_error (self): e = glGetError () + print e if e != GL_NO_ERROR: print "glError : %s" % glGetString (GL_PROGRAM_ERROR_STRING_ARB) - raise SystemExit +# raise SystemExit + + def activate (self): + glEnable(GL_FRAGMENT_PROGRAM_ARB) + + def deactivate (self): + glDisable(GL_FRAGMENT_PROGRAM_ARB) def __del__ (self): if self.id: diff --git a/gshaderedit.py b/gshaderedit.py index c2fe077..1e35554 100755 --- a/gshaderedit.py +++ b/gshaderedit.py @@ -133,10 +133,15 @@ class glArea (gtk.DrawingArea, gtk.gtkgl.Widget): gldrawable.gl_end () def on_expose_event (self, *args): - gldrawable = self.get_gl_drawable () + self.repaint() + + def repaint (self): + gldrawable = self.get_gl_drawable () glcontext = self.get_gl_context () gldrawable.gl_begin (glcontext) glClear (GL_COLOR_BUFFER_BIT) + if self.program: + self.program.activate() glMatrixMode (GL_MODELVIEW) glLoadIdentity () glTexEnvfv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (1, 1, 1, 1)) @@ -144,6 +149,8 @@ class glArea (gtk.DrawingArea, gtk.gtkgl.Widget): glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) self.display () gldrawable.swap_buffers () + if self.program: + self.program.deactivate() gldrawable.gl_end () def display (self): @@ -169,6 +176,8 @@ class glArea (gtk.DrawingArea, gtk.gtkgl.Widget): if self.program: del self.program self.program = Program (source) + self.repaint() + class gShaderEdit ():