comparison pytouhou/ui/opengl/sprite.pyx @ 527:db28538cd399

Use Sprite C arrays instead of their tuple representation where it makes sense.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 18 Dec 2013 18:19:08 +0100
parents 43ecf0f98f4d
children dacdcca59b66
comparison
equal deleted inserted replaced
526:0b2a92a25245 527:db28538cd399
18 from pytouhou.utils.matrix cimport Matrix, scale2d, flip, rotate_x, rotate_y, rotate_z, translate, translate2d 18 from pytouhou.utils.matrix cimport Matrix, scale2d, flip, rotate_x, rotate_y, rotate_z, translate, translate2d
19 from .renderer cimport Texture #XXX 19 from .renderer cimport Texture #XXX
20 20
21 21
22 cpdef tuple get_sprite_rendering_data(Sprite sprite): 22 cpdef tuple get_sprite_rendering_data(Sprite sprite):
23 cdef double tx, ty, tw, th, sx, sy, rx, ry, rz, tox, toy
24 cdef Matrix vertmat 23 cdef Matrix vertmat
25 24
26 if not sprite.changed: 25 if not sprite.changed:
27 return sprite._rendering_data 26 return sprite._rendering_data
28 27
29 vertmat = Matrix(-.5, .5, .5, -.5, 28 vertmat = Matrix(-.5, .5, .5, -.5,
30 -.5, -.5, .5, .5, 29 -.5, -.5, .5, .5,
31 0, 0, 0, 0, 30 0, 0, 0, 0,
32 1, 1, 1, 1) 31 1, 1, 1, 1)
33 32
34 tx, ty, tw, th = sprite.texcoords 33 tx, ty, tw, th = sprite._texcoords[0], sprite._texcoords[1], sprite._texcoords[2], sprite._texcoords[3]
35 sx, sy = sprite.rescale 34 sx, sy = sprite._rescale[0], sprite._rescale[1]
36 width = sprite.width_override or (tw * sx) 35 width = sprite.width_override or (tw * sx)
37 height = sprite.height_override or (th * sy) 36 height = sprite.height_override or (th * sy)
38 37
39 scale2d(&vertmat, width, height) 38 scale2d(&vertmat, width, height)
40 if sprite.mirrored: 39 if sprite.mirrored:
41 flip(&vertmat) 40 flip(&vertmat)
42 41
43 rx, ry, rz = sprite.rotations_3d 42 rx, ry, rz = sprite._rotations_3d[0], sprite._rotations_3d[1], sprite._rotations_3d[2]
44 if sprite.automatic_orientation: 43 if sprite.automatic_orientation:
45 rz += pi/2. - sprite.angle 44 rz += pi/2. - sprite.angle
46 elif sprite.force_rotation: 45 elif sprite.force_rotation:
47 rz += sprite.angle 46 rz += sprite.angle
48 47
51 if ry: 50 if ry:
52 rotate_y(&vertmat, ry) 51 rotate_y(&vertmat, ry)
53 if rz: 52 if rz:
54 rotate_z(&vertmat, -rz) #TODO: minus, really? 53 rotate_z(&vertmat, -rz) #TODO: minus, really?
55 if sprite.allow_dest_offset: 54 if sprite.allow_dest_offset:
56 translate(&vertmat, sprite.dest_offset[0], sprite.dest_offset[1], sprite.dest_offset[2]) 55 translate(&vertmat, sprite._dest_offset)
57 if sprite.corner_relative_placement: # Reposition 56 if sprite.corner_relative_placement: # Reposition
58 translate2d(&vertmat, width / 2, height / 2) 57 translate2d(&vertmat, width / 2, height / 2)
59 58
60 x_1 = sprite.anm.size_inv[0] 59 x_1 = sprite.anm.size_inv[0]
61 y_1 = sprite.anm.size_inv[1] 60 y_1 = sprite.anm.size_inv[1]
62 tox, toy = sprite.texoffsets 61 tox, toy = sprite._texoffsets[0], sprite._texoffsets[1]
63 uvs = (tx * x_1 + tox, 62 uvs = (tx * x_1 + tox,
64 (tx + tw) * x_1 + tox, 63 (tx + tw) * x_1 + tox,
65 ty * y_1 + toy, 64 ty * y_1 + toy,
66 (ty + th) * y_1 + toy) 65 (ty + th) * y_1 + toy)
67 66
67 r, g, b, a = sprite._color[0], sprite._color[1], sprite._color[2], sprite._color[3]
68
68 key = ((<Texture>sprite.anm.texture).key << 1) | sprite.blendfunc 69 key = ((<Texture>sprite.anm.texture).key << 1) | sprite.blendfunc
69 r, g, b = sprite.color 70 values = tuple([x for x in (<float*>&vertmat)[:12]]), uvs, (r, g, b, a)
70 values = tuple([x for x in (<float*>&vertmat)[:12]]), uvs, (r, g, b, sprite.alpha)
71 sprite._rendering_data = key, values 71 sprite._rendering_data = key, values
72 sprite.changed = False 72 sprite.changed = False
73 73
74 return sprite._rendering_data 74 return sprite._rendering_data