-
Notifications
You must be signed in to change notification settings - Fork 4
/
fbmatrix.py
131 lines (102 loc) · 4.27 KB
/
fbmatrix.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import sys
import numpy as np
import OpenGL.GL as gl
import OpenGL.GLUT as glut
import time
import fbo
import signal
import displays.ws2811
import displays.hub75e
import geometry.simple
import assembly.tree
def signal_handler(sig, frame):
sys.exit(0)
global_init = False
class renderer(object):
def __init__(self, emulate=False, preview=False, raw=False, display='hub75e', rows=32, columns=32, supersample=3, order='line-first', interpolate=True, oe='normal', extract='bcm'):
self.emulate = emulate
self.preview = preview
self.raw = raw
self.displaytype = display
self.rows = rows
self.columns = columns
self.supersample = supersample
self.order = order
self.interpolate = interpolate
self.oe = oe
self.extract = extract
self.init()
def clear(self):
gl.glClearColor(0, 0, 0, 0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
gl.glEnable(gl.GL_BLEND)
gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE)
def display(self):
with self.mainfbo:
self.clear()
self.render()
gl.glMemoryBarrier(gl.GL_FRAMEBUFFER_BARRIER_BIT)
if self.emulate:
gl.glClearColor(0, 0, 0, 0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT| gl.GL_DEPTH_BUFFER_BIT)
gl.glViewport(0, 0, int(self.screenWidth/2), self.screenHeight)
self.tree.render(0)
gl.glViewport(int(self.screenWidth/2), 0, int(self.screenWidth/2), self.screenHeight)
self.texquad.render()
else:
gl.glClearColor(0, 0, 0, 0)
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
if self.preview:
self.texquad.render()
else:
self.signalgenerator.render()
glut.glutSwapBuffers()
glut.glutPostRedisplay()
def reshape(self,width,height):
self.screenWidth = width
self.screenHeight = height
gl.glViewport(0, 0, width, height)
def keyboard(self, key, x, y ):
if key == b'\033':
sys.exit( )
def init(self):
# Initialize display
global global_init
if not global_init:
glut.glutInit()
glut.glutInitDisplayMode(glut.GLUT_DOUBLE | glut.GLUT_RGBA | glut.GLUT_DEPTH | glut.GLUT_ALPHA)
glut.glutCreateWindow(b'fbmatrix')
global_init = True
if self.preview or self.raw:
glut.glutReshapeWindow(512, 512)
elif self.emulate:
glut.glutReshapeWindow(1024, 512)
glut.glutReshapeFunc(lambda w,h: self.reshape(w,h))
glut.glutDisplayFunc(lambda: self.display())
glut.glutKeyboardFunc(lambda k,x,y: self.keyboard(k,x,y))
# Primary offscreen framebuffer
self.mainfbo = fbo.FBO(self.columns, 32, mag_filter = gl.GL_NEAREST, min_filter = gl.GL_NEAREST)
# Initialize display shader
layoutfile = 'layout.json'
if self.displaytype == 'ws2811':
self.signalgenerator = displays.ws2811.signalgenerator(layoutfile, supersample=self.supersample)
self.signalgenerator.setTexture(self.mainfbo.getTexture())
elif self.displaytype == 'hub75e':
self.signalgenerator = displays.hub75e.signalgenerator(columns=self.columns, rows=self.rows, supersample=self.supersample, order=self.order, oe=self.oe, extract=self.extract)
self.signalgenerator.setTexture(self.mainfbo.getTexture())
# Emulation shader
if self.emulate or self.preview:
self.texquad = geometry.simple.texquad()
self.texquad.setTexture(self.mainfbo.getTexture())
# Tree emulator
if self.emulate:
self.tree = assembly.tree.tree(layoutfile)
self.tree.setTexture(self.mainfbo.getTexture())
# Render
glut.glutSetCursor(glut.GLUT_CURSOR_NONE);
if not self.raw and not self.preview and not self.emulate:
glut.glutFullScreen()
def run(self, render):
self.render = render
signal.signal(signal.SIGINT, signal_handler)
glut.glutMainLoop()