you have to trick Pyglet into thinking that a context exists and use OpenGL 
internal context switching. I've gotten this working in wx but the process 
should work with other context providders

The real impotent bits I'll highlight here:

import pyglet

# this line is very important, we're tricking pyglet into thinking there is a 
context avalible

# but we can't make it work with the shadow window that alows sharing of

# object between contexts

pyglet.options['shadow_window'] = False

# now that that is set we can import gl and get on our way

from pyglet import gl


This sequence must take place in this order. The shadow_window option must 
be set to false before pyglet.gl is ever imported in the application..

Then the next step is creating a fake context opbject for pyglet to use. Up 
to version 1.1.4 this was easy, New pyglet however requires a bit more work

if pyglet.version > "1.1.4":

    pygletcontext = PygletContext()

else:

    pygletcontext = gl.Context()

pygletcontext.set_current()


Do this BEFORE  you do any work with your context like setting the blend 
func etc.
If you have multiple contexts you want to work with in your GUI application 
then keep your  pygletcontext object handy you'll need to use the GUI's 
method of setting the current context as well as the .set_current() of the 
fake context to get pyglet drawing in the right context.

Here is the class I cobbled together to trick pyglet < 1.1.4 It's mostly a 
copy paste of the pyglet source for pyglet.gl.context the important bit is 
after the #implement workarounds comment

class PygletWXContext(gl.Context):

    def __init__(self, config=None, context_share=None):

        self.config = config

        self.context_share = context_share

        self.canvas = None

        if context_share:

            self.object_space = context_share.object_space

        else:

            self.object_space = gl.ObjectSpace()

    def attach(self, canvas=None):

        pass

    def detach(self):

        pass

    def set_current(self):

        # XXX not per-thread

        gl.current_context = self

        # XXX

        gl.gl_info.set_active_context()

        gl.glu_info.set_active_context()

        # Implement workarounds

        if not self._info:

            self._info = gl.gl_info.GLInfo()

            self._info.set_active_context()

            for attr, check in self._workaround_checks:

                setattr(self, attr, check(self._info))

        # Release textures and buffers on this context scheduled for deletion.

        # Note that the garbage collector may introduce a race condition,

        # so operate on a copy of the textures/buffers and remove the deleted

        # items using list slicing (which is an atomic operation)

        if self.object_space._doomed_textures:

            textures = self.object_space._doomed_textures[:]

            textures = (gl.GLuint * len(textures))(*textures)

            gl.glDeleteTextures(len(textures), textures)

            self.object_space._doomed_textures[0:len(textures)] = []

        if self.object_space._doomed_buffers:

            buffers = self.object_space._doomed_buffers[:]

            buffers = (gl.GLuint * len(buffers))(*buffers)

            gl.glDeleteBuffers(len(buffers), buffers)

            self.object_space._doomed_buffers[0:len(buffers)] = []


And that should be it. so long as you set teh current context correctly 
every time you begin work with a new context you don't need pyglet to 
manage it. The down side of pyglet not managing the context is that object 
can not be reused. (at least I couldn't figure out how to make it work when 
I tried a few years ago. perhaps the internals are different now and it can 
be done.)

On Wednesday, September 30, 2015 at 7:13:19 AM UTC-6, dumebi bidume wrote:
>
> hello,
>
> I would like to use pyglet code within a GUI application, currently I'm 
> trying to achieve that by setting pyglet context, based on some old thread 
> about this…
> (for instance: 
> https://groups.google.com/forum/#!topic/pyglet-users/QmXU5ssY40E)
>
> I'm using pyglet 1.2 and trying to use glglue 
> <https://pypi.python.org/pypi/glglue/0.3.1> with a glut window to test 
> this but I'm not able to make it work.
>
> Is there a reasonable way to get pyglet using an already created context ?
> thanks
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pyglet-users+unsubscr...@googlegroups.com.
To post to this group, send email to pyglet-users@googlegroups.com.
Visit this group at http://groups.google.com/group/pyglet-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to