wip new shader banks feature

This commit is contained in:
langolierz
2019-11-29 10:50:30 +00:00
parent c90ddeb703
commit b7e0919277
7 changed files with 389 additions and 39 deletions

View File

@@ -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']

View File

@@ -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):
@@ -70,6 +79,11 @@ class Data(object):
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:
data = json.load(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:
@@ -332,6 +377,11 @@ class Data(object):
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):
if input is None:

View File

@@ -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

View File

@@ -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"]
}
}

View File

@@ -170,6 +170,14 @@
],
"value": "enabled"
},
"USE_SHADER_BANK": {
"action": "update_capture_settings",
"options": [
"enabled",
"disabled"
],
"value": "disabled"
},
"X3_AS_SPEED": {
"action": null,
"options": [

View File

@@ -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": "-"
}
]
]

View File

@@ -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