mirror of
https://github.com/cyberboy666/r_e_c_u_r.git
synced 2025-12-05 16:00:06 +01:00
some stuff from when i last worked on conjur
This commit is contained in:
@@ -349,6 +349,7 @@ class Actions(object):
|
||||
|
||||
def quit_the_program(self):
|
||||
self.video_driver.exit_all_players()
|
||||
self.video_driver.exit_osc_server()
|
||||
self.toggle_x_autorepeat()
|
||||
self.tk.destroy()
|
||||
|
||||
|
||||
@@ -95,6 +95,14 @@
|
||||
],
|
||||
"value": "off"
|
||||
},
|
||||
"VIDEO_BACKEND": {
|
||||
"action": null,
|
||||
"options": [
|
||||
"omxplayer",
|
||||
"openframeworks"
|
||||
],
|
||||
"value": "omxplayer"
|
||||
},
|
||||
"RESTART_PROGRAM": {
|
||||
"action": "restart_the_program",
|
||||
"options": [],
|
||||
|
||||
@@ -1,196 +0,0 @@
|
||||
# Pygame/PyopenGL example by Bastiaan Zapf, Apr 2009
|
||||
#
|
||||
# Draw a range of cubes, light them prettily
|
||||
#
|
||||
# Employed techniques:
|
||||
#
|
||||
# - Vertex and Fragment shaders
|
||||
# - Lightsource variables
|
||||
# - Display Lists
|
||||
|
||||
|
||||
from OpenGL.GL import *
|
||||
from OpenGL.GLU import *
|
||||
import random
|
||||
from math import * # trigonometry
|
||||
|
||||
import pygame # just to get a display
|
||||
|
||||
import Image
|
||||
import sys
|
||||
import time
|
||||
|
||||
# get an OpenGL surface
|
||||
|
||||
pygame.init()
|
||||
pygame.display.set_mode((800,600), pygame.OPENGL|pygame.DOUBLEBUF)
|
||||
|
||||
def jpg_file_write(name, number, data):
|
||||
im = Image.frombuffer("RGBA", (800,600), data, "raw", "RGBA", 0, 0)
|
||||
fnumber = "%05d" % number
|
||||
im.save(name + fnumber + ".jpg")
|
||||
|
||||
|
||||
glEnable(GL_DEPTH_TEST)
|
||||
|
||||
# Create and Compile a shader
|
||||
# but fail with a meaningful message if something goes wrong
|
||||
|
||||
def createAndCompileShader(type,source):
|
||||
shader=glCreateShader(type)
|
||||
glShaderSource(shader,source)
|
||||
glCompileShader(shader)
|
||||
|
||||
# get "compile status" - glCompileShader will not fail with
|
||||
# an exception in case of syntax errors
|
||||
|
||||
result=glGetShaderiv(shader,GL_COMPILE_STATUS)
|
||||
|
||||
if (result!=1): # shader didn't compile
|
||||
raise Exception("Couldn't compile shader\nShader compilation Log:\n"+glGetShaderInfoLog(shader))
|
||||
return shader
|
||||
|
||||
# Create and Compile fragment and vertex shaders
|
||||
# Transfer data from fragment to vertex shader
|
||||
|
||||
vertex_shader=createAndCompileShader(GL_VERTEX_SHADER,"""
|
||||
varying vec3 v;
|
||||
varying vec3 N;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
|
||||
v = gl_ModelViewMatrix * gl_Vertex;
|
||||
N = gl_NormalMatrix * gl_Normal;
|
||||
|
||||
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
|
||||
}
|
||||
""");
|
||||
|
||||
fragment_shader=createAndCompileShader(GL_FRAGMENT_SHADER,"""
|
||||
varying vec3 N;
|
||||
varying vec3 v;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec3 L = gl_LightSource[0].position.xyz-v;
|
||||
|
||||
// "Lambert's law"? (see notes)
|
||||
// Rather: faces will appear dimmer when struck in an acute angle
|
||||
// distance attenuation
|
||||
|
||||
float Idiff = max(dot(normalize(L),N),0.0)*pow(length(L),-2.0);
|
||||
|
||||
gl_FragColor = vec4(0.5,0,0.5,1.0)+ // purple
|
||||
vec4(1.0,1.0,1.0,1.0)*Idiff; // diffuse reflection
|
||||
}
|
||||
""");
|
||||
|
||||
# build shader program
|
||||
|
||||
program=glCreateProgram()
|
||||
glAttachShader(program,vertex_shader)
|
||||
glAttachShader(program,fragment_shader)
|
||||
glLinkProgram(program)
|
||||
|
||||
# try to activate/enable shader program
|
||||
# handle errors wisely
|
||||
|
||||
try:
|
||||
glUseProgram(program)
|
||||
except OpenGL.error.GLError:
|
||||
print glGetProgramInfoLog(program)
|
||||
raise
|
||||
|
||||
done = False
|
||||
|
||||
t=0
|
||||
|
||||
# load a cube into a display list
|
||||
|
||||
glNewList(1,GL_COMPILE)
|
||||
|
||||
glBegin(GL_QUADS)
|
||||
|
||||
glColor3f(1,1,1)
|
||||
|
||||
glNormal3f(0,0,-1)
|
||||
glVertex3f( -1, -1, -1)
|
||||
glVertex3f( 1, -1, -1)
|
||||
glVertex3f( 1, 1, -1)
|
||||
glVertex3f( -1, 1, -1)
|
||||
|
||||
glNormal3f(0,0,1)
|
||||
glVertex3f( -1, -1, 1)
|
||||
glVertex3f( 1, -1, 1)
|
||||
glVertex3f( 1, 1, 1)
|
||||
glVertex3f( -1, 1, 1)
|
||||
|
||||
glNormal3f(0,-1,0)
|
||||
glVertex3f( -1, -1, -1)
|
||||
glVertex3f( 1, -1, -1)
|
||||
glVertex3f( 1, -1, 1)
|
||||
glVertex3f( -1, -1, 1)
|
||||
|
||||
glNormal3f(0,1,0)
|
||||
glVertex3f( -1, 1, -1)
|
||||
glVertex3f( 1, 1, -1)
|
||||
glVertex3f( 1, 1, 1)
|
||||
glVertex3f( -1, 1, 1)
|
||||
|
||||
glNormal3f(-1,0,0)
|
||||
glVertex3f( -1, -1, -1)
|
||||
glVertex3f( -1, 1, -1)
|
||||
glVertex3f( -1, 1, 1)
|
||||
glVertex3f( -1, -1, 1)
|
||||
|
||||
glNormal3f(1,0,0)
|
||||
glVertex3f( 1, -1, -1)
|
||||
glVertex3f( 1, 1, -1)
|
||||
glVertex3f( 1, 1, 1)
|
||||
glVertex3f( 1, -1, 1)
|
||||
|
||||
glEnd()
|
||||
glEndList()
|
||||
|
||||
while not done:
|
||||
|
||||
t=t+1
|
||||
|
||||
glMatrixMode(GL_PROJECTION)
|
||||
glLoadIdentity()
|
||||
gluPerspective(90,1,0.01,1000)
|
||||
gluLookAt(sin(t/260.0)*4,cos(t/260.0)*4,cos(t/687.0)*3,0,0,0,0,1,0)
|
||||
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0)
|
||||
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
|
||||
|
||||
glMatrixMode(GL_MODELVIEW)
|
||||
|
||||
# calculate light source position
|
||||
|
||||
ld=[sin(t/16.0)*4.0,sin(t/20.0)*4.0,cos(t/16.0)*4.0]
|
||||
|
||||
# pass data to fragment shader
|
||||
|
||||
glLightfv(GL_LIGHT0,GL_POSITION,[ld[0],ld[1],ld[2]]);
|
||||
|
||||
# fallback
|
||||
|
||||
glColor3f(1,1,1)
|
||||
|
||||
glLoadIdentity()
|
||||
# render a pretty range of cubes
|
||||
|
||||
for i in range(-5,5):
|
||||
for j in range(-5,5):
|
||||
for k in range(-5,5):
|
||||
glPushMatrix()
|
||||
|
||||
glTranslate(i,j,k)
|
||||
glScale(0.1,0.1,0.1)
|
||||
glCallList(1)
|
||||
glPopMatrix()
|
||||
|
||||
pygame.display.flip()
|
||||
@@ -1,47 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
import common2d, sys
|
||||
import OpenGL.GLUT as glut
|
||||
import OpenGL.GL as gl
|
||||
|
||||
_myProg = None
|
||||
|
||||
def displayFunc():
|
||||
global _myProg
|
||||
common2d.display(_myProg)
|
||||
glut.glutSwapBuffers()
|
||||
|
||||
def set_global_program(program):
|
||||
global _myProg
|
||||
_myProg = program
|
||||
|
||||
def reshape(width,height):
|
||||
gl.glViewport(0, 0, width, height)
|
||||
|
||||
def keyboard( key, x, y ):
|
||||
if key == '\033':
|
||||
sys.exit( )
|
||||
|
||||
if __name__=="__main__":
|
||||
# GLUT init
|
||||
# --------------------------------------
|
||||
glut.glutInit()
|
||||
glut.glutInitDisplayMode(glut.GLUT_DOUBLE | glut.GLUT_RGBA)
|
||||
glut.glutCreateWindow('Hello world!')
|
||||
glut.glutReshapeWindow(640,480)
|
||||
glut.glutReshapeFunc(reshape)
|
||||
glut.glutDisplayFunc(displayFunc)
|
||||
glut.glutKeyboardFunc(keyboard)
|
||||
|
||||
program = common2d.init_shader_program()
|
||||
set_global_program(program)
|
||||
|
||||
# Make program the default program
|
||||
gl.glUseProgram(program)
|
||||
|
||||
# Enter mainloop
|
||||
# --------------------------------------
|
||||
glut.glutMainLoop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -1,4 +1,5 @@
|
||||
// copied from http://glslsandbox.com/e#47821.0
|
||||
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
// copied from http://glslsandbox.com/e#47841.0
|
||||
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
|
||||
uniform float u_time;
|
||||
uniform vec2 u_mouse;
|
||||
uniform vec2 u_resolution;
|
||||
uniform float u_tick;
|
||||
|
||||
float map(vec3 p)
|
||||
{
|
||||
const int MAX_ITER = 20;
|
||||
const float BAILOUT=2.0;
|
||||
float Power =2.;
|
||||
|
||||
vec3 v = p;
|
||||
vec3 c = vec3(cos(u_time*0.1), cos(u_time * 0.05234567), v.z);
|
||||
|
||||
float r=0.0;
|
||||
float d=1.0;
|
||||
for(int n=0; n<MAX_ITER; n++)
|
||||
{
|
||||
r = length(v);
|
||||
float zr = pow(r,Power);
|
||||
if(zr/r>BAILOUT) break; // improved
|
||||
|
||||
float theta = atan(v.z/length(v.xy)*tan(u_mouse.x*1.57))*tan(u_mouse.y*2.);
|
||||
float phi = atan(v.y, v.x);
|
||||
d = pow(r,Power-1.0)*Power*d+1.;
|
||||
|
||||
//theta = theta*2.;
|
||||
phi = phi*Power;
|
||||
v = (vec3(cos(theta)*cos(phi), sin(phi)*cos(theta), sin(theta))*zr)+c;
|
||||
}
|
||||
return 0.5*log(r)*r/d;
|
||||
}
|
||||
|
||||
|
||||
void main( void )
|
||||
{
|
||||
vec2 pos = (gl_FragCoord.xy*2.0 - u_resolution.xy) / u_resolution.y;
|
||||
vec3 camPos = vec3(1, 1, 1.5);
|
||||
vec3 camTarget = vec3(0.0, 0.0, 0.0);
|
||||
|
||||
vec3 camDir = normalize(camTarget-camPos);
|
||||
vec3 camUp = normalize(vec3(0.0, 1.0, 0.0));
|
||||
vec3 camSide = cross(camDir, camUp);
|
||||
float focus = 1.8;
|
||||
|
||||
vec3 rayDir = normalize(camSide*pos.x + camUp*pos.y + camDir*focus);
|
||||
vec3 ray = camPos;
|
||||
float m = 0.0;
|
||||
float d = 0.0, total_d = 0.0;
|
||||
const int MAX_MARCH = 150;
|
||||
const float MAX_DISTANCE = 10.0;
|
||||
for(int i=0; i<MAX_MARCH; ++i) {
|
||||
d = map(ray);
|
||||
total_d += d*1.11;
|
||||
ray += rayDir * d;
|
||||
m += 1.0;
|
||||
if(d<0.0002) { break; }
|
||||
if(total_d>MAX_DISTANCE) { total_d=MAX_DISTANCE; break; }
|
||||
}
|
||||
|
||||
float c = (total_d)*0.0001;
|
||||
vec3 result = vec3( vec3(0.8, 0.23, 0.1)*m*0.02 );
|
||||
gl_FragColor = vec4(result, 1);
|
||||
}
|
||||
85
shader_experiments/osc_example.py
Normal file
85
shader_experiments/osc_example.py
Normal file
@@ -0,0 +1,85 @@
|
||||
from tkinter import *
|
||||
from pythonosc import osc_message_builder
|
||||
from pythonosc import udp_client
|
||||
from pythonosc import dispatcher
|
||||
from pythonosc import osc_server
|
||||
import argparse
|
||||
import threading
|
||||
print('starting osc_example')
|
||||
|
||||
root = Tk()
|
||||
|
||||
def key(event):
|
||||
print("key pressed is {}".format(event.char))
|
||||
|
||||
if event.char == 'q':
|
||||
print('quiting program')
|
||||
root.destroy()
|
||||
elif event.char == 'a':
|
||||
print('loading video')
|
||||
send_osc_message("/player/a/load", "/home/pi/Videos/internal_storage/480-from-adobe.mp4")
|
||||
elif event.char == 's':
|
||||
print('playing video')
|
||||
send_osc_message("/player/a/play", True)
|
||||
elif event.char == 'd':
|
||||
print('pausing video')
|
||||
send_osc_message("/player/a/play", False)
|
||||
elif event.char == 'f':
|
||||
print('making video partly transparent')
|
||||
send_osc_message("/player/a/alpha", 200)
|
||||
elif event.char == 'g':
|
||||
print('quiting video')
|
||||
send_osc_message("/player/a/quit", True)
|
||||
elif event.char == 'h':
|
||||
print('seeking video')
|
||||
send_osc_message("/player/a/position", 0.5)
|
||||
elif event.char == 'j':
|
||||
print('requesting video position')
|
||||
send_osc_message("/player/a/get_position", True)
|
||||
|
||||
|
||||
def send_osc_message(address, value):
|
||||
client.send_message(address, value)
|
||||
|
||||
def set_position(unused_addr, args, player_name):
|
||||
print("the position of the player {} is {}".format(args, player_name))
|
||||
|
||||
def set_status(unused_addr, args, player_name):
|
||||
print("the status of the player {} is {}".format(args, player_name))
|
||||
|
||||
### setting up the client
|
||||
client_parser = argparse.ArgumentParser()
|
||||
client_parser.add_argument("--ip", default="127.0.0.1", help="the ip")
|
||||
client_parser.add_argument("--port", type=int, default=8000, help="the port")
|
||||
|
||||
client_args = client_parser.parse_args()
|
||||
|
||||
client = udp_client.SimpleUDPClient(client_args.ip, client_args.port)
|
||||
|
||||
### setting up the server
|
||||
server_parser = argparse.ArgumentParser()
|
||||
server_parser.add_argument("--ip", default="127.0.0.1", help="the ip")
|
||||
server_parser.add_argument("--port", type=int, default=7000, help="the port")
|
||||
|
||||
server_args = server_parser.parse_args()
|
||||
|
||||
dispatcher = dispatcher.Dispatcher()
|
||||
dispatcher.map("/player/a/position", set_position, "a")
|
||||
dispatcher.map("/player/b/position", set_position, "b")
|
||||
dispatcher.map("/player/c/position", set_position, "c")
|
||||
dispatcher.map("/player/a/status", set_status, "a")
|
||||
dispatcher.map("/player/b/status", set_status, "b")
|
||||
dispatcher.map("/player/c/status", set_status, "c")
|
||||
|
||||
server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), dispatcher)
|
||||
server_thread = threading.Thread(target=server.serve_forever)
|
||||
server_thread.start()
|
||||
### setting up tk etc
|
||||
frame = Frame(root, width=100, height=100)
|
||||
frame.bind("<KeyPress>", key)
|
||||
frame.pack()
|
||||
|
||||
frame.focus_set()
|
||||
root.mainloop()
|
||||
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
// Created by inigo quilez - iq/2013
|
||||
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
|
||||
|
||||
uniform vec3 u_Resolution; // viewport resolution (in pixels)
|
||||
uniform float u_Time; // shader playback time (in seconds)
|
||||
uniform float u_TimeDelta; // render time (in seconds)
|
||||
uniform int u_Frame; // shader playback frame
|
||||
uniform float u_ChannelTime[4];
|
||||
|
||||
void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
||||
{
|
||||
vec2 q = fragCoord.xy / u_Resolution.xy;
|
||||
vec2 uv = 0.5 + (q-0.5)*(0.9 + 0.1*sin(0.2*u_Time));
|
||||
|
||||
vec3 oricol = texture( u_Channel0, vec2(q.x,1.0-q.y) ).xyz;
|
||||
vec3 col;
|
||||
|
||||
col.r = texture(u_Channel0,vec2(uv.x+0.003,-uv.y)).x;
|
||||
col.g = texture(u_Channel0,vec2(uv.x+0.000,-uv.y)).y;
|
||||
col.b = texture(u_Channel0,vec2(uv.x-0.003,-uv.y)).z;
|
||||
|
||||
col = clamp(col*0.5+0.5*col*col*1.2,0.0,1.0);
|
||||
|
||||
col *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y);
|
||||
|
||||
col *= vec3(0.95,1.05,0.95);
|
||||
|
||||
col *= 0.9+0.1*sin(10.0*u_Time+uv.y*1000.0);
|
||||
|
||||
col *= 0.99+0.01*sin(110.0*u_Time);
|
||||
|
||||
float comp = smoothstep( 0.2, 0.7, sin(u_Time) );
|
||||
col = mix( col, oricol, clamp(-2.0+2.0*q.x+3.0*comp,0.0,1.0) );
|
||||
|
||||
fragColor = vec4(col,1.0);
|
||||
}
|
||||
@@ -1,157 +0,0 @@
|
||||
# PyQt4 imports
|
||||
from PyQt4 import QtGui, QtCore, QtOpenGL
|
||||
from PyQt4.QtOpenGL import QGLWidget
|
||||
# PyOpenGL imports
|
||||
import OpenGL.GL as gl
|
||||
import OpenGL.arrays.vbo as glvbo
|
||||
|
||||
# Window creation function.
|
||||
def create_window(window_class):
|
||||
"""Create a Qt window in Python, or interactively in IPython with Qt GUI
|
||||
event loop integration:
|
||||
# in ~/.ipython/ipython_config.py
|
||||
c.TerminalIPythonApp.gui = 'qt'
|
||||
c.TerminalIPythonApp.pylab = 'qt'
|
||||
See also:
|
||||
http://ipython.org/ipython-doc/dev/interactive/qtconsole.html#qt-and-the-qtconsole
|
||||
"""
|
||||
app_created = False
|
||||
app = QtCore.QCoreApplication.instance()
|
||||
if app is None:
|
||||
app = QtGui.QApplication(sys.argv)
|
||||
app_created = True
|
||||
app.references = set()
|
||||
window = window_class()
|
||||
app.references.add(window)
|
||||
window.show()
|
||||
if app_created:
|
||||
app.exec_()
|
||||
return window
|
||||
|
||||
def compile_vertex_shader(source):
|
||||
"""Compile a vertex shader from source."""
|
||||
vertex_shader = gl.glCreateShader(gl.GL_VERTEX_SHADER)
|
||||
gl.glShaderSource(vertex_shader, source)
|
||||
gl.glCompileShader(vertex_shader)
|
||||
# check compilation error
|
||||
result = gl.glGetShaderiv(vertex_shader, gl.GL_COMPILE_STATUS)
|
||||
if not(result):
|
||||
raise RuntimeError(gl.glGetShaderInfoLog(vertex_shader))
|
||||
return vertex_shader
|
||||
|
||||
def compile_fragment_shader(source):
|
||||
"""Compile a fragment shader from source."""
|
||||
fragment_shader = gl.glCreateShader(gl.GL_FRAGMENT_SHADER)
|
||||
gl.glShaderSource(fragment_shader, source)
|
||||
gl.glCompileShader(fragment_shader)
|
||||
# check compilation error
|
||||
result = gl.glGetShaderiv(fragment_shader, gl.GL_COMPILE_STATUS)
|
||||
if not(result):
|
||||
raise RuntimeError(gl.glGetShaderInfoLog(fragment_shader))
|
||||
return fragment_shader
|
||||
|
||||
def link_shader_program(vertex_shader, fragment_shader):
|
||||
"""Create a shader program with from compiled shaders."""
|
||||
program = gl.glCreateProgram()
|
||||
gl.glAttachShader(program, vertex_shader)
|
||||
gl.glAttachShader(program, fragment_shader)
|
||||
gl.glLinkProgram(program)
|
||||
# check linking error
|
||||
result = gl.glGetProgramiv(program, gl.GL_LINK_STATUS)
|
||||
if not(result):
|
||||
raise RuntimeError(gl.glGetProgramInfoLog(program))
|
||||
return program
|
||||
|
||||
# Vertex shader
|
||||
VS = """
|
||||
#version 330
|
||||
// Attribute variable that contains coordinates of the vertices.
|
||||
layout(location = 0) in vec2 position;
|
||||
|
||||
// Main function, which needs to set `gl_Position`.
|
||||
void main()
|
||||
{
|
||||
// The final position is transformed from a null signal to a sinewave here.
|
||||
// We pass the position to gl_Position, by converting it into
|
||||
// a 4D vector. The last coordinate should be 0 when rendering 2D figures.
|
||||
gl_Position = vec4(position.x, .2 * sin(20 * position.x), 0., 1.);
|
||||
}
|
||||
"""
|
||||
|
||||
# Fragment shader
|
||||
FS = """
|
||||
#version 330
|
||||
// Output variable of the fragment shader, which is a 4D vector containing the
|
||||
// RGBA components of the pixel color.
|
||||
out vec4 out_color;
|
||||
|
||||
// Main fragment shader function.
|
||||
void main()
|
||||
{
|
||||
// We simply set the pixel color to yellow.
|
||||
out_color = vec4(1., 1., 0., 1.);
|
||||
}
|
||||
"""
|
||||
|
||||
class GLPlotWidget(QGLWidget):
|
||||
# default window size
|
||||
width, height = 600, 600
|
||||
|
||||
def initializeGL(self):
|
||||
"""Initialize OpenGL, VBOs, upload data on the GPU, etc."""
|
||||
# background color
|
||||
gl.glClearColor(0, 0, 0, 0)
|
||||
# create a Vertex Buffer Object with the specified data
|
||||
self.vbo = glvbo.VBO(self.data)
|
||||
# compile the vertex shader
|
||||
vs = compile_vertex_shader(VS)
|
||||
# compile the fragment shader
|
||||
fs = compile_fragment_shader(FS)
|
||||
# compile the vertex shader
|
||||
self.shaders_program = link_shader_program(vs, fs)
|
||||
|
||||
def paintGL(self):
|
||||
"""Paint the scene."""
|
||||
# clear the buffer
|
||||
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
|
||||
# bind the VBO
|
||||
self.vbo.bind()
|
||||
# tell OpenGL that the VBO contains an array of vertices
|
||||
# prepare the shader
|
||||
gl.glEnableVertexAttribArray(0)
|
||||
# these vertices contain 2 single precision coordinates
|
||||
gl.glVertexAttribPointer(0, 2, gl.GL_FLOAT, gl.GL_FALSE, 0, None)
|
||||
gl.glUseProgram(self.shaders_program)
|
||||
# draw "count" points from the VBO
|
||||
gl.glDrawArrays(gl.GL_LINE_STRIP, 0, len(self.data))
|
||||
|
||||
def resizeGL(self, width, height):
|
||||
"""Called upon window resizing: reinitialize the viewport."""
|
||||
# update the window size
|
||||
self.width, self.height = width, height
|
||||
# paint within the whole window
|
||||
gl.glViewport(0, 0, width, height)
|
||||
|
||||
if __name__ == '__main__':
|
||||
# import numpy for generating random data points
|
||||
import sys
|
||||
import numpy as np
|
||||
|
||||
# null signal
|
||||
data = np.zeros((10000, 2), dtype=np.float32)
|
||||
data[:,0] = np.linspace(-1., 1., len(data))
|
||||
|
||||
# define a Qt window with an OpenGL widget inside it
|
||||
class TestWindow(QtGui.QMainWindow):
|
||||
def __init__(self):
|
||||
super(TestWindow, self).__init__()
|
||||
# initialize the GL widget
|
||||
self.widget = GLPlotWidget()
|
||||
self.widget.data = data
|
||||
# put the window at the screen position (100, 100)
|
||||
self.setGeometry(100, 100, self.widget.width, self.widget.height)
|
||||
self.setCentralWidget(self.widget)
|
||||
self.show()
|
||||
|
||||
# show the window
|
||||
win = create_window(TestWindow)
|
||||
@@ -1,51 +0,0 @@
|
||||
BaseContext = testingcontext.getInteractive()
|
||||
from OpenGL.GL import *
|
||||
from OpenGL.arrays import vbo
|
||||
from OpenGL.GL import shaders
|
||||
|
||||
class TextContext( BaseContext ):
|
||||
""" Creates a simple vertex shader ... """
|
||||
|
||||
def Oninit(self):
|
||||
VERTEX_SHADER = shaders.compileShader("""#version 120
|
||||
void main() {
|
||||
gl_position = gl_ModeViewProjectionMatrix * gl_Vertex;
|
||||
}""", GL_VERTEX_SHADER)
|
||||
|
||||
FRAGMENT_SHADER = shaders.compileShader("""#version 120
|
||||
void main() {
|
||||
gl_FragColor = vect4(0, 1, 0, 1 );
|
||||
}""", GL_FRAMENT_SHADER)
|
||||
|
||||
self.shader = shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
|
||||
|
||||
self.vbo = vbo.VBO(
|
||||
array( [
|
||||
[ 0, 1, 0 ],
|
||||
[ -1, -1, 0 ],
|
||||
[ 1, -1, 0 ],
|
||||
[ 2, -1, 0 ],
|
||||
[ 4, -1, 0 ],
|
||||
[ 4, 1, 0 ],
|
||||
[ 2, -1, 0 ],
|
||||
[ 4, 1, 0 ],
|
||||
[ 2, 1, 0 ],
|
||||
], 'f')
|
||||
)
|
||||
|
||||
def Render(self, mode):
|
||||
""""Renders the geometry for the scene"""
|
||||
shaders.glUseProgram(self.shader)
|
||||
try:
|
||||
self.vbo.bind()
|
||||
try:
|
||||
glEnableClientState(GL_VERTEX_ARRAY)
|
||||
glVertexPointerf(self.vbo)
|
||||
glDrawArrays(GL_TRIANGLES,0,9)
|
||||
finally:
|
||||
self.vbo.unbind()
|
||||
glDisableClientState(GL_VERTEX_ARRAY)
|
||||
finally:
|
||||
shaders.glUseProgram(0)
|
||||
|
||||
|
||||
193
video_centre/alt_video_player.py
Normal file
193
video_centre/alt_video_player.py
Normal file
@@ -0,0 +1,193 @@
|
||||
|
||||
|
||||
class AltVideoPlayer:
|
||||
def __init__(self, root, message_handler, data, osc_client, name):
|
||||
self.root = root
|
||||
self.message_handler = message_handler
|
||||
self.data = data
|
||||
self.name = name
|
||||
self.player_running = False
|
||||
self.status = 'EMPTY'
|
||||
self.total_length = 0.0
|
||||
self.bankslot_number = '*-*'
|
||||
self.start = -1.0
|
||||
self.end = -1.0
|
||||
self.rate = 1
|
||||
self.crop_length = 0.0
|
||||
self.location = ''
|
||||
self.load_attempts = 0
|
||||
self.alpha = 0
|
||||
### new stuff
|
||||
self.client = osc_client
|
||||
|
||||
self.position = -1
|
||||
|
||||
|
||||
def try_load(self, layer):
|
||||
load_attempts = 0
|
||||
while(load_attempts < 2):
|
||||
load_attempts = load_attempts + 1
|
||||
if self.load(layer):
|
||||
print('load success')
|
||||
return True
|
||||
else:
|
||||
print('load failed')
|
||||
self.message_handler.set_message('ERROR', 'failed to load')
|
||||
self.status = 'ERROR'
|
||||
return False
|
||||
|
||||
|
||||
def load(self, layer):
|
||||
#try:
|
||||
self.get_context_for_player()
|
||||
#is_dev_mode, first_screen_arg, second_screen_arg = self.set_screen_size_for_dev_mode()
|
||||
#arguments = ['--no-osd', '--layer', str(layer), '--adev', 'local', '--alpha', '0', first_screen_arg, second_screen_arg]
|
||||
#if not is_dev_mode:
|
||||
# arguments.append('--blank=0x{}'.format(self.data.get_background_colour()))
|
||||
print('the location is {}'.format(self.location))
|
||||
if self.location == '':
|
||||
self.status = 'EMPTY'
|
||||
return True
|
||||
#self.omx_player = OMXPlayer(self.location, args=arguments, dbus_name=self.name)
|
||||
self.client.send_message("/player/{}/load".format(self.name[0]), self.location)
|
||||
#self.player_running = True
|
||||
#self.total_length = self.omx_player.duration() # <-- uneeded once self.duration stores float
|
||||
if(self.end is -1):
|
||||
self.end = self.total_length
|
||||
if(self.start is -1):
|
||||
self.start = 0
|
||||
self.crop_length = self.end - self.start
|
||||
print('{}: the duration is {}'.format(self.name, self.total_length))
|
||||
if 'show' in self.data.settings['sampler']['ON_LOAD']['value']:
|
||||
#self.set_alpha_value(255)
|
||||
pass
|
||||
else:
|
||||
pass
|
||||
#self.set_alpha_value(0)
|
||||
return True
|
||||
#except (ValueError, SystemError) as e:
|
||||
# print(e)
|
||||
#self.message_handler.set_message('ERROR', 'load attempt fail')
|
||||
#return False
|
||||
|
||||
def start_video(self):
|
||||
if 'show' in self.data.settings['sampler']['ON_START']['value']:
|
||||
pass
|
||||
#self.set_alpha_value(255)
|
||||
else:
|
||||
pass
|
||||
#self.set_alpha_value(0)
|
||||
if 'play' in self.data.settings['sampler']['ON_START']['value']:
|
||||
self.status = 'PLAYING'
|
||||
self.client.send_message("/player/{}/play".format(self.name[0]), True)
|
||||
else:
|
||||
self.status = 'START'
|
||||
|
||||
|
||||
def reload(self, layer):
|
||||
self.exit()
|
||||
self.player_running = False
|
||||
self.try_load(layer)
|
||||
|
||||
def is_loaded(self):
|
||||
return self.status == 'LOADED'
|
||||
|
||||
def is_finished(self):
|
||||
return self.status == 'FINISHED'
|
||||
|
||||
#def get_position(self):
|
||||
# try:
|
||||
# return self.omx_player.position()
|
||||
# except:
|
||||
# print('{}: error get_position'.format(self.name))
|
||||
# return -1
|
||||
|
||||
def get_context_for_player(self):
|
||||
next_context = self.data.get_next_context()
|
||||
self.location = next_context['location']
|
||||
self.total_length = next_context['length']
|
||||
self.start = next_context['start']
|
||||
self.end = next_context['end']
|
||||
self.bankslot_number = next_context['bankslot_number']
|
||||
self.rate = next_context['rate']
|
||||
|
||||
def toggle_pause(self):
|
||||
if self.status == "PLAYING":
|
||||
self.client.send_message("/player/{}/play".format(self.name[0]), False)
|
||||
elif self.status == "PAUSED":
|
||||
self.client.send_message("/player/{}/play".format(self.name[0]), True)
|
||||
else:
|
||||
print("error toggling pause when video is neither playing or paused")
|
||||
#self.omx_player.play_pause()
|
||||
#self.status = self.omx_player.playback_status().upper()
|
||||
|
||||
def toggle_show(self):
|
||||
if self.alpha > 127:
|
||||
self.show_toggle_on = False
|
||||
#self.set_alpha_value(0)
|
||||
else:
|
||||
self.show_toggle_on = True
|
||||
#self.set_alpha_value(255)
|
||||
|
||||
def set_alpha_value(self, amount):
|
||||
self.client.send_message("/player/{}/alpha".format(self.name[0]), amount)
|
||||
#self.omx_player.set_alpha(amount)
|
||||
self.alpha = amount
|
||||
|
||||
def seek(self, amount):
|
||||
position = self.position
|
||||
after_seek_position = position + amount
|
||||
if after_seek_position > self.start and after_seek_position < self.end:
|
||||
self.set_position(after_seek_position)
|
||||
#self.player.seek(amount)
|
||||
else:
|
||||
self.message_handler.set_message('INFO', 'can not seek outside range')
|
||||
|
||||
def change_rate(self, amount):
|
||||
pass
|
||||
#new_rate = self.rate + amount
|
||||
#if (new_rate > self.omx_player.minimum_rate() and new_rate < self.omx_player.maximum_rate()):
|
||||
# updated_speed = self.omx_player.set_rate(new_rate)
|
||||
# self.rate = new_rate
|
||||
#print('max rate {} , min rate {} '.format(self.omx_player.maximum_rate() ,self.omx_player.minimum_rate()))
|
||||
#return new_rate
|
||||
#else:
|
||||
# self.message_handler.set_message('INFO', 'can not set speed outside of range')
|
||||
#return self.rate
|
||||
|
||||
def get_position(self):
|
||||
return self.position
|
||||
|
||||
def set_position(self, position):
|
||||
self.client.send_message("/player/{}/position".format(self.name[0]), position / self.total_length)
|
||||
#self.omx_player.set_position(position)
|
||||
|
||||
def exit(self):
|
||||
try:
|
||||
self.client.send_message("/player/{}/quit".format(self.name[0]),True)
|
||||
#self.omx_player.quit()
|
||||
self.player_running = False
|
||||
except:
|
||||
pass
|
||||
|
||||
def set_screen_size_for_dev_mode(self):
|
||||
## only dev mode is needed now that auto handles all modes... can be removed probably ...
|
||||
if self.data.settings['other']['DEV_MODE_RESET']['value'] == 'on':
|
||||
return True, '--win', '50,350,550,750'
|
||||
else:
|
||||
aspect_mode = self.data.settings['video']['SCREEN_MODE']['value']
|
||||
return False, '--aspect-mode', aspect_mode
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
from video_centre.video_player import VideoPlayer
|
||||
from video_centre.alt_video_player import AltVideoPlayer
|
||||
|
||||
from pythonosc import osc_message_builder
|
||||
from pythonosc import udp_client
|
||||
from pythonosc import dispatcher
|
||||
from pythonosc import osc_server
|
||||
import argparse
|
||||
import threading
|
||||
|
||||
class VideoDriver(object):
|
||||
|
||||
@@ -12,14 +20,23 @@ class VideoDriver(object):
|
||||
self.in_first_load_cycle = False
|
||||
self.in_current_playing_cycle = False
|
||||
self.in_next_load_cycle = False
|
||||
|
||||
self.server = self.setup_osc_server()
|
||||
self.osc_client = self.setup_osc_client()
|
||||
|
||||
self.layer = self.MAX_LAYER
|
||||
|
||||
self.last_player = VideoPlayer(self.root, self.message_handler, self.data, 'a.a')
|
||||
self.current_player = VideoPlayer(self.root,self.message_handler, self.data, 'b.b')
|
||||
self.next_player = VideoPlayer(self.root, self.message_handler, self.data, 'c.c')
|
||||
if(self.data.settings['other']['VIDEO_BACKEND']['value'] == 'openframeworks'):
|
||||
self.last_player = AltVideoPlayer(self.root, self.message_handler, self.data, self.osc_client, 'a.a')
|
||||
self.current_player = AltVideoPlayer(self.root,self.message_handler, self.data, self.osc_client, 'b.b')
|
||||
self.next_player = AltVideoPlayer(self.root, self.message_handler, self.data, self.osc_client, 'c.c')
|
||||
else:
|
||||
self.last_player = VideoPlayer(self.root, self.message_handler, self.data, 'a.a')
|
||||
self.current_player = VideoPlayer(self.root,self.message_handler, self.data, 'b.b')
|
||||
self.next_player = VideoPlayer(self.root, self.message_handler, self.data, 'c.c')
|
||||
|
||||
self.root.after(self.delay, self.begin_playing)
|
||||
|
||||
self.print_status()
|
||||
self.update_video_settings()
|
||||
|
||||
|
||||
@@ -115,3 +132,49 @@ class VideoDriver(object):
|
||||
def reload_next_player(self):
|
||||
self.next_player.reload(self.get_next_layer_value())
|
||||
|
||||
def setup_osc_client(self):
|
||||
client_parser = argparse.ArgumentParser()
|
||||
client_parser.add_argument("--ip", default="127.0.0.1", help="the ip")
|
||||
client_parser.add_argument("--port", type=int, default=8000, help="the port")
|
||||
|
||||
client_args = client_parser.parse_args()
|
||||
|
||||
return udp_client.SimpleUDPClient(client_args.ip, client_args.port)
|
||||
|
||||
def setup_osc_server(self):
|
||||
server_parser = argparse.ArgumentParser()
|
||||
server_parser.add_argument("--ip", default="127.0.0.1", help="the ip")
|
||||
server_parser.add_argument("--port", type=int, default=9000, help="the port")
|
||||
|
||||
server_args = server_parser.parse_args()
|
||||
|
||||
this_dispatcher = dispatcher.Dispatcher()
|
||||
this_dispatcher.map("/player/a/position", self.receive_position, "a.a")
|
||||
this_dispatcher.map("/player/b/position", self.receive_position, "b.b")
|
||||
this_dispatcher.map("/player/c/position", self.receive_position, "c.c")
|
||||
this_dispatcher.map("/player/a/status", self.receive_status, "a.a")
|
||||
this_dispatcher.map("/player/b/status", self.receive_status, "b.b")
|
||||
this_dispatcher.map("/player/c/status", self.receive_status, "c.c")
|
||||
#this_dispatcher.map("/player/a/status", self.set_status)
|
||||
|
||||
server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher)
|
||||
server_thread = threading.Thread(target=server.serve_forever)
|
||||
server_thread.start()
|
||||
return server
|
||||
|
||||
def exit_osc_server(self):
|
||||
self.server.shutdown()
|
||||
|
||||
def receive_position(self, unused_addr, player_name, args):
|
||||
print("the position of player {} is set to {}".format(player_name,args))
|
||||
for player in [self.next_player, self.current_player, self.last_player]:
|
||||
if player_name[0] in player.name :
|
||||
player.position = args * player.total_length
|
||||
break
|
||||
|
||||
def receive_status(self, unused_addr, player_name, args):
|
||||
print("the status of player {} is set to {}".format(player_name,args))
|
||||
for player in [self.next_player, self.current_player, self.last_player]:
|
||||
if player_name[0] in player.name:
|
||||
player.status = args
|
||||
break
|
||||
|
||||
Reference in New Issue
Block a user