i wrote a crude pong in L5. maybe i still need a better title for this library of Processing API in Lua with Love2d. (any suggestions?)
(music by Hildegard Von Bingen of course)
ok, i'm stopping for the night. the next things to do are to add typography functions, full mouse functions, and color modes, then I think that will be most of the API complete. I will still need to do bug testing.
Tonight I ran up against a problem I couldn't quite solve. I am using @Alexjgriffith suggestion to modify love2d's love.run() game loop and modified the default loop to not clear the screen between draw calls. Unfortunately, when drawing graphics from events (such as keyPressed(), keyTyped() ) the screen flickers, I think because of double drawing. I tried half a dozen different solutions but never quite found a satisfactory one unfortunately.
added frameRate() function.
while working on all this, had a bit of a think. i believe my flickering screen problem is a result of me hacking Love2d to work more like processing/p5. in the processing model, the approach is a synchronous model. draw runs once per frame. if too much processing happens, it slows down/frame rate drops. love2d takes the approach of drawing as many times as needed per game loop. logic is separated out into update(), while drawing is rendered in a separate thread, so game logic doesn't block rendering and realtime logic can be processed. In love2d, the emphasis is on realtime game processes.:
Don't want to jinx myself but I think I'm nearing completion of what I've set for my first run implementation of Processing API in Lua (via Love2d). I need to add in typography styling, some input/output options, and then probably have some drawing buffer debugging to do (which has been the most difficult thing for me to work through so far).
Today I added in describe() mode from p5.js and decided to try having it output text to the console for CLI screenreaders, but I need to look into more best practices for this.
I also implemented color tables, getting and setting colors, screenshotting (save() ) , smoothing/noSmoothing, strokeCaps, strokeJoins, displayWidth, displayHeight, millis(), mouseWheel() function.
i had temporarily for a day or two jinxed myself but i was able to figure out font loading and textSize, and other typography functions to emulate the processing api / flow (maintaining state).
next i turn to input/output (importing and exporting strings/json/tables?).
completed! loadStrings(), saveStrings(), loadTable(), and saveTable() complete. And current data formats are csv, tsv and lua.
I considered adding in a loadJSON() function, and still could at some point, but didn't think it made sense to DIY build a basic JSON parser or drop in something now. Could always be added later.
And with that, i've pretty much finished most of this first draft of implementing the API. there's a few remaining color modes to add in: HSB, a noise function, some vertex functions, and then lots of debugging and refactoring. notably, i have not tested on a Mac or Windows machine yet, or any computer other than my own! I also need to review how i'm implementing drawing from setup(). my current method is a bit dumb and draws twice. but ultimately, feeling pretty good about the library so far.
fiinished up a heckuva of a lot of the API and have been doing some tests (still need to do some more). I still need to add in colormodes HSB, HSA and a few related functions and then that'll be the first draft of L5. i am ignoring vertex functions for now (I could'nt quite wrap my head around it yet) and need to fix arcs.
I started building out intro documentation yesterday. I saw Casey and Lauren today and told them about the project and will share it with them hopefully soon. Lauren asked me about what if it catches on and I'm working on this for years and years lol.
Now I'm starting to think through documentation and reference sites. I looked at how they build the sites for Processing and p5 and I don't quite want to have to learn JSX and MDX. It's probably not too bad but I'm hoping for something much simpler at first. I can always build it out further later.
Anyone have a suggestion for building a programming language documentation and reference site? particularly that's beginner-friendly, emphasizes the reference, and makes it easy to handle/build a reference page for all of the language's functions? written in markdown, produces static pages, and can be hosted on a git forge and collaboratively built with others.
I am currently looking at:
* hugo documentation themes
* MKDocs
* adapting my own static site generator again - though this may not be robust enough over time
* i keep reading about documentation generators but i don't really grok the idea yet
there's not too much to this sketch, but it's fun trying out rapid code sketching with the language now
code:
require("L5")
function setup()
size(1920,1280)
windowTitle("Flag Thing")
noStroke()
createPage()
frameRate(1)
end
function draw()
createPage()
end
function createPage()
background(random(255),random(255),random(255))
fill(random(255),random(255),random(255))
circle(width/2,height/2,2/3*height)
end
with a bit of a whimper at the end of a friday night here i have implemented 99% of the API to an unpolished, un-refactored state. I've also assembled a bit of a TODO list so I can go in and start cleaning things up.
Today I added in colorMode() which lets you change between RGB, HSB and HSL. I thought I had it, but since I'm trying to emulate Processing and p5.js I always test against their outcomes and was dismayed to learn that using a html color name in p5.js even in another color mode should always output in RGB. And while this makes complete sense, I kept getting strange color output when rendering "orange" in HSL mode for example. I'm guessing my color juggling is off somewhere because it goes like this:
code:
colormode(HSL)
fill("orange")
square(0,0,100)
behind the scenes:
1. change global color mode state to HSL and max vals for HSLA are 360,100,100,100 default
2. retrieve orange as RGB(A) values. convert that to "orange" in HSL.
3. draw the square in that fill color
..
4. Hmm, yellow appears instead?
The problem exists between 2 and 3 (as well as between my ears).
just wasting time.
coded a basic chess set with manual placement of pieces, so not a really playable game yet, though maybe hexapawn soon though? (no promises!)
some bug fixin' of L5 today. I tracked down a bug that was messing up the origin point location for shapes and in the process fixed some shape drawing modes. In the evening I visited Offline for the Show Us Your Screens event, which was really nice, a totally packed crowed. Alex McLean gave a cool demo of new functions coming to Strudel, Tidal and other uzu-langs https://uzu.lurk.org/
I presented my work on L5 (it's first pubilc showing) and recent work in a bit of a hodge podge. It was really nice to hear others' talks and see/hear what they're working on.
Hmmmm, on a flight of fancy I decided to add in filters. I did it through adding in shaders, which I am really a dilettante in. But.....it's working. Took me 3 hours tonight. Not happy with gaussian blur but the rest are ok. Again, a bit of a hacky approach. Essentially i have a flag checking for whether if a filter is on. if so, set the shader, send optional parameter if available, draw canvas to screen, then set to no shader and turn shader flag off. currently prevents switching filters but i think i could solve that.
next i went back to my own artwork i had turned in for an exhibit and revisited the alternate version in L5 (i had sent the work as a p5.js project). now with the filters working my L5 version is fairly comparable to the p5 version. one weird timing issue in that L5 cycles the background color fade much faster. so i'll look at debugging that later.
pretty happy with things in L5 now. need to look at error() messaging, testing on Mac/Windows/any other computer besides my own, and documentation and testing next.
So glad I added filters! I'm able to just drop into L5 and work on some interactive artworks.
I started with some of the source images from the previous artwork I was working on, but made a different kind of variation. I may actually like this one better.
Code:
require("L5")
function setup()
--size(400, 400)
fullscreen(true)
windowTitle("The L5 logo")
imageMode(CENTER)
face={}
for i=1,30 do
face[i] = loadImage("face/"..i..".png")
end
drawFaces()
frameRate(1.7)
end
function draw()
drawFaces()
filter(THRESHOLD)
end
function mousePressed()
end
function drawFaces()
for i=1,100 do
image(random(face),random(height),random(height),width,height)
end
end
working on documentation website and a logo for L5. could this be it?
i am trying out mkdocs with the material theme. pretty mainstream i know. typical problem: was easy to get started and easy to render pages but customizing it is a pain since you have to figure out how they've done it and override their choices.
@exquisitecorp afaik, unless i’ve misunderstood your post - love2d does not run update and draw on separate threads. in its vanilla configuration, update is run first, draw second. they're both run in the same (blocking) single thread.
i can confirm that via experience - framerate absolutely can tank due to too many update calls. i had some nasty bad code that was checking 100,000,000 coordinates per frame and brought fps to its knees 😅
@vga256 ah ok, thank you for clarifying that.
oh and i've made good progress! fingers crossed, but everything seems to be rendering across draw and events. now i can't seem to get setup to render correctly, but hopefully only a matter of time. need to do more testing but feeling better.
@exquisitecorp woohoo. glad to hear it!
always a drag when progress gets hung up on a single annoying bug