rhap5ody.js
extends p5.js
to support conditional re-rendering – taking inspiration from react.js
. All objects on the canvas are ordered in a structured tree layout, thus allowing for property inheritance and a standard interface for interaction. Objects also support the freeze
method which collapses their subtree into a single bitmap image, allowing for efficient re-rendering without the need to rebuild the whole subtree. The tree inheritance structure additionally allows for relative positioning (relative to the element's parent) which id similar to position: relative;
in css. With standard p5.js
there is no inherent structure to the elements drawn to the canvas and so they behave similarly to absolute
or fixed
css positioning, where explicit x, y, width and height pixel values are supplied.
View a demo project using rhap5ody.js
here.
Every renderable element in rhap5ody.js
inherits from the Obj
class - including the Canvas
object itself. The Obj
class definition can be found in the core.js
file. Every Obj
instance has exactly the following attributes.
Obj Attribute |
Description |
---|---|
this.parent |
Pointer to the parent Obj in the object tree |
this.children |
Array of pointers to the children Obj in the object tree |
this.ident |
Instance of the Ident class – id , classes etc... |
this.env |
Instance of the Env class – properties , listeners etc... |
this.freezer |
Instance of the Freezer class – frozen , frozenTo etc... |
this.img |
Instance of the GraphicsImg class – p5.js drawing functionality |
this._internal |
Private object of internal properties |
The Obj
class also has a number of public methods – some of which are briefly listed below.
Obj Method (public) |
Description |
---|---|
this.setChildren() |
Programmatically set children for the object |
this.addClass(name) |
Adds class name to Ident instance |
this.search(query) |
Searches for an Obj in subtree by query |
this.set(name,update) |
Updates the property name in Env & triggers listener |
this.get(name) |
Returns the property name from Env |
this.freeze() |
Freezes the subtree with this Obj as head |
this.setup() |
Setup of object – eg: setId , addClass , freeze etc... |
this.build(img) |
Build the Obj class and produce bitmap image |
this.effects() |
Run effects method at every timestep |
this.draw(ctx) |
Draw element to context ctx – only if redraw required |
this.mouseClicked() |
Event listener for mouse click on object |
A developer can create custom elements that extend the Obj
class (or extend other elements) and place them in the /components
folder of their rhap5ody.js
project – similar to react .jsx
components. They should define the Canvas
class (extending the Base
class) in sketch.js
. Canvas
is the head of the object tree where the children are set by returning an array of elements from /components
in the setChildren()
method. NB: all components must be imported in order within the index.html
file (eg: in the example given Text.js
must be placed above BackgroundText.js
since BackgroundText
extends Text
).
To better understand how the object tree is structured, I recommend cloning the repo and launching index.html
in a browser, opening inspector tools and switching to the console tab. You can then click on the Canvas dropdown and explore the whole tree (including each element's identity, environment, freezer and graphics classes).
Note: rhap5ody.js
was primarily developed in the TobiasLoader/P5-Canvas-Tree
repository.