Ejemplo n.º 1
0
class Render(object):
    def __init__(self, camera, window):
        super(Render, self).__init__()
        self.scene_batch = pyglet.graphics.Batch()
        self.static_batch = pyglet.graphics.Batch()
        self.camera = camera
        self.window = window
        # scaling factors
        self.scale = vec2(window.width / 1360., window.height / 765.)
        self.players = {}

        #for rendering
        self.fbo = FBO(window.width, window.height)
        self.lighting = Shader('lighting')
        self.lighting.set('mvp', Matrix.orthographic(
            0., window.width, 0., window.height, 0, 1))
        self.lighting.set('lightPos', vector((-20., 20, 10)))
        self.screen = TexQuad(
            0, 0, window.width, window.height, self.fbo.textures[0].tex_coords)

    def draw(self):
        with self.fbo:
            self.fbo.clear()
            with self.camera as mvp:
                self.scene_batch.draw()
                for player in self.players.itervalues():
                    player.draw(mvp)

        #send texture data to shader
        for i in range(3):
            glActiveTexture(GL_TEXTURE0 + i)
            glBindTexture(GL_TEXTURE_2D, self.fbo.textures[i].id)
        self.lighting.set('texs', arr(self.fbo.textures[0].id,
                                      self.fbo.textures[1].id,
                                      self.fbo.textures[2].id))
        glActiveTexture(GL_TEXTURE0)

        #draw; for now scene batch like this, eventually it will also be 3d
        self.window.clear()
        with self.lighting:
            self.screen.draw()
        self.static_batch.draw()

    def maphook(self, map, add=False, spawn=False, remove=False, taken=False):
        if spawn:
            self.map.spawn(map)
        elif taken:
            self.map.taken(map)
        elif add:
            self.map = DrawableMap(map, self.scene_batch, self.scale)

    def playerhook(self, player, remove=False, update=False, add=False):
        id = player.id
        if update:
            self.players[id].update(player, self.scale)
        elif add:
            self.players[id] = DrawablePlayer(player, self.scene_batch,
                                              self.scale)
        elif remove:
            self.players[id].remove()
            del self.players[id]

    def update(self, dt):
        #self.model.update(dt, self.players[1].state)
        for player in self.players.itervalues():
            player.animate(dt)

    def weapon_check(self, id, weaponinfo):
        self.players[id].update_weapon(weaponinfo[1])

    def attack(self, id):
        try:
            self.players[id].attack()
        except KeyError:
            pass
Ejemplo n.º 2
0
class Model(object):
    """docstring for Model"""
    def __init__(self, filename, scale):
        super(Model, self).__init__()
        p_data = parsedae.parse_dae(filename, scale)
        verts, norms, facedata, jd, js, skn, anm, fsc = p_data
        self.maxtime = max(anm[0][0])
        _anim = AnimatedModel(*p_data)
        self.anim = AnimationUpdater(anm, _anim)
        self.meshes = []
        self.batch = pyglet.graphics.Batch()
        for faces in facedata:
            color = faces[0]
            facearr = [(vert, faces[2][i]) for i, vert in enumerate(faces[1])]
            self.meshes.append(Mesh(verts, facearr, norms, color, skn))
        self.tarr = [[None for j in range(len(facedata[i][1])*3)]
                     for i in range(len(facedata))]
        self.add(self.batch)
        self.quats, self.vecs = _anim.get_bindpose()
        self.shader = Shader('skinning')
        self.shader.set('quats', self.quats)
        self.shader.set('vecs', self.vecs)
        self.shader.set('scale', fsc)

    def add(self, batch):
        for mesh in self.meshes:
            mesh.data_to_batch(batch)

    def remove(self):
        for mesh in self.meshes:
            mesh.vertex_list.delete()

    def update(self, dt, state):
        self.quats, self.vecs = self.anim.update(dt, state)
        self.shader.set('quats', self.quats)
        self.shader.set('vecs', self.vecs)

    def start_attack(self):
        self.anim.start_attack()

    def draw(self, mvp):
        self.shader.set('mvp', mvp)
        with self.shader:
            self.batch.draw()

    def change_color(self, color):
        self.meshes[1].vertex_list._set_attribute_data(
            2, color[:4] * self.meshes[1].length)

    def update_weapon(self, color):
        self.meshes[2].vertex_list._set_attribute_data(
            2, color[:4] * self.meshes[2].length)