From 89b7c1bb7bd17207d48d730d083314eb28a30d66 Mon Sep 17 00:00:00 2001 From: langolierz Date: Thu, 4 Oct 2018 21:15:26 +0000 Subject: [PATCH] improving the shader interface --- actions.py | 14 +++++++++++--- display_centre/display.py | 8 ++++---- display_centre/menu.py | 2 +- video_centre/shaders.py | 37 +++++++++++++++++++++++++++---------- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/actions.py b/actions.py index add2649..268ee2e 100644 --- a/actions.py +++ b/actions.py @@ -62,7 +62,9 @@ class Actions(object): self.shaders.shaders_menu.navigate_menu_up() def enter_on_shaders_selection(self): - self.shaders.enter_on_shaders_selection() + is_shader, selected_shader = self.shaders.enter_on_shaders_selection() + if is_shader and selected_shader['shad_type'] == 'gen' and self.shaders.selected_status == '▶': + self.video_driver.current_player.toggle_pause() def clear_all_slots(self): self.data.clear_all_slots() @@ -227,10 +229,16 @@ class Actions(object): self.message_handler.set_message('INFO', 'cant mirror in dev mode') def toggle_shaders(self): - if self.shaders.selected_status == 'RUNNING': + if self.shaders.selected_status == '▶': self.shaders.stop_selected_shader() - else: + if self.shaders.selected_shader['shad_type'] == 'gen': + self.video_driver.current_player.toggle_pause() + elif self.shaders.selected_status == '■': self.shaders.start_selected_shader() + if self.shaders.selected_shader['shad_type'] == 'gen': + self.video_driver.current_player.toggle_pause() + else: + self.message_handler.set_message('INFO', 'no shader loaded') def toggle_player_mode(self): if self.data.player_mode == 'now': diff --git a/display_centre/display.py b/display_centre/display.py index 627af31..cf51829 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -148,11 +148,11 @@ class Display(object): self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.28) ## showing current shader info: shader = self.shaders.selected_shader - self.display_text.insert(END, '{:<6}:{:<1}{:<2} {:^10} '.format \ - (self.shaders.selected_status,shader['shad_type'], \ - shader['shad_index'], shader['name'][0:26] )) + self.display_text.insert(END, '{:<1}:{:<1}{:<2} {:<17} '.format \ + (self.shaders.selected_status,shader['shad_type'][0], \ + format(shader['shad_index'],'02d'), shader['name'][0:17] )) for i in range(min(4,shader['param_number'])): - self.display_text.insert(END, 'x{}:{:<2} '.format(i, self.shaders.selected_param_values[i])) + self.display_text.insert(END, 'x{}:{num:02d} '.format(i, num=self.shaders.selected_param_values[i])) self.display_text.insert(END,'\n') self.display_text.tag_add("COLUMN_NAME", 5.0, 6.0) ## showing list of other shaders: diff --git a/display_centre/menu.py b/display_centre/menu.py index e2418cb..9a8c60d 100644 --- a/display_centre/menu.py +++ b/display_centre/menu.py @@ -198,7 +198,7 @@ class ShadersMenu(Menu): for f in files: split_name = os.path.splitext(f) - if (split_name[1].lower() in ['.frag', '.shader', '.glsl', '.glslf', '.shader', '.fsh']): + if (split_name[1].lower() in ['.frag', '.shader', '.glsl', '.glslf', '.fsh']): self.menu_list.append(dict(name='{}{}'.format(indent, f), is_shader=True)) diff --git a/video_centre/shaders.py b/video_centre/shaders.py index f1e6a94..8c3809e 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -16,20 +16,20 @@ class Shaders(object): if self.shaders_menu_list is not None: pass - self.selected_status = '-' - self.selected_param_values = [0,0,0,0,0,0,0,0] + self.selected_status = '-' ## going to try using symbols for this : '-' means empty, '▶' means running, '■' means not running, '!' means error + self.selected_param_values = [0,0,0,0] #self.load_selected_shader() def generate_shaders_list(self): shaders_menu_list = [] raw_list = self.shaders_menu.generate_raw_shaders_list() - print('raw list is {}: '.format(raw_list)) + shad_i = 0 for line in raw_list: - shad_i = 0 if line['is_shader']: has_path, path = self.get_path_for_shader(line['name']) shad_type = self.determine_if_shader_file_is_processing(path) parameter_number = self.determine_shader_parameter_number(path) + #print('shader index is {}'.format(shad_i)) shaders_menu_list.append(dict(name=line['name'],is_shader=True,shad_type=shad_type,param_number=parameter_number,path=path,shad_index=shad_i)) shad_i = shad_i +1 else: @@ -46,23 +46,39 @@ class Shaders(object): return False, '' def determine_if_shader_file_is_processing(self, path): - return True + with open(path, 'r') as selected_shader: + shader_text = selected_shader.read() + if '//pro-shader' in shader_text: + return 'pro' + elif '//gen-shader' in shader_text: + return 'gen' + + else: + return '-' def determine_shader_parameter_number(self, path): - return 4 + max_amount = 4 + with open(path, 'r') as selected_shader: + shader_text = selected_shader.read() + for i in range(max_amount): + if 'uniform float u_x{}'.format(i) not in shader_text: + return i + return max_amount def load_selected_shader(self): print(self.selected_shader) - is_proc = self.selected_shader['shad_type'] == 'p' - self.osc_client.send_message("/shader/load", [self.selected_shader['path'],is_proc,self.selected_shader['param_number']]) + is_pro = self.selected_shader['shad_type'] == 'pro' + self.osc_client.send_message("/shader/load", [self.selected_shader['path'],is_pro,self.selected_shader['param_number']]) + if not self.selected_status == '▶': + self.selected_status = '■' def start_selected_shader(self): self.osc_client.send_message("/shader/start", True) - self.selected_status = 'RUNNING' + self.selected_status = '▶' def stop_selected_shader(self): self.osc_client.send_message("/shader/stop", True) - self.selected_status = 'READY' + self.selected_status = '■' def enter_on_shaders_selection(self): index = self.shaders_menu.selected_list_index @@ -74,3 +90,4 @@ class Shaders(object): else: self.shaders_menu.update_open_folders(name) self.shaders_menu_list = self.generate_shaders_list() + return is_file, self.selected_shader