Skip to content

Instantly share code, notes, and snippets.

@larsoner
Created March 24, 2015 22:10
Show Gist options
  • Save larsoner/09813f4c7a9449d940cc to your computer and use it in GitHub Desktop.
Save larsoner/09813f4c7a9449d940cc to your computer and use it in GitHub Desktop.
Modified line visual example
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 24 22:53:59 2015
@author: larsoner
"""
from __future__ import division
from collections import namedtuple
import numpy as np
from math import exp
from vispy import app
from vispy import gloo
from vispy.visuals.shaders import ModularProgram
from vispy.visuals import Visual
from vispy.visuals.transforms import STTransform
class PanZoomTransform(STTransform):
pan = (0., 0.)
def move(self, loc):
"""I call this when I want to translate."""
dx, dy = loc
self.pan = (self.pan[0] + dx/self.scale[0],
self.pan[1] + dy/self.scale[1])
self.translate = (self.pan[0]*self.scale[0],
self.pan[1]*self.scale[1])
def zoom(self, loc, center=(0., 0.)):
"""I call this when I want to zoom."""
dx, dy = loc
scale = (self.scale[0] * exp(2.5*dx),
self.scale[1] * exp(2.5*dy))
tr = self.pan
self.pan = (tr[0] - center[0] * (1./self.scale[0] - 1./scale[0]),
tr[1] + center[1] * (1./self.scale[1] - 1./scale[1]))
self.scale = scale
self.translate = (self.pan[0]*self.scale[0],
self.pan[1]*self.scale[1])
class Canvas(app.Canvas):
VERTEX_SHADER = """
#version 120
vec4 transform(vec4);
attribute vec2 a_position;
void main (void)
{
gl_Position = $transform(vec4(a_position, 0., 1.0));
}
"""
FRAGMENT_SHADER = """
#version 120
uniform vec3 u_color;
void main()
{
gl_FragColor = vec4(u_color.xyz, 1.);
}
"""
def __init__(self, pos=None, color=None):
super(Canvas, self).__init__(keys='interactive')
self._dirty = False
self._program = ModularProgram(self.VERTEX_SHADER, self.FRAGMENT_SHADER)
self.panzoom = PanZoomTransform()
self._program.vert['transform'] = self.panzoom.shader_map()
self.set_data(pos=pos, color=color)
self._program['a_position'] = gloo.VertexBuffer(self._pos)
self._program['u_color'] = self._color
self.index = 0
def set_options(self):
gloo.set_state(clear_color=(1, 1, 1, 1), blend=True,
blend_func=('src_alpha', 'one_minus_src_alpha'))
def set_data(self, pos=None, color=None):
self._pos = pos
self._color = color
self._dirty = True
def on_draw(self, event):
gloo.clear()
self.set_options()
self._program.draw('line_strip')
def _normalize(self, loc):
x, y = loc
w, h = float(self.size[0]), float(self.size[1])
return x/(w/2.)-1., y/(h/2.)-1.
def on_mouse_wheel(self, event):
c = event.delta[1] * .1
x, y = self._normalize(event.pos)
self.panzoom.zoom((c, c), center=(x, y))
self.panzoom.shader_map()
self.update()
def on_resize(self, event):
self.width, self.height = event.size
gloo.set_viewport(0, 0, self.width, self.height)
def on_mouse_press(self, event):
self.index = (self.index + 1) % 2
self._program['u_color'] = (1, 0, 0) if self.index else (0, 0, 1)
self.update()
if __name__ == '__main__':
n = 1000
x = np.linspace(-1.0, +1.0, n).astype(np.float32)
y = np.random.uniform(-0.5, +0.5, n).astype(np.float32)
pos = np.c_[x,y]
line = Canvas(pos, color=(1., 0., 0.))
line.show()
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment