-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcrt_shader.py
88 lines (75 loc) · 3.25 KB
/
crt_shader.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
import struct
import pygame, os, sys
from pygame.locals import *
import moderngl
def resource_path(relative):
if hasattr(sys, "_MEIPASS"):
absolute_path = os.path.join(sys._MEIPASS, relative)
else:
absolute_path = os.path.join(relative)
return absolute_path
class Graphic_engine:
def __init__(self, screen, style = 1, VIRTUAL_RES=(800, 600), cpu_only=False, fullscreen=False):
pygame.init()
self.VIRTUAL_RES = VIRTUAL_RES
self.cpu_only = cpu_only
self.screen = screen
self.fullscreen = fullscreen
if not(self.cpu_only):
self.ctx = moderngl.create_context()
self.texture_coordinates = [0, 1, 1, 1,
0, 0, 1, 0]
self.world_coordinates = [-1, -1, 1, -1,
-1, 1, 1, 1]
self.render_indices = [0, 1, 2,
1, 2, 3]
self.style = style
# shader style : 0, no shader. 1, crt. 2, flat_crt.
self.prog = self.ctx.program(
vertex_shader=open(resource_path('shaders/VERTEX_SHADER.glsl')).read(),
fragment_shader=open(resource_path('shaders/FRAGMENT_SHADER.glsl')).read(),
)
self.prog['mode'] = self.style
self.screen_texture = self.ctx.texture(
self.VIRTUAL_RES, 3,
pygame.image.tostring(screen, "RGB", 1)
)
self.screen_texture.repeat_x = False
self.screen_texture.repeat_y = False
self.vbo = self.ctx.buffer(struct.pack('8f', *self.world_coordinates))
self.uvmap = self.ctx.buffer(struct.pack('8f', *self.texture_coordinates))
self.ibo= self.ctx.buffer(struct.pack('6I', *self.render_indices))
self.vao_content = [
(self.vbo, '2f', 'vert'),
(self.uvmap, '2f', 'in_text'),
]
self.vao = self.ctx.vertex_array(self.prog, self.vao_content, index_buffer=self.ibo)
else:
self.diaplay = pygame.display.get_surface()
def change_shader(self):
if not self.cpu_only:
self.__init__(self.screen, (self.style + 1) % 3, self.VIRTUAL_RES)
def render(self):
if not(self.cpu_only):
texture_data = self.screen.get_view('1')
self.screen_texture.write(texture_data)
self.ctx.clear(14/255,40/255,66/255)
self.screen_texture.use()
self.vao.render()
pygame.display.flip()
else:
self.diaplay.blit(self.screen, (0, 0))
pygame.display.update()
def Full_screen(self, REAL_RES):
if not(self.cpu_only):
if not(self.fullscreen):
pygame.display.set_mode(REAL_RES, pygame.DOUBLEBUF|pygame.OPENGL)
else:
pygame.display.set_mode(REAL_RES, pygame.DOUBLEBUF|pygame.OPENGL|pygame.FULLSCREEN)
else:
if not(self.fullscreen):
pygame.display.set_mode(self.VIRTUAL_RES)
else:
pygame.display.set_mode(self.VIRTUAL_RES, pygame.FULLSCREEN)
def __call__(self):
return self.render()