Hm, nothing? Well I guess I should give people more to go on.

Anyway, I made a multi-texture grid, but whenever I tried to access or 
change the tex_coords it would crash with an error: "_get_tex_coords: 
attribute = domain.attribute_names['tex_coords']"
Digging into pyglet-1.2.2 VertexDomain.py, Multi-texture arrays are stored 
as "multi_tex_coords" in domain.atribute_names, and the functions have no 
way of interacting with them.
So I made a few modifications:

    def _get_tex_coords(self):
        if 'multi_tex_coords' not in self.domain.attribute_names:
            if (self._tex_coords_cache_version != self.domain._version):
                domain = self.domain
                attribute = domain.attribute_names['tex_coords']
                self._tex_coords_cache = attribute.get_region(
                    attribute.buffer, self.start, self.count)
                self._tex_coords_cache_version = domain._version

            region = self._tex_coords_cache
            region.invalidate()
            return region.array
        else:
            return None

    def _set_tex_coords(self, data):
        self._get_tex_coords()[:] = data

    tex_coords = property(_get_tex_coords, _set_tex_coords,
                          doc='''Array of texture coordinate data.''')

    # ---

    def _get_multi_tex_coords(self):
        if 'tex_coords' not in self.domain.attribute_names:
            if (self._tex_coords_cache_version != self.domain._version):
                domain = self.domain
                attribute = domain.attribute_names['multi_tex_coords']
                self._tex_coords_cache = []
                for a in attribute.keys():
                    self._tex_coords_cache.append(attribute[a].get_region(
                        attribute[a].buffer, self.start, self.count))
                    self._tex_coords_cache_version = domain._version

            region = self._tex_coords_cache
            array = []
            for a in region:
                a.invalidate()
                array.append(a.array)
            return array
        else:
            return None

    def _set_multi_tex_coords(self, data):
        if self._get_multi_tex_coords() != None:
            for a in xrange(0, len(self._tex_coords_cache),1):
                if data[a] != None:
                    self._tex_coords_cache[a].array[:] = data[a]

    multi_tex_coords = property(_get_multi_tex_coords, 
_set_multi_tex_coords,
                                doc='''Multi-array texture coordinate 
data.''')

I'm sure it could use some improvement, but it seems to get the job done. 
When you call tex_coords it will return None if its a multi_tex_coord 
object, and vice versa if its a regular
tex_coord. _get_multi_tex_coords returns a list with the tex_coord array's, 
and you can set them by writing: array.multi_tex_coord = [(0,0,0...),etc]. 
Optionally you can update specific
arrays by returning None: array.multi_tex_coord = [(0,0,0...), None, 
(0,0,0...)]. I've written a small example program i'll attach.

Some of the problems i've run into involve the clock and blitted images 
messing up, though i'm beginning to think its how I handle the multi-tex 
rendering rather than something in pyglet,
again don't know enough to narrow it down, yet anyway. Also, the example 
script was written with the above modifications to VertexDomain.py.

-- 
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.
import pyglet
pyglet.options['shadow_window'] = False
from pyglet.window import key
from pyglet.gl import *

pyglet.options['debug_gl'] = False

class test(pyglet.window.Window):
    def __init__(self):
        super(test, self).__init__(640, 480, resizable=False, fullscreen=False, caption="Test")
    
        self.clear()

    #window aspect ratio for resizing fullscreen
        self.aspect = [0,0]

    #Enable blending
        gl.glEnable(GL_BLEND)
        gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

    #Enable transparency
        glEnable(GL_ALPHA_TEST)
        glAlphaFunc(GL_GREATER, .1)

        self.render = pyglet.graphics.Batch()

        self.texture0 = pyglet.image.TextureGrid(pyglet.image.ImageGrid(pyglet.image.load("sample7.png"),1,4))

        self.image = pyglet.image.load("sample6.png").get_texture()
    #texture swap counter for test
        self.count = [2,1,3]

        self.layer = []

    #initialize 32x32-tile grid 
        for b in range(0,15+1,1):
            self.layer.append([])
            for a in range(0,20+1,1):
                self.layer[b].append(self.render.add(4, pyglet.gl.GL_QUADS, group(1),
                ('v2f',((a*32),(b*32), 32+(a*32),(b*32), 32+(a*32),32+(b*32), (a*32),32+(b*32))),
                ('0t3f',self.texture0[2].tex_coords),
                ('1t3f',self.texture0[1].tex_coords),
                ('2t3f',self.texture0[3].tex_coords)))



        print self.layer[3][0].tex_coords
        print self.layer[3][0].multi_tex_coords


        pyglet.clock.get_fps()
        self.fps_display = pyglet.clock.ClockDisplay()
##        self.fps_display = pyglet.window.FPSDisplay(self)
        pyglet.clock.schedule_interval(self.update, .01)


    def update(self,dt):
        self.draw()        


    def draw(self):
        self.clear()

        glEnable(GL_TEXTURE_2D)
        self.render.draw()
        glDisable(GL_TEXTURE_2D)

        self.image.blit(256,256)

        self.fps_display.draw()

    def on_key_press(self,symbol,modifiers):
    #exit
        if symbol == key.ESCAPE:
            self.close()

    #fullscreen toggle
        if symbol == key.ENTER:
            if modifiers & key.MOD_ALT:
            #if fullscreen off, turn on and scale the screen
                if self.fullscreen == False:
                    window.set_fullscreen(True)
                    glScalef(window.width/640.0,window.height/480.0,1.0)#2.25x, 1.875y
                    self.aspect[0] = window.width/640.0
                    self.aspect[1] = window.height/480.0
            #if its on, turn it off and un-scale the screen
                else:
                    window.set_fullscreen(False)
                    glScalef((window.width/640.0)/self.aspect[0],(window.height/480.0)/self.aspect[1],1.0)

    #swap first layer
        if symbol == key._1:
            self.count[0] += 1
            if self.count[0] > 3:
                self.count[0] = 0
            self.layer[3][0].multi_tex_coords = [self.texture0[self.count[0]].tex_coords,None,None]
    #swap second layer
        if symbol == key._2:
            self.count[1] += 1
            if self.count[1] > 3:
                self.count[1] = 0
            self.layer[3][0].multi_tex_coords = [None,self.texture0[self.count[1]].tex_coords,None]
    #swap third layer
        if symbol == key._3:
            self.count[2] += 1
            if self.count[2] > 3:
                self.count[2] = 0
            self.layer[3][0].multi_tex_coords = [None,None,self.texture0[self.count[2]].tex_coords]



class group(pyglet.graphics.OrderedGroup):
    def set_state(self):

        glActiveTexture(GL_TEXTURE0)
        glEnable(window.texture0[0].target)
        glBindTexture(GL_TEXTURE_2D, window.texture0[0].id)
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

        glActiveTexture(GL_TEXTURE1)
        glEnable(window.texture0[1].target)
        glBindTexture(GL_TEXTURE_2D, window.texture0[1].id)
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

        glActiveTexture(GL_TEXTURE2)
        glEnable(window.texture0[2].target)
        glBindTexture(GL_TEXTURE_2D, window.texture0[2].id)
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)





if __name__ == '__main__':
    window = test()
    pyglet.app.run()

Reply via email to