From b7e0919277ba411ca33ee17b831c2a15360d17d1 Mon Sep 17 00:00:00 2001 From: langolierz Date: Fri, 29 Nov 2019 10:50:30 +0000 Subject: [PATCH] wip new shader banks feature --- actions.py | 50 ++++++- data_centre/data.py | 56 ++++++- display_centre/display.py | 38 ++++- json_objects/keypad_action_mapping.json | 36 +++-- json_objects/settings_default.json | 8 + json_objects/shader_bank_data.json | 188 ++++++++++++++++++++++++ video_centre/shaders.py | 52 ++++--- 7 files changed, 389 insertions(+), 39 deletions(-) create mode 100644 json_objects/shader_bank_data.json diff --git a/actions.py b/actions.py index 0af73ec..a465ca2 100644 --- a/actions.py +++ b/actions.py @@ -73,10 +73,12 @@ class Actions(object): def enter_on_shaders_selection(self): ##want to select shader if its not selected, and want to enter 'param' mode if it already is is_shader, is_selected_shader, selected_shader = self.shaders.enter_on_shaders_selection() - print('is selected shader: {}'.format(is_selected_shader)) if is_selected_shader and selected_shader['param_number'] > 0: self.set_shader_param_mode() + def map_on_shaders_selection(self): + self.shaders.map_on_shaders_selection() + def clear_all_slots(self): self.data.clear_all_slots() self.display.browser_menu.generate_browser_list() @@ -301,6 +303,48 @@ class Actions(object): self.data.detour_settings['is_playing'] = is_playing self.video_driver.osc_client.send_message("/detour/is_playing", is_playing) + def play_shader_0(self): + self.play_this_shader(0) + + def play_shader_1(self): + self.play_this_shader(1) + + def play_shader_2(self): + self.play_this_shader(2) + + def play_shader_3(self): + self.play_this_shader(3) + + def play_shader_4(self): + self.play_this_shader(4) + + def play_shader_5(self): + self.play_this_shader(5) + + def play_shader_6(self): + self.play_this_shader(6) + + def play_shader_7(self): + self.play_this_shader(7) + + def play_shader_8(self): + self.play_this_shader(8) + + def play_shader_9(self): + self.play_this_shader(9) + + def play_this_shader(self, number): + self.shaders.play_this_shader(number) + + def previous_shader_layer(self): + self.data.update_shader_layer_by_amount(-1) + + def next_shader_layer(self): + self.data.update_shader_layer_by_amount(1) + + def clear_shader_bank(self): + self.data.clear_all_shader_slots() + def toggle_detour_record(self): if self.data.settings['detour']['TRY_DEMO']['value'] == 'enabled': is_recording = not self.data.detour_settings['is_recording'] @@ -605,10 +649,10 @@ class Actions(object): self.shaders.decrease_this_param(self.data.settings['shader']['SHADER_PARAM']['value']) def increase_param_focus(self): - self.shaders.focused_param = (self.shaders.focused_param + 1)%self.shaders.selected_shader['param_number'] + self.shaders.focused_param = (self.shaders.focused_param + 1)%self.shaders.selected_shader_list[self.data.shader_layer]['param_number'] def decrease_param_focus(self): - self.shaders.focused_param = (self.shaders.focused_param - 1)%self.shaders.selected_shader['param_number'] + self.shaders.focused_param = (self.shaders.focused_param - 1)%self.shaders.selected_shader_list[self.data.shader_layer]['param_number'] def increase_shader_param(self): options = self.data.settings['shader']['SHADER_PARAM']['options'] diff --git a/data_centre/data.py b/data_centre/data.py index c5c92dd..b479914 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -13,6 +13,7 @@ from omxplayer.player import OMXPlayer class Data(object): BANK_DATA_JSON = 'display_data.json' + SHADER_BANK_DATA_JSON = 'shader_bank_data.json' SETTINGS_JSON = 'settings.json' DEFAULT_SETTINGS_JSON = 'settings_default.json' KEYPAD_MAPPING_JSON = 'keypad_action_mapping.json' @@ -42,17 +43,25 @@ class Data(object): self.update_screen = True self.confirm_action = None self.player_mode = 'now' + self.detour_active = False self.detour_mix_shaders = self.get_list_of_two_input_shaders() self.detour_settings = collections.OrderedDict([('current_detour',0), ('is_playing', False), ('is_recording', False), ('record_loop', False), ('detour_size', False), ('detour_speed', 0), ('memory_full', False), ('mix_shader', self.detour_mix_shaders[0]), ('detour_position', 5), ('detour_start', 0), ('detour_end', 0), ('detour_mix', 0), ('is_delay', False)]) + + self.next_bankslot = '0-0' + self.current_bankslot = '0-0' + + self.shader_layer = 0 + self.shader_slots = [None, None, None] ### persisted data (use default if doesnt exits): self.bank_data = [self.create_empty_bank()] if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.BANK_DATA_JSON): self.bank_data = self._read_json(self.BANK_DATA_JSON) - self.next_bankslot = '0-0' - self.current_bankslot = '0-0' + self.shader_bank_data = [self.create_empty_shader_bank() for i in range(3)] + if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SHADER_BANK_DATA_JSON): + self.shader_bank_data = self._read_json(self.SHADER_BANK_DATA_JSON) self.settings = self._read_json(self.DEFAULT_SETTINGS_JSON) if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SETTINGS_JSON): @@ -69,6 +78,11 @@ class Data(object): def create_empty_bank(): empty_slot = dict(name='', location='', length=-1, start=-1, end=-1, rate=1) return [empty_slot for i in range(10)] + + @staticmethod + def create_empty_shader_bank(): + empty_slot = dict(name='', path='', param_number=4, shad_type='-') + return [empty_slot for i in range(10)] def _read_json(self, file_name): with open(self.PATH_TO_DATA_OBJECTS + file_name) as data_file: @@ -104,6 +118,8 @@ class Data(object): if setting_key == setting_name: return folder_key, setting_key, setting_item +##### setting and adding to sample mapping ###### + def create_new_slot_mapping_in_first_open(self, file_name): ######## used for mapping current video to next available slot ######## for index, slot in enumerate(self.bank_data[self.bank_number]): @@ -149,6 +165,33 @@ class Data(object): self.next_bankslot = '{}-{}'.format(self.bank_number,new_value) return True + ######## setting and adding to shader mapping + + + def create_new_shader_mapping_in_first_open(self, file_name): + ######## used for mapping current shader to next available slot ######## + for index, slot in enumerate(self.shader_bank_data[self.shader_layer]): + if (not slot['name']): + self.create_new_shader_mapping(index, file_name) + return True + return False + + def create_new_shader_mapping(self, slot_number, file_name): + ######## used for mapping current shader to a specific slot ######## + has_location, location = self._get_path_for_file(file_name) + print('file_name:{},has_location:{}, location:{}'.format(file_name,has_location, location)) + new_slot = dict(name=file_name, path=location, shad_type='-', param_number=4) + self._update_a_shader_slots_data(slot_number, new_slot) + + def clear_all_shader_slots(self): + self.shader_bank_data[self.shader_layer] = self.create_empty_shader_bank() + self._update_json(self.SHADER_BANK_DATA_JSON, self.shader_bank_data) + + def update_shader_layer_by_amount(self, amount): + self.shader_layer = (self.shader_layer + amount) % len(self.shader_bank_data) + + + def update_setting_value(self, setting_folder, setting_name, setting_value): self.settings[setting_folder][setting_name]['value'] = setting_value self._update_json(self.SETTINGS_JSON, self.settings) @@ -277,7 +320,7 @@ class Data(object): def _get_path_for_file(self, file_name): ######## returns full path for a given file name ######## - for path in self.PATHS_TO_BROWSER: + for path in self.PATHS_TO_BROWSER + self.PATHS_TO_SHADERS: for root, dirs, files in os.walk(path): if file_name in files: return True, '{}/{}'.format(root, file_name) @@ -316,6 +359,8 @@ class Data(object): display_modes = [[ "SAMPLER",'PLAYER'], ["BROWSER",'NAV_BROWSER'],["SETTINGS",'NAV_SETTINGS']] if self.settings['video']['VIDEOPLAYER_BACKEND']['value'] != 'omxplayer' and self.settings['shader']['USE_SHADER']['value'] == 'enabled': display_modes.append(["SHADERS",'NAV_SHADERS']) + if self.settings['shader']['USE_SHADER_BANK']['value'] == 'enabled' and ["SHADERS",'NAV_SHADERS'] in display_modes: + display_modes.append(["SHADBANK",'PLAY_SHADER']) if self.settings['detour']['TRY_DEMO']['value'] == 'enabled': display_modes.append(["FRAMES",'NAV_DETOUR']) if not with_nav_mode: @@ -331,6 +376,11 @@ class Data(object): ######## overwrite a given slots info with new data ######## self.bank_data[self.bank_number][slot_number] = slot_info self._update_json(self.BANK_DATA_JSON, self.bank_data) + + def _update_a_shader_slots_data(self, slot_number, slot_info): + ######## overwrite a given slots info with new data ######## + self.shader_bank_data[self.shader_layer][slot_number] = slot_info + self._update_json(self.SHADER_BANK_DATA_JSON, self.shader_bank_data) @staticmethod def make_empty_if_none(input): diff --git a/display_centre/display.py b/display_centre/display.py index efa4da9..39dd43d 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -52,7 +52,7 @@ class Display(object): self.display_text.pack() def _load_title(self): - if self.data.display_mode == 'SHADERS': + if self.data.display_mode == 'SHADERS' or self.data.display_mode == 'SHADBANK': self.display_text.insert(END, self.TITLES[1] + ' \n') self.display_text.tag_add("TITLE", 1.19, 1.31) elif self.data.display_mode == 'FRAMES': @@ -88,6 +88,8 @@ class Display(object): self._load_sampler() elif self.data.display_mode == 'SHADERS': self._load_shaders() + elif self.data.display_mode == 'SHADBANK': + self._load_shader_bank() elif self.data.display_mode == 'FRAMES': self._load_detour() self.display_text.tag_add("DISPLAY_MODE", 4.19, 4.29) @@ -167,10 +169,10 @@ class Display(object): self.display_text.insert(END, '{} \n'.format(self.body_title)) ## showing current shader info: - shader = self.shaders.selected_shader - self.display_text.insert(END, '{:<1}:{:<1}{:<2} {:<17} '.format \ + shader = self.shaders.selected_shader_list[self.data.shader_layer] + self.display_text.insert(END, '{:<1}:{:<2} {:<17} '.format \ (self.shaders.selected_status,shader['shad_type'][0], \ - format(shader['shad_index'],'02d'), shader['name'].lstrip()[0:17] )) + shader['name'].lstrip()[0:17] )) for i in range(min(4,shader['param_number'])): display_param = self.format_param_value(self.shaders.selected_param_values[i]) if display_param == 100: @@ -194,6 +196,34 @@ class Display(object): if self.data.control_mode == "SHADER_PARAM": self._highlight_this_param(self.shaders.focused_param) + def _load_shader_bank(self): + shader_bank_data = self.data.shader_bank_data[self.data.shader_layer] + + self.display_text.insert(END, '{} \n'.format(self.body_title)) + + self.display_text.insert(END, '{:>6} {:<5} {:<5} '.format( + '{}-layer'.format(self.data.shader_layer), 'name', 'type')) + + shader = self.shaders.selected_shader_list[self.data.shader_layer] + + for i in range(min(4,shader['param_number'])): + display_param = self.format_param_value(self.shaders.selected_param_values[i]) + if display_param == 100: + display_param == 99 + self.display_text.insert(END, 'x{}:{:02d}'.format(i, display_param)) + self.display_text.insert(END, '\n') + + for index, slot in enumerate(shader_bank_data): + name_without_extension = slot['name'].rsplit('.',1)[0] + self.display_text.insert(END, '{:^6} {:<17} {:<5} \n'.format(index, name_without_extension[0:17], slot['shad_type'])) + if index % 2: + self.display_text.tag_add("ZEBRA_STRIPE", self.ROW_OFFSET + index, + self.ROW_OFFSET + self.SELECTOR_WIDTH + index) + # highlight the slot of the selected player + current_slot = self.data.shader_slots[self.data.shader_layer] + if current_slot: + self._highlight_this_row(current_slot) + def _load_detour(self): line_count = 0 diff --git a/json_objects/keypad_action_mapping.json b/json_objects/keypad_action_mapping.json index 1c0709e..b097926 100644 --- a/json_objects/keypad_action_mapping.json +++ b/json_objects/keypad_action_mapping.json @@ -6,7 +6,8 @@ "NAV_SHADERS": ["move_shaders_selection_up"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"] + "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], + "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] }, "b": { "NAV_BROWSER": ["move_browser_selection_down"], @@ -15,13 +16,15 @@ "NAV_SHADERS": ["move_shaders_selection_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["increase_this_param", "increase_shader_param"] + "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], + "PLAY_SHADER": ["increase_this_param", "increase_shader_param"] + }, "c": { "NAV_BROWSER": ["enter_on_browser_selection"], "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], "NAV_SETTINGS": ["enter_on_settings_selection"], - "NAV_SHADERS": ["enter_on_shaders_selection"], + "NAV_SHADERS": ["enter_on_shaders_selection", "map_on_shaders_selection"], "LENGTH_SET": ["record_fixed_length"], "SHADER_PARAM": ["return_to_default_control_mode"], "CONFIRM": ["perform_confirm_action"], @@ -34,11 +37,13 @@ "e": { "DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"], "SHADER_PARAM": ["decrease_param_focus"], + "PLAY_SHADER": ["decrease_param_focus"], "NAV_DETOUR": ["decrease_mix_shader"] }, "f": { "DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"], "SHADER_PARAM": ["increase_param_focus"], + "PLAY_SHADER": ["increase_param_focus"], "NAV_DETOUR": ["increase_mix_shader"] }, "g": { @@ -51,36 +56,47 @@ }, "j": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "k": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "PLAY_SHADER": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "l": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "m": { "DEFAULT": ["load_slot_3_into_next_player"], + "PLAY_SHADER": ["play_shader_3"], "NAV_DETOUR": ["switch_to_detour_3"] }, "n": { - "DEFAULT": ["load_slot_4_into_next_player"] + "DEFAULT": ["load_slot_4_into_next_player"], + "PLAY_SHADER": ["play_shader_4"] }, "o": { - "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] + "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"], + "PLAY_SHADER": ["play_shader_5"] }, "p": { - "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"], + "PLAY_SHADER": ["play_shader_6","toggle_shaders"] }, "q": { - "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"], + "PLAY_SHADER": ["play_shader_7","toggle_detour_mode"] }, "r": { - "DEFAULT": ["load_slot_8_into_next_player"] + "DEFAULT": ["load_slot_8_into_next_player"], + "PLAY_SHADER": ["play_shader_8"] }, "s": { - "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] - } + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], + "PLAY_SHADER": + ["play_shader_9","confirm_shutdown"] +} } diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index b629557..f881d11 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -170,6 +170,14 @@ ], "value": "enabled" }, + "USE_SHADER_BANK": { + "action": "update_capture_settings", + "options": [ + "enabled", + "disabled" + ], + "value": "disabled" + }, "X3_AS_SPEED": { "action": null, "options": [ diff --git a/json_objects/shader_bank_data.json b/json_objects/shader_bank_data.json new file mode 100644 index 0000000..82424ad --- /dev/null +++ b/json_objects/shader_bank_data.json @@ -0,0 +1,188 @@ +[ + [ + { + "name": "wipe.frag", + "param_number": 4, + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/wipe.frag", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + } + ], + [ + { + "name": "add_mix.frag", + "param_number": 4, + "path": "/home/pi/r_e_c_u_r/Shaders/2-input/add_mix.frag", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + } + ], + [ + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + }, + { + "name": "", + "param_number": 4, + "path": "", + "shad_type": "-" + } + ] +] \ No newline at end of file diff --git a/video_centre/shaders.py b/video_centre/shaders.py index df2c3e5..3c0a050 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -4,14 +4,14 @@ import os class Shaders(object): MENU_HEIGHT = 10 - EMPTY_SHADER = dict(name='none',is_shader=True,shad_type='-',param_number=0,path='-',shad_index=0) + EMPTY_SHADER = dict(name='none',is_shader=True,shad_type='-',param_number=4,path='-') def __init__(self, root, osc_client, message_handler, data): self.root = root self.osc_client = osc_client self.message_handler = message_handler self.data = data self.shaders_menu = menu.ShadersMenu(self.data, self.message_handler, self.MENU_HEIGHT ) - self.selected_shader = self.EMPTY_SHADER + self.selected_shader_list = [self.EMPTY_SHADER for i in range(3)] self.focused_param = None self.shaders_menu_list = self.generate_shaders_list() if self.shaders_menu_list is not None: @@ -24,18 +24,17 @@ class Shaders(object): def generate_shaders_list(self): shaders_menu_list = [] raw_list = self.shaders_menu.generate_raw_shaders_list() - shad_i = 0 for line in raw_list: if line['is_shader']: stripped_name = line['name'].lstrip() has_path, path = self.get_path_for_shader(stripped_name) shad_type = self.determine_shader_type(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 + + shaders_menu_list.append(dict(name=line['name'],is_shader=True,shad_type=shad_type,param_number=parameter_number,path=path)) + else: - shaders_menu_list.append(dict(name=line['name'],is_shader=False,shad_type='',param_number=None,path=None,shad_index=None)) + shaders_menu_list.append(dict(name=line['name'],is_shader=False,shad_type='',param_number=None,path=None)) return shaders_menu_list @@ -48,7 +47,6 @@ class Shaders(object): return False, '' def determine_shader_type(self, path): - #try: with open(path, 'r', errors='ignore') as selected_shader: shader_text = selected_shader.read() if '//0-input' in shader_text: @@ -59,9 +57,7 @@ class Shaders(object): return '2in' else: return '-' - #except Exception as e: - #self.message_handler.set_message('INFO', 'cannot inspect shader text') - #return '-' + def determine_shader_parameter_number(self, path): max_amount = 4 @@ -75,33 +71,51 @@ class Shaders(object): return max_amount def load_selected_shader(self): + selected_shader = self.selected_shader_list[self.data.shader_layer] self.selected_param_values = [0.0,0.0,0.0,0.0] - self.osc_client.send_message("/shader/load", [self.selected_shader['path'],self.selected_shader['shad_type'] == '2in',self.selected_shader['param_number']]) + print("select shader: ", selected_shader) + self.osc_client.send_message("/shader/load".format(str(self.data.shader_layer)), [selected_shader['path'],selected_shader['shad_type'] == '2in',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.osc_client.send_message("/shader/start".format(str(self.data.shader_layer)), True) self.selected_status = '▶' def stop_selected_shader(self): - self.osc_client.send_message("/shader/stop", True) + self.osc_client.send_message("/shader/stop".format(str(self.data.shader_layer)), True) self.selected_status = '■' + def map_on_shaders_selection(self): + index = self.shaders_menu.selected_list_index + is_file, name = self.shaders_menu.extract_file_type_and_name_from_menu_format( + self.shaders_menu_list[index]['name']) + if is_file: + is_successful = self.data.create_new_shader_mapping_in_first_open(name) + if not is_successful: + self.message_handler.set_message('INFO', 'current bank is full') + else: + self.message_handler.set_message('INFO', 'can not map folder') + def enter_on_shaders_selection(self): + selected_shader = self.selected_shader_list[self.data.shader_layer] index = self.shaders_menu.selected_list_index is_file, name = self.shaders_menu.extract_file_type_and_name_from_menu_format( self.shaders_menu_list[index]['name']) is_selected_shader = False - if is_file and name == self.selected_shader['name'].lstrip(): + if is_file and name == selected_shader['name'].lstrip(): is_selected_shader = True elif is_file: - self.selected_shader = self.shaders_menu_list[index] + self.selected_shader_list[self.data.shader_layer] = self.shaders_menu_list[index] self.load_selected_shader() else: self.shaders_menu.update_open_folders(name) self.shaders_menu_list = self.generate_shaders_list() - return is_file, is_selected_shader, self.selected_shader + return is_file, is_selected_shader, selected_shader + + def play_this_shader(self, slot): + self.selected_shader_list[self.data.shader_layer] = self.data.shader_bank_data[self.data.shader_layer][slot] + self.load_selected_shader() def increase_this_param(self, amount_change): param = self.focused_param @@ -126,8 +140,8 @@ class Shaders(object): def set_param_to_amount(self, param, amount): if self.data.settings['shader']['X3_AS_SPEED']['value'] == 'enabled' and param == 3: - self.osc_client.send_message("/shader/speed", [param, amount] ) + self.osc_client.send_message("/shader/{}/speed".format(str(self.data.shader_layer)), [param, amount] ) else: - self.osc_client.send_message("/shader/param", [param, amount] ) + self.osc_client.send_message("/shader/{}/param".format(str(self.data.shader_layer)), [param, amount] ) self.selected_param_values[param] = amount