diff --git a/Shaders/1-input/hsv_control_fine.frag b/Shaders/1-input/hsv_control_fine.frag new file mode 100644 index 0000000..f763972 --- /dev/null +++ b/Shaders/1-input/hsv_control_fine.frag @@ -0,0 +1,59 @@ +//1-input +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 v_texcoord; +uniform sampler2D u_tex0; +uniform sampler2D u_tex1; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_x0; +uniform float u_x1; +uniform float u_x2; +uniform float u_x3; + +vec3 rgb2grayscale(vec3 c) +{ + return(vec3(dot(c, vec3(0.299, 0.587, 0.114)))); +} + +vec3 rgb2hsv(vec3 c) +{ + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +vec3 hsv2rgb(vec3 c) +{ + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void main(){ + +vec2 pos = v_texcoord; +vec4 color = texture2D(u_tex0, pos); + +vec3 hsv = rgb2hsv(color.rgb); +hsv.x += 0.1*u_x0 - 0.05; +hsv.y += 0.1*u_x1 - 0.05; +hsv.z += 0.1*u_x2 - 0.05; +//hsv.x += -0.2; +vec3 rgb = hsv2rgb(hsv.xyz); + + +gl_FragColor = vec4(rgb, color.a); + +} + + + + + diff --git a/Shaders/1-input/rotate_fine.frag b/Shaders/1-input/rotate_fine.frag new file mode 100644 index 0000000..69cb61e --- /dev/null +++ b/Shaders/1-input/rotate_fine.frag @@ -0,0 +1,54 @@ +//1-input +#ifdef GL_ES +precision mediump float; +#endif + +varying vec2 v_texcoord; +uniform sampler2D u_tex0; +uniform sampler2D u_tex1; +uniform vec2 u_resolution; +uniform float u_time; +uniform float u_x0; +uniform float u_x1; +uniform float u_x2; +uniform float u_x3; + +vec4 rotate(sampler2D tex, vec2 pos){ + + vec4 texColourRotate; + vec2 center; + //center = vec2(u_x3 / u_resolution.x, u_x4 / u_resolution.y); + center = vec2(0.45 + 0.1*u_x1,0.45 + 0.1*u_x2); + + pos.x = (pos.x - center.x)*(0.5 / (0.45 + 0.1*u_x3)) + center.x; + pos.y = (pos.y - center.y)*(0.5 / (0.45 + 0.1*u_x3)) + center.y; + + float r = distance(center, pos); + float a = atan(pos.x - center.x, pos.y - center.y); + + pos.x = r * cos(a + 2.0 * 3.141592 * (0.2 + 0.1*u_x0)) + 0.5; + pos.y = r * sin(a + 2.0 * 3.141592 * (0.2 + 0.1*u_x0)) + 0.5; + pos.x = 1.0 - pos.x; + if((pos.x < 0.0)||(pos.y < 0.0)||(pos.x > 1.0)||(pos.y > 1.0)){ + texColourRotate = vec4(0.0); + } + else{ + texColourRotate = texture2D(tex, pos); + } + return texColourRotate; +} + +void main(){ + + vec2 pos = v_texcoord; + vec4 texColour0; + texColour0 = rotate(u_tex0, v_texcoord); + + gl_FragColor = texColour0; + +} + + + + + diff --git a/actions.py b/actions.py index 54152ed..1bec308 100644 --- a/actions.py +++ b/actions.py @@ -273,9 +273,9 @@ class Actions(object): self.message_handler.set_message('INFO', 'cant mirror in dev mode') def toggle_shaders(self): - if self.shaders.selected_status == '▶': + if self.shaders.selected_status_list[self.data.shader_layer] == '▶': self.shaders.stop_selected_shader() - elif self.shaders.selected_status == '■': + elif self.shaders.selected_status_list[self.data.shader_layer] == '■': self.shaders.start_selected_shader() else: self.message_handler.set_message('INFO', 'no shader loaded') diff --git a/display_centre/display.py b/display_centre/display.py index 4f6c4ae..17afa99 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -171,7 +171,7 @@ class Display(object): ## showing current shader info: shader = self.shaders.selected_shader_list[self.data.shader_layer] self.display_text.insert(END, '{:<1}lay{:<1}:{:<2} {:<16} '.format \ - (self.data.shader_layer,self.shaders.selected_status,shader['shad_type'][0], \ + (self.data.shader_layer,self.shaders.selected_status_list[self.data.shader_layer],shader['shad_type'][0], \ shader['name'].lstrip()[0:16] )) for i in range(min(4,shader['param_number'])): display_param = self.format_param_value(self.shaders.selected_param_list[self.data.shader_layer][i]) @@ -221,7 +221,7 @@ class Display(object): self.ROW_OFFSET + self.SELECTOR_WIDTH + index) # highlight the slot of the selected player current_slot = self.shaders.selected_shader_list[self.data.shader_layer].get('slot', None) - not_playing_tag = self.shaders.selected_status != '▶' + not_playing_tag = self.shaders.selected_status_list[self.data.shader_layer] != '▶' if current_slot is not None: self._highlight_this_row(current_slot, gray=not_playing_tag) diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index 48fc683..c2eae1b 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -49,7 +49,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"] }, "note_on 73": { "NAV_BROWSER": ["move_browser_selection_down"], @@ -58,17 +59,20 @@ "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"] + }, "note_on 74": { "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"], - "NAV_DETOUR": ["toggle_detour_play"] + "NAV_DETOUR": ["toggle_detour_play"], + "PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"] }, "note_on 75": { "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], @@ -77,11 +81,13 @@ "note_on 76": { "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"] }, "note_on 77": { "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"] }, "note_on 78": { @@ -94,46 +100,60 @@ }, "note_on 81": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], + "NAV_SHADERS": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, "note_on 82": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "PLAY_SHADER": ["play_shader_1","next_shader_layer"], + "NAV_SHADERS": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, "note_on 83": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], + "NAV_SHADERS": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, "note_on 84": { "DEFAULT": ["load_slot_3_into_next_player"], + "PLAY_SHADER": ["play_shader_3"], "NAV_DETOUR": ["switch_to_detour_3"] }, "note_on 85": { - "DEFAULT": ["load_slot_4_into_next_player"] + "DEFAULT": ["load_slot_4_into_next_player"], + "PLAY_SHADER": ["play_shader_4"] }, "note_on 86": { - "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", "toggle_screen_mirror"] }, "note_on 87": { - "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"] }, "note_on 88": { - "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"] }, "note_on 89": { - "DEFAULT": ["load_slot_8_into_next_player"] + "DEFAULT": ["load_slot_8_into_next_player", "toggle_feedback"], + "PLAY_SHADER": ["play_shader_8", "toggle_feedback"] }, "note_on 90": { - "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] - }, - "note_on 36": { + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], + "PLAY_SHADER": ["play_shader_9","confirm_shutdown"] + }, + "note_on 36": { "NAV_BROWSER": ["move_browser_selection_up"], "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], "NAV_SETTINGS": ["move_settings_selection_up"], "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"] }, "note_on 37": { "NAV_BROWSER": ["move_browser_selection_down"], @@ -142,17 +162,20 @@ "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"] + }, "note_on 38": { "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"], - "NAV_DETOUR": ["toggle_detour_play"] + "NAV_DETOUR": ["toggle_detour_play"], + "PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"] }, "note_on 39": { "DEFAULT": ["switch_to_next_player", "toggle_player_mode"], @@ -161,54 +184,69 @@ "note_on 40": { "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"] }, "note_on 41": { "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"] }, "note_on 42": { "DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]}, - "note_on 79": { + "note_on 43": { "DEFAULT": ["cycle_display_mode", "cycle_display_mode_back"] }, - "note_on 43": { + "note_on 44": { "DEFAULT": ["toggle_function"] }, - "note_on 44": { + "note_on 45": { "DEFAULT": ["load_slot_0_into_next_player","previous_bank"], + "PLAY_SHADER": ["play_shader_0","previous_shader_layer"], + "NAV_SHADERS": ["play_shader_0","previous_shader_layer"], "NAV_DETOUR": ["switch_to_detour_0", "set_the_detour_mix_0"] }, - "note_on 45": { + "note_on 46": { "DEFAULT": ["load_slot_1_into_next_player","next_bank"], + "PLAY_SHADER": ["play_shader_1","next_shader_layer"], + "NAV_SHADERS": ["play_shader_1","next_shader_layer"], "NAV_DETOUR": ["switch_to_detour_1", "set_the_detour_mix_1"] }, - "note_on 46": { + "note_on 47": { "DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"], + "PLAY_SHADER": ["play_shader_2","clear_shader_bank"], + "NAV_SHADERS": ["play_shader_2","clear_shader_bank"], "NAV_DETOUR": ["switch_to_detour_2", "clear_this_detour"] }, - "note_on 47": { + "note_on 48": { "DEFAULT": ["load_slot_3_into_next_player"], + "PLAY_SHADER": ["play_shader_3"], "NAV_DETOUR": ["switch_to_detour_3"] }, - "note_on 48": { - "DEFAULT": ["load_slot_4_into_next_player"] - }, "note_on 49": { - "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"] + "DEFAULT": ["load_slot_4_into_next_player"], + "PLAY_SHADER": ["play_shader_4"] }, "note_on 50": { - "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"] + "DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"], + "PLAY_SHADER": ["play_shader_5", "toggle_screen_mirror"] }, "note_on 51": { - "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"] + "DEFAULT": ["load_slot_6_into_next_player","toggle_shaders"], + "PLAY_SHADER": ["play_shader_6","toggle_shaders"] }, "note_on 52": { - "DEFAULT": ["load_slot_8_into_next_player"] + "DEFAULT": ["load_slot_7_into_next_player", "toggle_detour_mode"], + "PLAY_SHADER": ["play_shader_7","toggle_detour_mode"] }, "note_on 53": { - "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"] - } + "DEFAULT": ["load_slot_8_into_next_player", "toggle_feedback"], + "PLAY_SHADER": ["play_shader_8", "toggle_feedback"] + }, + "note_on 54": { + "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], + "PLAY_SHADER": ["play_shader_9","confirm_shutdown"] + } } diff --git a/json_objects/shader_bank_data.json b/json_objects/shader_bank_data.json index 6f85937..a85d327 100644 --- a/json_objects/shader_bank_data.json +++ b/json_objects/shader_bank_data.json @@ -69,13 +69,15 @@ "name": "hsv_control.frag", "param_number": 4, "path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control.frag", - "shad_type": "-" + "shad_type": "-", + "slot": 0 }, { - "name": "", + "name": "hsv_control_fine.frag", "param_number": 4, - "path": "", - "shad_type": "-" + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/hsv_control_fine.frag", + "shad_type": "-", + "slot": 1 }, { "name": "", @@ -131,8 +133,7 @@ "name": "wobble.frag", "param_number": 4, "path": "/home/pi/r_e_c_u_r/Shaders/1-input/wobble.frag", - "shad_type": "-", - "slot": 0 + "shad_type": "-" }, { "name": "rotate.frag", @@ -141,9 +142,9 @@ "shad_type": "-" }, { - "name": "", + "name": "rotate_fine.frag", "param_number": 4, - "path": "", + "path": "/home/pi/r_e_c_u_r/Shaders/1-input/rotate_fine.frag", "shad_type": "-" }, { diff --git a/video_centre/shaders.py b/video_centre/shaders.py index 78bdc24..0d93ae6 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -15,7 +15,7 @@ class Shaders(object): self.focused_param = 0 self.shaders_menu_list = self.generate_shaders_list() - self.selected_status = '-' ## going to try using symbols for this : '-' means empty, '▶' means running, '■' means not running, '!' means error + self.selected_status_list = ['-','-','-'] ## going to try using symbols for this : '-' means empty, '▶' means running, '■' means not running, '!' means error self.selected_param_list = [[0.0,0.0,0.0,0.0] for i in range(3)] self.selected_speed_list = [1.0, 1.0, 1.0] #self.load_selected_shader() @@ -71,19 +71,19 @@ class Shaders(object): def load_selected_shader(self): selected_shader = self.selected_shader_list[self.data.shader_layer] - self.selected_param_list[self.data.shader_layer] = [0.0,0.0,0.0,0.0] + #self.selected_param_list[self.data.shader_layer] = [0.0,0.0,0.0,0.0] 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 = '■' + if not self.selected_status_list[self.data.shader_layer] == '▶': + self.selected_status_list[self.data.shader_layer] = '■' def start_selected_shader(self): self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), True) - self.selected_status = '▶' + self.selected_status_list[self.data.shader_layer] = '▶' def stop_selected_shader(self): self.osc_client.send_message("/shader/{}/is_active".format(str(self.data.shader_layer)), False) - self.selected_status = '■' + self.selected_status_list[self.data.shader_layer] = '■' def map_on_shaders_selection(self): index = self.shaders_menu.selected_list_index