9. Instance mode
This program creates a canvas in a local p5 instance using instance mode.
Instance mode allows to place a p5 instance into a specific <div>
and to have multiple p5 canvas in the same document.
Thanks to nim metaprogramming capabilities, we do not need
to have a different api for instance mode, we can have the same api
we use for global mode, we only need to wrap it in a instance
call.
This macro will make sure that all the required functions
will have an additional sketch
argument added.
In this example we show two copies of get_started
example.
The syntax here is explicitly contrived to make sure the instance
is able to check all possible syntax variations allowed by nim.
# to test that a local proc is not converted
proc foo(): int = 400
instance("canvas1"): # call with `instance("<name of my div>")` to place into specific div
let x = 5
let y = 10
setup: # `setup` and `draw` are templates shadowing the global templates
let bar = foo() # this won't be replaced, as there's no `foo` in p5 that we wrapped
createCanvas(bar, 400) # each call will be checked against calls wrapped in the p5nim wrapper.
# If a name matches, it will be replaced by `p5Inst.<the call>` instead.
background(200)
draw:
# similar to calls, idents are also compared with known fields of the
# `P5Instance` type and replaced by `p5Inst.<field>` in case of a match
if mouseIsPressed:
fill(0)
else:
let fillBy = 255 # store in variable to test rewriting of real `nnkDotExpr`
fillBy.fill # not no `()`
mouseX.ellipse(mouseY, 40, 40) # even if used in dot expression, rewrite works
# (this is a `nnkCall` with `nnkDotExpr` first child)
In this second instance we make use of nbP5Instance
nimib convenience template:
let x = 5
let y = 10
setup: # `setup` and `draw` are templates shadowing the global templates
let bar = foo() # this won't be replaced, as there's no `foo` in p5 that we wrapped
createCanvas(bar, 400) # each call will be checked against calls wrapped in the p5nim wrapper.
# If a name matches, it will be replaced by `p5Inst.<the call>` instead.
background(200)
draw:
# similar to calls, idents are also compared with known fields of the
# `P5Instance` type and replaced by `p5Inst.<field>` in case of a match
if mouseIsPressed:
fill(0)
else:
let fillBy = 255 # store in variable to test rewriting of real `nnkDotExpr`
fillBy.fill # not no `()`
mouseX.ellipse(mouseY, 40, 40) # even if used in dot expression, rewrite works
# (this is a `nnkCall` with `nnkDotExpr` first child)