1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
pdlua graphics
===
pdlua's graphics allow you to draw basic vector graphics and receive mouse events on pure-data and plugdata. Drawing functions are prefixed with 'gfx.', and should only be called from within the "paint" function.
NOTE: The "paint" method (see below) is required by all pdlua objects which want to utilize the graphics interface. Defining it automatically puts the object into graphics mode in which all graphics routines work as described below.
Painting:
--------------
You can paint by defining the "paint" function, for example:
function yourclass:paint(g)
g:set_color(250, 200, 240)
g:fill_all()
end
Mouse Events:
--------------
You can receive mouse events by defining the "mouse_down", "mouse_up", "mouse_move" and "mouse_drag" functions. Both pass the x,y coordinates as arguments. For example:
function yourclass:mouse_down(x, y)
pd.post(tostring(x))
pd.post(tostring(y))
end
API overview
--------------
-- Callback functions you can define
pd:Class:mouse_down(x, y) -- Mouse down callback, called when the mouse is clicked
pd:Class:mouse_up(x, y) -- Mouse up callback, called when the mouse button is released
pd:Class:mouse_move(x, y) -- Mouse move callback, called when the mouse is moved while not being down
pd:Class:mouse_drag(x, y) -- Mouse drag callback, called when the mouse is moved while also being down
-- Functions you can call
pd:Class:repaint(layer) -- Request a repaint for specified layer (or all layers if no parameter is set
or if layer is 0). after this, the "paint" or "paint_layer_n" callback will occur
pd:Class:paint(g) / pd:Class:paint_layer_n(g) -- Paint callback, passes a graphics context object (commonly called g) for main
layer or layer n (n > 1) that you can call these drawing functions on:
g:set_size(w, h) -- Sets the size of the object
width, height = g:get_size(w, h) -- Gets the size of the object
g:set_color(r, g, b, a=1.0) -- Sets the color for the next drawing operation
g:fill_ellipse(x, y, w, h) -- Draws a filled ellipse at the specified position and size
g:stroke_ellipse(x, y, w, h, line_width) -- Draws the outline of an ellipse at the specified position and size
g:fill_rect(x, y, w, h) -- Draws a filled rectangle at the specified position and size
g:stroke_rect(x, y, w, h, line_width) -- Draws the outline of a rectangle at the specified position and size
g:fill_rounded_rect(x, y, w, h, corner_radius) -- Draws a filled rounded rectangle at the specified position and size
g:stroke_rounded_rect(x, y, w, h, corner_radius, line_width) -- Draws the outline of a rounded rectangle at the specified position and size
g:draw_line(x1, y1, x2, y2) -- Draws a line between two points
g:draw_text(text, x, y, w, fontsize) -- Draws text at the specified position and size
g:fill_all() -- Fills the entire drawing area with the current color. Also will draw
an object outline in the style of the host (ie. pure-data or plugdata)
g:translate(tx, ty) -- Translates the coordinate system by the specified amounts
g:scale(sx, sy) -- Scales the coordinate system by the specified factors. This will always happen after the translation
g:reset_transform() -- Resets current scale and translation
p = Path(x, y) -- Initiates a new path at the specified point
p:line_to(x, y) -- Adds a line segment to the path
p:quad_to(x1, y1, x2, y2) -- Adds a quadratic Bezier curve to the path
p:cubic_to(x1, y1, x2, y2, x3, y) -- Adds a cubic Bezier curve to the path
p:close_path() -- Closes the path
g:stroke_path(p, line_width) -- Draws the outline of the path with the specified line width
g:fill_path(p) -- Fills the current path
-- Audio callbacks
pd:Class:dsp(samplerate, blocksize, channel_counts) -- Called when DSP is activated and whenever the DSP graph is updated
pd:Class:perform(in1, in2, ..., in_n) -- Called for every audio block, passing tables of samples per inlet and
expecting tables of samples per outlet
pd:Class:signal_setmultiout(outlet_index, channel_count) -- Used in dsp function to achieve multichannel output for specific outlets
-- Additional functions
expandedsymbol = pd:Class:canvas_realizedollar(s) -- Expand dollar symbols in patch canvas context
pd:Class:set_args(args) -- Set the object arguments to be saved in the patch file
args = pd:Class:get_args() -- Get the object arguments
Basic example
---------------------
-- Create an object named "example"
local example = pd.Class:new():register("example")
function example:initialize(sel, atoms)
self.inlets = 1
self.circle_x = 10
self.circle_y = 10
return true
end
-- Receive mouse drag events
function example:mouse_drag(x, y)
-- Set circle position
self.circle_x = x - 15
self.circle_y = y - 15
-- Request a repaint
self:repaint()
end
function example:paint(g)
-- Fill background with color
g:set_color(255, 0, 0, 1)
g:fill_all()
-- Draw an ellipse
g:set_color(0, 255, 0, 1)
g:fill_ellipse(self.circle_x, self.circle_y, 30, 30)
end
|